Jump to content
The Dark Mod Forums

stgatilov

Active Developer
  • Posts

    6825
  • Joined

  • Last visited

  • Days Won

    237

Posts posted by stgatilov

  1. 10 hours ago, Daft Mugi said:

    My dev machine is down for repairs at the moment, unfortunately.

    I plan to make dev build today evening.

    If your machine is under repair, may I commit your 3 patches beforehand?
    I mean: leaning, mantling, and weapon selection.
    Or you want to do it yourself? Or are you waiting for more feedback?

    • Like 1
  2. 1 hour ago, ChronA said:

    The essence of the proposal is that whatever interaction is the most indispensable--the "primary action"--that should be mapped to the default short frob that everyone is familiar with. The less important "secondary" action gets mapped to the new long frob, which we hope will be more discoverable than the use-while-frobbing combo.

    There also such thing as "code inertia".
    You are discussing something as simple as "controls" or "bindinds". But in reality it is the whole logic of frobbing, grabbing, dragging, light extinguishing, light handles, scripts and spawnargs --- all tied in a single knot.

    The code existed long time in a way that you can shoulder a body only after you grab it, and you can extinguish a candle only after you grab it. As far as I understand, @Daft Mugi did not refactor everything so that this idea no longer exists --- that would be too hard right now and probably break too much. Under the hood, there old logic somewhat remains in addition to the new one.

    Such things often bite back with bugs, corner cases. Also it makes it even harder to further change things in frobbing. Of course, one could say that the new code has been extensively play-tested, but then we'll find yet another mission where something is used in unexpected way and we need to change something again. Indeed, happy people will just add more if-s and condition-s, but often it just shifts the problem into a different case.

    So you know, if there are several plausible solutions, I would definitely lean to a more conservative one, which better complements the old one.

  3. 1 minute ago, snatcher said:

    Yeah, actually @Daft Mugi could consider making parts of the source code he works on script-friendly, instead of adding obscure cvars that we easily forget about and might never be worthy of a proper in-game setting.

    Oh god no!

    With this patch, the frob code already looks like spaghetti.
    If you make it scriptable, it only means all non-standard configurations will break all th etime.

  4. 6 minutes ago, ChronA said:

    The TDM training mission is technically competent, but it fails at the critical requirement of giving new players motivation to slog through the learning curve in order to play the game proper. This is an area where Thief inarguably did it better even 20 years ago. TDM's tutorial is too long. It is bloated with too much non-essential information, and lacks any teasers of the world building or gameplay loops that would motivate a player to try the game proper.

    Yes, absolutely.
    It is not tutorial, it is "training" mission.
    More like a playground, which appeared when no real missions existed.

    New Job does not count either: it just shows 3-4 tips, which are on the level of generic idea.

    Tutorial should be short, simple, linear, and able to cite current player's controls straight into text messages.

  5. One issue I really see with saying "just click to shoulder body" is that clicking again does not drop it.

    Right now the player has to press Enter to shoulder the body, so it is logical to press Enter to unshoulder it.
    But as soon as we try to simplify it and move shouldering to the same mouse button, it would be natural to expect that player should unshoulder with the same mouse button too. But it does not happen by default.

    It is indeed possible to unshoulder on click. That's what @Wellingtoncrab said is already done with the patch, although it did not work for me when I tried --- perhaps I messed something up. The real issue is that player might also want to frob doors when body is shouldered, so now opening doors and unshouldering body gets mixed together. It is possible to unshoulder on click only when there is no object highlighted, but that's still a bit strange.

    And I think there is no perfect way around it.

  6. 8 hours ago, Daft Mugi said:

    Is there agreement that the following issues need to be solved?

     

    • How can the control scheme be made less cumbersome?
    • How can bodies be shouldered without first dragging them?
    • How can candles be extinguished and lanterns toggled off/on without first picking them up?
    • How can so much key pressing and mouse clicking (currently in TDM 2.11) be eliminated?

     

    I think not.
    The goal is to have convenient way to instantly shoulder a body and instantly extinguish the candle.
    The old scheme is bad because frob is by default on mouse, and use is by default on keyboard, so doing click + keypress + click feels awful.

    As for discoverability, only the proper tutorial mission can really solve all the problems.

    Quote

    Even if you disagree with long-press frob, is it ok to include long-press frob in 2.12 dev if players want it?

    You have something like 4 pending changes right now.
    Perhaps you commit the other three (which are less radical) to trunk, then I'll make a dev build of it, and then I'll apply your patch and create a test build (also in tdm_installer) with frob changes? Then I can do the same with double-clicking prototype.

     

  7. 9 hours ago, Daft Mugi said:

    Another reason for long-press frob for special action: 2.11 already has one, multiloot.

    Quick-press frob to loot.
    Long-press frob to multiloot.

    It is not a long-click, it is click-and-hold, where holding time matters (and is much longer than long click).
    So with your change it would be short click, long click, and click-and-hold.

    Click-and-hold at least continues short click, while long click does not.
    When I pick up a candle, the candle is lift off with delay --- that's because long click does not continue the action of short click, so the code has to wait until mouse is released and can't apply the short-click action immediately.
    That's exactly the issue that you fixed with crouching, and now you introduce it in another place.

     

  8. Maybe I'll try make a double-click prototype?
    Indeed, I don't have 7 months, so it won't be anywhere as polished as this proposal, but perhaps I could make something enough to understand how it feels.

    The double-clicking can be made generic, so that we would probably be able to assign other actions to double-click.

    P.S. I think I only saw long-click thing on touch screens, and there I always see some kind of circular progress bar which explains to me that holding the button will do something special. But that's not something suitable for TDM unfortunately. And yeah, I cannot easily google up discussions regarding long-click with mouse.

  9. 10 minutes ago, Daft Mugi said:

    This long-press frob proposal has already been play tested and agreed to be a good control scheme by several players. Double-click frob would need new code written, would need to be play tested, and would need to be fine tuned based on player feedback. Another rewrite of the code would be a distraction and may not bring us closer to the goal of "providing a better experience for new players as well as longtime players," especially since one has already been found and proven: long-press frob.

    After 7 months of player research, code experiments, early player feedback, adjustments, rewriting code, and more player feedback, I believe long-press frob is good enough, given all of the compromises, imperfections, and its iterative design. It solves the problems stated in the proposal on the first page, and its design goals are met.

    Well, I'm sorry I missed the discussion. The only threads I see are 2 weeks old.

    You decided to change core aspect of gameplay, such things are painful.

  10. Oh no, you are changing the controls scheme.

    Previously body grabbing was toggle-like behavior (click to toggle between grabbed and not), now it has hold-like behavior (has to hold to drag body). Previously clicking a body did not shoulder it, now it does. Previously holding the click slightly longer did not cause a different action on a candle, now it does.

    The old controls scheme is consistent: you click to grab/ungrab, then you Enter to perform action on the grabbed object. The double-click scheme is also consistent: you still click to grab/ungrab, but now you also have double-click to combine grab + action.

    The proposed scheme is totally inconsistent. Clicking on an object grabs it, clicking again ungrabs. Clicking on a body... shoulders it... why? Then clicking again does not even unshoulder it. Long click on a candle extinguishes it without grabbing, but long click on a body grabs it... why? So you hold you mouse for grabbing bodies, but for grabbing candles this does not work... why?
    Sooner or later someone will come and say that objects should also be grabbed by holding, since bodies does so. And we'll make excuses like "you know, body grabbing is garbage and nobody needs it, but grabbing objects is different, so we just made different controls, and now making them similar won't work".

    I like the idea of making instant-shoulder and candle extinguishing easy to do, but the exact controls scheme is something very strange.

    • Like 1
  11. 25 minutes ago, Wellingtoncrab said:

    There is a method via the delay cvar for experienced players who prefer the old system to restore it, so I am uncertain what the down side is really?

    I don't pay attention to this argument, sorry.

    Quote

    What is getting lost is the primary interaction with a body imo is actually to shoulder it - not drag it. Obfuscating this behind a second input is clunky and confusing to new players.

    I can agree that grabbing bodies has little gameplay utility and is something like an engine show-off. But situation with candles is different: both grabbing and extinguishing are useful. Click vs Long click, irreversibly extinguishing candles accidentally, eternal arguments about exact duration --- this confusion is removed with double-click.

    And new players have equally low chance to discover double-click and long click, unless it is explained somewhere.

    UPDATE: And the double-click approach does not change existing controls, only adds new meaning for the second part of double-click.

  12. It feels uncomfortable that two entirely different actions are done depending on how long I hold the button.
    This is not even a widespread UI design.

    Why not double-click instead?

    Suppose something like that:

    • Single-click body to grab/ungrab it
    • Double-click body to shoulder it
    • Single-click candle to grab/ungrab it
    • Double-click candle to extinguish it

    This even satisfies the sanity condition that double-click action should include the single-click action:

    • When double-clicking body: first click -> grab it, second click -> shoulder it.
    • When double-clicking candle: first click -> grab it, second click -> extinguish and ungrab it.

    Isn't it better in all regards?

    • Like 1
  13. I asked myself and my family: how would they lean into the doorway if they don't want to be seen?

    All of us prefer to only expose head. And this is impossible for a human being to do with such a low rotation angle.
    Moreover, my family members also suggested leaning horizontally, i.e. with full 90 degree angle.

    As far as I understand, the main reason to love your change is because it simply makes leaning easier for the player. But I think it is wrong: leaning should only be used to quickly glimpse what is around the corner. If you want to look properly, just go around the corner with your full body. And most definitely, it is wrong to make shooting bow easy while leaning.

    Of course, we are not some kind of spies/special agents, maybe someone knows better.

    • Like 3
  14. On 9/5/2023 at 7:43 PM, Geep said:

    Instead, let me show the end goal I was thinking about, through a mockup. The idea is to have a non-moving oval (representing a disc laid flat on the floor, in perspective), with a small colored square constrained to move smoothly along it, representing the direction of the sound source. In the mockup (attached cropped image), the oval is blue, the square is red, and the direction being indicated is front right. (Or maybe the ring should be dark red and the square light blue... or disk could be solid, etc.) The translucent field is 240 (out of 640) pixels wide, so the oval shown is roughly 30 pixels wide. The perspective could also be made more prominent, if instead of a uniform stroke width on the ring, the lower ("nearer") edge was thicker than the upper ("farther") edge.

    Sound-source-as-red-square-on-blue-oval.jpg

    Yes, it sounds like better idea than virtual 5-speakers.
    I guess simply passing local X and Y coordinates would be enough for this.

    Do we want to show elevation somehow?

  15. On 9/4/2023 at 12:10 AM, Geep said:

    @stgatilov, both the compressed Carleton and Stone fonts look better than the original uncompressed IMHO. We could give the user a choice of either, while keeping the gui scale factor fixed at 0.25 (e.g., 12 pt). If Stone's artifacting you mentioned was not too problematic.

    I guess at this moment we have too many analysis and need "the decision" 😀

    Maybe I'd share the GUI code for

    And we'll just accept it or decide what needs to be changed?


     

    Quote

     

    Another topic. I'd like to play around a bit with the 5 sound-source-location variables you were using to position the white bars. In file tdm_subtitles_message.gui, these were of form:

    "gui::subtitle0_oriBackLeft"   // where 0 if subtitle was shown in vertical "slot 0"; could be 1 or 2
    and name suffixes were _oriFront, _oriFrontLeft, _oriFrontRight, _oriBackLeft, and _oriBackRight

    Could you briefly explain what values these could take on, how they would work or differ, how often they get updated? Thanks

     

    The code is here: https://svn.thedarkmod.com/publicsvn/darkmod_src/trunk/ui/UserInterface.cpp
    Check SubtitleOrientationProbeVars, ComputeSubtitleProbeValues, basically everything about subtitles and probes.

    The source for spatializedDirection is in https://svn.thedarkmod.com/publicsvn/darkmod_src/trunk/sound/snd_world.cpp  (just search for spatializedDirection ).

    So I think right now the XY plane in listener's local coordinates is considered.
    5 virtual speakers are placed. Then we look at the unit direction vector to sound source (distance does not matter), and decompose it as linear combination to two adjacent speakers. The coefficients are put into these "oriXxxYyy" GUI vars. As far as I understand, this approach is used to compute volumes for individual speakers on 5.1 sound systems.
    Volume affects alpha-transparency (_alpha), but I think it is not very reliable now.

  16. 17 hours ago, Geep said:

    @stgatilov, would it be correct to say that the latest public 2.12dev contains the original 4:3 fonts, and does not distribute the narrowed 16:9 fonts (e.g., for Carleton and possibly Stone)?

    It is available in dev builds as engine feature (6283), but it is not used in any GUI scripts.

    I was hoping that someone would volunteer to propose, tweak, and test the change of font size and rectangle of subtitles. Perhaps I should just do rough approximation myself and commit changes 😞


    I feel that feature of showing location is pretty desolated too.
    Indeed, I implemented it and it works, but it fells horrible. People are asking what the hell this moving white bars are, which totally confirms the idea that current design does not work.

    Quote

    Also, I'd greatly appreciate it if you could expose a numeric variable whose value is set to indicate whether the current subtitle is of type "verbosity story", "verbosity speech", or "verbosity effect", that can be read (but not set) in tdm_subtitles_common.gui

    Yes, this is indeed possible, not really hard to do in C++.
    To you want to color the text?

    • Like 1
  17. Now, it is just for "auto-remove me after X seconds".

    But nothing uses it, except for some platform (not used anywhere) and the famous "penis".
    The penis is attached to one type of proguard, which is indeed used in High Expectations, but I have no idea how this suicide script can migrate from penis to anything else.
    And I don't see any C++ code for dynamically spawning tdm_suicide.

    While I checked that the values that I printed are usually correct, and tdm_suicide.script:54 is indeed removal of entity, I think that logic won't help here.
    Either the information about tdm_suicide is simply nonsense, or there is some major corruption happening long before crash. I wonder if @snatcher can reproduce the crash from fresh start, or whether he reproduces it from particular save file.

  18. According to the last three events, someone deleted the arrow from script:

    Spoiler
    [116336] Attach: player1_weapon <- idStaticEntity_atdm:attachment_aimer_7
    Stack trace (hash = FFFF20A8):
      idCommonLocal::PrintCallStack           G:/TheDarkMod/darkmod_211_src/framework/Common.cpp:618
      idAnimatedEntity::Attach                G:/TheDarkMod/darkmod_211_src/game/Entity.cpp:8724
      idWeapon::Attach                        G:/TheDarkMod/darkmod_211_src/game/Weapon.cpp:3612
      idWeapon::GetWeaponDef                  G:/TheDarkMod/darkmod_211_src/game/Weapon.cpp:1064
      idPlayer::Weapon_Combat                 G:/TheDarkMod/darkmod_211_src/game/Player.cpp:4164
      idPlayer::UpdateWeapon                  G:/TheDarkMod/darkmod_211_src/game/Player.cpp:4422
      idPlayer::Think                         G:/TheDarkMod/darkmod_211_src/game/Player.cpp:7551
      idGameLocal::RunFrame                   G:/TheDarkMod/darkmod_211_src/game/Game_local.cpp:3366
      idSessionLocal::RunGameTic              G:/TheDarkMod/darkmod_211_src/framework/Session.cpp:3061
      idSessionLocal::RunGameTics             G:/TheDarkMod/darkmod_211_src/framework/Session.cpp:3107
      idSessionLocal::FrontendThreadFunction  G:/TheDarkMod/darkmod_211_src/framework/Session.cpp:3157
      <lambda_4da128457a8cbff73e848802e63deb86>::<lambda_invoker_cdecl>  G:/TheDarkMod/darkmod_211_src/framework/Session.cpp:3234
      BaseThreadInitThunk                     :0
      RtlUserThreadStart                      :0
    [116336] Attach: player1_weapon <- idStaticEntity_atdm:attachment_broadhead_8
    Stack trace (hash = FFFF5B10):
      idCommonLocal::PrintCallStack           G:/TheDarkMod/darkmod_211_src/framework/Common.cpp:618
      idAnimatedEntity::Attach                G:/TheDarkMod/darkmod_211_src/game/Entity.cpp:8724
      idWeapon::Attach                        G:/TheDarkMod/darkmod_211_src/game/Weapon.cpp:3612
      idWeapon::GetWeaponDef                  G:/TheDarkMod/darkmod_211_src/game/Weapon.cpp:1108
      idPlayer::Weapon_Combat                 G:/TheDarkMod/darkmod_211_src/game/Player.cpp:4164
      idPlayer::UpdateWeapon                  G:/TheDarkMod/darkmod_211_src/game/Player.cpp:4422
      idPlayer::Think                         G:/TheDarkMod/darkmod_211_src/game/Player.cpp:7551
      idGameLocal::RunFrame                   G:/TheDarkMod/darkmod_211_src/game/Game_local.cpp:3366
      idSessionLocal::RunGameTic              G:/TheDarkMod/darkmod_211_src/framework/Session.cpp:3061
      idSessionLocal::RunGameTics             G:/TheDarkMod/darkmod_211_src/framework/Session.cpp:3107
      idSessionLocal::FrontendThreadFunction  G:/TheDarkMod/darkmod_211_src/framework/Session.cpp:3157
      <lambda_4da128457a8cbff73e848802e63deb86>::<lambda_invoker_cdecl>  G:/TheDarkMod/darkmod_211_src/framework/Session.cpp:3234
      BaseThreadInitThunk                     :0
      RtlUserThreadStart                      :0
    [116384] Destroy: idStaticEntity_atdm:attachment_broadhead_8
    Stack trace (hash = 00001C57):
      idCommonLocal::PrintCallStack           G:/TheDarkMod/darkmod_211_src/framework/Common.cpp:618
      idEntity::~idEntity                     G:/TheDarkMod/darkmod_211_src/game/Entity.cpp:1545
      idStaticEntity::`scalar deleting destructor'  :0
      idClass::Event_Remove                   G:/TheDarkMod/darkmod_211_src/game/gamesys/Class.cpp:1093
      idClass::ProcessEventArgPtr             G:/TheDarkMod/darkmod_211_src/game/gamesys/Class.cpp:1049
      idEvent::ServiceEvents                  G:/TheDarkMod/darkmod_211_src/game/gamesys/Event.cpp:619
      idGameLocal::RunFrame                   G:/TheDarkMod/darkmod_211_src/game/Game_local.cpp:3405
      idSessionLocal::RunGameTic              G:/TheDarkMod/darkmod_211_src/framework/Session.cpp:3061
      idSessionLocal::RunGameTics             G:/TheDarkMod/darkmod_211_src/framework/Session.cpp:3107
      idSessionLocal::FrontendThreadFunction  G:/TheDarkMod/darkmod_211_src/framework/Session.cpp:3157
      <lambda_4da128457a8cbff73e848802e63deb86>::<lambda_invoker_cdecl>  G:/TheDarkMod/darkmod_211_src/framework/Session.cpp:3234
      BaseThreadInitThunk                     :0
      RtlUserThreadStart                      :0

     

    The first two events happen inside GetWeaponDef when player switches from blackjack to bow.
    This should be the only place messing with the weapon.
    Two attachments (aimer + arrow) are added here.

    But then the arrow gets destroyed inside ServiceEvents, which is unexpected.
    Normally, it should be destroyed in the same GetWeaponDef at the very beginning, before creating new attachments.
    This is either triggered by script code, or by C++ code which posts delayed event.
     

    • Like 1
×
×
  • Create New...