Normally I'd say that's mean, but I think the crucial point that warrants it in this case is that their Patreon account hasn't been suspended during this entire shitshow, which is a major faux pas for me. Even if by mistake, that is a LOT of money.It's obvious that the artist feels some sort of obligation to the coder. Forgive my wording but this behaviour from the artist seems extremely 'feminine'. There is a reason that every business has a single boss, there is extreme utility in firing people who simply are not doing their job. I feel like many people here are extremely naive, this project is bringing in big dollars and the coder TAKES A 3 MONTH vacation, even 3 weeks seems excessive. From their postings it seems like he is working himself to death, but he has literally nothing to show for it other than extremely sloppy and shitty code.
After reading through your posts It's obvious that this entire project has been mismanaged from the very beginning. The artist, MITY has all the leverage, after all that's why people buy the game, not for the code but for the art. If this is a joint-project MITY needs to buy FET's share in the name and if he doesn't want to sell then threaten to leave him.
I legitimately think that he refused to patch up the game himself, because if he did he would outshine the coder. MITY wouldn't want to hurt his feelings so he stalls the project for 5 months.
For his next project i hope he hires a team of competent people and actually reinvents some money into his business.
I think your earlier point might hit a bit closer to home than anyone would want to admit. For instance, if the artist hired some guy to do the CCG minigame he failed to do, and he just DOES IT in a fucking weekend for 200 bucks, it's entirely possible the old coder would feel inadequate and spiral further into depression. The project management/HR side of things has always been the weakest aspect of FET, and it will continue to be so.Furthermore, MITY could host a minigame competition right now. Just ask people to submit Ren'py minigames which showcase their skills and fit for a project, he could offer 30% of the cashflow for the winner that gets hired. And of course if a new coder is a stranger, he will actually feel some pressure to improve due to the fear of being fired for subpar work.
And they couldn't take like 3000 bucks out of that to hire a back up coder during the main coder's bulshit 3 month long vacation ?Also some quick maffs for those of you wondering:
You don't have permission to view the spoiler content. Log in or register now.
Assuming their stated goal of $6000 per month is enough to employ both of the people working on the project full time, i.e. that is their salary, they have $268,091 in reserve to do with as they please (before taxes). I don't mean to break out Marx, but god damn.
Dont wanna be rude but pretty much avery 1 knows skyrim is sex mod heaven totally pointless to make any other type games for it.I think it would be cool if he did something with the elder scrolls like skyrim or one of the games but that is my opinion
jump
(goto) and global variables everywhere. Works alright for a classic VN with essentially no gameplay, but the moment you need a minigame, inventory, complex series of interacting choices... There's a reason practically every RenPy game update ships riddled with bugs (Summertime Saga had to progressively rewrite their codebase to use finite state machines).label korra_training:
if amon_mask:
if air_scroll ==2:
if airbending ==7:
show bfab bfab04 with dissolve
kn "ready for more training?"
show under_development_1
show ctc
pause
hide ctc
hide under_development_1
jump b4_airtemple_map1
if airbending ==6:
if korra_spank_bj >=6:
if korra_foot_quest ==1:
show bfab bfab24 with dissolve
kn "ready for more training?"
kn "i... i promise i'll repay you."
if spinner_level >=10:
$ korra_foot_quest = 2
jump air_train3
else:
tn "(i need to level up to {b}10{/b} on the spinners before i can train more with korra.)"
jump bk4_training_menu
if korra_foot_quest ==0:
show bfab bfab24 with dissolve
kn "hey, tenzin...?"
tn "yeah?"
kn "i... i really need to get stronger."
kn "if you... i mean..."
kn "if you'll train with me some more..."
kn "i'll... i'll give you something."
tn "oh? what?"
kn "i... i don't know yet."
kn "but i promise it will be worth it!"
tn "...."
tn "okay."
$ korra_foot_quest = 1
if spinner_level >=10:
$ korra_foot_quest = 2
jump air_train3
else:
tn "(i need to level up to {b}10{/b} on the spinners before i can train more with korra.)"
jump bk4_training_menu
else:
show bfab bfab04 with dissolve
kn "ready for more training?"
tn "soon, but not yet."
jump b4_airtemple_map1
if airbending ==5:
if k_protein <3:
tn "korra's waiting in her room for her protein shake."
jump b4_airtemple_map1
else:
show bfab bfab04 with dissolve
kn "alright, what's next?"
tn "next, you're going to give me asami's number."
show bfab bfab24 with dissolve
kn "are you still on that?"
tn "yeah, and i'm gonna be... until i get her number."
tn "i'm tired of dialing random numbers."
tn "it's not an efficient system, and one man is very mad at me."
kn "....."
tn "....."
ta "give me that number!"
kn "okay, okay..."
kn "after today."
tn "fine."
hide black
show black with dissolve
"you practice the latest technique with korra, gaining efficiency in it."
hide black
show bfab bfab09
with dissolve
kn "yeah! love a good sweat!"
show bfab bfab04 with dissolve
kn "alright, tenzin... here's asami's number."
play sound "audio/win2.mp3"
"you got asami sato's phone number!"
tn "finally."
hide bfab with dissolve
tn "i should go somewhere private to make this phone call..."
tn "the tower, maybe?"
$ airbending = 6
jump b4_airtemple_map1
if air_scroll ==1:
if airbending ==4:
if lin_buttstuff and korra_scroll2==0:
show bfab bfab04 with dissolve
tn "hey... so..."
tn "i need asami's phone number."
tn "phones are a thing by now, right?"
show bfab bfab24 with dissolve
kn "why..."
tn "it doesn't concern you."
kn "uh... i don't think she wants me to give it out..."
tn "come on. buddy. korra. pal. old friend. sloot."
kn "...what?"
tn "ignore that last one."
tn "help me out."
kn "mm... okay."
tn "great!"
show bfab bfab03 with dissolve
kn "in exchange for more training!"
tn "what?"
tn "but... i don't wanna."
show bfab bfab04 with dissolve
kn "come on... you haven't taught me anything real since that one scroll."
kn "let's do this!"
tx "uuughgh...."
tn "fine."
show bfab bfab03 with dissolve
kn "yay!"
tn "but first i need to... do something."
show bfab bfab24 with dissolve
kn "okay..."
hide bfab with dissolve
tn "...shit."
tn "where the fuck do i find a new airbending scroll?"
$ korra_scroll2 = 1
jump b4_airtemple_map1
if korra_scroll2 ==1:
show bfab bfab04 with dissolve
kn "hey, ready to train me?"
tn "(i still don't have an airbending scroll...)"
tn "uh... almost."
show bfab bfab24 with dissolve
kn "oh... okay."
jump b4_airtemple_map1
if korra_scroll2 ==2:
if spinner_level >=8:
show bfab bfab04 with dissolve
kn "ready?"
tn "actually, i am."
tn "read this."
show bfab bfab24 with dissolve
"you hand korra the scroll."
kn "this again..."
kn "fine, i guess i'll {i}read{/i}."
kn "like a dork."
hide black
show black with dissolve
"korra begins practicing the moves written on the scroll."
"you mimic her technique."
hide black
show bfab bfab09
with dissolve
kn "what a workout!"
show bfab bfab04 with dissolve
kn "not bad, tenzin."
tn "so... can i have asami's number now?"
show bfab bfab24 with dissolve
kn "i don't know..."
tn "oh, come on!"
kn "i'll... think about it, okay?"
kn "that's the best I can offer right now."
tn "...damn it."
kn "sorry, tenzin."
kn "now i need to go have my boring protein shake."
show bfab bfab05 with dissolve
kn "pema makes the worst shakes."
tn "...why don't you just make your own?"
show bfab bfab24 with dissolve
kn "pfft, yeah right."
kn "why would that be my responsibility?"
tn "....."
tn "sure."
kn "alright, terrible protein shake, here i come."
hide bfab with dissolve
tn "that... gives me an idea."
tn "i'll ask pema to help me with a... special one."
$ k_protein = 1
$ air_scroll = 2
$ airbending = 5
$ b4_daytime = False
jump b4_airtemple_map1
else:
show bfab bfab04 with dissolve
kn "hey, ready to train me?"
tn "(i need to be up to level 8 on the spinners to handle this move.)"
tn "not yet."
jump b4_airtemple_map1
else:
tn "(still more to do elsewhere first.)"
jump b4_airtemple_map1
if airbending ==3:
if spinner_level < 6:
tn "i need to get to level 7 in the spinners to handle the next training session."
jump b4_airtemple_map1
if spinner_level >=7:
if korra_rubbed >=3:
$ airbending = 4
jump air_train2
else:
tn "(my body is ready... but korra's isn't.)"
tn "(i need to lower her resistance, and maybe progress some more with her before the next training session.)"
jump b4_airtemple_map1
if not air_scroll1_thought:
tn "(alright, looking at this airbending scroll, i don't think i need to do anything special this time, actually.)"
tn "(this one actually seems really straight forward.)"
$ air_scroll1_thought = True
show bfab bfab24 with dissolve
kn "so...?"
kn "you ready?"
if spinner_level <5:
tn "(crap, i need to spend more time on the spinners before i can train with this airbending move.)"
tn "uh... not yet."
kn "okay..."
jump b4_airtemple_map1
else:
$ b4_daytime = False
jump air_train1
if not amon_mask:
show bfab bfab04
with dissolve
kn "ready to train?"
tn "(i still don't know any airbending techniques!)"
tn "uh... not yet."
kn "okay, i guess..."
jump b4_airtemple_map1
image kg = "bk4/backgrounds/park_day_1.jpg"
init python:
import time
style.mcnn=Style(style.default)
style.mcnn.set_parent(style.button)
style.mcnn.color="#beddff"
style.mcnn.size=70
style.mcnn.outlines=[(2,"#6e6e6e",0,0)]
def krib():
global cl1,cl2,cl3,cl4,cl5,cl6,cl7,kricol,krix,krix0,pointka,ktmr,clp1,clp2,clp3,clp4,clp5,clp6,clp7
for i in range(0,9):
if cl1[i]>0:
clzz=1
if i<7:
if cl1[i]==cl1[i+1]==cl1[i+2]:
pointka+=(cl1[i]+cl1[i+1]+cl1[i+2])*2
if i<6 and cl1[i]==cl1[i+3]:
if i<5 and cl1[i]==cl1[i+4]:
pointka+=cl1[i+4]*4
ktmr+=4
cl1[i+4]=0
pointka+=cl1[i+3]*3
ktmr+=2
cl1[i+3]=0
clzz,cl1[i+1],cl1[i+2]=0,0,0
if cl1[i]==cl2[i]==cl3[i]:
pointka+=(cl1[i]+cl2[i]+cl3[i])*2
if cl1[i]==cl4[i]:
if cl1[i]==cl5[i]:
pointka+=cl5[i]*4
ktmr+=4
cl5[i]=0
pointka+=cl4[i]*3
ktmr+=2
cl4[i]=0
clzz,cl2[i],cl3[i]=0,0,0
if clzz==0:
cl1[i]=0
renpy.pause(0.05)
for i in range(0,9):
if cl2[i]>0:
clzz=1
if i<7:
if cl2[i]==cl2[i+1]==cl2[i+2]:
pointka+=(cl2[i]+cl2[i+1]+cl2[i+2])*2
if i<6 and cl2[i]==cl2[i+3]:
if i<5 and cl2[i]==cl2[i+4]:
pointka+=cl2[i+4]*4
ktmr+=4
cl2[i+4]=0
pointka+=cl2[i+3]*3
ktmr+=2
cl2[i+3]=0
clzz,cl2[i+1],cl2[i+2]=0,0,0
if cl2[i]==cl3[i]==cl4[i]:
pointka+=(cl2[i]+cl3[i]+cl4[i])*2
if cl2[i]==cl5[i]:
if cl2[i]==cl6[i]:
pointka+=cl6[i]*4
ktmr+=4
cl6[i]=0
pointka+=cl5[i]*3
ktmr+=2
cl5[i]=0
clzz,cl3[i],cl4[i]=0,0,0
if clzz==0:
cl2[i]=0
renpy.pause(0.05)
for i in range(0,9):
if cl3[i]>0:
clzz=1
if i<7:
if cl3[i]==cl3[i+1]==cl3[i+2]:
pointka=(cl3[i]+cl3[i+1]+cl3[i+2])*2
if i<6 and cl3[i]==cl3[i+3]:
if i<5 and cl3[i]==cl3[i+4]:
pointka+=cl3[i+4]*4
ktmr+=4
cl3[i+4]=0
pointka+=cl3[i+3]*3
ktmr+=2
cl3[i+3]=0
clzz,cl3[i+1],cl3[i+2]=0,0,0
if cl3[i]==cl4[i]==cl5[i]:
pointka+=(cl3[i]+cl4[i]+cl5[i])*2
if cl3[i]==cl6[i]:
pointka+=cl6[i]*3
ktmr+=2
cl6[i]=0
clzz,cl4[i],cl5[i]=0,0,0
if clzz==0:
cl3[i]=0
renpy.pause(0.05)
for i in range(0,9):
if cl4[i]>0:
clzz=1
if i<7:
if cl4[i]==cl4[i+1]==cl4[i+2]:
pointka+=(cl4[i]+cl4[i+1]+cl4[i+2])*2
if i<6 and cl4[i]==cl4[i+3]:
if i<5 and cl4[i]==cl4[i+4]:
pointka+=cl4[i+4]*4
ktmr+=4
cl4[i+4]=0
pointka+=cl4[i+3]*3
ktmr+=2
cl4[i+3]=0
clzz,cl4[i+1],cl4[i+2]=0,0,0
if cl4[i]==cl5[i]==cl6[i]:
pointka+=(cl4[i]+cl5[i]+cl6[i])*2
clzz,cl5[i],cl6[i]=0,0,0
if clzz==0:
cl4[i]=0
renpy.pause(0.05)
for i in range(0,7):
if cl5[i]>0:
if cl5[i]==cl5[i+1]==cl5[i+2]:
pointka+=(cl5[i]+cl5[i+1]+cl5[i+2])*2
if i<6 and cl5[i]==cl5[i+3]:
if i<5 and cl5[i]==cl5[i+4]:
pointka+=cl5[i+4]*4
ktmr+=4
cl5[i+4]=0
pointka+=cl5[i+3]*3
ktmr+=2
cl5[i+3]=0
cl5[i],cl5[i+1],cl5[i+2]=0,0,0
renpy.pause(0.05)
for i in range(0,7):
if cl6[i]>0:
if cl6[i]==cl6[i+1]==cl6[i+2]:
pointka+=(cl6[i]+cl6[i+1]+cl6[i+2])*2
if i<6 and cl6[i]==cl6[i+3]:
if i<5 and cl6[i]==cl6[i+4]:
pointka+=cl6[i+4]*4
ktmr+=4
cl6[i+4]=0
pointka+=cl6[i+3]*3
ktmr+=2
cl6[i+3]=0
cl6[i],cl6[i+1],cl6[i+2]=0,0,0
for i in range(0,9):
if cl6[i]==0:
clp5[i]-=32
if cl5[i]>0:
cl6[i]=cl5[i]
cl5[i]=0
elif cl4[i]>0:
cl6[i]=cl4[i]
cl4[i]=0
elif cl3[i]>0:
cl6[i]=cl3[i]
cl3[i]=0
elif cl2[i]>0:
cl6[i]=cl2[i]
cl2[i]=0
elif cl1[i]>0:
cl6[i]=cl1[i]
cl1[i]=0
else:
cl6[i]=renpy.random.randint(1,6)
for q in range(4):
clp5[i]+=8
renpy.pause(.0000001)
ktmr+=0.1
for i in range(0,9):
if cl5[i]==0:
clp5[i]-=32
if cl4[i]>0:
cl5[i]=cl4[i]
cl4[i]=0
elif cl3[i]>0:
cl5[i]=cl3[i]
cl3[i]=0
elif cl2[i]>0:
cl5[i]=cl2[i]
cl2[i]=0
elif cl1[i]>0:
cl5[i]=cl1[i]
cl1[i]=0
else:
cl5[i]=renpy.random.randint(1,6)
for q in range(4):
clp5[i]+=8
renpy.pause(.0000001)
ktmr+=0.1
for i in range(0,9):
if cl4[i]==0:
clp4[i]-=32
if cl3[i]>0:
cl4[i]=cl3[i]
cl3[i]=0
elif cl2[i]>0:
cl4[i]=cl2[i]
cl2[i]=0
elif cl1[i]>0:
cl4[i]=cl1[i]
cl1[i]=0
else:
cl4[i]=renpy.random.randint(1,6)
for q in range(4):
clp4[i]+=8
renpy.pause(.0000001)
ktmr+=0.1
for i in range(0,9):
if cl3[i]==0:
clp3[i]-=32
if cl2[i]>0:
cl3[i]=cl2[i]
cl2[i]=0
elif cl1[i]>0:
cl3[i]=cl1[i]
cl1[i]=0
else:
cl3[i]=renpy.random.randint(1,6)
for q in range(4):
clp3[i]+=8
renpy.pause(.0000001)
ktmr+=0.1
for i in range(0,9):
if cl2[i]==0:
clp2[i]-=32
if cl1[i]>0:
cl2[i]=cl1[i]
cl1[i]=0
else:
cl2[i]=renpy.random.randint(1,6)
for q in range(4):
clp2[i]+=8
renpy.pause(.0000001)
ktmr+=0.1
for i in range(0,9):
if cl1[i]==0:
clp1[i]-=32
cl1[i]=renpy.random.randint(1,6)
for w in range(4):
clp1[i]+=8
renpy.pause(.0000001)
ktmr+=0.1
return
screen krix:
text "[pointk]" style "mcnn"
text str(int(ktmr)) style "mcnn" xalign .99
timer 1 repeat True action If(ktmr>0,true=SetVariable('ktmr',ktmr-1),false=Return())
for z in range(1,7):
for i in range(0,9):
imagebutton idle ("bk4_xtra/3in1/k"+str(globals()["cl"+str(z)][i])+".png") xpos (i*80+260) ypos (z*80+20) action [SetVariable('krix',i),SetVariable('kriy',z),ui.callsinnewcontext("krich")]
textbutton "I give up!" style "mcnn" xalign 0.5 yalign 0.9 action [SetVariable('ktmr',1)]
if temp_int < 2:
textbutton "Try again" style "mcnn" xalign 0.8 yalign 0.9 action [SetVariable('pointka',0),
SetVariable('temp_int', temp_int+1), Jump("krix")]
screen krixx:
text "[pointk]" style "mcnn"
text str(int(ktmr)) style "mcnn" xalign .99
timer 1 repeat True action If(ktmr>0,true=SetVariable('ktmr',ktmr-1),false=Return())
for z in range(1,7):
for i in range(0,9):
add ("bk4_xtra/3in1/k"+str(globals()["cl"+str(z)][i])+".png") xpos (i*80+260) ypos (z*80+20+globals()["clp"+str(z)][i])
label krich:
show screen krixx
if krix>=0:
if krix in(krix0+1,krix0-1)and kriy==kriy0:
pass
elif kriy in(kriy0+1,kriy0-1)and krix==krix0:
pass
else:
jump krich3
if krix0>=0:
$ krixxx=globals()["cl"+str(kriy)][krix]
$ globals()["cl"+str(kriy)][krix]=globals()["cl"+str(kriy0)][krix0]
$ globals()["cl"+str(kriy0)][krix0]=krixxx
label krich2:
$ krib()
if pointka>0:
$ pointloop+=1
$ pointk+=pointka
$ pointka=0
jump krich2
if pointloop==0:
$ krixxx=globals()["cl"+str(kriy0)][krix0]
$ globals()["cl"+str(kriy0)][krix0]=globals()["cl"+str(kriy)][krix]
$ globals()["cl"+str(kriy)][krix]=krixxx
$ pointloop=0
$ krix=-1
$ krix0=-1
else:
label krich3:
$ krix0=krix
$ kriy0=kriy
return
label krix:
scene kg:
ypos 0
python:
cl0,cl1,cl2,cl3,cl4,cl5,cl6,cl7,krix,kriy,kris,krin,kriw,krie,kricol,krix,krix0,kriy,kriy0,pointk,pointloop,ktmr,pointka=[],[],[],[],[],[],[],[],0,0,0,0,0,0,0,-1,-1,-1,-1,0,0,60,0
for z in range(1,7):
for i in range(0,9):
globals()["cl"+str(z)].append(renpy.random.randint(1,6))
clp0,clp1,clp2,clp3,clp4,clp5,clp6,clp7=[],[],[],[],[],[],[],[]
for z in range(1,7):
for i in range(0,9):
globals()["clp"+str(z)].append(0)
call screen krix
return
^ That one's a bit niche.2016-20XX - "Worked on popular Western Erotica Game Cartoon Parody".
Since this warrants a longer response, I'll be breaking it up into segments and responding to each. Note that my goal with these posts genuinely isn't to shit on MITY, they are far from the worst dev when it comes to goodwill, transparency or trying their hardest (especially the artist). I'm trying to be as neutral and fair as possible.Guys the "coder" created the project in the first place and he's also the primary writer, or at least contributes a similar amount as the artist. As mention previously, the artist goes byYou must be registered to see the links. MITY could even be the name the coder went by. You can't expect the artist to "fire" him (they're not even running a business, Patreon is a donation service) and just because he goes by "coder" doesn't mean it's necessarily the code he's struggling with.
[...]
Given that the art portion of the game was finished on August 24th at the latest and 0.8.3c came out Aug 14th, that leaves us with a timespan of roughly 4 months (119 days) to account for. Consult the timeline of events posted earlier for a more detailed breakdown, but suffice to say that the physical injury accounts for a two week period around the middle of November through December 5th (during which he also worked), caring for his sick mother is something that was mentioned in the past and is likely no longer applicable (he doesn't live with his parents, and staying with them seemed to be an unusual one time event), he has no reason to worry about his finances unless he owes money to a fucking Saudi oil magnate, and the artist told him to drop the CCG minigame and avoid getting burnt out way back in August before this entire thing began. Make of that what you will.He was physically injured, he's having to care for his sick mother, probably felt guilty about breaking the monthly schedule a number of times and wasting time on a minigame, now likely worrying about his future financial situation.
Hence why I included the filesizes in the screenshot (to give a rough estimate of how much code is involved - we're not talking about 3MB 78,000 LOC files. In this case it's 30k lines for Book 4, of which ~15k is boilerplate, ~15k is dialogue and ~2k is actual logic), selected the only two files with minigame code (i.e., programming), trimmed out the VN segments from even those, and brought up the example of the map screen and the day/night system as the most complex elements implemented in Ren'Py script as opposed to pure Python.
- "Number of files" is a totally meaningless metric for code size or complexity. They could put the entire game (372,111 lines) in one file if they wanted, or have 372,111 files consisting of one line.
The reason I ignored those and why I'm overly dismissive of the VN side of things, is that I don't CONSIDER Ren'Py code to be fundamentally the same as programming. Note that I'm not saying "it takes no effort" either - writing DOES take effort. It just doesn't take the same kind of effort as programming in the conventional sense does. There are no classes you have to instantiate, you don't have to write unit tests, you don't need to know how A* search works, you don't have to be cautious when implementing cryptography, you don't have to write your own parser, you don't need to understand how binary formats work, you don't need to access a database, you don't have to work with matrices, you don't need to deal with the obscure bugs and API of the system you're running on, you don't have to worry about GC pauses, you don't need to worry about memory allocation, and I could keep going on and on. Ren'Py is control flow. That is ALL IT IS.
- The code definitely does not exist in just those two files. Sure, they might have a higher proportion of code to text compared to others, but all of the 41 .rpy files that make up book 4 (spanning 28,862 lines) contain logic or data, and possibly dialogue. A lot of it could be considered "boilerplate" (compositing images for example) but all of it had to be written.
if spinner_level >=10:
$ korra_foot_quest = 2
jump air_train3
else:
tn "(i need to level up to {b}10{/b} on the spinners before i can train more with korra.)"
jump bk4_training_menu
Yeah, and that's contention number #2. Even without the minigames and the Python side of things, EVEN amongst other VNs, Four Elements Trainer is very simple. The game doesn't HAVE an inventory system (ironically, because it might actually make things simpler). There are no complex series of interwoven choices which determine one of 17 possible outcomes with each character. The minigames don't affect your game state besides incrementing your money value or setting a flag to True. What you have are inline if/else choices with the dialogue listed right below, and scenes where the game outright fucking ASKS YOU which ending you'd like. Even as far as VN logic goes, FET's is firmly on the lower end of complexity.
- The images shown are far from an accurate depiction of the extent of the complexity of the code. Renpy is a thin layer over pygame. It grants you a DSL that funnels you into a control flow nightmare. jump (goto) and global variables everywhere. Works alright for a classic VN with essentially no gameplay, but the moment you need a minigame, inventory, complex series of interacting choices... There's a reason practically every RenPy game update ships riddled with bugs (Summertime Saga had to progressively rewrite their codebase to use finite state machines).
#This variable is set to False if you told Azula about Mai in the shop during the second day of the love route, and True otherwise
#This variable should be between 0-10 if you didn't get along with Azula, 10-20 if she was lukewarm towards you, and a perfect score of 23 is required for the special ending
This would likely be the easiest to implement, and have the biggest benefit to output.
- when writing a scene, you just write that standalone scene as its own thing with zero logic, code or labels, when coding minigames, you code that minigame separately as its own standalone project - i.e., you could be hired onto the project as a writer or a programmer with ZERO knowledge of the game and have the existing guy implement your work
Wasn't sure what term to use, it's probably just control flow. Most of what you have in Ren'Py are labels (which are analogous to game "levels" or Unity scenes) that are on the same conceptual level of depth, nested if/else chains and menus which require you to keep track of how "deep" you currently are, and screens which are mostly used for UI overlays and minigames. Labels are pretty straightforward and naturally lend themselves to a linear A -> B graph/tree/whatever structure you can keep track of, similarly to how you'd have chapters one after the other in a book and a table of contents which you can use as an overview.This would likely be the easiest to implement, and have the biggest benefit to output.
Obviously you have to check state to decide what path to lead a player down, but well-structured and mostly distinct systems make it drastically easier to both track and isolate shoddy work, as well as avoid tech. debt that results from throwing things in wherever you can cram 'em.
As an aside: do you mean call stack here? Honestly, languages like Python make a big effort to abstract from anything to do with the call stack. I guess it's sort of a synonym for control flow - which could definitely be approached much better in FET's code.
label falley_night2:
if earth_deal:
if tax_collector:
if not tax_done:
menu:
"kill him":
menu:
"donate the money":
"keep the money":
"knock him out":
menu:
"donate the money":
if variable >= 20:
if flag == True:
if condition:
else:
menu:
"do it anyways":
if variable = 1:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
"Suspendisse porttitor arcu aliquet tortor vehicula, ut ultricies magna feugiat."
"Sed nec nunc non leo varius consequat eget sit amet orci."
"Curabitur malesuada nunc vitae tortor auctor facilisis."
$ variable += 2
"Praesent ut ligula sed augue scelerisque lobortis non dictum dui."
"Pellentesque nec tellus blandit, vestibulum lacus tincidunt, consectetur nibh."
"Donec sagittis nisl eu tellus aliquam, et accumsan ante maximus."
"Etiam aliquet turpis non ipsum consectetur, sit amet lacinia libero hendrerit."
"Pellentesque id diam at nulla ornare posuere."
"Sed accumsan tortor non eros pulvinar, sed varius magna eleifend."
"Donec non leo in elit rhoncus pellentesque."
"Phasellus in lacus posuere, dictum arcu vel, volutpat ipsum."
jump bk2_map
label one:
scene outside
jump two
label two:
show character with dissolve
jump three
label three:
play music "maintheme.ogg"
jump four
label four:
show othercharacter at left
jump five
label five:
c "Dialogue text"
jump six
Is that Azula in Dragon Prince art style?
Look more like Azula in the style of those 3D character maker engine.Is that Azula in Dragon Prince art style?