/*
* 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 : ONEWS.H
//Description : Object News
#ifndef __ONEWS_H
#define __ONEWS_H
#ifndef __OBUTTON_H
#include
#endif
#ifndef __OVBROWSE_H
#include
#endif
#ifndef __ODYNARRB_H
#include
#endif
//----- Maximum no. of news ---------//
enum { MAX_NEWS=2000 };
//--------- Define constant --------------//
#define DISP_NEWS_DAYS 60 // how long a news should stay on the screen before it disappears
#define DISP_NEWS_COUNT 5 // maximum no. of news message displayed on the screen at a time
//-------- Define news type ---------//
enum { NEWS_TYPE_NUM=1 };
enum { NEWS_NORMAL=0 };
enum { NEWS_WHO_NUM=4 };
enum { NEWS_DISP_ALL=0, NEWS_DISP_FRIENDLY, NEWS_DISP_PLAYER, NEWS_DISP_NONE };
//------- Define other constant -------//
enum { DESTROYER_NATION=1, DESTROYER_REBEL, DESTROYER_MONSTER, DESTROYER_UNKNOWN };
enum { NEWS_LOC_TOWN=1, NEWS_LOC_FIRM, NEWS_LOC_UNIT, NEWS_LOC_ANY }; // for News::loc_type
//--------- Define news id. ----------//
enum { NEWS_DIPLOMACY=1,
NEWS_TOWN_REBEL,
NEWS_MIGRATE,
NEWS_NEW_NATION,
NEWS_NATION_DESTROYED,
NEWS_NATION_SURRENDER,
NEWS_KING_DIE,
NEWS_NEW_KING,
NEWS_FIRM_DESTROYED, // when your firm is destroyed
NEWS_FIRM_CAPTURED, // when your firm is taken over by another nation or you take over the firm of another nation
NEWS_TOWN_DESTROYED, // when the last unit in the town is killed by an enemy
NEWS_TOWN_ABANDONED, // when all villagers have left the village
NEWS_TOWN_SURRENDERED, // A town surrenders to another natino
NEWS_MONSTER_KING_KILLED,
NEWS_MONSTER_FIRM_DESTROYED,
NEWS_SCROLL_ACQUIRED,
NEWS_MONSTER_GOLD_ACQUIRED,
NEWS_YOUR_SPY_KILLED,
NEWS_ENEMY_SPY_KILLED,
NEWS_UNIT_BETRAY, // your unit betray or other nation's betray and turn towards you
NEWS_UNIT_ASSASSINATED,
NEWS_ASSASSINATOR_CAUGHT,
NEWS_GENERAL_DIE,
NEWS_RAW_EXHAUST,
NEWS_TECH_RESEARCHED,
NEWS_LIGHTNING_DAMAGE,
NEWS_EARTHQUAKE_DAMAGE,
NEWS_GOAL_DEADLINE,
NEWS_WEAPON_SHIP_WORN_OUT,
NEWS_FIRM_WORN_OUT,
NEWS_CHAT_MSG,
NEWS_MULTI_RETIRE,
NEWS_MULTI_QUIT_GAME,
NEWS_MULTI_SAVE_GAME,
NEWS_MULTI_CONNECTION_LOST,
};
//------- Define struct News ---------//
#pragma pack(1)
struct News
{
public:
char id; // id. of the news, NEWS_???
char type; // news type // type may be > NEWS_TYPE_NUM, for indicating that the news has been displayed in the stock window, do display it on the newspaper again
char news_type() { return type%NEWS_TYPE_NUM; }
long news_date; // date of the news
char nation_color1; // nation color, can't use nation_recno directly, because it may bankrupt one day
char nation_color2;
char nation_race_id1;
char nation_race_id2;
int nation_name_id1; // nation res. id of the nation that generate the news
int nation_name_id2; // if the news is related to two nations (e.g. one nation buys the stock of another nation)
char* nation_name1();
char* nation_name2();
char* king_name1(int addColor=0);
char* king_name2(int addColor=0);
short short_para1;
short short_para2;
short short_para3;
short short_para4;
short short_para5;
char loc_type;
short loc_type_para;
WORD loc_type_para2; // must use WORD as it will be used to store unit name id.
short loc_x, loc_y; // location where the news happens
public:
int put(int y, int detectAction, int& newsHeight);
char* msg(); // return the news msg
int is_major();
void set_loc(int xLoc, int yLoc, int locType, int locTypePara=0, int locTypePara2=0);
int is_loc_valid();
//---- functions for return news string ----//
void diplomacy();
void town_rebel();
void migrate();
void new_nation();
void nation_destroyed();
void nation_surrender();
void king_die();
void new_king();
void firm_destroyed();
void firm_captured();
void town_destroyed();
void town_abandoned();
void town_surrendered();
void monster_king_killed();
void monster_firm_destroyed();
void scroll_acquired();
void monster_gold_acquired();
void your_spy_killed();
void enemy_spy_killed();
void unit_betray();
void unit_assassinated();
void assassinator_caught();
void general_die();
void raw_exhaust();
void tech_researched();
void lightning_damage();
void earthquake_damage();
void goal_deadline();
void weapon_ship_worn_out();
void firm_worn_out();
void chat_msg();
void multi_retire();
void multi_quit_game();
void multi_save_game();
void multi_connection_lost();
};
#pragma pack()
//-------- Define class NewsArray ----------//
class Unit;
class Font;
class NewsArray : public DynArray
{
public:
//------ display options ------//
char news_type_option[NEWS_TYPE_NUM];
char news_who_option;
char news_add_flag;
int last_clear_recno;
public:
NewsArray();
void init();
void deinit();
void enable() { news_add_flag = 1; }
void disable() { news_add_flag = 0; }
void reset();
void default_setting();
void set_font(Font*);
int detect();
void disp();
int put(int detectAction);
void clear_news_disp();
News* add_news(int newsId, int newsType, int nationRecno=0, int nationRecno2=0, int forceAdd=0);
void remove(int newsId, int shortPara1);
//------ functions for adding news -------//
void diplomacy(int talkMsgRecno);
void town_rebel(int townRecno, int rebelCount);
void migrate(int srcTownRecno, int desTownRecno, int raceId, int migratedCount, int firmRecno=0);
void new_nation(int kingUnitRecno);
void nation_destroyed(int nationRecno);
void nation_surrender(int nationRecno, int toNationRecno);
void king_die(int nationRecno);
void new_king(int nationRecno, int kingUnitRecno);
void firm_destroyed(int firmRecno, Unit* attackUnit);
void firm_captured(int firmRecno, int takeoverNationRecno, int spyTakeover);
void town_destroyed(int townNameId, int xLoc, int yLoc, Unit* attackUnit);
void town_abandoned(int townRecno);
void town_surrendered(int townRecno, int toNationRecno);
void monster_king_killed(int monsterId, int xLoc, int yLoc);
void monster_firm_destroyed(int monsterId, int xLoc, int yLoc);
void scroll_acquired(int acquireNationRecno, int scrollRaceId);
void monster_gold_acquired(int goldAmt);
void spy_killed(int spyRecno);
void unit_betray(int unitRecno, int betrayToNationRecno);
void unit_assassinated(int unitRecno, int spyKilled);
void assassinator_caught(int spyRecno, int targetRankId);
void general_die(int unitRecno);
void raw_exhaust(int rawId, int xLoc, int yLoc);
void tech_researched(int techId, int techVersion);
void lightning_damage(int xLoc, int yLoc, int objectId, int recno, int objectDie);
void earthquake_damage(int unitDamage, int unitDie, int townDamage, int firmDamage, int firmDie);
void goal_deadline(int yearLeft, int monthLeft);
void weapon_ship_worn_out(int unitId, int weaponLevel);
void firm_worn_out(int firmRecno);
void chat_msg(int nationRecno, char* chatStr);
void multi_retire(int nationRecno);
void multi_quit_game(int nationRecno);
void multi_save_game();
void multi_connection_lost(int nationRecno);
//--------------------------------------------//
int write_file(File*);
int read_file(File*);
News* operator[](int recNo);
};
extern NewsArray news_array;
//-------------------------------------------//
#endif