From a4433808695a5d408820e1fac351739333305e2f Mon Sep 17 00:00:00 2001 From: Edmundo Ruiz Date: Sat, 16 Aug 2014 11:51:15 -0700 Subject: [PATCH] Added Adventure Game Studio (AGS) Script language definition and samples. --- lib/linguist/languages.yml | 10 + samples/AGS Script/GlobalScript.asc | 521 ++++++++++++++++++++ samples/AGS Script/GlobalScript.ash | 4 + samples/AGS Script/KeyboardMovement_102.asc | 216 ++++++++ samples/AGS Script/KeyboardMovement_102.ash | 13 + 5 files changed, 764 insertions(+) create mode 100644 samples/AGS Script/GlobalScript.asc create mode 100644 samples/AGS Script/GlobalScript.ash create mode 100644 samples/AGS Script/KeyboardMovement_102.asc create mode 100644 samples/AGS Script/KeyboardMovement_102.ash diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index b7defba5..111ca481 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -28,6 +28,16 @@ ABAP: extensions: - .abap +AGS Script: + type: programming + lexer: C++ + color: "#B9D9FF" + aliases: + - ags + extensions: + - .asc + - .ash + ANTLR: type: programming color: "#9DC3FF" diff --git a/samples/AGS Script/GlobalScript.asc b/samples/AGS Script/GlobalScript.asc new file mode 100644 index 00000000..507cb071 --- /dev/null +++ b/samples/AGS Script/GlobalScript.asc @@ -0,0 +1,521 @@ +// main global script file + +// A function that initializes a bunch of stuff. +function initialize_control_panel() { + // Centre the control panel + gPanel.Centre(); + // Centre the Restart dialog as well + gRestartYN.Centre(); + if (!IsSpeechVoxAvailable()) { + // If there is no speech-vox file, and therefore no speech, + // disable all the controls related with speech. + lblVoice.Visible = false; + btnVoice.Visible = false; + sldVoice.Visible = false; + } + else { + // If there *is*, then set it to voice and text. It's best to use + // both whenever possible, for the player's sake. + SetVoiceMode(eSpeechVoiceAndText); + // And reflect this in the control panel. + btnVoice.Text = "Voice and Text"; + } + if (!System.SupportsGammaControl) { + // If we can't change the gamma settings, disable the relevant options. + sldGamma.Visible = false; + lblGamma.Visible = false; + } + + //And now, set all the defaults + System.Volume = 100; + sldAudio.Value = System.Volume; + SetGameSpeed(40); + sldSpeed.Value = 40; + if (IsSpeechVoxAvailable()) { + SetVoiceMode(eSpeechVoiceAndText); + btnVoice.Text = "Voice and Text"; + sldVoice.Value = 255; + SetSpeechVolume(255); + } + if (System.SupportsGammaControl) { + System.Gamma = 100; + sldGamma.Value = 100; + } +} + +// Called when the game starts, before the first room is loaded +function game_start() { + // Put the code all in a function and then just call the function. + // It saves cluttering up places like game_start. + initialize_control_panel(); + // Use the KeyboardMovement module to, per default, replicate the standard + // keyboard movement of most Sierra games. See KeyboardMovement.txt for more info + KeyboardMovement.SetMode(eKeyboardMovement_Tapping); +} + +function repeatedly_execute() { + + // Put here anything you want to happen every game cycle, even when + // the game is paused. This will not run when the game is blocked + // inside a command like a blocking Walk() + + if (IsGamePaused() == 1) return; + + // Put here anything you want to happen every game cycle, but not + // when the game is paused. +} + +function repeatedly_execute_always() { + + // Put anything you want to happen every game cycle, even + // when the game is blocked inside a command like a + // blocking Walk(). + // You cannot run blocking commands from this function. + +} + +function show_inventory_window () +{ + gInventory.Visible = true; + // switch to the Use cursor (to select items with) + mouse.Mode = eModeInteract; + // But, override the appearance to look like the arrow + mouse.UseModeGraphic(eModePointer); +} + +function show_save_game_dialog() +{ + gSaveGame.Visible = true; + // Get the list of save games + lstSaveGamesList.FillSaveGameList(); + if (lstSaveGamesList.ItemCount > 0) + { + // If there is at least one, set the default text + // to be the first game's name + txtNewSaveName.Text = lstSaveGamesList.Items[0]; + } + else + { + // No save games yet, default empty text. + txtNewSaveName.Text = ""; + } + mouse.UseModeGraphic(eModePointer); + gIconbar.Visible = false; +} + +function show_restore_game_dialog() +{ + gRestoreGame.Visible = true; + lstRestoreGamesList.FillSaveGameList(); + mouse.UseModeGraphic(eModePointer); + gIconbar.Visible = false; +} + +function close_save_game_dialog() +{ + gSaveGame.Visible = false; + mouse.UseDefaultGraphic(); + gIconbar.Visible = true; +} + +function close_restore_game_dialog() +{ + gRestoreGame.Visible = false; + mouse.UseDefaultGraphic(); + gIconbar.Visible = true; +} + +// Called when a key is pressed. keycode holds the key's ASCII code +function on_key_press(eKeyCode keycode) { + // The following is called before "if game is paused keycode=0", so + // it'll happen even when the game is paused. + + if ((keycode == eKeyEscape) && gRestartYN.Visible) { + //Use ESC to cancel restart. + gRestartYN.Visible = false; + gIconbar.Visible = true; + // If the panel's not ON, then the player must have gotten here by tapping F9, + // therefore his cursor needs restoring. If the panel IS on, then it doesn't, + // because it's already a pointer. Get used to thinking like this!! + if (!gPanel.Visible) mouse.UseDefaultGraphic(); + return; + } + if ((keycode == eKeyEscape) && gPanel.Visible) { + // Use ESC to turn the panel off. + gPanel.Visible = false; + mouse.UseDefaultGraphic(); + gIconbar.Visible = true; + return; + } + if ((keycode == eKeyEscape) && (gSaveGame.Visible)) + { + // Use ESC to close the save game dialog + close_save_game_dialog(); + return; + } + if ((keycode == eKeyEscape) && (gRestoreGame.Visible)) + { + // Use ESC to close the restore game dialog + close_restore_game_dialog(); + return; + } + + if (keycode == eKeyReturn) { + // ENTER, in this case merely confirms restart + if (gRestartYN.Visible) RestartGame(); + } + + if (IsGamePaused() || (IsInterfaceEnabled() == 0)) + { + // If the game is paused with a modal GUI on the + // screen, or the player interface is disabled in + // a cut scene, ignore any keypresses. + return; + } + + // FUNCTION KEYS AND SYSTEM SHORTCUTS + if (keycode == eKeyEscape) { + // ESC + gPanel.Visible = true; + gIconbar.Visible = false; + mouse.UseModeGraphic(eModePointer); + } + if (keycode == eKeyCtrlQ) QuitGame(1); // Ctrl-Q + if (keycode == eKeyF5) show_save_game_dialog(); // F5 + if (keycode == eKeyF7) show_restore_game_dialog(); // F7 + if (keycode == eKeyF9) { + // F9, asks the player to confirm restarting (so much better to always confirm first) + gRestartYN.Visible = true; + gIconbar.Visible = false; + mouse.UseModeGraphic(eModePointer); + } + if (keycode == eKeyF12) SaveScreenShot("scrnshot.bmp"); // F12 + if (keycode == eKeyTab) show_inventory_window(); // Tab, show inventory + + // GAME COMMAND SHORTCUTS + if (keycode == 'W') mouse.Mode=eModeWalkto; //Notice this alternate way to indicate keycodes. + if (keycode == 'L') mouse.Mode=eModeLookat; //Note that all we do here is set modes. + if (keycode == 'U') mouse.Mode=eModeInteract; //If you want something else to happen, such as GUI buttons highlighting, + if (keycode == 'T') mouse.Mode=eModeTalkto; //you'll need some more scripting done. + if (keycode == 'I') mouse.Mode=eModeUseinv; //But this will, as-is, give you some standard keyboard shortcuts your players will very much appreciate. + + // For extra cursor modes, such as pick up, feel free to add as you will. + // Uncomment the line below if you use the "Pick Up" mode. + //if (keycode == 'P' || keycode == 'G') mouse.Mode=eModePickup; + + // DEBUG FUNCTIONS + if (keycode == eKeyCtrlS) Debug(0,0); // Ctrl-S, give all inventory + if (keycode == eKeyCtrlV) Debug(1,0); // Ctrl-V, version + if (keycode == eKeyCtrlA) Debug(2,0); // Ctrl-A, show walkable areas + if (keycode == eKeyCtrlX) Debug(3,0); // Ctrl-X, teleport to room + if (keycode == eKeyCtrlW && game.debug_mode) + player.PlaceOnWalkableArea(); //Ctrl-W, move to walkable area +} + + +function on_mouse_click(MouseButton button) { + // called when a mouse button is clicked. button is either LEFT or RIGHT + if (IsGamePaused() == 1) { + // Game is paused, so do nothing (ie. don't allow mouse click) + } + else if (button == eMouseLeft) { + ProcessClick(mouse.x, mouse.y, mouse.Mode ); + } + else if (button == eMouseRight || button == eMouseWheelSouth){ + // right-click our mouse-wheel down, so cycle cursor + mouse.SelectNextMode(); + } + else if (button == eMouseMiddle) { + // Middle-button-click, default make character walk to clicked area (a little shortcut) + // Could have been just "player.Walk(mouse.x,mouse.y)", but it's best to + // leave our options open - what if you have a special script triggered + // on "walking" mode? + ProcessClick(mouse.x, mouse.y, eModeWalkto); + } + else if (button == eMouseWheelNorth) { + // Mouse-wheel up, cycle cursors + // If mode isn't WALK, set the previous mode (notice usage of numbers instead + // of eNums, when it suits us)... + if (mouse.Mode>0) mouse.Mode=mouse.Mode-1; + else + { + // ...but if it is WALK mode... + if (player.ActiveInventory!=null) + { + //...and the player has a selected inventory item, set mouse mode to UseInv. + mouse.Mode=eModeUseinv; + } + else + { + // If they don't, however, just set it to mode TALK (change this line if you add more cursor modes) + mouse.Mode=eModeTalkto; + } + } + } +} + +function interface_click(int interface, int button) { + // This function is obsolete, from 2.62 and earlier versions. +} + +function btnInvUp_Click(GUIControl *control, MouseButton button) { + invCustomInv.ScrollUp(); +} + +function btnInvDown_Click(GUIControl *control, MouseButton button) { + invCustomInv.ScrollDown(); +} + +function btnInvOK_Click(GUIControl *control, MouseButton button) { + // They pressed the OK button, close the GUI + gInventory.Visible = false; + mouse.UseDefaultGraphic(); +} + +function btnInvSelect_Click(GUIControl *control, MouseButton button) { + + // They pressed SELECT, so switch to the Get cursor + mouse.Mode = eModeInteract; + // But, override the appearance to look like the arrow + mouse.UseModeGraphic(eModePointer); +} + +function btnIconInv_Click(GUIControl *control, MouseButton button) { + + show_inventory_window(); +} + +function btnIconCurInv_Click(GUIControl *control, MouseButton button) { + + if (player.ActiveInventory != null) + mouse.Mode = eModeUseinv; +} + +function btnIconSave_Click(GUIControl *control, MouseButton button) +{ + show_save_game_dialog(); +} + +function btnIconLoad_Click(GUIControl *control, MouseButton button) +{ + show_restore_game_dialog(); +} + +function btnIconExit_Click(GUIControl *control, MouseButton button) { + + QuitGame(1); +} + +function btnIconAbout_Click(GUIControl *control, MouseButton button) { + + gPanel.Visible=true; + gIconbar.Visible=false; + mouse.UseModeGraphic(eModePointer); +} + +function cEgo_Look() +{ + Display("Damn, I'm looking good!"); +} + +function cEgo_Interact() +{ + Display("You rub your hands up and down your clothes."); +} + +function cEgo_Talk() +{ + Display("Talking to yourself is a sign of madness!"); +} + +//START OF CONTROL PANEL FUNCTIONS +function btnSave_OnClick(GUIControl *control, MouseButton button) +{ + gPanel.Visible = false; + mouse.UseDefaultGraphic(); + gIconbar.Visible = true; + Wait(1); + btnIconSave_Click(btnIconSave, eMouseLeft); +} + +function gControl_OnClick(GUI *theGui, MouseButton button) +{ + +} + +function btnAbout_OnClick(GUIControl *control, MouseButton button) +{ +Display("Adventure Game Studio run-time engine default game."); +} + +function btnQuit_OnClick(GUIControl *control, MouseButton button) +{ + gPanel.Visible = false; + Wait(1); + QuitGame(1); + gPanel.Visible = true; + gIconbar.Visible = false; + mouse.UseModeGraphic(eModePointer); +} + +function btnLoad_OnClick(GUIControl *control, MouseButton button) +{ + gPanel.Visible = false; + mouse.UseDefaultGraphic(); + gIconbar.Visible = true; + Wait(1); + btnIconLoad_Click(btnIconLoad, eMouseLeft); +} + +function btnResume_OnClick(GUIControl *control, MouseButton button) +{ + gPanel.Visible = false; + mouse.UseDefaultGraphic(); + gIconbar.Visible = true; +} + +function sldAudio_OnChange(GUIControl *control) +{ + System.Volume = sldAudio.Value; +} + +function sldVoice_OnChange(GUIControl *control) +{ + // Sets voice volume. Note that we don't check for the existence of speech.vox - + // we did that in game_start, so if it's not there the slider won't even be available. + SetSpeechVolume(sldVoice.Value); +} + +function btnVoice_OnClick(GUIControl *control, MouseButton button) +{ + // Note that we don't check for the existence of speech.vox - we did that in game_start, + // so if it's not there the button won't even be available. + if (btnVoice.Text == "Voice and Text") { + SetVoiceMode(eSpeechVoiceOnly); + btnVoice.Text = "Voice only"; + } + else if (btnVoice.Text == "Voice only") { + SetVoiceMode(eSpeechTextOnly); + btnVoice.Text = "Text only"; + } + else if (btnVoice.Text == "Text only") { + SetVoiceMode(eSpeechVoiceAndText); + btnVoice.Text = "Voice and Text"; + } +} + +function sldGamma_OnChange(GUIControl *control) +{ + // Set the gamma. Note there's no need to check for anything else, as we ensured, + // in game_start, that the slider won't even appear if it's not possible to do this. + System.Gamma = sldGamma.Value; +} + +function btnDefault_OnClick(GUIControl *control, MouseButton button) +{ + // Reset everything to default. You'll have to edit these as well as the sliders + // if you'd rather have different default parameters. + System.Volume = 100; + sldAudio.Value = System.Volume; + sldSpeed.Value = 40; + SetGameSpeed(40); + if (IsSpeechVoxAvailable()) { + SetVoiceMode(eSpeechVoiceAndText); + btnVoice.Text = "Voice and Text"; + sldVoice.Value = 255; + SetSpeechVolume(255); + } + if (System.SupportsGammaControl) { + System.Gamma = 100; + sldGamma.Value = 100; + } +} +//END OF CONTROL PANEL FUNCTIONS + +function dialog_request(int param) +{ + // This is used by the dialog text parser if you need to process + // text that the player types in to the parser. + // It is not used by default. +} + +function sldSpeed_OnChange(GUIControl *control) +{ + SetGameSpeed(sldSpeed.Value); +} + +function btnRestart_OnClick(GUIControl *control, MouseButton button) +{ + gRestartYN.Visible=true; + gIconbar.Visible=false; +} + +function btnRestartYes_OnClick(GUIControl *control, MouseButton button) +{ + RestartGame(); +} + +function btnRestartNo_OnClick(GUIControl *control, MouseButton button) +{ + gRestartYN.Visible = false; + gIconbar.Visible = true; + // If the panel's not ON, then the player must have gotten here by tapping F9, + // therefore his cursor needs restoring. If the panel IS on, then it doesn't, + // because it's already a pointer. Get used to thinking like this!! + if (!gPanel.Visible) mouse.UseDefaultGraphic(); +} + +function btnCancelSave_OnClick(GUIControl *control, MouseButton button) +{ + close_save_game_dialog(); +} + +function btnSaveGame_OnClick(GUIControl *control, MouseButton button) +{ + int gameSlotToSaveInto = lstSaveGamesList.ItemCount + 1; + int i = 0; + while (i < lstSaveGamesList.ItemCount) + { + if (lstSaveGamesList.Items[i] == txtNewSaveName.Text) + { + gameSlotToSaveInto = lstSaveGamesList.SaveGameSlots[i]; + } + i++; + } + SaveGameSlot(gameSlotToSaveInto, txtNewSaveName.Text); + close_save_game_dialog(); +} + +function btnCancelRestore_OnClick(GUIControl *control, MouseButton button) +{ + close_restore_game_dialog(); +} + +function btnRestoreGame_OnClick(GUIControl *control, MouseButton button) +{ + if (lstRestoreGamesList.SelectedIndex >= 0) + { + RestoreGameSlot(lstRestoreGamesList.SaveGameSlots[lstRestoreGamesList.SelectedIndex]); + } + close_restore_game_dialog(); +} + +function lstSaveGamesList_OnSelectionCh(GUIControl *control) +{ + txtNewSaveName.Text = lstSaveGamesList.Items[lstSaveGamesList.SelectedIndex]; +} + +function txtNewSaveName_OnActivate(GUIControl *control) +{ + // Pressing return in the text box simulates clicking the Save button + btnSaveGame_OnClick(control, eMouseLeft); +} + +function btnDeleteSave_OnClick(GUIControl *control, MouseButton button) +{ + if (lstSaveGamesList.SelectedIndex >= 0) + { + DeleteSaveSlot(lstSaveGamesList.SaveGameSlots[lstSaveGamesList.SelectedIndex]); + lstSaveGamesList.FillSaveGameList(); + } +} diff --git a/samples/AGS Script/GlobalScript.ash b/samples/AGS Script/GlobalScript.ash new file mode 100644 index 00000000..2dab2f11 --- /dev/null +++ b/samples/AGS Script/GlobalScript.ash @@ -0,0 +1,4 @@ +// Main header script - this will be included into every script in +// the game (local and global). Do not place functions here; rather, +// place import definitions and #define names here to be used by all +// scripts. diff --git a/samples/AGS Script/KeyboardMovement_102.asc b/samples/AGS Script/KeyboardMovement_102.asc new file mode 100644 index 00000000..8776789a --- /dev/null +++ b/samples/AGS Script/KeyboardMovement_102.asc @@ -0,0 +1,216 @@ +// Main script for module 'KeyboardMovement' + +//**************************************************************************************************** +// DEFINITIONS +//**************************************************************************************************** + +#define DISTANCE 10000// distance player walks in Tapping mode before he stops + +enum KeyboardMovement_Directions { + eKeyboardMovement_Stop, + eKeyboardMovement_DownLeft, + eKeyboardMovement_Down, + eKeyboardMovement_DownRight, + eKeyboardMovement_Left, + eKeyboardMovement_Right, + eKeyboardMovement_UpLeft, + eKeyboardMovement_Up, + eKeyboardMovement_UpRight +}; + +//**************************************************************************************************** +// VARIABLES +//**************************************************************************************************** + +// keycodes as variables for future key customization functions (static variables?): +int KeyboardMovement_KeyDown = 380; // down arrow +int KeyboardMovement_KeyLeft = 375; // left arrow +int KeyboardMovement_KeyRight = 377; // right arrow +int KeyboardMovement_KeyUp = 372; // up arrow +int KeyboardMovement_KeyDownRight = 381; // PgDn (numpad) +int KeyboardMovement_KeyUpRight = 373; // PgUp (numpad) +int KeyboardMovement_KeyDownLeft = 379; // End (numpad) +int KeyboardMovement_KeyUpLeft = 371; // Home (numpad) +int KeyboardMovement_KeyStop = 376; // 5 (numpad) + +KeyboardMovement_Modes KeyboardMovement_Mode = eKeyboardMovement_None; // stores current keyboard control mode (disabled by default) + +KeyboardMovement_Directions KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // stores current walking direction of player character + +//**************************************************************************************************** +// USER FUNCTIONS +//**************************************************************************************************** + +//==================================================================================================== + +static function KeyboardMovement::SetMode(KeyboardMovement_Modes mode) { + KeyboardMovement_Mode = mode; +} + +//==================================================================================================== + +// key customization functions here + +//==================================================================================================== + +//**************************************************************************************************** +// EVENT HANDLER FUNCTIONS +//**************************************************************************************************** + +//==================================================================================================== + +function repeatedly_execute() { + + //-------------------------------------------------- + // Pressing mode + //-------------------------------------------------- + + if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Pressing) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; + // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function + + KeyboardMovement_Directions newdirection; // declare variable storing new direction + + // get new direction: + if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyDownRight)) ) newdirection = eKeyboardMovement_DownRight; // if down&right arrows or PgDn (numeric pad) held down, set new direction to Down-Right + else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyUpRight)) ) newdirection = eKeyboardMovement_UpRight; // up&right arrows or PgUp (numpad) + else if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyDownLeft)) ) newdirection = eKeyboardMovement_DownLeft; // down&left arrows or End (numpad) + else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyUpLeft)) ) newdirection = eKeyboardMovement_UpLeft; // up&left arrows or Home (numpad) + else if (IsKeyPressed(KeyboardMovement_KeyDown)) newdirection = eKeyboardMovement_Down; // down arrow + else if (IsKeyPressed(KeyboardMovement_KeyLeft)) newdirection = eKeyboardMovement_Left; // left arrow + else if (IsKeyPressed(KeyboardMovement_KeyRight)) newdirection = eKeyboardMovement_Right; // right arrow + else if (IsKeyPressed(KeyboardMovement_KeyUp)) newdirection = eKeyboardMovement_Up; // up arrow + else newdirection = eKeyboardMovement_Stop; // if none of the above held down, set it to stop player character + + if (IsKeyPressed(KeyboardMovement_KeyStop)) newdirection = eKeyboardMovement_Stop; // if 5 (numeric pad) held down, stop player character, regardless of whether some of the above are held down + + if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction + + if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character + else { // if new direction is NOT the Stop command + + int dx, dy; // declare variables storing new walk coordinates + if (newdirection == eKeyboardMovement_DownRight) { + dx = DISTANCE; + dy = DISTANCE; + } + else if (newdirection == eKeyboardMovement_UpRight) { + dx = DISTANCE; + dy = -DISTANCE; + } + else if (newdirection == eKeyboardMovement_DownLeft) { + dx = -DISTANCE; + dy = DISTANCE; + } + else if (newdirection == eKeyboardMovement_UpLeft) { + dx = -DISTANCE; + dy = -DISTANCE; + } + else if (newdirection == eKeyboardMovement_Down) { + dx = 0; + dy = DISTANCE; + } + else if (newdirection == eKeyboardMovement_Left) { + dx = -DISTANCE; + dy = 0; + } + else if (newdirection == eKeyboardMovement_Right) { + dx = DISTANCE; + dy = 0; + } + else if (newdirection == eKeyboardMovement_Up) { + dx = 0; + dy = -DISTANCE; + } + + player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates + } + KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction + + } + +} + +//==================================================================================================== + +function on_key_press(int keycode) { + + //-------------------------------------------------- + // Tapping mode + //-------------------------------------------------- + + if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Tapping) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; + // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function + + KeyboardMovement_Directions newdirection; // declare variable storing new direction + + // get new direction: + if (keycode == KeyboardMovement_KeyDownRight) newdirection = eKeyboardMovement_DownRight; // if down-right key pressed, set new direction to Down-Right + else if (keycode == KeyboardMovement_KeyUpRight) newdirection = eKeyboardMovement_UpRight; + else if (keycode == KeyboardMovement_KeyDownLeft) newdirection = eKeyboardMovement_DownLeft; + else if (keycode == KeyboardMovement_KeyUpLeft) newdirection = eKeyboardMovement_UpLeft; + else if (keycode == KeyboardMovement_KeyDown) newdirection = eKeyboardMovement_Down; + else if (keycode == KeyboardMovement_KeyLeft) newdirection = eKeyboardMovement_Left; + else if (keycode == KeyboardMovement_KeyRight) newdirection = eKeyboardMovement_Right; + else if (keycode == KeyboardMovement_KeyUp) newdirection = eKeyboardMovement_Up; + else if (keycode == KeyboardMovement_KeyStop) newdirection = eKeyboardMovement_Stop; // if stop key pressed, set to stop player character + + if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction + + if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character + else { // if new direction is NOT the Stop command + + int dx, dy; // declare variables storing new walk coordinates + if (newdirection == eKeyboardMovement_DownRight) { + dx = DISTANCE; + dy = DISTANCE; + } + else if (newdirection == eKeyboardMovement_UpRight) { + dx = DISTANCE; + dy = -DISTANCE; + } + else if (newdirection == eKeyboardMovement_DownLeft) { + dx = -DISTANCE; + dy = DISTANCE; + } + else if (newdirection == eKeyboardMovement_UpLeft) { + dx = -DISTANCE; + dy = -DISTANCE; + } + else if (newdirection == eKeyboardMovement_Down) { + dx = 0; + dy = DISTANCE; + } + else if (newdirection == eKeyboardMovement_Left) { + dx = -DISTANCE; + dy = 0; + } + else if (newdirection == eKeyboardMovement_Right) { + dx = DISTANCE; + dy = 0; + } + else if (newdirection == eKeyboardMovement_Up) { + dx = 0; + dy = -DISTANCE; + } + + player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates + } + KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction + + } + else { // if new direction is same as current direction + player.StopMoving(); // stop player character + KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // update current direction + } + +} + +//==================================================================================================== + +function on_event(EventType event, int data) { + + if (event == eEventLeaveRoom) KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; + +} + +//==================================================================================================== diff --git a/samples/AGS Script/KeyboardMovement_102.ash b/samples/AGS Script/KeyboardMovement_102.ash new file mode 100644 index 00000000..a1e28c2c --- /dev/null +++ b/samples/AGS Script/KeyboardMovement_102.ash @@ -0,0 +1,13 @@ +// Script header for module 'KeyboardMovement' + +#define KeyboardMovement_VERSION 101 + +enum KeyboardMovement_Modes { + eKeyboardMovement_None, + eKeyboardMovement_Tapping, + eKeyboardMovement_Pressing +}; + +struct KeyboardMovement { + import static function SetMode(KeyboardMovement_Modes mode); +};