00001
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
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();
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
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)
00226 {
00227
if (!npc.paid)
00228 {
00229
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
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
00264
00265
00266
00267
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
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 }
00325 npc.age_days++;
00326 npc.save();
00327 }
00328 q.free_result();
00329 }
00330
00331