| 07-01-2008, 07:46 PM | #1 |
Basically, I want people to test this demo map, and tell me what they think of the system(s). Basically, it's two conversations, one after another. You can use the arrow keys for conversation choices, and the escape key to skip what's currently being said, instantly (or you can wait it out). As fas as I can tell, it workless seemlessly and actually works quite well as a design, but I need other people's opinions on it as well. The more detailed critique, the better. (Some of you might recognise the demo map, but I've encorporated some new systems and made it sleeker overall. CG Convo is actually now an outdated name; should be CG TransConvo or something.) If you need any real enticement, it's funny, and very short. Cookies are available for helping. |
| 07-01-2008, 07:55 PM | #2 |
I like it, although I think that the text could be somewhat better placed. I also think that you'll have problems with the environment, as you can see for long distances, etc. By that, I mean you can see Jana in this cinematic when you're talking to the ghoul. That's not a big problem in this, I know, but if some map maker was to use this, then it could be. |
| 07-01-2008, 08:17 PM | #3 |
It's nice, just like last time, but it seems to me that waits are lame. This requires that a trigger fires your conversation. If this were a pure jass system (although it feels like it's meant for GUI...), it'd probably be best to do: JASS://Empties out the current conversation function ClearConvo takes nothing returns nothing //This sets up the current convo, adding a choice displayed as 'name', that, when the player presses the appropriate key, //has the current hero say 'say', the sound 'play' is played, and, once the sound either finishes or ESC is pressed, the //callback 'caller' is called (where callback is a function interface or boolexpr or similar). Returns false if all five slots are full function ConvoAddChoice takes string name, string say, callback caller, sound play returns boolean //Displays all choices avaliable function DisplayConvo takes nothing returns nothing Oh, and about transmissions and such, well... I tend to take the OOP method: JASS:library Characters initializer Init function interface Callback takes nothing returns nothing globals private constant real DELAY = .1 private boolean autoskip = false private boolean ESCAPE = false private timer T=CreateTimer() private boolean active private Callback Call endglobals private function CallEscape takes nothing returns nothing set active=false call Call.execute() endfunction private function SetEscape takes nothing returns nothing set active=false call PauseTimer(T) call TimerStart(T,DELAY,false,function CallEscape) endfunction struct Hero private static timer camT = CreateTimer() private static unit camTarget unit main playercolor color string name static method create takes string name, unit u, playercolor c returns Hero local Hero h=Hero.allocate() set h.main=u set h.color=c set h.name=name call SetUnitColor(u,c) return h endmethod private static method camLock takes nothing returns nothing call ResetToGameCamera(.04) call SetCameraTargetController(.camTarget,0,0,false) endmethod method lockCameraTo takes nothing returns nothing set .camTarget = .main call TimerStart(.camT,.02,true,function Hero.camLock) endmethod static method unlockCamera takes nothing returns nothing call PauseTimer(.camT) endmethod method say takes string text, Callback c, real dur returns nothing if(not autoskip)then set dur=9999999. endif call SetCinematicScene(GetUnitTypeId(.main),.color,.name,text,dur,0) set Call = c set active=true call TimerStart(T,dur,false,function CallEscape) endmethod method order takes string order returns boolean return IssueImmediateOrder(.main,order) endmethod method orderPoint takes string order, real x, real y returns boolean return IssuePointOrder(.main,order,x,y) endmethod method orderTarget takes string order, widget target returns boolean return IssueTargetOrder(.main,order,target) endmethod method operator show= takes boolean which returns nothing call ShowUnit(.main,which) endmethod method operator paused= takes boolean which returns nothing call PauseUnit(.main,which) endmethod method operator x= takes real xa returns nothing call SetUnitX(.main,xa) endmethod method operator y= takes real ya returns nothing call SetUnitY(.main,ya) endmethod method operator facing= takes real f returns nothing call SetUnitFacing(.main,f) endmethod method operator x takes nothing returns real return GetUnitX(.main) endmethod method operator y takes nothing returns real return GetUnitY(.main) endmethod method operator facing takes nothing returns real return GetUnitFacing(.main) endmethod endstruct private function Cond takes nothing returns boolean return active endfunction private function Init takes nothing returns nothing local trigger t=CreateTrigger() call TriggerRegisterPlayerEvent(t,Player(0),EVENT_PLAYER_END_CINEMATIC) call TriggerAddCondition(t,Condition(function Cond)) call TriggerAddAction(t,function SetEscape) endfunction //! textmacro NewHero takes NAME, ID, OWNER, COLOR library $NAME$ initializer init globals Hero $NAME$ endglobals private function init takes nothing returns nothing set $NAME$=Hero.create("$NAME$",CreateUnit(Player($OWNER$),'$ID$',0,0,0),ConvertPlayerColor($COLOR$)) set $NAME$.show=false endfunction endlibrary //! endtextmacro endlibrary //! runtextmacro NewHero( "Feyman", "h000", "0", "4" ) //! runtextmacro NewHero( "Daren", "h001", "0", "0" ) //! runtextmacro NewHero( "Jerod", "h002", "1", "1" ) //! runtextmacro NewHero( "Luna", "h003", "2", "15" ) So that making someone say something is as easy as <Charname>.say() Granted, that method only really works linearly, but I believe OOP is the way to go. You already have the convo struct, so why not make it all use .syntax? I would *still* suggest using constant integers such as CHOICE_UP, CHOICE_RIGHT, CHOICE_ESC, if only for robustity ^^ And also a slight delay - it makes things more natural. Nothing you haven't heard before. It works nice, and if you are happy with the interface then I wouldn't change it. |
| 07-01-2008, 08:32 PM | #4 | ||
Quote:
It's meant for me. The coding method is in a style I like (KISS). Quote:
OOP isn't needed. The only reason why conversations are OO is because you might have multiple instances; I'm either going to remove the OO for that or extend it. OO shouldn't be used for the hell of it, but when you want it. CHOICE_UP, CHOICE_RIGHT, etc, are too verbose; when I move to the next itineration of this before I actually start making stuff with it, I'll move to UP, DOWN, RIGHT, LEFT. And robustness isn't an issue, since if you mistype it, it just inserts it into the first one that is free, and you should really refer to them by indices. |
| 07-01-2008, 08:44 PM | #5 |
with out even looking at it i have to say i HATE slowly scrolling text, i don't usually want to skip but i don't wanna waste time, a button which makes it all appear instantly would be very appreciated. |
| 07-01-2008, 08:50 PM | #6 |
Just press escape...? It only skips the current dialog, so you don't miss anything. I do believe, in my infinite wisdom, I even added in protect so you don't accidently skip the next one by pressing just as it changes, but I can't remember if I did. |
| 07-01-2008, 09:29 PM | #7 |
If this is for you only (which hell... I don't see the point of making a system taht you wouldn't use), then it's pretty much perfect for what it does. Seems a little clunky to me (lots of timer usage that is rather confusing to decipher), but it certainly does work just fine. I'm not completely sure why you included camera movement in the system... it seems like there will be instances when you might need to do something else with the camera. So then my only relevant suggestions are with timing - sometimes things are worded in a way that people have to read through twice, but if things are auto-timed, then that can be an issue. So I'd say, if there is no voice over, the duration should be fairly long, or just infinite (only changes with ESC). That one is NOT a matter of taste. It is important to be able to continue the map at your leisure. |
| 07-01-2008, 09:43 PM | #8 | ||
Quote:
Indeed it is, really I'm just looking for what people think of the end result rather than the code. As for the camera locking, that's because I have to enable user control for the arrow keys to work, which means I have to lock the camera (or it'd move). Quote:
The automatic cut off for most transmissions (those not explicitly TransmissionTimed) can be toggled on and off with a boolean already (it would be an option in game), while I'll probably have a variety of text speeds. |
| 07-01-2008, 10:53 PM | #9 |
I played through a second time and I have to say... the color of yellow '|cffaaaa00' is pretty gross. I understand you dont' want as bright a yellow as |cffffcc00, but this one is extremely dull... Try maybe shades or gray or light blue? EDIT: it could have just been the background of sand... I hate sunken ruins sand. |
