truelight@0: truelight@0: #include "stdafx.h" truelight@0: #include "ttd.h" tron@507: #include "table/strings.h" truelight@0: #include "command.h" truelight@0: #include "player.h" truelight@0: #include "gfx.h" truelight@0: #include "window.h" truelight@0: #include "saveload.h" truelight@0: #include "economy.h" truelight@0: truelight@0: /* p1 = player truelight@0: p2 = face truelight@0: */ truelight@0: truelight@0: int32 CmdSetPlayerFace(int x, int y, uint32 flags, uint32 p1, uint32 p2) truelight@0: { truelight@0: if (flags & DC_EXEC) { truelight@0: DEREF_PLAYER(p1)->face = p2; truelight@0: MarkWholeScreenDirty(); truelight@0: } truelight@0: return 0; truelight@0: } truelight@0: truelight@0: /* p1 = player truelight@0: * p2 = color truelight@0: */ truelight@0: int32 CmdSetPlayerColor(int x, int y, uint32 flags, uint32 p1, uint32 p2) truelight@0: { truelight@0: Player *p,*pp; truelight@0: truelight@0: // /* can only set color for itself */ truelight@0: // if ( (byte)p1 != _current_player) truelight@0: // return CMD_ERROR; truelight@0: truelight@0: p = DEREF_PLAYER(p1); truelight@0: truelight@0: /* ensure no dups */ truelight@0: FOR_ALL_PLAYERS(pp) { truelight@0: if (pp->is_active && pp != p && pp->player_color == (byte)p2) truelight@0: return CMD_ERROR; truelight@0: } truelight@193: truelight@0: if (flags & DC_EXEC) { truelight@0: _player_colors[p1] = (byte)p2; truelight@0: p->player_color = (byte)p2; truelight@0: MarkWholeScreenDirty(); truelight@0: } truelight@0: return 0; truelight@0: } truelight@0: truelight@0: int32 CmdIncreaseLoan(int x, int y, uint32 flags, uint32 p1, uint32 p2) truelight@0: { truelight@0: Player *p; truelight@0: int32 size; truelight@0: truelight@0: if ( (byte)p1 != _current_player) truelight@0: return CMD_ERROR; truelight@0: truelight@0: p = DEREF_PLAYER(p1); truelight@0: truelight@0: if (p->current_loan >= _economy.max_loan) { truelight@0: SET_DPARAM32(0, _economy.max_loan); truelight@0: return_cmd_error(STR_702B_MAXIMUM_PERMITTED_LOAN); truelight@0: } truelight@0: truelight@0: if (flags & DC_EXEC) { truelight@0: if (p2) truelight@0: size = _economy.max_loan - p->current_loan; truelight@0: else truelight@0: size = IS_HUMAN_PLAYER((byte)p1) ? 10000 : 50000; truelight@0: truelight@0: p->money64 += size; truelight@0: p->current_loan += size; truelight@0: UpdatePlayerMoney32(p); truelight@0: InvalidatePlayerWindows(p); truelight@0: } truelight@0: truelight@0: return 0; truelight@0: } truelight@0: truelight@0: int32 CmdDecreaseLoan(int x, int y, uint32 flags, uint32 p1, uint32 p2) truelight@0: { truelight@0: Player *p; truelight@0: int32 size; truelight@0: if ( (byte)p1 != _current_player) truelight@0: return CMD_ERROR; truelight@0: truelight@0: p = DEREF_PLAYER(p1); truelight@0: truelight@0: if (p->current_loan == 0) truelight@0: return_cmd_error(STR_702D_LOAN_ALREADY_REPAYED); truelight@0: truelight@0: size = p->current_loan; truelight@0: truelight@0: // p2 is true while CTRL is pressed (repay all possible loan, or max money you have) truelight@84: if (!p2) { truelight@84: if (_patches.ainew_active) truelight@84: size = min(size, 10000); truelight@84: else truelight@84: size = min(size, IS_HUMAN_PLAYER((byte)p1) ? 10000 : 50000); truelight@84: } else { // only repay in chunks of 10K truelight@0: size = min(size, p->player_money); truelight@0: size = max(size, 10000); truelight@0: size -= size % 10000; truelight@0: } truelight@0: truelight@0: if (p->player_money < size) { truelight@0: SET_DPARAM32(0, size); truelight@0: return_cmd_error(STR_702E_REQUIRED); truelight@0: } truelight@0: truelight@0: if (flags & DC_EXEC) { truelight@0: p->money64 -= size; truelight@0: p->current_loan -= size; truelight@0: UpdatePlayerMoney32(p); truelight@0: InvalidatePlayerWindows(p); truelight@0: } truelight@0: return 0; truelight@0: } truelight@0: truelight@0: int32 CmdChangeCompanyName(int x, int y, uint32 flags, uint32 p1, uint32 p2) truelight@0: { truelight@0: StringID str,old_str; truelight@0: Player *p; truelight@0: truelight@0: str = AllocateName((byte*)_decode_parameters, 4); truelight@0: if (str == 0) truelight@0: return CMD_ERROR; truelight@193: truelight@0: if (flags & DC_EXEC) { truelight@0: p = DEREF_PLAYER(p1); truelight@0: old_str = p->name_1; truelight@0: p->name_1 = str; truelight@0: DeleteName(old_str); truelight@0: MarkWholeScreenDirty(); truelight@0: } else { truelight@0: DeleteName(str); truelight@0: } truelight@0: truelight@0: return 0; truelight@0: } truelight@0: truelight@0: int32 CmdChangePresidentName(int x, int y, uint32 flags, uint32 p1, uint32 p2) truelight@0: { truelight@0: StringID str,old_str; truelight@0: Player *p; truelight@0: truelight@0: str = AllocateName((byte*)_decode_parameters, 4); truelight@0: if (str == 0) truelight@0: return CMD_ERROR; truelight@193: truelight@0: if (flags & DC_EXEC) { truelight@0: p = DEREF_PLAYER(p1); truelight@0: old_str = p->president_name_1; truelight@0: p->president_name_1 = str; truelight@0: DeleteName(old_str); truelight@0: truelight@0: if (p->name_1 == STR_SV_UNNAMED) { truelight@0: byte *s = " Transport"; truelight@0: byte *d = (byte*)_decode_parameters, b; truelight@0: d--; do d++; while (*d); truelight@0: do *d++ = b = *s++; while(d != (byte*)endof(_decode_parameters) && b != 0); truelight@0: DoCommandByTile(0, p1, 0, DC_EXEC, CMD_CHANGE_COMPANY_NAME); truelight@193: } truelight@0: MarkWholeScreenDirty(); truelight@0: } else { truelight@0: DeleteName(str); truelight@0: } truelight@0: truelight@193: return 0; truelight@0: } truelight@0: truelight@0: static void UpdateSignVirtCoords(SignStruct *ss) truelight@0: { truelight@0: Point pt = RemapCoords(ss->x, ss->y, ss->z); truelight@0: SET_DPARAM16(0, ss->str); truelight@0: UpdateViewportSignPos(&ss->sign, pt.x, pt.y - 6, STR_2806); truelight@0: } truelight@0: truelight@0: void UpdateAllSignVirtCoords() truelight@0: { truelight@0: SignStruct *ss; truelight@0: for(ss=_sign_list; ss != endof(_sign_list); ss++) truelight@0: if (ss->str != 0) truelight@0: UpdateSignVirtCoords(ss); truelight@0: truelight@0: } truelight@0: truelight@0: static void MarkSignDirty(SignStruct *ss) truelight@0: { truelight@0: MarkAllViewportsDirty( truelight@0: ss->sign.left-6, truelight@0: ss->sign.top-3, truelight@0: ss->sign.left+ss->sign.width_1*4+12, truelight@0: ss->sign.top + 45 truelight@0: ); truelight@0: } truelight@0: truelight@0: truelight@0: int32 CmdPlaceSign(int x, int y, uint32 flags, uint32 p1, uint32 p2) truelight@0: { truelight@0: SignStruct *ss; truelight@193: truelight@0: for(ss=_sign_list; ss != endof(_sign_list); ss++) { truelight@0: if (ss->str == 0) { truelight@0: if (flags & DC_EXEC) { truelight@0: ss->str = STR_280A_SIGN; truelight@0: ss->x = x; truelight@0: ss->y = y; truelight@0: ss->z = GetSlopeZ(x,y); truelight@0: UpdateSignVirtCoords(ss); truelight@0: MarkSignDirty(ss); truelight@0: _new_sign_struct = ss; truelight@0: } truelight@0: return 0; truelight@193: } truelight@0: } truelight@0: truelight@0: return_cmd_error(STR_2808_TOO_MANY_SIGNS); truelight@0: } truelight@0: truelight@0: // p1 = sign index truelight@0: // p2: 1 -> remove sign truelight@0: int32 CmdRenameSign(int x, int y, uint32 flags, uint32 p1, uint32 p2) truelight@0: { truelight@0: StringID str,old_str; truelight@0: SignStruct *ss; truelight@0: truelight@0: if (_decode_parameters[0] != 0 && !p2) { truelight@0: str = AllocateName((byte*)_decode_parameters, 0); truelight@0: if (str == 0) truelight@0: return CMD_ERROR; truelight@0: truelight@0: if (flags & DC_EXEC) { truelight@0: ss = &_sign_list[p1]; truelight@0: MarkSignDirty(ss); truelight@0: DeleteName(ss->str); truelight@0: ss->str = str; truelight@0: UpdateSignVirtCoords(ss); truelight@0: MarkSignDirty(ss); truelight@0: } else { truelight@0: DeleteName(str); truelight@0: } truelight@0: } else { truelight@0: if (flags & DC_EXEC) { truelight@0: ss = &_sign_list[p1]; truelight@0: old_str = ss->str; truelight@0: ss->str = 0; truelight@0: DeleteName(old_str); truelight@0: MarkSignDirty(ss); truelight@0: } truelight@0: } truelight@0: return 0; truelight@0: } truelight@0: truelight@0: // p1 = 0 decrease pause counter truelight@0: // p1 = 1 increase pause counter truelight@0: int32 CmdPause(int x, int y, uint32 flags, uint32 p1, uint32 p2) truelight@0: { truelight@0: if (flags & DC_EXEC) { truelight@0: _pause += p1?1:-1; truelight@0: if(_pause==(byte)-1) _pause = 0; truelight@0: InvalidateWindow(WC_STATUS_BAR, 0); truelight@0: InvalidateWindow(WC_MAIN_TOOLBAR, 0); truelight@0: } truelight@0: return 0; truelight@0: } truelight@0: truelight@0: truelight@0: truelight@0: int32 CmdResume(int x, int y, uint32 flags, uint32 p1, uint32 p2) truelight@0: { truelight@0: return 0; truelight@0: } truelight@0: truelight@0: int32 CmdMoneyCheat(int x, int y, uint32 flags, uint32 p1, uint32 p2) truelight@0: { truelight@193: SET_EXPENSES_TYPE(EXPENSES_OTHER); truelight@0: return (int32)p1; truelight@0: } truelight@0: truelight@0: int32 CmdChangeDifficultyLevel(int x, int y, uint32 flags, uint32 p1, uint32 p2) truelight@0: { truelight@0: if (flags & DC_EXEC) { truelight@0: if (p1 != (uint32)-1L) { truelight@0: ((int*)&_opt_mod_ptr->diff)[p1] = p2; truelight@0: _opt_mod_ptr->diff_level = 3; truelight@0: } else { truelight@0: _opt_mod_ptr->diff_level = p2; truelight@0: } truelight@0: InvalidateWindow(WC_GAME_OPTIONS, 0); truelight@0: } truelight@193: return 0; truelight@0: } truelight@0: truelight@0: static const byte _sign_desc[] = { truelight@0: SLE_VAR(SignStruct,str, SLE_UINT16), truelight@0: SLE_VAR(SignStruct,x, SLE_INT16), truelight@0: SLE_VAR(SignStruct,y, SLE_INT16), truelight@0: SLE_VAR(SignStruct,z, SLE_UINT8), truelight@0: SLE_END() truelight@0: }; truelight@0: truelight@0: static void Save_SIGN() truelight@0: { truelight@0: SignStruct *s; truelight@0: int i; truelight@0: for(i=0,s=_sign_list; i!=lengthof(_sign_list); i++,s++) { truelight@0: if (s->str != 0) { truelight@0: SlSetArrayIndex(i); truelight@0: SlObject(s, _sign_desc); truelight@0: } truelight@0: } truelight@0: } truelight@0: truelight@0: static void Load_SIGN() truelight@0: { truelight@0: int index; truelight@0: while ((index = SlIterateArray()) != -1) { truelight@0: SlObject(&_sign_list[index], _sign_desc); truelight@0: } truelight@0: } truelight@0: truelight@0: const ChunkHandler _sign_chunk_handlers[] = { truelight@0: { 'SIGN', Save_SIGN, Load_SIGN, CH_ARRAY | CH_LAST}, truelight@0: }; truelight@0: truelight@0: