Main Page   Data Structures   File List   Data Fields   Globals   Related Pages  

palm/savegame.c

Go to the documentation of this file.
00001 
00006 #include <PalmOS.h>
00007 #include <StringMgr.h>
00008 #include <unix_string.h>
00009 #include <unix_stdlib.h>
00010 #include <StdIOPalm.h>
00011 #include <stddef.h>
00012 #include <simcity.h>
00013 #include <simcity_resconsts.h>
00014 #include <savegame.h>
00015 #include <savegame_be.h>
00016 #include <logging.h>
00017 #include <globals.h>
00018 #include <zakdef.h>
00019 #include <drawing.h>
00020 #include <build.h>
00021 #include <handler.h>
00022 #include <simulation.h>
00023 #include <resCompat.h>
00024 #include <palmutils.h>
00025 #include <repeathandler.h>
00026 
00027 static void UpdateSaveGameList(void) SAVE_SECTION;
00028 static void CleanSaveGameList(void) SAVE_SECTION;
00029 static void DeleteFromList(void) SAVE_SECTION;
00030 static int  LoadFromList(void) SAVE_SECTION;
00031 
00032 static FormPtr filesSetup(FormPtr form) SAVE_SECTION;
00033 
00034 static void cnCancelButtonPressed(void) SAVE_SECTION;
00035 static void cnCreateButtonPressed(void) SAVE_SECTION;
00036 static FormPtr cityNewSetup(FormPtr form) SAVE_SECTION;
00037 static void cnFieldContentChanged(UInt16 fieldID) SAVE_SECTION;
00038 static void cnRepeatPressed(EventPtr event) SAVE_SECTION;
00039 
00040 #if defined(HRSUPPORT)
00041 static Boolean resizeSavegameForm(FormPtr form, Int16 hOff,
00042     Int16 vOff) SAVE_SECTION;
00043 #else
00044 #define resizeSavegameForm(F,H,V)
00045 #endif
00046 
00048 #define LASTGAME                ((UInt16)~0)
00049 
00050 #define MAXSAVEGAMECOUNT        50
00051 
00053 static char **citylist;
00054 
00055 int
00056 UILoadAutoGame(void)
00057 {
00058         return (LoadAutoSave());
00059 }
00060 
00061 void
00062 UIClearAutoSaveSlot(void)
00063 {
00064         DeleteAutoSave();
00065 }
00066 
00070 void
00071 UISaveMyCity(void)
00072 {
00073         SaveGameByName((char *)game.cityname);
00074 }
00075 
00079 void
00080 UISaveAutoGame(void)
00081 {
00082         SetAutoSave((char *)game.cityname);
00083         UISaveMyCity();
00084 }
00085 
00089 Boolean
00090 hFilesNew(EventPtr event)
00091 {
00092         Boolean handled = false;
00093         FormPtr form;
00094         UInt16 fieldID;
00095         WChar chr;
00096 
00097         switch (event->eType) {
00098         case frmOpenEvent:
00099                 SetGameNotInProgress();
00100                 form = FrmGetActiveForm();
00101                 SetSilkResizable(form, true);
00102                 collapseMove(form, CM_DEFAULT, NULL, NULL);
00103                 FrmDrawForm(cityNewSetup(form));
00104                 handled = true;
00105                 break;
00106         case frmCloseEvent:
00107                 break;
00108         case keyDownEvent:
00109                 form = FrmGetActiveForm();
00110                 fieldID = FrmGetObjectId(form, FrmGetFocus(form));
00111                 if (fieldID < fieldID_width || fieldID > fieldID_width)
00112                         break;
00113 
00114                 chr = event->data.keyDown.chr;
00115                 if (((chr >= chrDigitZero) && (chr <= chrDigitNine)) ||
00116                         (chr == chrBackspace)) {
00117                         EvtEnqueueKey(chrTilde, 0, 0);
00118                         break;
00119                 }
00120                 if (chr == chrTilde)
00121                         cnFieldContentChanged(fieldID);
00122                 break;
00123 
00124         case ctlRepeatEvent:
00125                 cnRepeatPressed(event);
00126                 break;
00127         case ctlSelectEvent:
00128                 switch (event->data.ctlSelect.controlID) {
00129                 case buttonID_FilesNewCreate:
00130                         cnCreateButtonPressed();
00131                         handled = true;
00132                         break;
00133                 case buttonID_FilesNewCancel:
00134                         cnCancelButtonPressed();
00135                         handled = true;
00136                         break;
00137                 }
00138                 break;
00139 #if defined(HRSUPPORT)
00140         case winDisplayChangedEvent:
00141 #if defined(SONY_CLIE)
00142         case vchrSilkResize:
00143 #endif
00144                 form = FrmGetActiveForm();
00145                 if (collapseMove(form, CM_DEFAULT, NULL, NULL)) {
00146                         FrmEraseForm(form);
00147                         FrmDrawForm(form);
00148                 }
00149                 handled = true;
00150                 break;
00151 #endif
00152         default:
00153                 break;
00154         }
00155 
00156         return (handled);
00157 }
00158 
00162 static buttonmapping_t mapsize_map[] = {
00163         { rbutton_widthdown, rbutton_widthup, fieldID_width, 50, 120, 0, 0 },
00164         { rbutton_heightdown, rbutton_heightup, fieldID_height, 50, 120, 0, 0 },
00165         { 0, 0, 0, 0, 0, 0, 0 }
00166 };
00167 
00172 static void
00173 cnRepeatPressed(EventPtr event)
00174 {
00175         UInt16 control = event->data.ctlRepeat.controlID;
00176         (void) processRepeater(mapsize_map, control, true, NULL);
00177 }
00178 
00183 static void
00184 cnFieldContentChanged(UInt16 fieldID)
00185 {
00186         (void) processRepeater(mapsize_map, fieldID, false, NULL);
00187 }
00188 
00189 /*
00190  * \brief react to cancel button being pressed on newcity form.
00191  *
00192  * The cancel button is pressed in the new city form
00193  * Note the use of the returntoform api, this is means the last
00194  * form is reopened, and the frmcloseevent isn't sent to the
00195  * form that's being closed.
00196  */
00197 static void
00198 cnCancelButtonPressed(void)
00199 {
00200         game.cityname[0] = '\0';
00201         FrmReturnToForm(0);
00202 }
00203 
00207 static void
00208 cnCreateButtonPressed(void)
00209 {
00210         char *pGameName;
00211         FormPtr form;
00212         UInt8 level = 0;
00213         UInt8 width;
00214         UInt8 height;
00215         FieldPtr fp;
00216         MemHandle mh;
00217         MemPtr mp;
00218 
00219         InitGameStruct();
00220 
00221         form = FrmGetActiveForm();
00222         if (FrmGetControlValue(form, FrmGetObjectIndex(form, buttonID_Easy)))
00223                 level = 0;
00224         if (FrmGetControlValue(form, FrmGetObjectIndex(form, buttonID_Medium)))
00225                 level = 1;
00226         if (FrmGetControlValue(form, FrmGetObjectIndex(form, buttonID_Hard)))
00227                 level = 2;
00228         setDifficultyLevel(level);
00229 
00230         if (FrmGetControlValue(form, FrmGetObjectIndex(form,
00231             buttonID_dis_off)))
00232                 level = 0;
00233         if (FrmGetControlValue(form, FrmGetObjectIndex(form,
00234             buttonID_dis_one)))
00235                 level = 1;
00236         if (FrmGetControlValue(form, FrmGetObjectIndex(form,
00237             buttonID_dis_two)))
00238                 level = 2;
00239         if (FrmGetControlValue(form, FrmGetObjectIndex(form,
00240             buttonID_dis_three)))
00241                 level = 3;
00242         setDisasterLevel(level);
00243 
00244         fp = (FieldPtr)GetObjectPtr(form, fieldID_width);
00245         mh = FldGetTextHandle(fp);
00246         mp = MemHandleLock(mh);
00247         width = (UInt8)StrAToI(mp);
00248         MemHandleUnlock(mh);
00249         fp = (FieldPtr)GetObjectPtr(form, fieldID_height);
00250         mh = FldGetTextHandle(fp);
00251         mp = MemHandleLock(mh);
00252         height = (UInt8)StrAToI(mp);
00253         MemHandleUnlock(mh);
00254         setMapSize(width, height);
00255         ConfigureNewGame();
00256 
00257         pGameName = FldGetTextPtr((FieldPtr)GetObjectPtr(form,
00258             fieldID_newGameName));
00259         if (pGameName != NULL) {
00260                 MemSet(game.cityname, CITYNAMELEN, '\0');
00261                 StrNCopy((char *)game.cityname, pGameName, CITYNAMELEN);
00262                 while (GameExists((char *)game.cityname)) {
00263                         UInt16 slen = StrLen((char *)game.cityname);
00264                         if (slen < CITYNAMELEN-1) {
00265                                 game.cityname[slen-1] = '0' - 1;
00266                                 game.cityname[slen] = '\0';
00267                                 slen++;
00268                         }
00269                         game.cityname[slen - 1]++;
00270                 }
00271                 SaveGameByName((char *)game.cityname);
00272                 CleanSaveGameList();
00273                 if (LoadGameByName((char *)game.cityname) != -1) {
00274                         FrmEraseForm(form);
00275                         form = FrmGetFormPtr(formID_files);
00276                         if (form != NULL) {
00277                                 FrmEraseForm(form);
00278                                 FrmDeleteForm(form);
00279                         }
00280                         FrmGotoForm(formID_pocketCity);
00281                 } else {
00282                         UpdateSaveGameList();
00283                 }
00284         } else {
00285                 game.cityname[0] = '\0';
00286                 WriteLog("No name specified\n");
00287         }
00288 }
00289 
00295 static FormPtr
00296 cityNewSetup(FormPtr form)
00297 {
00298         int i;
00299         MemHandle hText;
00300         MemPtr pText;
00301 
00302         FrmSetFocus(form, FrmGetObjectIndex(form, fieldID_newGameName));
00303         FrmSetControlValue(form, FrmGetObjectIndex(form, buttonID_Easy), 1);
00304         FrmSetControlValue(form, FrmGetObjectIndex(form, buttonID_dis_one), 1);
00305 
00306         for (i = 0; i < 2; i++) {
00307                 hText = MemHandleNew(5);
00308                 pText = MemHandleLock(hText);
00309                 StrPrintF((char *)pText, "%u", 100);
00310                 MemHandleUnlock(hText);
00311                 FldSetTextHandle((FieldPtr)GetObjectPtr(form,
00312                     (UInt16)(fieldID_width + i)), hText);
00313         }
00314 
00315         return (form);
00316 }
00317 
00322 Boolean
00323 hFiles(EventPtr event)
00324 {
00325         Boolean handled = false;
00326         FormPtr form;
00327 #if defined(HRSUPPORT)
00328         Int16 hOff = 0, vOff = 0;
00329 #endif
00330 
00331         switch (event->eType) {
00332         case frmOpenEvent:
00333                 form = FrmGetActiveForm();
00334                 SetSilkResizable(form, true);
00335                 collapseMove(form, CM_DEFAULT, &hOff, &vOff);
00336                 resizeSavegameForm(form, hOff, vOff);
00337                 filesSetup(form);
00338                 FrmDrawForm(form);
00339                 handled = true;
00340                 break;
00341         case frmCloseEvent:
00342                 CleanSaveGameList();
00343                 SetSilkResizable(NULL, false);
00344                 break;
00345         case ctlSelectEvent:
00346                 switch (event->data.ctlSelect.controlID) {
00347                 case buttonID_FilesNew:
00348                         /* create new game and add it to the list */
00349                         FrmPopupForm(formID_filesNew);
00350                         handled = true;
00351                         break;
00352                 case buttonID_FilesLoad:
00353                         /* create new game */
00354                         if (LoadFromList() != -1)
00355                                 FrmGotoForm(formID_pocketCity);
00356                         handled = true;
00357                         break;
00358                 case buttonID_FilesDelete:
00359                         DeleteFromList();
00360                         CleanSaveGameList();
00361                         UpdateSaveGameList();
00362                         handled = true;
00363                         break;
00364                 }
00365                 break;
00366 #if defined(HRSUPPORT)
00367         case winDisplayChangedEvent:
00368 #if defined(SONY_CLIE)
00369         case vchrSilkResize:
00370 #endif
00371                 form = FrmGetActiveForm();
00372                 if (collapseMove(form, CM_DEFAULT, &hOff, &vOff)) {
00373                         resizeSavegameForm(form, hOff, vOff);
00374                         FrmDrawForm(form);
00375                 }
00376                 handled = true;
00377                 break;
00378 #endif
00379         default:
00380                 break;
00381         }
00382 
00383         return (handled);
00384 }
00385 
00391 static FormPtr
00392 filesSetup(FormPtr form)
00393 {
00394         SetGameNotInProgress();
00395         UpdateSaveGameList();
00396 
00397         return (form);
00398 }
00399 
00400 #if defined(HRSUPPORT)
00401 
00410 static Boolean
00411 resizeSavegameForm(FormPtr form, Int16 hOff, Int16 vOff)
00412 {
00413         if (!(hOff || vOff))
00414                 return (false);
00415 
00416         RearrangeObjectOnly(form, listID_FilesList, 0, 0, hOff, vOff);
00417         RearrangeObjectOnly(form, buttonID_FilesNew, 0, vOff, 0, 0);
00418         RearrangeObjectOnly(form, buttonID_FilesLoad, 0, vOff, 0, 0);
00419         RearrangeObjectOnly(form, buttonID_FilesDelete, 0, vOff, 0, 0);
00420         return (true);
00421 }
00422 
00423 #endif /* HRSUPPORT */
00424 
00432 static void
00433 UpdateSaveGameList(void)
00434 {
00435         int count;
00436         FormPtr files_form;
00437         ListPtr list;
00438 
00439         if (citylist != NULL)
00440                 FreeCityNames(citylist);
00441 
00442         citylist = CityNames(&count);
00443 
00444         files_form = FrmGetFormPtr((UInt16)formID_files);
00445 
00446         if (files_form == NULL) {
00447                 WriteLog("could not get the files form pointer\n");
00448                 return;
00449         }
00450         list = (ListPtr)GetObjectPtr(files_form, listID_FilesList);
00451 
00452         if (list == NULL) {
00453                 WriteLog("Could not get the pointer for list\n");
00454                 return;
00455         }
00456 
00457         if (NULL == citylist) {
00458                 LstSetListChoices(list, NULL, 0);
00459                 if (files_form == FrmGetActiveForm() && FrmVisible(files_form))
00460                         LstDrawList(list);
00461                 return; /* no cities */
00462         }
00463 
00464         /* update list */
00465         LstSetListChoices(list, citylist, count);
00466         if (files_form == FrmGetActiveForm() && FrmVisible(files_form))
00467                 LstDrawList(list);
00468 }
00469 
00476 static void
00477 CleanSaveGameList(void)
00478 {
00479         ListPtr listp;
00480         FormPtr form = FrmGetFormPtr(formID_files);
00481 
00482         if (form == NULL)
00483                 return;
00484         listp = (ListPtr)GetObjectPtr(form, listID_FilesList);
00485         if (listp == NULL)
00486                 return;
00487 
00488         LstSetListChoices(listp, NULL, 0);
00489 
00490         FreeCityNames(citylist);
00491         citylist = NULL;
00492 }
00493 
00500 static int
00501 LoadFromList(void)
00502 {
00503         FormPtr form = FrmGetFormPtr(formID_files);
00504         ListPtr listp;
00505         int index;
00506 
00507         listp = (ListPtr)GetObjectPtr(form, listID_FilesList);
00508         index = LstGetSelection(listp);
00509         if (index >= 0) {
00510                 char *text = LstGetSelectionText(listp, index);
00511                 return (LoadGameByName(text));
00512         } else {
00513                 return (-1);
00514         }
00515 }
00516 
00523 static void
00524 DeleteFromList(void)
00525 {
00526         FormPtr form = FrmGetFormPtr(formID_files);
00527         ListPtr listp;
00528         Int16 index;
00529 
00530         listp = (ListPtr)GetObjectPtr(form, listID_FilesList);
00531         index = LstGetSelection(listp);
00532         if (index != noListSelection) {
00533                 char *name;
00534                 name = LstGetSelectionText(listp, index);
00535                 DeleteGameByName(name);
00536         }
00537 }

Generated on Mon Aug 30 19:44:15 2004 for pocketcity by doxygen1.2.18