From 32f5b1cb25e5493189ac0a7274d487b4a1cfdbbf Mon Sep 17 00:00:00 2001 From: Maikel de Vries Date: Mon, 26 Sep 2016 17:15:37 +0200 Subject: [PATCH] add keypad to decoration objects This can control lots of things and triggers on entering the correct code. --- .../Room.ocd/Keypad.ocd/DefCore.txt | 8 + .../Room.ocd/Keypad.ocd/Graphics.8.png | Bin 0 -> 37837 bytes .../Room.ocd/Keypad.ocd/Normal.8.png | Bin 0 -> 1905 bytes .../Room.ocd/Keypad.ocd/Script.c | 366 ++++++++++++++++++ .../Room.ocd/Keypad.ocd/StringTblDE.txt | 28 ++ .../Room.ocd/Keypad.ocd/StringTblUS.txt | 28 ++ 6 files changed, 430 insertions(+) create mode 100644 planet/Decoration.ocd/Room.ocd/Keypad.ocd/DefCore.txt create mode 100644 planet/Decoration.ocd/Room.ocd/Keypad.ocd/Graphics.8.png create mode 100644 planet/Decoration.ocd/Room.ocd/Keypad.ocd/Normal.8.png create mode 100644 planet/Decoration.ocd/Room.ocd/Keypad.ocd/Script.c create mode 100644 planet/Decoration.ocd/Room.ocd/Keypad.ocd/StringTblDE.txt create mode 100644 planet/Decoration.ocd/Room.ocd/Keypad.ocd/StringTblUS.txt diff --git a/planet/Decoration.ocd/Room.ocd/Keypad.ocd/DefCore.txt b/planet/Decoration.ocd/Room.ocd/Keypad.ocd/DefCore.txt new file mode 100644 index 000000000..dfc7304ba --- /dev/null +++ b/planet/Decoration.ocd/Room.ocd/Keypad.ocd/DefCore.txt @@ -0,0 +1,8 @@ +[DefCore] +id=Keypad +Version=8,0 +Category=C4D_StaticBack +Picture=0,0,112,144 +Width=14 +Height=18 +Offset=-7,-9 diff --git a/planet/Decoration.ocd/Room.ocd/Keypad.ocd/Graphics.8.png b/planet/Decoration.ocd/Room.ocd/Keypad.ocd/Graphics.8.png new file mode 100644 index 0000000000000000000000000000000000000000..f5504728edd2fcebc29be934fa624e8f75b9e2bb GIT binary patch literal 37837 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 BUcdkV literal 0 HcmV?d00001 diff --git a/planet/Decoration.ocd/Room.ocd/Keypad.ocd/Normal.8.png b/planet/Decoration.ocd/Room.ocd/Keypad.ocd/Normal.8.png new file mode 100644 index 0000000000000000000000000000000000000000..d8c417df5d7e7c1e2a00dc68309134d7ef5d202e GIT binary patch literal 1905 zcmZ9N2T&8(7KTHB(1b{@PYe*cAciQY^n`>WL^|P>9Z@tncMgKg__D>rr(fN(!!aQ}-Kd=S+~Swi+z|QN9QZ~;hOGvmiw z1)cO;p%eA+Z=OT{FbRb@`mlGTnitZl9@l-SnN)J}Wc8HB9{qtkcopFK_Iv53NfBEH z*$8yDWB`G&A1}RJ4v~@AJ*nIld3V(-ly6p>y(nCT5;qZ<-@M`x0zHU$Z+(c}oQEQApBLinT9I{7$a#1TT6_QL& zEp)SzjK+AB)evhyPKx4wD#7d)>6wadj|5d3yg5nzTUjG*%rTrCL^t+Zl^7pMIAzbk zOTIvoTwHqs?pT6<7LiIv0-+dmS(dqwl!T@l*W(lZ;Q`-J(2R(yOw!*T%%$6A0Y z>)d&trI21zE@bjtXQYN`XN%V$e|QfuF7%jX8j>##)Lnh_8{^m0zj%vYS+w|tFq`za zx*!ZRyclLOuR8y|X{u5iXNb3^dPtbTiK>a3>}v)9C^NyTbefGMcjgu6vv4cY5><{7&GBgobihokthhk5}3$m%hm1J z`=5deXD~dD{FjIKBl#~&bK2f1NO4F+V2N;~-ZK#YWpY^@8CW9n!h&a5s9x_lV%*aE zOqO{aA{UIbW<7Ie8gV(7!-aN1;LUcf&1d7@*pX1eU1I_U!%B=qf2O<35 zg$*N)!?@_-#&=5j}-a=vT%Kmo3(x}+l zds>*I zZ>-WfpHkqf1{2`{LmOhcwb3PXs%`#ZhBNSPiZE>0y}?oA5RAy^UP>=Ykf6c@d*cHx zRWnN|-oLL|8r|>cuFHx2IlU-Of?6+lIR@*I-jhpZddCQBmS3u*K`Rqhp|Z~tR&V(T zXqQ(dwng0Ro%0m9iOq{&QtBw~*^ymKb7zuz2VJn!f=%bT4`=PF3T(ubn0FB^*JmRL zW%JE-y@SqJT-Dckfy{@L6)euafE2HsO4P{Ql0Raq7eAvL9qJf_N^jE_LHm;KxD{MU z2PPJHXi8U6oME(QyEA)9{9+}Z$r_XyY=k*ze=kgFTtQ=A_oYyu%}o&Dq676Suqc?M zcH7O`kYQvqsKWV%eBH}bGl&7{bKevrO1Uq!`7K4Se3~zJr2P{xZ=@KB<;}>+{jW92 zqyYxyok;s6nVC4|v!;vX%Ux0T|2oho3$5IEqNDjwqIP|bDzGqw^sP}nEaq-P2w{WY zHT+jUlOmO~uKEyrt(7N+iuDR|n=8#zQPN>Z1XrEPHba?0^`TB+;)MA#Lq;X5IB zt3lEbwFL@?-C*LlJv`}6m-|wx# zzQE#HFM{fC+R6SqrhR={GBg)(Om<+Hl)ok&lq(3M{> z{^`a^xlf&)F&*KIn&F@g&R8qLH)EncRLjYH^)wu97s>hX)h4$!6qOuaa1f)VhS5zu Z;yrkkpKb9;N0j@A0&I{Dh+0c5@o&G(hL!*T literal 0 HcmV?d00001 diff --git a/planet/Decoration.ocd/Room.ocd/Keypad.ocd/Script.c b/planet/Decoration.ocd/Room.ocd/Keypad.ocd/Script.c new file mode 100644 index 000000000..c70840130 --- /dev/null +++ b/planet/Decoration.ocd/Room.ocd/Keypad.ocd/Script.c @@ -0,0 +1,366 @@ +/** + Keypad + allows to enter digit codes to trigger an event. + + @author Maikel +*/ + +// Background colors for hovering and bars and description. +static const KEYPADMENU_BackgroundColor = 0x77000000; +static const KEYPADMENU_HoverColor = 0x99888888; +static const KEYPADMENU_BarColor = 0x99888888; + +local code, correct_code; +local target_door; +local correct_code_action, wrong_code_action; +local menu, menu_id, menu_target, menu_controller; + + +/*-- Script Interface --*/ + +public func SetKeypadCode(string to_code) +{ + // Check if code contains any non-digits. + var non_digits = RegexMatch(to_code, "[^0-9]+"); + if (!DeepEqual(non_digits, [])) + { + Log("$WarningKeypadCode$", to_code); + return; + } + // If code is valid, set it. + correct_code = to_code; + return; +} + +public func SetStoneDoor(object door) +{ + target_door = door; + return true; +} + +public func OpenDoor(object clonk) +{ + SetPlrView(clonk->GetController(), target_door); + var y_off = target_door->~GetFloorOffset(); + Global->CreateLight(target_door->GetX(), target_door->GetY() + y_off, 30, Fx_Light.LGT_Temp, clonk->GetController(), 30, 50); + target_door->OpenDoor(); + return; +} + +public func OnCorrectCodeEntered(object clonk) +{ + // Open door if specified. + if (target_door) + OpenDoor(clonk); + // Perform user action last; it may delete the door/clonk/etc. + UserAction->EvaluateAction(correct_code_action, this, clonk); + return; +} + +public func OnWrongCodeEntered(object clonk) +{ + // Perform user action last; it may delete the door/clonk/etc. + UserAction->EvaluateAction(wrong_code_action, this, clonk); + return; +} + +public func SetCodeActions(new_correct_action, new_wrong_action) +{ + correct_code_action = new_correct_action; + wrong_code_action = new_wrong_action; + return; +} + + +/*-- Saving --*/ + +public func SaveScenarioObject(proplist props) +{ + if (!_inherited(props, ...)) return false; + if (correct_code) props->AddCall("Code", this, "SetKeypadCode", Format("%v", correct_code)); + if (target_door) props->AddCall("Target", this, "SetStoneDoor", target_door); + if (correct_code_action || wrong_code_action) props->AddCall("Action", this, "SetCodeActions", correct_code_action, wrong_code_action); + return true; +} + + +/*-- Editor --*/ + +public func Definition(proplist def) +{ + if (!def.EditorProps) + def.EditorProps = {}; + def.EditorProps.correct_code = { Name = "$KeypadCode$", Type = "string", Set="SetKeypadCode", EditorHelp = "$HelpKeypadCode$" }; + def.EditorProps.target_door = { Name = "$KeypadTarget$", Type = "object", Filter = "IsSwitchTarget", EditorHelp = "$HelpKeypadTarget$" }; + def.EditorProps.correct_code_action = new UserAction.Prop { Name = "$OnCorrectCodeAction$", EditorHelp = "$HelpOnCorrectCodeAction$" }; + def.EditorProps.wrong_code_action = new UserAction.Prop { Name = "$OnWrongCodeAction$", EditorHelp = "$HelpOnWrongCodeAction$" }; + return; +} + + +/*-- Interaction --*/ + +public func IsInteractable(object clonk) +{ + return clonk->GetProcedure() == "WALK" && (!clonk->GetMenu() || clonk->GetMenu().ID != menu_id); +} + +public func Interact(object clonk) +{ + code = ""; + OpenKeypadMenu(clonk); + return true; +} + + +/*-- Menu --*/ + +public func OpenKeypadMenu(object clonk) +{ + // Only one clonk at a time can handle the keypad. + if (menu_controller) + return; + + // If the menu is already open, don't open another instance. + if (clonk->GetMenu() && clonk->GetMenu().ID == menu_id) + return; + + // This object functions as menu target and for visibility. + menu_target = CreateContents(Dummy); + menu_target.Visibility = VIS_Owner; + menu_target->SetOwner(clonk->GetOwner()); + menu_controller = clonk; + + // Make the room/credits menu. + menu = + { + Target = menu_target, + Left = "50%-6em", + Right = "50%+6em", + Top = "50%-10em", + Bottom = "50%+8em", + Decoration = GUI_MenuDeco, + BackgroundColor = {Std = KEYPADMENU_BackgroundColor}, + }; + menu.code = + { + Target = this, + ID = 2, + Bottom = "1.5em", + text = + { + Target = this, + ID = 21, + Right = "4em", + Style = GUI_TextVCenter, + Text = "$MsgEnterCode$" + }, + value = + { + Target = this, + ID = 22, + Left = "4em", + Right = "100%-0.05em", + Style = GUI_TextVCenter | GUI_TextRight, + Text = nil + } + }; + menu.bar = + { + Target = this, + ID = 3, + Top = "1.5em", + Bottom = "2em", + BackgroundColor = {Std = ROOMMENU_BarColor}, + }; + menu.keys = + { + Target = this, + ID = 4, + Top = "2em", + }; + menu.keys.key1 = MakePadButton(0, 0, Icon_Number, "1", "$TooltipDigit$", GuiAction_Call(this, "UpdateMenuCode", 1)); + menu.keys.key2 = MakePadButton(1, 0, Icon_Number, "2", "$TooltipDigit$", GuiAction_Call(this, "UpdateMenuCode", 2)); + menu.keys.key3 = MakePadButton(2, 0, Icon_Number, "3", "$TooltipDigit$", GuiAction_Call(this, "UpdateMenuCode", 3)); + menu.keys.key4 = MakePadButton(0, 1, Icon_Number, "4", "$TooltipDigit$", GuiAction_Call(this, "UpdateMenuCode", 4)); + menu.keys.key5 = MakePadButton(1, 1, Icon_Number, "5", "$TooltipDigit$", GuiAction_Call(this, "UpdateMenuCode", 5)); + menu.keys.key6 = MakePadButton(2, 1, Icon_Number, "6", "$TooltipDigit$", GuiAction_Call(this, "UpdateMenuCode", 6)); + menu.keys.key7 = MakePadButton(0, 2, Icon_Number, "7", "$TooltipDigit$", GuiAction_Call(this, "UpdateMenuCode", 7)); + menu.keys.key8 = MakePadButton(1, 2, Icon_Number, "8", "$TooltipDigit$", GuiAction_Call(this, "UpdateMenuCode", 8)); + menu.keys.key9 = MakePadButton(2, 2, Icon_Number, "9", "$TooltipDigit$", GuiAction_Call(this, "UpdateMenuCode", 9)); + menu.keys.key0 = MakePadButton(1, 3, Icon_Number, "0", "$TooltipDigit$", GuiAction_Call(this, "UpdateMenuCode", 0)); + menu.keys.enter = MakePadButton(2, 3, Icon_Ok, nil, "$TooltipCheck$", GuiAction_Call(this, "EnterKeypadCode", nil)); + + menu.keys.clearlast = MakePadButton(0, 0, Icon_Number, "Hash", "$TooltipClearLast$", GuiAction_Call(this, "UpdateMenuCode", nil)); + menu.keys.clearlast.Left = "0em"; menu.keys.clearlast.Right = "2em"; menu.keys.clearlast.Top = "12em"; menu.keys.clearlast.Bottom = "14em"; + menu.keys.clearlast.image = {Left = "50%", Top = "50%", Symbol = Icon_Arrow, GraphicsName = "Left"}; + + menu.keys.clearcode = MakePadButton(0, 0, Icon_Number, "Hash", "$TooltipClearCode$", GuiAction_Call(this, "ClearMenuCode", nil)); + menu.keys.clearcode.Left = "2em"; menu.keys.clearcode.Right = "4em"; menu.keys.clearcode.Top = "12em"; menu.keys.clearcode.Bottom = "14em"; + menu.keys.clearcode.image = {Left = "50%", Top = "50%", Symbol = Icon_Cancel}; + + menu.keys.resetcode = MakePadButton(0, 0, Icon_Number, "Hash", "$TooltipResetCode$", GuiAction_Call(this, "ResetKeypadCode", nil)); + menu.keys.resetcode.Left = "2em"; menu.keys.resetcode.Right = "4em"; menu.keys.resetcode.Top = "14em"; menu.keys.resetcode.Bottom = "16em"; + menu.keys.resetcode.image = {Left = "50%", Top = "50%", Symbol = Icon_Swap}; + + menu.keys.close = MakePadButton(0, 0, Icon_Cancel, nil, "$TooltipClose$", GuiAction_Call(this, "CloseKeypadMenu", nil)); + menu.keys.close.Left = "0em"; menu.keys.close.Right = "2em"; menu.keys.close.Top = "14em"; menu.keys.close.Bottom = "16em"; + + // Open the menu and store the menu ID. + menu_id = GuiOpen(menu); + // Notify the clonk and set the menu. + clonk->SetMenu(this); + return; +} + +public func MakePadButton(int x, int y, id symbol, string graphics_name, string tooltip, on_click) +{ + return { + Left = Format("%dem", 4 * x), + Right = Format("%dem", 4 * (x + 1)), + Top = Format("%dem", 4 * y), + Bottom = Format("%dem", 4 * (y + 1)), + Symbol = symbol, + GraphicsName = graphics_name, + BackgroundColor = {Std = 0, Hover = KEYPADMENU_HoverColor}, + OnMouseIn = GuiAction_SetTag("Hover"), + OnMouseOut = GuiAction_SetTag("Std"), + OnClick = on_click, + Tooltip = tooltip + }; +} + +public func UpdateMenuCode(int digit_pressed) +{ + if (digit_pressed == nil) + { + if (GetType(code) == C4V_String) + code = TakeString(code, 0, GetLength(code) - 1); + Sound("UI::Click?"); + } + else + { + if (code == nil) + code = Format("%d", digit_pressed); + else + code = Format("%s%d", code, digit_pressed); + Sound("UI::Tick"); + } + menu.code.value.Text = code; + GuiUpdate(menu.code.value, menu_id, menu.code.value.ID, this); + return; +} + +public func ClearMenuCode() +{ + code = nil; + Sound("UI::Click?"); + menu.code.value.Text = code; + GuiUpdate(menu.code.value, menu_id, menu.code.value.ID, this); + return; +} + +public func EnterKeypadCode() +{ + if (menu_controller.code_reset_state == "reset") + { + correct_code = code; + code = nil; + menu.code.value.Text = "$MsgCodeReset$"; + menu_controller.code_reset_state = nil; + Sound("UI::Confirmed"); + menu.code.text.Text = "$MsgEnterCode$"; + GuiUpdate(menu.code.text, menu_id, menu.code.text.ID, this); + } + else + { + if (correct_code == nil) + { + code = nil; + menu.code.value.Text = "$MsgNoCode$"; + Sound("UI::Error"); + } + else if (correct_code == code) + { + code = nil; + Sound("UI::Confirmed"); + if (menu_controller.code_reset_state == "confirm") + { + menu.code.value.Text = "$MsgCodeConfirmed$"; + menu_controller.code_reset_state = "reset"; + menu.code.text.Text = "$MsgEnterNewCode$"; + GuiUpdate(menu.code.text, menu_id, menu.code.text.ID, this); + } + else + { + menu.code.value.Text = "$MsgCorrectCode$"; + // Execute the correct code trigger. + OnCorrectCodeEntered(menu_controller); + } + } + else + { + code = nil; + menu.code.value.Text = "$MsgWrongCode$"; + Sound("UI::Error"); + // Execute the wrong code trigger. + OnWrongCodeEntered(menu_controller); + } + } + GuiUpdate(menu.code.value, menu_id, menu.code.value.ID, this); + return; +} + +public func ResetKeypadCode() +{ + // Only allow resetting the code if the clonk (menu_target) has entered the correct code before. + if (correct_code == nil) + { + menu_controller.code_reset_state = "reset"; + menu.code.text.Text = "$MsgEnterNewCode$"; + GuiUpdate(menu.code.text, menu_id, menu.code.text.ID, this); + } + else if (menu_controller.code_reset_state != "reset" && menu_controller.code_reset_state != "confirm") + { + menu_controller.code_reset_state = "confirm"; + menu.code.text.Text = "$MsgConfirmCode$"; + GuiUpdate(menu.code.text, menu_id, menu.code.text.ID, this); + } + else + { + menu_controller.code_reset_state = nil; + menu.code.text.Text = "$MsgEnterCode$"; + GuiUpdate(menu.code.text, menu_id, menu.code.text.ID, this); + } + Sound("UI::Tick"); + return; +} + +public func CloseKeypadMenu() +{ + // Close the menu and inform the controller. + Sound("UI::Close"); + GuiClose(menu_id, nil, this); + menu_target->RemoveObject(); + menu_target = nil; + menu_id = nil; + if (menu_controller) + { + menu_controller.code_reset_state = nil; + menu_controller->MenuClosed(); + } + menu_controller = nil; + return; +} + +public func Close() +{ + CloseKeypadMenu(); + return; +} + + +/*-- Properties --*/ + +local Name = "$Name$"; +local Description = "$Description$"; \ No newline at end of file diff --git a/planet/Decoration.ocd/Room.ocd/Keypad.ocd/StringTblDE.txt b/planet/Decoration.ocd/Room.ocd/Keypad.ocd/StringTblDE.txt new file mode 100644 index 000000000..fce68adc9 --- /dev/null +++ b/planet/Decoration.ocd/Room.ocd/Keypad.ocd/StringTblDE.txt @@ -0,0 +1,28 @@ +Name=Ziffernblock +Description=Richtiger Kennzahl eingeben um ein Ereignis aus zu lösen. + +MsgEnterCode=Kennzahl eingeben: +MsgEnterNewCode=Neue Kennzahl: +MsgConfirmCode=Kennzahl bestätigen: +MsgNoCode=Ziffernblock hat kein Kennzahl! +MsgCorrectCode=Richtiger Kennzahl! +MsgWrongCode=Falscher Kennzahl! +MsgCodeReset=Kennzahl wurde zurück gesetzt! +MsgCodeConfirmed=Kennzahl bestätigt, jetzt zurücksetzen. + +TooltipDigit=Gebe Nummer ein. +TooltipCheck=Kontrolliere die eingebene Kennzahl. +TooltipClose=Schließe das Ziffernblock. +TooltipClearLast=Entferne die letzte Nummer. +TooltipClearCode=Eingegebene Kennzahl löschen. +TooltipResetCode=Die Kennzahl des Ziffernblocks zurücksetzen. + +KeypadCode=Kennzahl +KeypadTarget=Ziel +OnCorrectCodeAction=Aktion 'richtige Kennzahl' +OnWrongCodeAction=Aktion 'falsche Kennzahl' +HelpKeypadCode=Gib den Kennzahl ein der vom Spieler eingetippt werden muss (darf nur Zahlen enthalten). +HelpKeypadTarget=Tür die geöffnet wird wenn den richtigen Kennzahl eingegeben wird. +HelpOnCorrectCodeAction=Aktion die ausgeführt wird wenn die richtige Kennzahl eingegeben wird. +HelpOnWrongCodeAction=Aktion die ausgeführt wird wenn eine falsche Kennzahl eingegeben wird. +WarningKeypadCode=WARNUNG: Kennzahl vom Ziffernblock (%s) enthält Charaktere die nicht Zahlen sind, Kennzahl wird nicht gesetzt. \ No newline at end of file diff --git a/planet/Decoration.ocd/Room.ocd/Keypad.ocd/StringTblUS.txt b/planet/Decoration.ocd/Room.ocd/Keypad.ocd/StringTblUS.txt new file mode 100644 index 000000000..23a9d1eab --- /dev/null +++ b/planet/Decoration.ocd/Room.ocd/Keypad.ocd/StringTblUS.txt @@ -0,0 +1,28 @@ +Name=Keypad +Description=Enter the correct code to trigger an event. + +MsgEnterCode=Enter code: +MsgEnterNewCode=New code: +MsgConfirmCode=Confirm code: +MsgNoCode=Keypad has no code! +MsgCorrectCode=Correct code! +MsgWrongCode=Wrong code! +MsgCodeReset=Code has been reset! +MsgCodeConfirmed=Code confirmed, reset now. + +TooltipDigit=Enter digit. +TooltipCheck=Check the entered code. +TooltipClose=Close the keypad. +TooltipClearLast=Delete the last digit. +TooltipClearCode=Clear the entered code. +TooltipResetCode=Reset the keypad code. + +KeypadCode=Code +KeypadTarget=Target +OnCorrectCodeAction=Action 'correct code' +OnWrongCodeAction=Action 'wrong code' +HelpKeypadCode=Enter the keypad code the player must type in (must be digits only). +HelpKeypadTarget=Target door that will be opened when the correct has been entered. +HelpOnCorrectCodeAction=Action to be executed when the correct code has been entered. +HelpOnWrongCodeAction=Action to be executed when a wrong code has been entered. +WarningKeypadCode=WARNING: keypad code (%s) contains some non-digit characters, code will not be set. \ No newline at end of file