/* * 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 : OU_CARA.H //Description : Header file of Unit Caravan //Owner : Alex #ifndef __OU_CARA_H #define __OU_CARA_H #ifndef __ODYNARR_H #include #endif #ifndef __OSPATH_H #include #endif #ifndef __OUNIT_H #include #endif #ifndef __ORAWRES_H #include #endif #ifndef __F_MARK_H #include #endif //------------- Define constant -----------// #define MAX_STOP_FOR_CARAVAN 3 // Maximum no. of destination stations per train #define MAX_CARAVAN_CARRY_QTY 100 // Maximum qty of goods a caravan can carry #define MAX_CARAVAN_WAIT_TERM 8 // no. of term the caravan is in the market to upload/download cargo #define POPULATION_PER_CARAVAN 10 // the population size for supporting one caravan //-------- define pick up type --------// enum { AUTO_PICK_UP = 0, PICK_UP_RAW_FIRST = 1, PICK_UP_RAW_LAST=PICK_UP_RAW_FIRST+MAX_RAW-1, PICK_UP_PRODUCT_FIRST, PICK_UP_PRODUCT_LAST=PICK_UP_PRODUCT_FIRST+MAX_PRODUCT-1, MAX_PICK_UP_GOODS = PICK_UP_PRODUCT_LAST, NO_PICK_UP = MAX_PICK_UP_GOODS+1, MAX_GOODS_SELECT_BUTTON = MAX_PICK_UP_GOODS+2, }; enum { PICK_UP_TYPE_COUNT = NO_PICK_UP }; enum { NO_STOP_DEFINED = 0, // used for journey_status ON_WAY_TO_FIRM = 1, SURROUND_FIRM, INSIDE_FIRM, }; #define CARAVAN_UNLOAD_TO_MARKET_QTY 100 #define MIN_FIRM_STOCK_QTY 100 //-------- Define struct TradeStop ----------// #pragma pack(1) struct TradeStop { public: short firm_recno; // firm recno of the station short firm_loc_x1; //-******* used temporarily short firm_loc_y1; char pick_up_type; // auto, selective, none char pick_up_array[MAX_PICK_UP_GOODS]; // useful for selective mode public: int num_of_pick_up_goods(char *enableTable); //----------- single player version --------------// void pick_up_set_auto(); void pick_up_set_none(); void pick_up_toggle(int pos); //----------- multiplayer version --------------// void mp_pick_up_set_auto(char *enableTable); void mp_pick_up_set_none(char *enableTable); }; #pragma pack() //-------- Define struct CaravanStop ----------// #pragma pack(1) struct CaravanStop : public TradeStop { public: char firm_id; public: int update_pick_up(char *enableFlag=NULL); //----------- multiplayer version --------------// void mp_pick_up_toggle(int pos); }; #pragma pack() //----------- Define class Caravan -----------// #pragma pack(1) class UnitCaravan : public Unit { public: short caravan_id; // id. of the caravan, for name display char journey_status; // 1 for not unload but can up load, 2 for unload but not up load char dest_stop_id; // destination stop id. the stop which the train currently is moving towards char stop_defined_num; // num of stop defined char wait_count; // set to -1 to indicate only one stop is specified short stop_x_loc; // the x location the unit entering the stop short stop_y_loc; // the y location the unit entering the stop CaravanStop stop_array[MAX_STOP_FOR_CARAVAN]; // an array of firm_recno telling train stop stations int last_set_stop_date; // the date when stops were last set. int last_load_goods_date; // the last date when the caravan load goods from a firm //------ goods that the caravan carries -------// short raw_qty_array[MAX_RAW]; short product_raw_qty_array[MAX_PRODUCT]; int carrying_qty(int pickupType); public: UnitCaravan(); void init_derived(); void disp_info(int refreshFlag); void detect_info(); void set_stop(int stopId, int stopXLoc, int stopYLoc, char remoteAction); void del_stop(int stopId, char remoteAction); void update_stop_list(); void update_stop_and_goods_info(); void set_stop_pick_up(int stopId, int newPIckUpType, int remoteAction); int can_set_stop(int firmRecno); int has_pick_up_type(int stopId, int pickUpType); void caravan_in_firm(); void caravan_on_way(); void pre_process(); //------- ai functions --------// void process_ai(); int think_resign(); int think_del_stop(); void think_set_pick_up_type(); void think_set_pick_up_type2(int fromStopId, int toStopId); //-------------- multiplayer checking codes ---------------// virtual UCHAR crc8(); virtual void clear_ptr(); private: void disp_stop(int dispY1, int refreshFlag); void detect_stop(); void disp_goods(int dispY1, int refreshFlag); void disp_goods_select_button(int stopNum, int dispY1, int refreshFlag); int get_next_stop_id(int curStopId=MAX_STOP_FOR_CARAVAN); //-------- for mine ----------// void mine_load_goods(char pickUpType); //-------- for factory ---------// void factory_unload_goods(); void factory_load_goods(char pickupType); //-------- for market ---------// void market_unload_goods(); int market_unload_goods_in_empty_slot(FirmMarket *curMarket, int position); void market_load_goods(); void market_auto_load_goods(); void market_load_goods_now(MarketGoods* marketGoods, float loadQty); int appear_in_firm_surround(int& xLoc, int& yLoc, Firm* firmPtr); // select a suitable location to leave the stop }; #pragma pack() //------------------------------------------// #endif