00001 
#include "MainForm.h"
00002 
#include "SimpleWeb.h"
00003 
#include <libsimple.h>
00004 
00005 
00006 MainForm::MainForm(
SimpleWeb& www)
00007 :
BaseForm(www, "
MainForm")
00008 {
00009 }
00010 
00011 
00012 MainForm::~MainForm()
00013 {
00014 }
00015 
00016 
00017 void MainForm::Process()
00018 {
00019         Database& db = 
GetWeb().
GetDatabase();
00020         Query q(db);
00021         std::string action = GetForm() -> getvalue(GetFormName());
00022         
long skill = 
GetWeb().
GetSkill();
00023         
long building = 
GetWeb().
GetBuilding();
00024         
char sql[1000];
00025 
00026         
if (action == 
"logout")
00027         {
00028                 sprintf(sql, 
"delete from valid where account=%ld", 
GetWeb().GetAccount());
00029                 q.execute(sql);
00030                 
GetWeb().
SetAccount(0);
00031                 
GetWeb().
SetValid(0);
00032                 
GetWeb().
SetPlayer(0);
00033                 
return;
00034         }
00035         
else
00036         
if (action == 
"player")
00037         {
00038                 
GetWeb().
SetPlayer(0);
00039                 
return;
00040         }
00041         
else
00042         
if (action == 
"hire")
00043         {
00044                 
long num = atol(GetForm() -> getvalue(
"hire").c_str());
00045                 db::Npc npc(db, num);
00046                 db::Player pl(db, 
GetWeb().GetPlayer());
00047                 sprintf(sql, 
"select count(*) from npc where player=%ld and location=%ld", 
GetWeb().GetPlayer(), pl.location);
00048                 
long qnpcs = q.get_count(sql);
00049                 
long qbeds = 0;
00050                 sprintf(sql, 
"select * from playerbuilding where player=%ld and location=%ld", 
GetWeb().GetPlayer(), pl.location);
00051                 q.get_result(sql);
00052                 
while (q.fetch_row())
00053                 {
00054                         db::Playerbuilding x(&db, &q);
00055                         db::Building b(db, x.building);
00056                         qbeds += b.beds;
00057                 }
00058                 q.free_result();
00059 
00060                 
if (!npc.player && qnpcs < qbeds)
00061                 {
00062                         sprintf(sql, 
"select * from npcskill where npc=%ld", npc.num);
00063                         db::Npcskill npcsk(&db, sql);
00064                         db::Resource gold(db, 
"Gold");
00065                         db::Linkskillresource x(db, npcsk.skill, gold.num);
00066                         db::Playerresource y(db, 
GetWeb().GetPlayer(), gold.num);
00067                         
if (y.amount >= x.base_amount)
00068                         {
00069                                 y.amount -= x.base_amount;
00070                                 y.save();
00071                                 npc.player = 
GetWeb().
GetPlayer();
00072                                 npc.paid = 1;
00073                                 npc.location = pl.location;
00074                                 npc.save();
00075                         }
00076                 }
00077                 
return;
00078         }
00079         
else
00080         
if (action == 
"fire")
00081         {
00082                 
long num = atol(GetForm() -> getvalue(
"fire").c_str());
00083                 db::Npc npc(db, num);
00084                 
if (npc.player == 
GetWeb().
GetPlayer())
00085                 {
00086                         npc.player = 0;
00087                         npc.save();
00088                 }
00089                 
return;
00090         }
00091         
else
00092         
if (action == 
"travel")
00093         {
00094                 
long num = atol(GetForm() -> getvalue(
"travel").c_str());
00095                 db::Player pl(db, 
GetWeb().GetPlayer());
00096                 db::Locationlink x(db, pl.location, num);
00097                 
if (x.location1 == pl.location && x.location2 == num) 
00098                 {
00099                         pl.location = num;
00100                         pl.save();
00101                 }
00102                 
return;
00103         }
00104         db::Account acct(db, 
GetWeb().GetAccount());
00105         
if (!acct.superuser)
00106         {
00107                 
return;
00108         }
00109         
00110         
if (action == 
"skill_create")
00111         {
00112                 std::string name = GetForm() -> getvalue(
"skill_name");
00113                 std::string rname = GetForm() -> getvalue(
"resource_name");
00114                 std::string prod = GetForm() -> getvalue(
"prod"); 
00115                 
long num = atol(GetForm() -> getvalue(
"skill").c_str());
00116                 
long rtoadd = atol(GetForm() -> getvalue(
"resource").c_str());
00117                 
long amount = atol(GetForm() -> getvalue(
"amount").c_str());
00118                 
if (rname.size())
00119                 {
00120                         db::Resource r(db, rname);
00121                         r.name = rname;
00122                         r.save();
00123                 }
00124                 
if (name.size())
00125                 {
00126                         db::Skill sk(db, name);
00127                         sk.name = name;
00128                         sk.save();
00129                 }
00130                 
if (num)
00131                 {
00132                         
GetWeb().
SetSkill(num);
00133                         skill = num;
00134                 }
00135                 
if (skill && rtoadd)
00136                 {
00137                         db::Linkskillresource x(db, skill, rtoadd);
00138                         x.skill = skill;
00139                         x.resource = rtoadd;
00140                         x.type = prod;
00141                         x.base_amount = amount;
00142                         x.save();
00143                 }
00144         }
00145         
else
00146         
if (action == 
"unlink" && skill)
00147         {
00148                 
long resource = atol(GetForm() -> getvalue(
"unlink").c_str());
00149                 db::Linkskillresource x(db, skill, resource);
00150                 x.erase();
00151         }
00152         
else
00153         
if (action == 
"building")
00154         {
00155                 
long num = atol(GetForm() -> getvalue(
"building").c_str());
00156                 
long rtoadd = atol(GetForm() -> getvalue(
"resource").c_str());
00157                 
long amount = atol(GetForm() -> getvalue(
"amount").c_str());
00158                 std::string name = GetForm() -> getvalue(
"building_name");
00159                 
long beds = atol(GetForm() -> getvalue(
"beds").c_str());
00160                 
if (name.size())
00161                 {
00162                         db::Building b(db, name);
00163                         b.name = name;
00164                         b.beds = beds;
00165                         b.save();
00166                 }
00167                 
if (num)
00168                 {
00169                         
GetWeb().
SetBuilding(num);
00170                         building = num;
00171                 }
00172                 
if (building && rtoadd)
00173                 {
00174                         db::Buildingresource x(db, building, rtoadd);
00175                         x.building = building;
00176                         x.resource = rtoadd;
00177                         x.amount = amount;
00178                         x.save();
00179                 }
00180         }
00181         
else
00182         
if (action == 
"unlinkbr" && building)
00183         {
00184                 
long resource = atol(GetForm() -> getvalue(
"unlinkbr").c_str());
00185                 db::Buildingresource x(db, building, resource);
00186                 x.erase();
00187         }
00188         
else
00189         
if (action == 
"run")
00190         {
00191                 
GetWeb().
Run();
00192         }
00193         
else
00194         
if (action == 
"supervy")
00195         {
00196                 
GetWeb().
SetSuperuservy(1);
00197         }
00198         
else
00199         
if (action == 
"normalvy")
00200         {
00201                 
GetWeb().
SetSuperuservy(0);
00202         }
00203         
else
00204         
if (action == 
"loc_create")
00205         {
00206                 std::string name = GetForm() -> getvalue(
"location_name");
00207                 
long max = atol(GetForm() -> getvalue(
"max").c_str());
00208                 
long num = atol(GetForm() -> getvalue(
"location").c_str());
00209                 db::Location loc(db, name);
00210                 
if (num)
00211                 {
00212                         
GetWeb().
SetLocation(num);
00213                 }
00214                 
if (!loc.num && name.size())
00215                 {
00216                         db::Player pl(db, 
GetWeb().GetPlayer());
00217                         loc.name = name;
00218                         loc.max_buildings = max;
00219                         loc.save();
00220                         {
00221                                 db::Locationlink x(db, loc.num, pl.location);
00222                                 x.location1 = loc.num;
00223                                 x.location2 = pl.location;
00224                                 x.save();
00225                         }
00226                         {
00227                                 db::Locationlink x(db, pl.location, loc.num);
00228                                 x.location1 = pl.location;
00229                                 x.location2 = loc.num;
00230                                 x.save();
00231                         }
00232                         q.get_result(
"select * from resource");
00233                         
while (q.fetch_row())
00234                         {
00235                                 db::Resource r(&db, &q);
00236                                 
if (random() % 100 >= 10)
00237                                 {
00238                                         db::Locationresource x(db, loc.num, r.num);
00239                                         x.location = loc.num;
00240                                         x.resource = r.num;
00241                                         x.amount = 1000 + random() % 10000;
00242                                         x.save();
00243                                 }
00244                         }
00245                         q.free_result();
00246                 }
00247                 
if (name.size())
00248                 {
00249                         loc.name = name;
00250                         loc.max_buildings = max;
00251                         loc.save();
00252                 }
00253         }
00254 }
00255 
00256 
00257 void MainForm::Display(
long)
00258 {
00259         Database& db = 
GetWeb().
GetDatabase();
00260         Query q(db);
00261         db::Account acct(db, 
GetWeb().GetAccount());
00262         db::Player pl(db, 
GetWeb().GetPlayer());
00263         db::Location loc(db, pl.location);
00264         
char sql[1000];
00265 
00266         sprintf(sql, 
"select count(*) from npc where player=%ld and location=%ld", pl.num, pl.location);
00267         
long qnpcs = q.get_count(sql);
00268         
long qbeds = 0;
00269 
00270         sprintf(sql, 
"select * from playerbuilding where player=%ld and location=%ld", pl.num, pl.location);
00271         q.get_result(sql);
00272         
while (q.fetch_row())
00273         {
00274                 db::Playerbuilding x(&db, &q);
00275                 db::Building b(db, x.building);
00276                 qbeds += b.beds;
00277         }
00278         q.free_result();
00279 
00280         
00281         Header(db, q, acct, pl, loc, sql);
00282 
00283         
if (!
GetWeb().
GetSuperuservy() || !acct.superuser)
00284         {
00285                 printf(
"<table cellpadding=0 cellspacing=0><tr>");
00286                 printf(
"<td valign='top'>");
00287                 
00288                 printf(
"<div class=box style='background: #e0ffe0'>");
00289                 printf(
"<u>NPC's available for hire</u><br>");
00290                 
if (qnpcs < qbeds)
00291                 {
00292                         q.get_result(
"select * from npc where player=0 order by name");
00293                         
while (q.fetch_row())
00294                         {
00295                                 db::Npc npc(&db, &q);
00296                                 sprintf(sql, 
"select * from npcskill where npc=%ld", npc.num);
00297                                 db::Npcskill npcsk(&db, sql);
00298                                 db::Skill sk(db, npcsk.skill);
00299                                 printf(
"<b>%s</b>, age <b>%ld</b> days, <b>%s</b> [ <a class=button href='%s?%s=hire&hire=%ld'>Hire</a> ]<br>",
00300                                         npc.name.c_str(), npc.age_days, sk.name.c_str(),
00301                                         
GetWeb().GetCgiName().c_str(), GetFormName().c_str(), npc.num);
00302                         }
00303                         q.free_result();
00304                 }
00305                 
else
00306                 {
00307                         printf(
"<p>No space available - build more buildings.</p>");
00308                 }
00309                 printf(
"</div>");
00310                 printf(
"</td>");
00311                 
00312                 sprintf(sql, 
"select * from npc where player=%ld", pl.num);
00313                 q.get_result(sql);
00314                 
if (q.num_rows())
00315                 {
00316                         printf(
"<td valign='top'>");
00317                         printf(
"<div class=box style='background: #ffffe0'>");
00318 
00319                         printf(
"<u>Your hired npc's</u><br>");
00320                         
while (q.fetch_row())
00321                         {
00322                                 db::Npc npc(&db, &q);
00323                                 sprintf(sql, 
"select * from npcskill where npc=%ld", npc.num);
00324                                 db::Npcskill npcsk(&db, sql);
00325                                 db::Skill sk(db, npcsk.skill);
00326                                 printf(
"<b>%s</b>, age <b>%ld</b> days, <b>%s</b> [ <a class=button href='%s?%s=fire&fire=%ld'>Fire</a> ]<br>",
00327                                         npc.name.c_str(), npc.age_days, sk.name.c_str(),
00328                                         
GetWeb().GetCgiName().c_str(), GetFormName().c_str(), npc.num);
00329                         }
00330                         printf(
"</div>");
00331                         printf(
"</td>");
00332                 }
00333                 q.free_result();
00334 
00335                 
00336                 printf(
"<td valign='top'>");
00337                 printf(
"<div class=box style='background: #ffffe0'>");
00338 
00339                 printf(
"<u>Your resources</u><br>");
00340                 sprintf(sql, 
"select * from playerresource where player=%ld", pl.num);
00341                 q.get_result(sql);
00342                 
while (q.fetch_row())
00343                 {
00344                         db::Playerresource x(&db, &q);
00345                         db::Resource r(db, x.resource);
00346                         printf(
"<b>%s</b>, amount <b>%ld</b><br>", r.name.c_str(), x.amount);
00347                 }
00348                 q.free_result();
00349 
00350                 printf(
"</div>");
00351                 printf(
"</td>");
00352                 
00353                 printf(
"<td valign='top'>");
00354                 printf(
"<div class=box style='background: #ffffe0'>");
00355                 printf(
"<u>Current location</u><br>");
00356                 printf(
"<b>%s</b><br>", loc.name.c_str());
00357                 sprintf(sql, 
"select * from locationlink where location1=%ld", loc.num);
00358                 q.get_result(sql);
00359                 
while (q.fetch_row())
00360                 {
00361                         db::Locationlink x(&db, &q);
00362                         db::Location l(db, x.location2);
00363                         printf(
"<a class=button href='%s?%s=travel&travel=%ld'>Travel to %s</a><br>",
00364                                 
GetWeb().GetCgiName().c_str(), GetFormName().c_str(), x.location2, l.name.c_str());
00365                 }
00366                 q.free_result();
00367                 printf(
"</div>");
00368                 
00369                 printf(
"<div class=box style='background: #ffffe0'>");
00370 
00371                 printf(
"<u>Your buildings in <b>%s</b></u><br>", loc.name.c_str());
00372                 sprintf(sql, 
"select * from playerbuilding where player=%ld and location=%ld", pl.num, pl.location);
00373                 q.get_result(sql);
00374                 
while (q.fetch_row())
00375                 {
00376                         db::Playerbuilding x(&db, &q);
00377                         db::Building b(db, x.building);
00378                         printf(
"<b>%s</b>, <b>%ld</b> beds<br>",
00379                                 b.name.c_str(), b.beds);
00380                 }
00381                 q.free_result();
00382                 printf(
"<a class=button href='%s?BuildForm=try_build'>Build</a>", 
GetWeb().GetCgiName().c_str());
00383 
00384                 printf(
"</div>");
00385                 printf(
"</td>");
00386                 printf(
"</tr></table>");
00387         }
00388 
00389         
00390         
if (
GetWeb().
GetSuperuservy() && acct.superuser)
00391         {
00392                 
00393                 printf(
"<table cellpadding=0 cellspacing=0><tr><td valign='top'>");
00394                 printf(
"<div class=box style='background: #ffe0e0'>");
00395                 printf(
"<form method='POST' action='%s'>", 
GetWeb().GetCgiName().c_str());
00396                 printf(
"<input type=hidden name='%s' value='skill_create'>", GetFormName().c_str());
00397                 q.get_result(
"select * from skill order by name");
00398                 printf(
"Edit Skill: <select name=skill><option>");
00399                 
while (q.fetch_row())
00400                 {
00401                         db::Skill sk(&db, &q);
00402                         printf(
"<option value=%ld%s>%s", sk.num, 
00403                                 (sk.num == GetWeb().GetSkill()) ? 
" selected" : 
"",
00404                                 sk.name.c_str());
00405                 }
00406                 q.free_result();
00407                 printf(
"</select><input type=submit name=submit value=' Select '><br>");
00408                 
if (
GetWeb().
GetSkill())
00409                 {
00410                         db::Skill sk(db, 
GetWeb().GetSkill());
00411                         printf(
"<div class=box style='background: #ffc0c0'>");
00412                         printf(
"Selected skill: <b>%s</b><br>", sk.name.c_str());
00413                         printf(
"<div class=box style='background: #ffe0e0'>");
00414                         printf(
"Resource: <select name=resource><option>");
00415                         q.get_result(
"select * from resource order by name");
00416                         
while (q.fetch_row())
00417                         {
00418                                 db::Resource r(&db, &q);
00419                                 printf(
"<option value=%ld>%s", r.num, r.name.c_str());
00420                         }
00421                         q.free_result();
00422                         printf(
"</select><br>");
00423                         printf(
"Type: <input type=radio name=prod value='Producer'>Producer\n");
00424                         printf(
"<input type=radio name=prod value='Consumer'>Consumer<br>");
00425                         printf(
"BaseAmount: <input type=text name=amount size=8> units/day");
00426                         printf(
"<br>");
00427                         printf(
"<input type=submit name=submit value=' Add selected resource '><br>");
00428                         printf(
"</div>");
00429                         sprintf(sql, 
"select * from linkskillresource where skill=%ld", sk.num);
00430                         q.get_result(sql);
00431                         
while (q.fetch_row())
00432                         {
00433                                 db::Linkskillresource l(&db, &q);
00434                                 db::Resource r(db, l.resource);
00435                                 printf(
"Linked resource: <b>%s</b> %s, %ld units/day [ <a href='%s?%s=unlink&unlink=%ld'>unlink resource</a> ]<br>", 
00436                                         r.name.c_str(), l.type.c_str(), l.base_amount,
00437                                         
GetWeb().GetCgiName().c_str(), GetFormName().c_str(), r.num);
00438                         }
00439                         q.free_result();
00440                         printf(
"</div>");
00441                 }
00442                 printf(
"Skill name to create<br>");
00443                 printf(
"<input type=text name=skill_name><br>");
00444                 printf(
"Resource name to create<br>");
00445                 printf(
"<input type=text name=resource_name><br>");
00446                 printf(
"<input type=submit name=submit value=' Edit / Create Skill '>");
00447                 
00448                 printf(
"</form>");
00449                 printf(
"</div>"); 
00450                 printf(
"</td><td valign='top'>");
00451                 printf(
"<div class=box style='background: #ffe0e0'>");
00452                 printf(
"<form method='POST' action='%s'>", 
GetWeb().GetCgiName().c_str());
00453                 printf(
"<input type=hidden name='%s' value='building'>", GetFormName().c_str());
00454                 q.get_result(
"select * from building order by name");
00455                 printf(
"Edit building: <select name=building><option>");
00456                 
while (q.fetch_row())
00457                 {
00458                         db::Building b(&db, &q);
00459                         printf(
"<option value=%ld%s>%s", b.num, 
00460                                 (b.num == GetWeb().GetBuilding()) ? 
" selected" : 
"",
00461                                 b.name.c_str());
00462                 }
00463                 q.free_result();
00464                 printf(
"</select><input type=submit name=submit value=' Select '><br>");
00465                 
00466                 
if (
GetWeb().
GetBuilding())
00467                 {
00468                         db::Building sk(db, 
GetWeb().GetBuilding());
00469                         printf(
"<div class=box style='background: #ffc0c0'>");
00470                         printf(
"Selected building: <b>%s</b><br>", sk.name.c_str());
00471                         printf(
"Beds: <b>%ld</b><br>", sk.beds);
00472                         printf(
"<div class=box style='background: #ffe0e0'>");
00473                         printf(
"Resource: <select name=resource><option>");
00474                         q.get_result(
"select * from resource order by name");
00475                         
while (q.fetch_row())
00476                         {
00477                                 db::Resource r(&db, &q);
00478                                 printf(
"<option value=%ld>%s", r.num, r.name.c_str());
00479                         }
00480                         q.free_result();
00481                         printf(
"</select><br>");
00482                         printf(
"Amount: <input type=text name=amount size=8> units");
00483                         printf(
"<br>");
00484                         printf(
"<input type=submit name=submit value=' Add selected resource '><br>");
00485                         printf(
"</div>");
00486                         sprintf(sql, 
"select * from buildingresource where building=%ld", sk.num);
00487                         q.get_result(sql);
00488                         
while (q.fetch_row())
00489                         {
00490                                 db::Buildingresource l(&db, &q);
00491                                 db::Resource r(db, l.resource);
00492                                 printf(
"Linked resource: <b>%s</b>, <b>%ld</b> units [ <a href='%s?%s=unlinkbr&unlinkbr=%ld'>unlink resource</a> ]<br>", 
00493                                         r.name.c_str(), l.amount,
00494                                         
GetWeb().GetCgiName().c_str(), GetFormName().c_str(), r.num);
00495                         }
00496                         q.free_result();
00497                         printf(
"</div>");
00498                 }
00499                 printf(
"Building name to create<br>");
00500                 printf(
"<input type=text name=building_name><br>");
00501                 printf(
"Number of beds<br>");
00502                 printf(
"<input type=text name=beds size=10><br>");
00503                 printf(
"<input type=submit name=submit value=' Submit '>");
00504 
00505                 printf(
"</form>");
00506                 printf(
"</div>");
00507                 
00508                 sprintf(sql, 
"select count(*) from locationlink where location1=%ld", pl.location);
00509                 
long qlinks = q.get_count(sql);
00510                 
if (qlinks < 3)
00511                 {
00512                         printf(
"</td><td valign='top'>");
00513                         printf(
"<div class=box style='background: #ffe0e0'>");
00514                         printf(
"<form method='POST' action='%s'>", 
GetWeb().GetCgiName().c_str());
00515                         printf(
"<input type=hidden name='%s' value='loc_create'>", GetFormName().c_str());
00516 
00517                         q.get_result(
"select * from location order by name");
00518                         printf(
"Edit location: <select name=location><option>");
00519                         
while (q.fetch_row())
00520                         {
00521                                 db::Location sk(&db, &q);
00522                                 printf(
"<option value=%ld%s>%s", sk.num, 
00523                                         (sk.num == GetWeb().GetLocation()) ? 
" selected" : 
"",
00524                                         sk.name.c_str());
00525                         }
00526                         q.free_result();
00527                         printf(
"</select><input type=submit name=submit value=' Select '><br>");
00528                         
00529                         
if (
GetWeb().
GetLocation())
00530                         {
00531                                 db::Location sk(db, 
GetWeb().GetLocation());
00532                                 printf(
"<div class=box style='background: #ffc0c0'>");
00533                                 printf(
"Selected location: <b>%s</b><br>", sk.name.c_str());
00534                                 printf(
"Max buildings: <b>%ld</b><br>", sk.max_buildings);
00535                                 sprintf(sql, 
"select * from locationresource where location=%ld", sk.num);
00536                                 q.get_result(sql);
00537                                 
while (q.fetch_row())
00538                                 {
00539                                         db::Locationresource l(&db, &q);
00540                                         db::Resource r(db, l.resource);
00541                                         printf(
"Linked resource: <b>%s</b>, <b>%ld</b> units<br>", 
00542                                                 r.name.c_str(), l.amount);
00543                                 }
00544                                 q.free_result();
00545                                 printf(
"</div>");
00546                         }
00547 
00548                         printf(
"Create location<br>(Current location: <b>%s</b>)<br>", loc.name.c_str());
00549                         printf(
"<input type=text name=location_name><br>");
00550                         printf(
"Max buildings<br>");
00551                         printf(
"<input type=text name=max size=10><br>");
00552                         printf(
"<input type=submit name=submit value=' Create '>");
00553                         
00554                         printf(
"</form>");
00555                         printf(
"</div>");
00556                 }
00557                 printf(
"</td></tr></table>");
00558         }
00559 }
00560 
00561