void Form_NetSet_Proc(LPWindow pWindow, LPGuiMsgInfo pGuiMsgInfo) { CControl* pControl; sIP_ADDR *setip; s32 port; char cTemp[20]=""; static u8 reset = 0; switch(pGuiMsgInfo->ID) { case WM_LOAD: ClearScreen(); SysTimeDly(15); if(!Param_Read(ParamNet, &Local_IP, sizeof(Local_IP))) { debug(Debug_Error,"read local IP address from eeprom error!!!\r\n"); } if(!Param_Read(ParamNet+sizeof(Local_IP), &ServerAddr, sizeof(ServerAddr))) { debug(Debug_Error,"read server IP address from eeprom error!!!\r\n"); } //CreateWindowTimerEx(pWindow, 1); case WM_SHOW: sprintf(gsIpAddr,"%d.%d.%d.%d",Local_IP.ipaddr.addr1,Local_IP.ipaddr.addr2,Local_IP.ipaddr.addr3,Local_IP.ipaddr.addr4); sprintf(gsSubnetMask,"%d.%d.%d.%d",Local_IP.SubnetMask.addr1,Local_IP.SubnetMask.addr2,Local_IP.SubnetMask.addr3,Local_IP.SubnetMask.addr4); sprintf(gsGateWay,"%d.%d.%d.%d",Local_IP.GateWay.addr1,Local_IP.GateWay.addr2,Local_IP.GateWay.addr3,Local_IP.GateWay.addr4); sprintf(gsServerPort,"%d",ServerAddr.port); sprintf(gsServerAddr,"%d.%d.%d.%d",ServerAddr.ipaddr.addr1,ServerAddr.ipaddr.addr2,ServerAddr.ipaddr.addr3,ServerAddr.ipaddr.addr4); pWindow->DrawFunc(pWindow); break; case WM_UPDATECTRL: pControl = (CControl*)(pGuiMsgInfo->wParam); if(pControl != NULL) { pControl->DrawFunc(pControl); } break; case WM_TIMEUPDATE: PostWindowMsg(pWindow, WM_UPDATECTRL, (uint32)&gStatusBar, 0); break; case WM_KEYDOWN: switch(pGuiMsgInfo->wParam) { case KEY_UP: if (CTRL_CONTENT(mNetParaAttr).focus > 0) { CTRL_CONTENT(mNetParaAttr).focus--; PostWindowMsg(pWindow, WM_UPDATECTRL, (uint32)&mNetParaAttr, 0); } break; case KEY_DOWN: if (CTRL_CONTENT(mNetParaAttr).focus + 1 < CTRL_CONTENT(mNetParaAttr).total) { CTRL_CONTENT(mNetParaAttr).focus++; PostWindowMsg(pWindow, WM_UPDATECTRL, (uint32)&mNetParaAttr, 0); } break; case KEY_OK: memset(cTemp,0,20); switch (CTRL_CONTENT(mNetParaAttr).focus) { case 0: // if( LoadEditDlg(&g_TextEditWindow, "请输入设备IP地址", gsIpAddr, cTemp, 15)) { setip = IPFormatDetection(cTemp); if(setip) { memcpy(&Local_IP.ipaddr,setip,sizeof(sIP_ADDR)); strcpy(gsIpAddr,cTemp); reset = 1; //IP4_ADDR(&ipaddr, setip->addr1, setip->addr2, setip->addr3, setip->addr4); //tcpclient_close(); //netif_set_ipaddr(&xnetif,&ipaddr); Net_Param_Save(NETSlave); } else { MsgBoxDlg(&g_MsgBoxDlg, "信息提示", "IP地址不合法,请重新输入"); } } break; case 1: // if( LoadEditDlg(&g_TextEditWindow, "请输入设备子网掩码", gsSubnetMask, cTemp, 15)) { setip = IPFormatDetection(cTemp); if(setip) { memcpy(&Local_IP.SubnetMask,setip,sizeof(sIP_ADDR)); strcpy(gsSubnetMask,cTemp); reset = 1; //IP4_ADDR(&netmask, setip->addr1, setip->addr2, setip->addr3, setip->addr4); //tcpclient_close(); //netif_set_netmask(&xnetif,&netmask); Net_Param_Save(NETSlave); } else { MsgBoxDlg(&g_MsgBoxDlg, "信息提示", "子网掩码不合法,请重新输入"); } } break; case 2: // if( LoadEditDlg(&g_TextEditWindow, "请输入设备默认网关", gsGateWay, cTemp, 15)) { setip = IPFormatDetection(cTemp); if(setip) { memcpy(&Local_IP.GateWay,setip,sizeof(sIP_ADDR)); strcpy(gsGateWay,cTemp); reset = 1; //IP4_ADDR(&gw, setip->addr1, setip->addr2, setip->addr3, setip->addr4); //tcpclient_close(); //netif_set_gw(&xnetif,&gw); Net_Param_Save(NETSlave); } else { MsgBoxDlg(&g_MsgBoxDlg, "信息提示", "网关地址不合法,请重新输入"); } } break; case 3: // if( LoadEditDlg(&g_TextEditWindow, "请输入服务器端口", gsServerPort, cTemp, 5)) { port = atoi(cTemp); if((port > 0) && (port < 65535)) { strcpy(gsServerPort,cTemp); ServerAddr.port= port; reset = 1; //tcpclient_close(); Net_Param_Save(NETMaster); } else { MsgBoxDlg(&g_MsgBoxDlg, "信息提示", "端口号不合法,请重新输入"); } } break; case 4: // if( LoadEditDlg(&g_TextEditWindow, "请输入服务器IP地址", gsServerAddr, cTemp, 15)) { setip = IPFormatDetection(cTemp); if(setip) { memcpy(&ServerAddr.ipaddr,setip,sizeof(sIP_ADDR)); strcpy(gsServerAddr,cTemp); reset = 1; //tcpclient_close(); Net_Param_Save(NETMaster); } else { MsgBoxDlg(&g_MsgBoxDlg, "信息提示", "IP地址不合法,请重新输入"); } } break; default: break; } PostWindowMsg(pWindow, WM_SHOW, NULL, NULL); break; case KEY_BACK: if(reset) { reset = 0; MsgBoxDlg(&g_MsgBoxDlg, "信息提示", "新的设置将在系统重启后生效"); } if(pWindow->pParentWindow != NULL) { g_pCurWindow = pWindow->pParentWindow; } else { g_pCurWindow = &gWD_Main; } PostWindowMsg(g_pCurWindow, WM_LOAD,0,0); break; default: break; } break; default: break; } }
static int PerformLine(int ct) { int continuation=0; int param[5],pptr=0; int act[4]; int cc=0; while(cc<5) { int cv,dv; cv=Actions[ct].Condition[cc]; dv=cv/20; cv%=20; switch(cv) { case 0: param[pptr++]=dv; break; case 1: if(Items[dv].Location!=CARRIED) return(0); break; case 2: if(Items[dv].Location!=MyLoc) return(0); break; case 3: if(Items[dv].Location!=CARRIED&& Items[dv].Location!=MyLoc) return(0); break; case 4: if(MyLoc!=dv) return(0); break; case 5: if(Items[dv].Location==MyLoc) return(0); break; case 6: if(Items[dv].Location==CARRIED) return(0); break; case 7: if(MyLoc==dv) return(0); break; case 8: if((BitFlags&(1<<dv))==0) return(0); break; case 9: if(BitFlags&(1<<dv)) return(0); break; case 10: if(CountCarried()==0) return(0); break; case 11: if(CountCarried()) return(0); break; case 12: if(Items[dv].Location==CARRIED||Items[dv].Location==MyLoc) return(0); break; case 13: if(Items[dv].Location==0) return(0); break; case 14: if(Items[dv].Location) return(0); break; case 15: if(CurrentCounter>dv) return(0); break; case 16: if(CurrentCounter<=dv) return(0); break; case 17: if(Items[dv].Location!=Items[dv].InitialLoc) return(0); break; case 18: if(Items[dv].Location==Items[dv].InitialLoc) return(0); break; case 19:/* Only seen in Brian Howarth games so far */ if(CurrentCounter!=dv) return(0); break; } cc++; } /* Actions */ act[0]=Actions[ct].Action[0]; act[2]=Actions[ct].Action[1]; act[1]=act[0]%150; act[3]=act[2]%150; act[0]/=150; act[2]/=150; cc=0; pptr=0; while(cc<4) { if(act[cc]>=1 && act[cc]<52) { Output(Messages[act[cc]]); Output("\n"); } else if(act[cc]>101) { Output(Messages[act[cc]-50]); Output("\n"); } else switch(act[cc]) { case 0:/* NOP */ break; case 52: if(CountCarried()==GameHeader.MaxCarry) { if(Options&YOUARE) Output("You are carrying too much. "); else Output("I've too much to carry! "); break; } Items[param[pptr++]].Location= CARRIED; break; case 53: Items[param[pptr++]].Location=MyLoc; break; case 54: MyLoc=param[pptr++]; break; case 55: Items[param[pptr++]].Location=0; break; case 56: BitFlags|=1<<DARKBIT; break; case 57: BitFlags&=~(1<<DARKBIT); break; case 58: BitFlags|=(1<<param[pptr++]); break; case 59: Items[param[pptr++]].Location=0; break; case 60: BitFlags&=~(1<<param[pptr++]); break; case 61: if(Options&YOUARE) Output("You are dead.\n"); else Output("I am dead.\n"); BitFlags&=~(1<<DARKBIT); MyLoc=GameHeader.NumRooms;/* It seems to be what the code says! */ break; case 62: { /* Bug fix for some systems - before it could get parameters wrong */ int i=param[pptr++]; Items[i].Location=param[pptr++]; break; } case 63: doneit: Output("The game is now over.\n"); glk_exit(); case 64: break; case 65: { int i=0; int n=0; while(i<=GameHeader.NumItems) { if(Items[i].Location==GameHeader.TreasureRoom && *Items[i].Text=='*') n++; i++; } if(Options&YOUARE) Output("You have stored "); else Output("I've stored "); OutputNumber(n); Output(" treasures. On a scale of 0 to 100, that rates "); OutputNumber((n*100)/GameHeader.Treasures); Output(".\n"); if(n==GameHeader.Treasures) { Output("Well done.\n"); goto doneit; } break; } case 66: { int i=0; int f=0; if(Options&YOUARE) Output("You are carrying:\n"); else Output("I'm carrying:\n"); while(i<=GameHeader.NumItems) { if(Items[i].Location==CARRIED) { if(f==1) { if (Options & TRS80_STYLE) Output(". "); else Output(" - "); } f=1; Output(Items[i].Text); } i++; } if(f==0) Output("Nothing"); Output(".\n"); break; } case 67: BitFlags|=(1<<0); break; case 68: BitFlags&=~(1<<0); break; case 69: GameHeader.LightTime=LightRefill; Items[LIGHT_SOURCE].Location=CARRIED; BitFlags&=~(1<<LIGHTOUTBIT); break; case 70: ClearScreen(); /* pdd. */ break; case 71: SaveGame(); break; case 72: { int i1=param[pptr++]; int i2=param[pptr++]; int t=Items[i1].Location; Items[i1].Location=Items[i2].Location; Items[i2].Location=t; break; } case 73: continuation=1; break; case 74: Items[param[pptr++]].Location= CARRIED; break; case 75: { int i1,i2; i1=param[pptr++]; i2=param[pptr++]; Items[i1].Location=Items[i2].Location; break; } case 76: /* Looking at adventure .. */ break; case 77: if(CurrentCounter>=0) CurrentCounter--; break; case 78: OutputNumber(CurrentCounter); break; case 79: CurrentCounter=param[pptr++]; break; case 80: { int t=MyLoc; MyLoc=SavedRoom; SavedRoom=t; break; } case 81: { /* This is somewhat guessed. Claymorgue always seems to do select counter n, thing, select counter n, but uses one value that always seems to exist. Trying a few options I found this gave sane results on ageing */ int t=param[pptr++]; int c1=CurrentCounter; CurrentCounter=Counters[t]; Counters[t]=c1; break; } case 82: CurrentCounter+=param[pptr++]; break; case 83: CurrentCounter-=param[pptr++]; if(CurrentCounter< -1) CurrentCounter= -1; /* Note: This seems to be needed. I don't yet know if there is a maximum value to limit too */ break; case 84: Output(NounText); break; case 85: Output(NounText); Output("\n"); break; case 86: Output("\n"); break; case 87: { /* Changed this to swap location<->roomflag[x] not roomflag 0 and x */ int p=param[pptr++]; int sr=MyLoc; MyLoc=RoomSaved[p]; RoomSaved[p]=sr; break; } case 88: Delay(2); break; case 89: pptr++; /* SAGA draw picture n */ /* Spectrum Seas of Blood - start combat ? */ /* Poking this into older spectrum games causes a crash */ break; default: fprintf(stderr,"Unknown action %d [Param begins %d %d]\n", act[cc],param[pptr],param[pptr+1]); break; } cc++; } return(1+continuation); }