Files
oboe/osx/dialogxml/pict.h
Celtic Minstrel c0110adb40 New special nodes:
- Town set attitude for affecting single creature, adapted from Windows code; technically redundant, but maybe handy
- If numeric response
- Print nums (for debugging)
- SDF arithmetic - add, subtract, multiply, divide, exponentiate
- Store random to SDF (adapted from Windows code)
- Display picture (inspired by Windows code, but the implementation is completely different and totally incompatible)
2014-12-11 01:36:22 -05:00

251 lines
12 KiB
C++

/*
* pict.h
* BoE
*
* Created by Celtic Minstrel on 11/05/09.
*
*/
#ifndef PICT_H
#define PICT_H
/// @file
/// Icon-related classes and types.
#include <SFML/Graphics.hpp>
#include <vector>
#include <map>
#include "graphtool.h" // for pic_num_t
#include "control.h"
/// Specifies an icon type.
enum ePicType {
PIC_TER = 1, ///< 28x36 terrain graphic from the preset sheets
PIC_TER_ANIM = 2, ///< 28x36 terrain graphic from the preset animated terrain sheet
PIC_MONST = 3, ///< 28x36 monster graphic from the preset sheets
PIC_DLOG = 4, ///< 36x36 dialog graphic from the preset sheet
PIC_TALK = 5, ///< 32x32 talking portrait from the preset sheet
PIC_SCEN = 6, ///< 32x32 scenario graphic from the scenario sheet
PIC_ITEM = 7, ///< 28x36 item graphic from the large item sheet,
///< or 18x18 item graphic from the small sheet centred in a 28x36 space
PIC_PC = 8, ///< 28x36 pc graphic from the player sheet
PIC_FIELD = 9, ///< 28x36 field graphic from the fields sheet
PIC_BOOM = 10, ///< 28x36 boom graphic from the booms sheet
PIC_FULL = 11, ///< entire sheet graphic; number is the resource ID
PIC_MISSILE = 12, ///< 18x18 missile graphic from the missiles sheet
PIC_DLOG_LG = 13, ///< 72x72 dialog graphic from the dialog sheet
PIC_SCEN_LG = 14, ///< 64x64 scenario graphic (currently each is on its own sheet)
PIC_TER_MAP = 15, ///< 12x12 map graphic... or should it be 6x6?
PIC_STATUS = 16, ///< 12x12 status icon
PIC_MONST_WIDE = 23, ///< 56x36 monster graphic from the preset sheets, resized to fit and centred in a 28x36 space
PIC_MONST_TALL = 43, ///< 28x72 monster graphic from the preset sheets, resized to fit and centred in a 28x36 space
PIC_MONST_LG = 63, ///< 56x72 monster graphic from the preset sheets, resized to fit in a 28x36 space
PIC_CUSTOM_TER = 101, ///< 28x36 custom terrain graphic from the custom sheets
PIC_CUSTOM_TER_ANIM = 102, ///< 28x36 custom animated terrain graphic from the custom sheets
PIC_CUSTOM_MONST = 103, ///< 28x36 custom monster graphic from the custom sheets
PIC_CUSTOM_DLOG = 104, ///< 36x36 dialog graphic drawn from two 18x26 halves in the custom sheets
PIC_CUSTOM_TALK = 105, ///< 32x32 talking portrait drawn from two 16x32 halves in the custom sheets
PIC_CUSTOM_SCEN = 106, ///< 32x32 scenario portrait loading from scenname.exr/scenario.png
PIC_CUSTOM_ITEM = 107, ///< 28x36 custom item graphic from the custom sheets
PIC_CUSTOM_FULL = 111, ///< entire sheet graphic, drawn from scenname.exr/sheetxxx.png where xxx is the number
PIC_CUSTOM_MISSILE = 112, ///< 18x18 missile graphic drawn from the the custom sheets
PIC_CUSTOM_DLOG_LG = 113, ///< 72x72 dialog graphic from the custom sheet, taken from 8 successive slots
PIC_CUSTOM_TER_MAP = 115, ///< 12x12 map graphic (should it be 6x6?) taken from the custom sheet
PIC_CUSTOM_MONST_WIDE = 123,///< 56x36 monster graphic from the custom sheets, resized to fit and centred in a 28x36 space
PIC_CUSTOM_MONST_TALL = 143,///< 28x72 monster graphic from the custom sheets, resized to fit and centred in a 28x36 space
PIC_CUSTOM_MONST_LG = 163, ///< 56x72 monster graphic from the custom sheets, resized to fit in a 28x36 space
PIC_PARTY_MONST = 203, ///< 28x36 monster graphic drawn from the savegame sheet
PIC_PARTY_SCEN = 206, ///< 32x32 graphic drawn from the scenario headers sheet
PIC_PARTY_ITEM = 207, ///< 28x36 item graphic drawn from the savegame sheet
PIC_PARTY_PC = 208, ///< 28x36 PC graphic drawn from the savegame sheet
PIC_PARTY_MONST_WIDE = 223, ///< 56x36 monster graphic from the savegame sheet, resized to fit and centred in a 28x36 space
PIC_PARTY_MONST_TALL = 243, ///< 28x72 monster graphic from the savegame sheet, resized to fit and centred in a 28x36 space
PIC_PARTY_MONST_LG = 263, ///< 56x72 monster graphic from the savegame sheet, resized to fit in a 28x36 space
NUM_PIC_TYPES
};
/// Flags that modify icon types.
/// Can be added to or subtracted from ePicType enums, returning an ePicType.
enum ePicTypeMod {
PIC_PRESET = 0, ///< No mod, included just for good measure; can be added to cancel out all mods.
PIC_WIDE = 20, ///< If applied to any derivative of PIC_MONST, makes the x-dimension 2 instead of 1.
PIC_TALL = 40, ///< If applied to any derivative of PIC_MONST, makes the y-dimension 2 instead of 1.
PIC_LARGE = PIC_WIDE + PIC_TALL, ///< A combination of PIC_WIDE and PIC_TALL.
PIC_CUSTOM = 100, ///< If applied to any customizable graphic, makes it custom instead of preset.
PIC_PARTY = 200, ///< If applies to any exportable graphic, makes it exported instead of preset.
};
/// Specifies a graphics sheet that icons are drawn from.
enum eSheetType {
SHEET_TER, ///< The preset terrain sheets, terX.png
SHEET_TER_ANIM, ///< The animated terrains sheet, teranim.png
SHEET_MONST, ///< The preset monster sheets, monstX.png
SHEET_DLOG, ///< The preset dialog icons sheet, dlogpics.png
SHEET_TALK, ///< The preset talk icons sheet, talkportraits.png
SHEET_SCEN, ///< The preset scenario icons sheet, scenpics.png
SHEET_SCEN_LG, ///< The large scenario icons sheet, bigscenpics.png
SHEET_ITEM, ///< The preset large items sheet, objects.png
SHEET_TINY_ITEM,///< The small itesm sheet, tinyobj.png
SHEET_PC, ///< The PC graphics sheet, pcs.png
SHEET_FIELD, ///< The fields and objects sheet, fields.png
SHEET_BOOM, ///< The special effects sheet, booms.png
SHEET_MISSILE, ///< The missile animations sheet, missles.png
SHEET_PARTY, ///< The exported graphics sheet stored in the saved game
SHEET_HEADER, ///< The scenario header sheet
SHEET_TER_MAP, ///< The terrain map icons sheet, termap.png
SHEET_FULL, ///< Any full sheet
SHEET_STATUS, ///< The status icons sheet, staticons.png
SHEET_CUSTOM, ///< Any custom graphics sheet
// TODO: Vehicle sheet is missing.
// TODO: Documentation of full, custom, header, and exported sheets is still lacking.
NUM_SHEET_TYPES
};
/// A simple icon.
/// This control can also be made clickable.
class cPict : public cControl {
public:
/// @copydoc cDialog::init()
static void init();
void attachClickHandler(click_callback_t f) throw();
void attachFocusHandler(focus_callback_t f) throw(xHandlerNotSupported);
bool triggerClickHandler(cDialog& me, std::string id, eKeyMod mods);
void setFormat(eFormat prop, short val) throw(xUnsupportedProp);
short getFormat(eFormat prop) throw(xUnsupportedProp);
void setColour(sf::Color clr) throw(xUnsupportedProp);
sf::Color getColour() throw(xUnsupportedProp);
/// @copydoc setPict(pic_num_t)
/// @param type The type of the new icon
/// @note If you change to a type with a different bounding rect,
/// you will need to separately update the bounding rect.
/// (The bounding rect is mostly ignored when drawing, so if the icon is opaque, the control is not clickable,
/// and there is no frame, you can usually safely skip this step.)
///
/// This function applies a few automatic adjustments to its input:
///
/// - If type is PIC_MONST, it automatically looks up the chosen icon to determine
/// whether it should apply the tall or wide modifiers.
/// - If num is 1000 or greater, it automatically subtracts 1000 and applies the custom modifier.
void setPict(pic_num_t num, ePicType type);
/// Set the pict's icon.
/// @param num The new icon index.
void setPict(pic_num_t num);
/// Automatically recalculate the icon's bounding rect based on its current picture.
void recalcRect();
/// Get the current icon.
/// @return The number of the current icon.
pic_num_t getPicNum();
/// Get the current icon's type.
/// @return The type of the current icon.
ePicType getPicType();
/// Create a new icon.
/// @param parent The parent dialog.
explicit cPict(cDialog& parent);
/// Create a new icon without a parent dialog.
/// @param parent The parent window.
explicit cPict(sf::RenderWindow& parent);
bool isClickable();
/// Advance the current animation frame.
/// Should be called at predictable intervals if the dialog might contain an animated graphic.
static void advanceAnim();
virtual ~cPict();
void draw();
/// A utility function to draw an icon into an arbitrary window.
/// @param win The window to draw in.
/// @param dest The bounding rect to draw in (ignored for drawing the actual, but used for background fill and framing)
/// @param which_g The icon to draw.
/// @param type_g The type of icon to draw.
/// @param framed Whether to draw a frame around the icon.
static void drawAt(sf::RenderWindow& win, RECT dest, pic_num_t which_g, ePicType type_g, bool framed);
cPict& operator=(cPict& other) = delete;
cPict(cPict& other) = delete;
private:
static std::shared_ptr<sf::Texture> getSheet(eSheetType type, size_t n = 0);
static short animFrame;
short picNum;
ePicType picType;
bool clickable, drawFramed;
void drawPresetTer(short num, RECT to_rect);
void drawPresetTerAnim(short num, RECT to_rect);
void drawPresetMonstSm(short num, RECT to_rect);
void drawPresetMonstWide(short num, RECT to_rect);
void drawPresetMonstTall(short num, RECT to_rect);
void drawPresetMonstLg(short num, RECT to_rect);
void drawPresetDlog(short num, RECT to_rect);
void drawPresetDlogLg(short num, RECT to_rect);
void drawPresetTalk(short num, RECT to_rect);
void drawPresetScen(short num, RECT to_rect);
void drawPresetScenLg(short num, RECT to_rect);
void drawPresetItem(short num, RECT to_rect);
void drawPresetPc(short num, RECT to_rect);
void drawPresetField(short num, RECT to_rect);
void drawPresetBoom(short num, RECT to_rect);
void drawPresetMissile(short num, RECT to_rect);
void drawPresetTerMap(short num, RECT to_rect);
void drawStatusIcon(short num, RECT to_rect);
void drawFullSheet(short num, RECT to_rect);
void drawCustomTer(short num, RECT to_rect);
void drawCustomTerAnim(short num, RECT to_rect);
void drawCustomMonstSm(short num, RECT to_rect);
void drawCustomMonstWide(short num, RECT to_rect);
void drawCustomMonstTall(short num, RECT to_rect);
void drawCustomMonstLg(short num, RECT to_rect);
void drawCustomDlog(short num, RECT to_rect);
void drawCustomDlogLg(short num, RECT to_rect);
void drawCustomTalk(short num, RECT to_rect);
void drawCustomItem(short num, RECT to_rect);
void drawCustomMissile(short num, RECT to_rect);
void drawCustomTerMap(short num, RECT to_rect);
void drawPartyMonstSm(short num, RECT to_rect);
void drawPartyMonstWide(short num, RECT to_rect);
void drawPartyMonstTall(short num, RECT to_rect);
void drawPartyMonstLg(short num, RECT to_rect);
void drawPartyScen(short num, RECT to_rect);
void drawPartyItem(short num, RECT to_rect);
void drawPartyPc(short num, RECT to_rect);
static std::map<ePicType,void(cPict::*)(short,RECT)>& drawPict();
click_callback_t onClick;
};
/// Apply a modifier to an icon type.
/// @param lhs The base icon type to modify.
/// @param rhs The modifier to apply.
/// @return The modified icon type.
/// @note As a special case, adding PIC_PRESET removes all modifiers.
ePicType operator + (ePicType lhs, ePicTypeMod rhs);
/// Remove a modifier from an icon type.
/// @param lhs The base icon type to modify.
/// @param rhs The modifier to remove.
/// @return The modified icon type.
ePicType operator - (ePicType lhs, ePicTypeMod rhs);
/// Apply a modifier to an icon type.
/// @param lhs The modifier to apply.
/// @param rhs The base icon type to modify.
/// @return The modified icon type.
/// @note As a special case, adding PIC_PRESET removes all modifiers.
ePicType operator + (ePicTypeMod lhs, ePicType rhs);
/// Remove a modifier from an icon type.
/// @param lhs The modifier to remove.
/// @param rhs The base icon type to modify.
/// @return The modified icon type.
ePicType operator - (ePicTypeMod lhs, ePicType rhs);
/// Apply a modifier to an icon type.
/// @param lhs The base icon type to modify.
/// @param rhs The modifier to apply.
/// @return lhs, now modified.
/// @note As a special case, adding PIC_PRESET removes all modifiers.
ePicType&operator +=(ePicType&lhs, ePicTypeMod rhs);
/// Remove a modifier from an icon type.
/// @param lhs The base icon type to modify.
/// @param rhs The modifier to remove.
/// @return lhs, now modified.
ePicType&operator -=(ePicType&lhs, ePicTypeMod rhs);
/// Check if an icon type has a modifier applied.
/// @param lhs The icon type to check.
/// @param rhs The modifier type to test for.
/// @return true if the modifier is present.
bool operator& (ePicType lhs, ePicTypeMod rhs);
#endif