/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
//Filename : OF_CAMP.H
//Description : Header of FirmCamp
#ifndef __OF_CAMP_H
#define __OF_CAMP_H
#ifndef __OFIRM_H
#include
#endif
//------------ define constant -----------//
enum { INSIDE_CAMP=0,
OUTSIDE_CAMP,
};
//-------- Define struct DefenseUnit ----------//
#pragma pack(1)
struct DefenseUnit
{
short unit_recno;
char status; // inside / outside the camp
};
#pragma pack()
//------- Define class FirmCamp --------//
class Town;
class Unit;
#pragma pack(1)
class FirmCamp : public Firm
{
public:
//-------------------------------------//
DefenseUnit defense_array[MAX_WORKER+1]; // plus 1 with the overseer
char employ_new_worker;
short defend_target_recno; // used in defend mode, store recno of the latest target attacking this firm
char defense_flag;
int is_worker_full();
//---------- AI related vars ----------//
char patrol_unit_count; // for AI to get the recno of the patrol units
short patrol_unit_array[MAX_WORKER+1];
char coming_unit_count; // for AI to get the recno of the coming units
short coming_unit_array[MAX_WORKER+1];
short ai_capture_town_recno; // >0 if the troop is in the process of attacking the independent village for capturing it.
char ai_recruiting_soldier;
char is_attack_camp;
int total_combat_level();
int average_combat_level();
int ai_combat_level_needed();
int ai_has_excess_worker();
public:
FirmCamp();
void init_derived();
void deinit();
void put_info(int refreshFlag);
void detect_info();
void next_day();
void patrol();
int patrol_all_soldier();
void assign_unit(int unitRecno);
void assign_overseer(int overseerRecno);
void assign_worker(int unitRecno);
void defense(short targetRecno, int useRangeAttack=0);
void defense_inside_camp(short unitRecno, short targetRecno);
void defense_outside_camp(short unitRecno, short targetRecno);
void clear_defense_mode();
int mobilize_worker(int workerId, char remoteAction);
int mobilize_overseer();
void change_nation(int newNationRecno);
void update_defense_unit(short unitRecno);
void set_employ_worker(char flag);
virtual FirmCamp *cast_to_FirmCamp() { return this; };
//----------- AI functions ----------//
void process_ai();
int ai_should_close(); // overloaded function
void ai_update_link_status();
int cur_commander_leadership(int bestRaceId=0);
int new_commander_leadership(int newRaceId, int newSkillLevel);
//-------------- multiplayer checking codes ---------------//
virtual UCHAR crc8();
virtual void clear_ptr();
private:
void reset_unit_home_camp(int firmRecno);
void reset_attack_camp(int firmRecno);
void disp_camp_info(int dispY1, int refreshFlag);
void train_unit();
void recover_hit_point();
void pay_weapon_expense();
void sort_soldier();
void update_influence();
void validate_patrol_unit();
//-------------- AI functions --------------//
void ai_reset_defense_mode();
void think_recruit();
int think_attack();
int ai_recruit(int combatLevelNeeded);
void ai_attack_town_defender(Unit*);
int think_attack_nearby_enemy();
void think_change_town_link();
void think_capture();
int think_capture_return();
int think_capture_use_spy(Town* targetTown);
int think_capture_use_spy2(Town* targetTown, int raceId, int curSpyLevel);
int think_assign_better_overseer(Town* targetTown);
int think_assign_better_overseer2(int targetTownRecno, int raceId);
void process_ai_capturing();
int think_capture_target_town();
int ai_capture_independent_town(Town* targetTown, int defenseCombatLevel);
int ai_capture_enemy_town(Town* targetTown, int defenseCombatLevel);
int think_use_cash_to_capture();
void think_linked_town_change_nation(int linkedTownRecno, int oldNationRecno, int newNationRecno);
int think_assign_better_commander();
int best_commander_race();
};
#pragma pack()
//--------------------------------------//
#endif