OpenClonk
C4ObjectMenuLogic.cpp
Go to the documentation of this file.
1 /*
2  * OpenClonk, http://www.openclonk.org
3  *
4  * Copyright (c) 1998-2000, Matthes Bender
5  * Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
6  * Copyright (c) 2009-2016, The OpenClonk Team and contributors
7  *
8  * Distributed under the terms of the ISC license; see accompanying file
9  * "COPYING" for details.
10  *
11  * "Clonk" is a registered trademark of Matthes Bender, used with permission.
12  * See accompanying file "TRADEMARK" for details.
13  *
14  * To redistribute this file separately, substitute the full license texts
15  * for the above references.
16  */
17 
18 /* Logic for C4Object: Menus */
19 
20 #include "C4Include.h"
22 #include "object/C4Object.h"
23 
24 #include "game/C4Viewport.h"
25 #include "graphics/C4Draw.h"
27 #include "lib/StdColors.h"
28 #include "object/C4Def.h"
29 #include "object/C4ObjectMenu.h"
30 #include "player/C4Player.h"
31 #include "player/C4PlayerList.h"
32 #include "script/C4AulExec.h"
33 
34 
35 static void DrawMenuSymbol(int32_t iMenu, C4Facet &cgo, int32_t iOwner)
36 {
37  C4Facet ccgo;
38 
39  DWORD dwColor=0;
40  if (ValidPlr(iOwner)) dwColor=::Players.Get(iOwner)->ColorDw;
41 
42  switch (iMenu)
43  {
44  case C4MN_Buy:
45  ::GraphicsResource.fctFlagClr.DrawClr(ccgo = cgo.GetFraction(75, 75), true, dwColor);
47  ::GraphicsResource.fctArrow.Draw(ccgo = cgo.GetFraction(70, 70, C4FCT_Right, C4FCT_Center), false, 0);
48  break;
49  case C4MN_Sell:
50  ::GraphicsResource.fctFlagClr.DrawClr(ccgo = cgo.GetFraction(75, 75), true, dwColor);
52  ::GraphicsResource.fctArrow.Draw(ccgo = cgo.GetFraction(70, 70, C4FCT_Right, C4FCT_Center), false, 1);
53  break;
54  }
55 }
56 
57 bool C4Object::ActivateMenu(int32_t iMenu, int32_t iMenuSelect,
58  int32_t iMenuData, int32_t iMenuPosition,
59  C4Object *pTarget)
60 {
61  // Variables
62  C4FacetSurface fctSymbol;
63  C4IDList ListItems;
64  // Close any other menu
65  if (Menu && Menu->IsActive()) if (!Menu->TryClose(true, false)) return false;
66  // Create menu
67  if (!Menu) Menu = new C4ObjectMenu; else Menu->ClearItems();
68  // Open menu
69  switch (iMenu)
70  {
71  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
72  case C4MN_Activate:
73  // No target specified: use own container as target
74  if (!pTarget) if (!(pTarget=Contained)) break;
75  // Opening contents menu blocked by RejectContents
76  if (!!pTarget->Call(PSF_RejectContents)) return false;
77  // Create symbol
78  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
79  pTarget->Def->Draw(fctSymbol,false,pTarget->Color,pTarget);
80  // Init
81  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_None,0,iMenu);
82  Menu->SetPermanent(true);
83  Menu->SetRefillObject(pTarget);
84  // Success
85  return true;
86  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
87  case C4MN_Buy:
88  // No target specified: container is base
89  if (!pTarget) if (!(pTarget=Contained)) break;
90  // Create symbol
91  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
92  DrawMenuSymbol(C4MN_Buy, fctSymbol, pTarget->Owner);
93  // Init menu
94  Menu->Init(fctSymbol,LoadResStr("IDS_PLR_NOBUY"),this,C4MN_Extra_Value,0,iMenu);
95  Menu->SetPermanent(true);
96  Menu->SetRefillObject(pTarget);
97  // Success
98  return true;
99  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
100  case C4MN_Sell:
101  // No target specified: container is base
102  if (!pTarget) if (!(pTarget=Contained)) break;
103  // Create symbol & init
104  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
105  DrawMenuSymbol(C4MN_Sell, fctSymbol, pTarget->Owner);
106  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_Value,0,iMenu);
107  Menu->SetPermanent(true);
108  Menu->SetRefillObject(pTarget);
109  // Success
110  return true;
111  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
112  case C4MN_Get:
113  case C4MN_Contents:
114  // No target specified
115  if (!pTarget) break;
116  // Opening contents menu blocked by RejectContents
117  if (!!pTarget->Call(PSF_RejectContents)) return false;
118  // Create symbol & init
119  fctSymbol.Create(C4SymbolSize,C4SymbolSize);
120  pTarget->Def->Draw(fctSymbol,false,pTarget->Color,pTarget);
121  Menu->Init(fctSymbol,FormatString(LoadResStr("IDS_OBJ_EMPTY"),pTarget->GetName()).getData(),this,C4MN_Extra_None,0,iMenu);
122  Menu->SetPermanent(true);
123  Menu->SetRefillObject(pTarget);
124  // Success
125  return true;
126  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
127  case C4MN_Info:
128  // Target by parameter
129  if (!pTarget) break;
130  // Create symbol & init menu
131  fctSymbol.Create(C4SymbolSize, C4SymbolSize); GfxR->fctOKCancel.Draw(fctSymbol,true,0,1);
132  Menu->Init(fctSymbol, pTarget->GetName(), this, C4MN_Extra_None, 0, iMenu, C4MN_Style_Info);
133  Menu->SetPermanent(true);
135  C4Viewport *pViewport = ::Viewports.GetViewport(Controller); // Hackhackhack!!!
136  if (pViewport) Menu->SetLocation((pTarget->GetX() + pTarget->Shape.GetX() + pTarget->Shape.Wdt + 10 - pViewport->GetViewX()) * pViewport->GetZoom(),
137  (pTarget->GetY() + pTarget->Shape.GetY() - pViewport->GetViewY()) * pViewport->GetZoom());
138  // Add info item
139  fctSymbol.Create(C4PictureSize, C4PictureSize); pTarget->Def->Draw(fctSymbol, false, pTarget->Color, pTarget);
140  Menu->Add(pTarget->GetName(), fctSymbol, "", C4MN_Item_NoCount, nullptr, pTarget->GetInfoString().getData());
141  fctSymbol.Default();
142  // Success
143  return true;
144  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
145  }
146  // Invalid menu identification
147  CloseMenu(true);
148  return false;
149 }
150 
151 bool C4Object::CloseMenu(bool fForce)
152 {
153  if (Menu)
154  {
155  if (Menu->IsActive()) if (!Menu->TryClose(fForce, false)) return false;
156  if (!Menu->IsCloseQuerying()) { delete Menu; Menu=nullptr; } // protect menu deletion from recursive menu operation calls
157  }
158  return true;
159 }
160 
161 bool C4Object::MenuCommand(const char *szCommand)
162 {
163  // Native script execution
164  if (!Def || !Status) return false;
165  return !! ::AulExec.DirectExec(this, szCommand, "MenuCommand");
166 }
C4AulExec AulExec
Definition: C4AulExec.cpp:29
const int C4PictureSize
Definition: C4Constants.h:60
const int C4SymbolSize
Definition: C4Constants.h:58
const int32_t C4FCT_Bottom
Definition: C4Facet.h:30
const int32_t C4FCT_Right
Definition: C4Facet.h:28
const int32_t C4FCT_Left
Definition: C4Facet.h:27
const int32_t C4FCT_Center
Definition: C4Facet.h:31
#define PSF_RejectContents
Definition: C4GameScript.h:134
C4GraphicsResource GraphicsResource
#define GfxR
const char * LoadResStr(const char *id)
Definition: C4Language.h:83
@ C4MN_Extra_Value
Definition: C4Menu.h:45
@ C4MN_Extra_None
Definition: C4Menu.h:44
@ C4MN_Item_NoCount
Definition: C4Menu.h:58
@ C4MN_Style_Info
Definition: C4Menu.h:37
@ C4MN_Align_Free
Definition: C4Menu.h:54
@ C4MN_Sell
Definition: C4ObjectMenu.h:32
@ C4MN_Buy
Definition: C4ObjectMenu.h:31
@ C4MN_Activate
Definition: C4ObjectMenu.h:33
@ C4MN_Get
Definition: C4ObjectMenu.h:39
@ C4MN_Contents
Definition: C4ObjectMenu.h:44
@ C4MN_Info
Definition: C4ObjectMenu.h:41
C4PlayerList Players
int32_t ValidPlr(int32_t plr)
C4ViewportList Viewports
uint32_t DWORD
StdStrBuf FormatString(const char *szFmt,...)
Definition: StdBuf.cpp:270
C4Value DirectExec(C4PropList *p, const char *szScript, const char *szContext, bool fPassErrors=false, C4AulScriptContext *context=nullptr, bool parse_function=false)
Definition: C4AulExec.cpp:1012
void Draw(C4Facet &cgo, bool fSelected=false, DWORD iColor=0, C4Object *pObj=nullptr, int32_t iPhaseX=0, int32_t iPhaseY=0, C4DrawTransform *trans=nullptr, const char *graphicsName=nullptr)
Definition: C4Def.cpp:607
void DrawClr(C4Facet &cgo, bool fAspect=true, DWORD dwClr=0)
Definition: C4Facet.cpp:213
void Draw(C4Facet &cgo, bool fAspect=true, int32_t iPhaseX=0, int32_t iPhaseY=0, bool fTransparent=true)
Definition: C4Facet.cpp:154
C4Facet GetFraction(int32_t percentWdt, int32_t percentHgt=0, int32_t alignX=C4FCT_Left, int32_t alignY=C4FCT_Top)
Definition: C4Facet.cpp:555
bool Create(int iWdt, int iHgt, int iWdt2=C4FCT_Full, int iHgt2=C4FCT_Full)
Definition: C4FacetEx.cpp:54
void Default()
Definition: C4FacetEx.h:43
bool Add(const char *szCaption, C4FacetSurface &fctSymbol, const char *szCommand, int32_t iCount=C4MN_Item_NoCount, C4Object *pObject=nullptr, const char *szInfoCaption=nullptr, C4ID idID=C4ID::None, const char *szCommand2=nullptr, bool fOwnValue=false, int32_t iValue=0, bool fIsSelectable=true)
Definition: C4Menu.cpp:350
void SetPermanent(bool fPermanent)
Definition: C4Menu.cpp:862
bool TryClose(bool fOK, bool fControl)
Definition: C4Menu.cpp:280
bool SetLocation(int32_t iX, int32_t iY)
Definition: C4Menu.cpp:951
void SetAlignment(int32_t iAlignment)
Definition: C4Menu.cpp:857
void ClearItems()
Definition: C4Menu.cpp:895
bool IsActive()
Definition: C4Menu.cpp:480
int32_t Owner
Definition: C4Object.h:108
int32_t GetX() const
Definition: C4Object.h:285
bool ActivateMenu(int32_t iMenu, int32_t iMenuSelect=0, int32_t iMenuData=0, int32_t iMenuPosition=0, C4Object *pTarget=nullptr)
bool MenuCommand(const char *szCommand)
class C4ObjectMenu * Menu
Definition: C4Object.h:138
int32_t Controller
Definition: C4Object.h:109
bool CloseMenu(bool fForce)
int32_t GetY() const
Definition: C4Object.h:286
C4ObjectPtr Contained
Definition: C4Object.h:142
C4Def * Def
Definition: C4Object.h:141
uint32_t Color
Definition: C4Object.h:118
StdStrBuf GetInfoString()
Definition: C4Object.cpp:1244
C4Shape Shape
Definition: C4Object.h:146
bool IsCloseQuerying() const
Definition: C4ObjectMenu.h:74
void SetRefillObject(C4Object *pObj)
bool Init(C4FacetSurface &fctSymbol, const char *szEmpty, C4Object *pObject, int32_t iExtra=C4MN_Extra_None, int32_t iExtraData=0, int32_t iId=0, int32_t iStyle=C4MN_Style_Normal, bool fUserMenu=false)
uint32_t ColorDw
Definition: C4Player.h:89
C4Player * Get(int iPlayer) const
virtual const char * GetName() const
Definition: C4PropList.cpp:618
int32_t Status
Definition: C4PropList.h:173
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
Definition: C4PropList.h:114
int32_t Wdt
Definition: C4Rect.h:30
int32_t GetX() const
Definition: C4Shape.h:62
int32_t GetY() const
Definition: C4Shape.h:63
float GetViewY()
Definition: C4Viewport.h:78
float GetViewX()
Definition: C4Viewport.h:76
float GetZoom()
Definition: C4Viewport.h:48
C4Viewport * GetViewport(int32_t player_nr, C4Viewport *prev=nullptr)
const char * getData() const
Definition: StdBuf.h:442