Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

SimpleWeb.cpp

Go to the documentation of this file.
00001 //#include <stdio.h> 00002 00003 #include "SimpleWeb.h" 00004 #include <libsimple.h> 00005 00006 00007 00008 SimpleWeb::SimpleWeb() 00009 :Web(COOKIE_DOMAIN, COOKIE_PATH) 00010 ,m_db("localhost","root","","simple") 00011 ,m_b_set_cookie(false) 00012 ,m_account(0) 00013 ,m_player(0) 00014 ,m_valid(0) 00015 ,m_skill(0) 00016 ,m_building(0) 00017 ,m_superuservy(0) 00018 ,m_location(0) 00019 ,m_build(0) 00020 // 00021 ,m_form_lobby(*this) 00022 ,m_form_main(*this) 00023 ,m_form_build(*this) 00024 { 00025 RegWebForm(&m_form_lobby); 00026 RegWebForm(&m_form_main); 00027 RegWebForm(&m_form_build); 00028 00029 // refill npc's 00030 CreateNPC(); 00031 } 00032 00033 00034 SimpleWeb::~SimpleWeb() 00035 { 00036 } 00037 00038 00039 void SimpleWeb::ReadCookies() 00040 { 00041 char slask[1000]; 00042 GetCookies() -> getvalue("s", slask, 1000); 00043 cgi::Parse pa(slask, ":"); 00044 m_account = pa.getvalue(); 00045 m_player = pa.getvalue(); 00046 m_valid = pa.getvalue(); 00047 m_skill = pa.getvalue(); 00048 m_building = pa.getvalue(); 00049 m_superuservy = pa.getvalue(); 00050 m_location = pa.getvalue(); 00051 m_build = pa.getvalue(); 00052 00053 if (m_account) 00054 { 00055 db::Valid valid(m_db, m_valid, m_account); 00056 if (valid.account != m_account) 00057 SetAccount(0); 00058 } 00059 } 00060 00061 00062 void SimpleWeb::FormInput() 00063 { 00064 Web::FormInput(); // loop reg'd forms... 00065 } 00066 00067 00068 void SimpleWeb::CreateHeader() 00069 { 00070 if (m_b_set_cookie) 00071 SetTheCookie(); 00072 printf("Content-type: text/html\n"); 00073 printf("\n"); 00074 } 00075 00076 00077 void SimpleWeb::GenerateDocument() 00078 { 00079 printf("<html><head>" 00080 "<style type='text/css'>" 00081 ".button {" 00082 "border-left: 2px #f0f0f0 solid;" 00083 "border-top: 2px #f0f0f0 solid;" 00084 "border-right: 2px #6f6f6f solid;" 00085 "border-bottom: 2px #6f6f6f solid;" 00086 "background: #e0e0e0;" 00087 "padding-left: 5px;" 00088 "padding-right: 5px;" 00089 "text-decoration: none;" 00090 "color: #0000ff;" 00091 "}" 00092 "div.box {" 00093 "margin: 5px;" 00094 "padding: 5px;" 00095 "border: 1px #000000 solid;" 00096 "}" 00097 "</style>" 00098 "</head>"); 00099 printf("<body>"); 00100 if (!m_account || !m_player) 00101 { 00102 m_form_lobby.Display( 0 ); 00103 } 00104 else 00105 if (m_build) 00106 { 00107 m_form_build.Display( 0 ); 00108 } 00109 else 00110 { 00111 m_form_main.Display( 0 ); 00112 } 00113 // 00114 printf("</body>"); 00115 printf("</html>"); 00116 } 00117 00118 00119 void SimpleWeb::SetTheCookie() 00120 { 00121 char slask[1000]; 00122 sprintf(slask, "%ld:%ld:%ld:%ld:%ld:%d:%ld:%d", 00123 m_account, m_player, m_valid, m_skill, m_building, m_superuservy, m_location, m_build); 00124 SetCookie("s", slask); 00125 } 00126 00127 00128 std::string SimpleWeb::GetRandomName() 00129 { 00130 std::vector<std::string> name_beg; 00131 std::vector<std::string> name_end; 00132 00133 name_beg.push_back( "naz" ); 00134 name_beg.push_back( "mor" ); 00135 name_beg.push_back( "gnar" ); 00136 name_beg.push_back( "aahr" ); 00137 name_beg.push_back( "more" ); 00138 name_beg.push_back( "dark" ); 00139 name_beg.push_back( "bam" ); 00140 name_beg.push_back( "raab" ); 00141 name_beg.push_back( "rake" ); 00142 name_beg.push_back( "lor" ); 00143 name_beg.push_back( "smur" ); 00144 name_beg.push_back( "him" ); 00145 name_beg.push_back( "bar" ); 00146 00147 name_end.push_back( "guz" ); 00148 name_end.push_back( "kill" ); 00149 name_end.push_back( "gul" ); 00150 name_end.push_back( "gok" ); 00151 name_end.push_back( "tan" ); 00152 name_end.push_back( "tok" ); 00153 name_end.push_back( "bul" ); 00154 name_end.push_back( "zod" ); 00155 name_end.push_back( "zed" ); 00156 name_end.push_back( "dor" ); 00157 name_end.push_back( "grim" ); 00158 name_end.push_back( "yohn" ); 00159 name_end.push_back( "fan" ); 00160 name_end.push_back( "self" ); 00161 name_end.push_back( "ton" ); 00162 00163 std::string name = 00164 name_beg[random() % name_beg.size()] + 00165 name_end[random() % name_end.size()]; 00166 name[0] -= 32; 00167 return name; 00168 } 00169 00170 00171 long SimpleWeb::CreateNPC() 00172 { 00173 Query q(m_db); 00174 long qaccts = q.get_count("select count(*) from account"); 00175 long qfree = q.get_count("select count(*) from npc where player=0"); 00176 if (qfree > 10) 00177 return 0; 00178 00179 std::string name = GetRandomName(); 00180 if (random() % 100 < 10) 00181 name += " of " + GetRandomName(); 00182 db::Npc npc(m_db, name); 00183 if (npc.num) 00184 return 0; 00185 npc.name = name; 00186 npc.save(); 00187 00188 std::vector<long> skills; 00189 q.get_result("select num from skill"); 00190 while (q.fetch_row()) 00191 { 00192 skills.push_back(q.getval()); 00193 } 00194 q.free_result(); 00195 long skill = skills[random() % skills.size()]; 00196 db::Npcskill npcsk(m_db, npc.num, skill); 00197 npcsk.npc = npc.num; 00198 npcsk.skill = skill; 00199 npcsk.save(); 00200 00201 return npc.num; 00202 } 00203 00204 00205 void SimpleWeb::Run() 00206 { 00207 Query q(m_db); 00208 Query q2(m_db); 00209 char sql[1000]; 00210 db::Resource gold(m_db, "Gold"); 00211 db::Location home(m_db, "Homesville"); 00212 00213 q.get_result("select * from npc where player<>0 order by player"); 00214 while (q.fetch_row()) 00215 { 00216 db::Npc npc(&m_db, &q); 00217 sprintf(sql, "select * from npcskill where npc=%ld", npc.num); 00218 db::Npcskill npcsk(&m_db, sql); 00219 bool failed = false; 00220 00221 // gold check first 00222 { 00223 db::Linkskillresource x(m_db, npcsk.skill, gold.num); 00224 db::Playerresource y(m_db, npc.player, gold.num); 00225 if (y.amount < x.base_amount) // not enough gold 00226 { 00227 if (!npc.paid) // bye bye 00228 { 00229 // %! add message 00230 npc.player = 0; 00231 } 00232 else 00233 { 00234 npc.paid = 0; 00235 } 00236 } 00237 else 00238 { 00239 y.amount -= x.base_amount; 00240 y.save(); 00241 npc.paid = 1; 00242 } 00243 } 00244 00245 if (npc.paid) 00246 { 00247 // search for consumer that isn't gold 00248 bool consumer = false; 00249 sprintf(sql, "select * from linkskillresource where skill=%ld and resource<>%ld", npcsk.skill, gold.num); 00250 q2.get_result(sql); 00251 while (q2.fetch_row()) 00252 { 00253 db::Linkskillresource x(&m_db, &q2); 00254 db::Playerresource y(m_db, npc.player, x.resource); 00255 if (x.type == "Consumer") 00256 { 00257 consumer = true; 00258 break; 00259 } 00260 } 00261 q2.free_result(); 00262 /* 00263 consumer == false means that produced resources should be taken 00264 from current location 00265 */ 00266 00267 // check failed 00268 sprintf(sql, "select * from linkskillresource where skill=%ld and resource<>%ld", npcsk.skill, gold.num); 00269 q2.get_result(sql); 00270 while (q2.fetch_row()) 00271 { 00272 db::Linkskillresource x(&m_db, &q2); 00273 db::Playerresource y(m_db, npc.player, x.resource); 00274 db::Locationresource z(m_db, npc.location, x.resource); 00275 if (x.type == "Consumer") 00276 { 00277 if (y.amount < x.base_amount) 00278 { 00279 failed = true; 00280 break; 00281 } 00282 } 00283 if (x.type == "Producer" && !consumer) 00284 { 00285 if (z.amount < x.base_amount && npc.location != home.num) 00286 { 00287 failed = true; 00288 break; 00289 } 00290 } 00291 } 00292 q2.free_result(); 00293 00294 // execute if not failed 00295 if (!failed) 00296 { 00297 sprintf(sql, "select * from linkskillresource where skill=%ld and resource<>%ld", npcsk.skill, gold.num); 00298 q2.get_result(sql); 00299 while (q2.fetch_row()) 00300 { 00301 db::Linkskillresource x(&m_db, &q2); 00302 db::Playerresource y(m_db, npc.player, x.resource); 00303 db::Locationresource z(m_db, npc.location, x.resource); 00304 y.player = npc.player; 00305 y.resource = x.resource; 00306 if (x.type == "Producer") 00307 { 00308 y.amount += x.base_amount; 00309 if (!consumer && npc.location != home.num) 00310 { 00311 z.amount -= x.base_amount; 00312 z.save(); 00313 } 00314 } 00315 else 00316 if (x.type == "Consumer") 00317 { 00318 y.amount -= x.base_amount; 00319 } 00320 y.save(); 00321 } 00322 q2.free_result(); 00323 } 00324 } // if (npc.paid) 00325 npc.age_days++; 00326 npc.save(); 00327 } 00328 q.free_result(); 00329 } 00330 00331

Generated for simple by doxygen 1.3.7