You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.0 KiB

Game start

In private void e(string A_0) in 2.6

  1. Sort characters, then objects when needed
    • needed: sort_order == ALPHA, the other two orders enum val doesn't do anything
    • inventory and room object order sort the same list, so as long at least one of them is ALPHA, they will be sorted...
    • apparently they are not resorted after a name change
  2. g: fixup object and character locations inside rooms (replace with UUID if it is a name)
  3. CorrectCommandsAndConditions: Add missing exits, buggily add missing <<On Character Enter>> and <<On Character Leave>> actions to characters, fixup actions, fixup object inside object locations (like g).
  4. s, r: Status bar?
  5. Hide main pic, portrait when needed
  6. Prompt for gender if needed (window title: Select Player Gender, prompt: Enter Your Gender:)
  7. Prompt for name if needed (prompt: Enter your character's name:). If empty: MsgBox Sorry, you can not enter an empty player name., retry.
  8. Print to log: Title, Opening Message
  9. Get starting room
  10. m: inventory shit
  11. l: room object shit, portal
  12. a(image, true/false): image shit
  13. a(true, true): room enter procedure with actions and timers.
  14. m, l again
  15. h: characters in room
  16. d: execute <<On Game Start>> (then 150 lines of completely unnecessary code executed)
  17. Start bg music
  18. o: actions for player & room

Random notes

  • Names are generally case insensitive. Due to .NET this means Unicode and the whole kitchen sink, like ß being equal to ss, and other nonsense like 👭 == 👫 (at least under mono, fortunately my win7 vm doesn't seem to support this emoji cancer).
  • HideMainPic && UseInlineImages: images pasted into the log text (?)
  • Action names starting with << are hidden
  • Turn off notifications: do not print You can see ..., ... is here lines. Plus DISPLAYCHARDESC action: do not print wearing, carrying

Player

  • There's only one of it
  • On start it's always in a room (you can't set it to none in the designer, and if you delete his starting room -> crash on load)

Portal items

  • Visible in room object list if room's any exit has this as portal
  • Their location is set to LT_PORTAL, but it is only checked when printing the contents of the object (they're somewhy skipped for portals), but actions can overwrite this location while still remaining a portal, so this whole location type is kinda useless (other than being an another source of bugs).

Timers

Single timer execute

  1. If the action is not Active, it doesn't do anything.
  2. Increase TurnNumber
  3. If TurnNumber > Length and this is a with length timer: set TurnNumber to 0, and if not auto restart set Active to false.
  4. Otherwise execute these actions in order: "<<On Each Turn>>", "<<On Turn " + TurnNumber + ">>", and if TurnNumber == Length: "<<On Last Turn>>". If any action resets the timer, subsequent actions are skipped.
  5. Update the status bar.
  6. Returns false if during each turn/n turn action the timer was reset (but not if during the last).

Note that this means with auto restart events, executing actions are skipped in one round (when TurnNumber == Length+1).

Multi timer execute

  1. Iterate through all timer:
  2. Set the currently executing timer
  3. If it is not a live timer, execute single timer procedure until it returns true.
  4. Refresh actions, inventory, room objects, character lists
  5. Clear the currently executing timer, even in case of an exception

This is called from: game startup, when changing rooms from the UI, after loading a savegame (?), after executing an action (if it didn't end the game).

Live timers

There is a background thread (RunTestThread) for EVERY FUCKING LIVE TIMER (even inactive ones). It sleeps for 500ms then it increases the elapsed time variable by 500ms. If elapsed_time >= TimerSeconds, it sets elapsed time back to 0 and if the timer is active, it post a message back to the GUI thread to execute the single timer procedure then blocks until it finishes. If it somehow manages to raise an exception, the thread quits. Yes, this means this is completely unsuitable for timers more than a few seconds, since for example if you have timer for 60s, activating it means it will trigger any time between the next 20ns and 2 hours.

Move to an other room

When the user manually selects a move direction in the GUI: 0. Increase TurnNumber

  1. Write the moce direction to the log (North, SouthWest, etc.)
  2. Execute room enter's inner procedure, but with Leave instead of Enter, with <<On Player Leave First Time>> when LeaveFirstTime is false, then with <<On Player Enter>>.
  3. If the move was canceled, don't do anything else.
  4. Move the player to the specified room.
  5. Execute room enter procedure with actions and timers.