Compare commits
32 Commits
03c97ae3f2
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 87dd8e1190 | |||
| 3bffb82560 | |||
| f181bf4de9 | |||
| 7dd6bfc40c | |||
| 0d080a8d94 | |||
| 613af7d7ea | |||
| b10641ee3c | |||
| 5b10d63970 | |||
| fcdd8306d2 | |||
| 01fb83d05f | |||
| 34024bab96 | |||
| 40df66e7cc | |||
| 61c628876f | |||
| 9aebddde86 | |||
| 8ae566d627 | |||
| 6c4f2e640a | |||
| 949a076ec7 | |||
| 14961d903b | |||
| ccac320e0e | |||
| ff3e66ae3e | |||
| 7c92f046a1 | |||
| 9de6a0b5a9 | |||
| 4603a64e10 | |||
| 36a172d07f | |||
| cb85c94f56 | |||
| 3ba7ef92ad | |||
| c326c363a0 | |||
| 7543fe3cb7 | |||
| 93480150e5 | |||
| 201d3be322 | |||
| b6aca99d0c | |||
| 44f58bc9c2 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 3.1 KiB |
@@ -0,0 +1,279 @@
|
||||
// Cinema 24/7 -- Navigation
|
||||
// Lobby -> Foyer -> Labyrinth-Etagen -> Eingang Theater 4
|
||||
//
|
||||
// Variablen:
|
||||
// past_it -- Spieler ist an Theater 4 vorbeigegangen (bool)
|
||||
// snaks -- Spieler hat Snacks mitgenommen (0/1)
|
||||
// had_sweets -- Spieler hat süße Snacks gewählt (0/1)
|
||||
//
|
||||
// Übergang zu cinema_f4r4.ink via # start_ink Tag bei Eintreten in Theater 4.
|
||||
// KV-Store überträgt snaks/had_sweets/past_it automatisch ans nächste Script.
|
||||
|
||||
VAR past_it = false
|
||||
VAR snaks = 0
|
||||
VAR had_sweets = 0
|
||||
|
||||
-> the_cinema
|
||||
|
||||
|
||||
== the_cinema ==
|
||||
|
||||
The lobby has a very retro, synth-wave, neon, 70s look to it. The carpet alone makes your eyes hurt. This is not a cheeky metaphor for its ugliness. Your eyes really hurt when you stare at it for any length of time because the shades of blue and red, mixed together on it in geometric patterns, are so bright they make your vision dance in the low light. At a glance, something in the part of your brain that is responsible for processing visual data seems to short-circuit and you see the patterns move against each other, impossibly on the static floor.
|
||||
|
||||
* [>>>]
|
||||
-
|
||||
|
||||
Better look to the ceiling with its wavy cutouts backlit by colorful LED.
|
||||
|
||||
The ticket booth is unmanned of course, as is the snack dispensary. Which seems well stocked at least. The popcorn even looks fresh. Well, it smells fresh at least. The scent of pleasantly burned sugar is heavy in the air.
|
||||
|
||||
The ribbon barrier is closed but easy enough to bypass. Is it closed? It looks open. Though abandoned. But not for long. Not the abandonment of disrepair, only the momentary abandonment place like this experience between beginning and end of the shows. When all the visitors sit in their seats and the staff takes this moment to slip away for a quick smoke break. Something like that. Full behind doors but empty in the open.
|
||||
|
||||
* [>>>]
|
||||
-
|
||||
|
||||
You can even hear sounds that must be a film playing. Screams and gunfire. You hope someone left the door to that particular theatre open and that is why you can hear it so clearly. Because if the sound insulation is that shit, the movie going experience can't be very good here.
|
||||
|
||||
* [Slip under the ticket barrier]
|
||||
You raise the ribbon of the barrier and duck under it. Almost without a thought.
|
||||
-> the_foliar
|
||||
* [Go to the ticket booth]
|
||||
The graspable of the ticket booth is plastered with advertisements, movie posters and prohibition signs informing visitors of behaviours and attire within the cinema. The slip you took for a "closed" sign that hangs in the middle of the glass says the following.
|
||||
|
||||
"No tickets required. Proceed with caution."
|
||||
|
||||
On the little table where someone would place their tickets, there is another slip reading:
|
||||
|
||||
"Warning:
|
||||
|
||||
Everyone is free to enter.
|
||||
|
||||
But it is advised only to visit the auditoriums where no film is currently being played.
|
||||
|
||||
As the films are a bit extreme for most audiences.
|
||||
|
||||
Thank you for your visit!"
|
||||
** [Go into the cinema]
|
||||
You can open the flimsy barrier from here. It is secured right next to where you stand. So you enter the foliar.
|
||||
-> the_foliar
|
||||
** [Leave the cinema] You leave.
|
||||
-> END
|
||||
|
||||
-> the_foliar
|
||||
|
||||
|
||||
== the_foliar ==
|
||||
|
||||
The foliar is big. With couches to wait and meet and lounge on. The room is only broken up by advertising columns. Some of them display movie posters, though most are empty.
|
||||
|
||||
A long bar stretches the length of the back wall. Behind it chips and candy are stacked on shelves like those of an actual bar. It even has a mirrored backwall, which visually multiplies the colourful packaging. This pattern is only broken by enormous popcorn machines, which are full to the brim.
|
||||
|
||||
Do you want to grab a snack?
|
||||
* [Of course]
|
||||
~ snaks = 1
|
||||
** [Sweet] You grab a sweet snack. You are lucky. They have your favourite.
|
||||
~ had_sweets = 1
|
||||
** [Salty] You grab a salty snack. You are lucky. They have your favourite.
|
||||
* [I don't think so] You better not risk it.
|
||||
-
|
||||
To both sides of the room are stairs. This is a multi-floor cinema.
|
||||
-> groundfloor
|
||||
|
||||
|
||||
== groundfloor ==
|
||||
|
||||
+ [Go to the right staircase]
|
||||
{not (f1 > 0 or f2 > 0):
|
||||
You choose the right staircase to ascend to the first floor.
|
||||
|
||||
Pictures of actors in film scenes decorate the walls. They are probably supposed to be famous. Iconically recognisable. You know none of them. However, some catch your eye as familiar until you take a second look. They are certainly not cheap generic-property knockoffs to avoid copyright infringement. It's just a coincidence.
|
||||
|
||||
A big number: 1 marks the landing to the next floor.
|
||||
}
|
||||
{f1 > 0 or f2 > 0:
|
||||
You enter the first floor.
|
||||
}
|
||||
-> f1.r
|
||||
+ [Go to the left staircase]
|
||||
{not (f1 > 0 or f2 > 0):
|
||||
You choose the left staircase to ascend.
|
||||
|
||||
Pictures of actors in film scenes decorate the walls. They are probably supposed to be famous. Iconically recognisable. You know none of them. However, some catch your eye as familiar until you take a second look. They are certainly not cheap generic-property knockoffs to avoid copyright infringement. It's just a coincidence.
|
||||
|
||||
A big number: 2 marks the landing to the next floor.
|
||||
}
|
||||
{f1 > 0 or f2 > 0:
|
||||
You enter the second floor.
|
||||
}
|
||||
-> f2.l
|
||||
|
||||
|
||||
// ── Etagen-Labyrinth ────────────────────────────────────────────────────────
|
||||
// Die Stockwerk-Verbindungen sind absichtlich nicht-euklidisch.
|
||||
// Treppenauf/-ab führen nicht zu linear benachbarten Etagen.
|
||||
|
||||
== f1 ==
|
||||
= r
|
||||
+ [Go down the corridor.] -> f1.l
|
||||
+ [Take the stairs up.]
|
||||
You enter the fifth floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f5.r
|
||||
+ [Take the stairs down.]
|
||||
You enter the sixth floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f6.r
|
||||
|
||||
= l
|
||||
+ [Go down the corridor.] -> f1.r
|
||||
+ [Take the stairs up.]
|
||||
You enter the third floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f3.l
|
||||
+ [Take the stairs down.]
|
||||
You enter the seventh floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f7.l
|
||||
|
||||
|
||||
== f2 ==
|
||||
= r
|
||||
+ [Go down the corridor.] -> f2.l
|
||||
+ [Take the stairs up.]
|
||||
You enter the sixth floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f6.r
|
||||
+ [Take the stairs down.]
|
||||
You enter the seventh floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f7.r
|
||||
|
||||
= l
|
||||
+ [Go down the corridor.] -> f2.r
|
||||
+ [Take the stairs up.]
|
||||
You enter the fifth floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f5.l
|
||||
+ [Take the stairs down.]
|
||||
You enter the first floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f1.l
|
||||
|
||||
|
||||
== f3 ==
|
||||
= r
|
||||
+ [Go down the corridor.] -> f3.l
|
||||
+ [Take the stairs up.]
|
||||
You are back on the ground floor.
|
||||
-> groundfloor
|
||||
+ [Take the stairs down.]
|
||||
You enter the second floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f2.r
|
||||
|
||||
= l
|
||||
+ [Go down the corridor.] -> f3.r
|
||||
+ [Take the stairs up.]
|
||||
You enter the sixth floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f6.l
|
||||
+ [Take the stairs down.]
|
||||
You enter the seventh floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f7.l
|
||||
|
||||
|
||||
== f4 ==
|
||||
= r
|
||||
+ [Go down the corridor.]
|
||||
{not past_it:
|
||||
You go down the corridor. It is empty. Some of the doors are closed. Some are slightly open. When you get close to the door of theatre 4 you can hear soft sounds. There is no film playing in the theatre according to the sign beside the door.
|
||||
- else:
|
||||
The corridor is still the same. And there are still the same faint noises coming out of theatre 4.
|
||||
}
|
||||
** [Enter]
|
||||
So you enter. # start_ink cinema_f4r4.ink.json
|
||||
-> END
|
||||
** [Go past it.]
|
||||
~ past_it = true
|
||||
You go past it.
|
||||
You walk closer to one wall. You want to run your fingers along it while you walk, but can't quite bring yourself to do so. To move the final millimetre closer to the wall. As if you are on tracks. Soon you are at the other side of the floor.
|
||||
-> f4.l
|
||||
+ [Take the stairs up.]
|
||||
You enter the fifth floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f5.l
|
||||
+ [Take the stairs down.]
|
||||
You are back on the ground floor.
|
||||
-> groundfloor
|
||||
|
||||
= l
|
||||
+ [Go down the corridor.]
|
||||
{not past_it:
|
||||
You go down the corridor. It is empty. Some of the doors are closed. Some are slightly open. When you get close to the door of theatre 4 you can hear soft sounds. There is no film playing in the theatre according to the sign beside the door.
|
||||
- else:
|
||||
The corridor is still the same. And there are still the same faint noises coming out of theatre 4.
|
||||
}
|
||||
** [Enter]
|
||||
So you enter. # start_ink cinema_f4r4.ink.json
|
||||
-> END
|
||||
** [Go past it.]
|
||||
~ past_it = true
|
||||
You go past it.
|
||||
You walk closer to one wall. You want to run your fingers along it while you walk, but can't quite bring yourself to do so. To move the final millimetre closer to the wall. As if you are on tracks. Soon you are at the other side of the floor.
|
||||
-> f4.r
|
||||
+ [Take the stairs up.]
|
||||
You enter the seventh floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f7.l
|
||||
+ [Take the stairs down.]
|
||||
You are back on the ground floor.
|
||||
-> groundfloor
|
||||
|
||||
|
||||
== f5 ==
|
||||
= r
|
||||
+ [Go down the corridor.] -> f5.l
|
||||
+ [Take the stairs up.]
|
||||
You enter the second floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f2.r
|
||||
+ [Take the stairs down.]
|
||||
You enter the third floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f3.l
|
||||
|
||||
= l
|
||||
+ [Go down the corridor.] -> f5.r
|
||||
+ [Take the stairs up.]
|
||||
You enter the first floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f1.l
|
||||
+ [Take the stairs down.]
|
||||
You enter the sixth floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f6.l
|
||||
|
||||
|
||||
== f6 ==
|
||||
= r
|
||||
+ [Go down the corridor.] -> f6.l
|
||||
+ [Take the stairs up.]
|
||||
You enter the first floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f1.r
|
||||
+ [Take the stairs down.]
|
||||
You enter the fourth floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.}}
|
||||
-> f4.r
|
||||
|
||||
= l
|
||||
+ [Go down the corridor.] -> f6.r
|
||||
+ [Take the stairs up.]
|
||||
You are back on the ground floor.
|
||||
-> groundfloor
|
||||
+ [Take the stairs down.]
|
||||
You enter the third floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f3.l
|
||||
|
||||
|
||||
== f7 ==
|
||||
= r
|
||||
+ [Go down the corridor.] -> f7.l
|
||||
+ [Take the stairs up.]
|
||||
You enter the third floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f3.r
|
||||
+ [Take the stairs down.]
|
||||
You enter the fifth floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f5.r
|
||||
|
||||
= l
|
||||
+ [Go down the corridor.] -> f7.r
|
||||
+ [Take the stairs up.]
|
||||
You enter the fourth floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.}}
|
||||
-> f4.l
|
||||
+ [Take the stairs down.]
|
||||
You enter the second floor. {~It looks like all the others.|||{~It looks the same as all the others.|More hallway. More carpet.|Just another floor}}
|
||||
-> f2.l
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,856 @@
|
||||
// Cinema 24/7 -- Theater 4: Nails
|
||||
// Begegnung mit Nails, der Schattenkünstlerin.
|
||||
//
|
||||
// Variablen:
|
||||
// favor_nails -- Nails' Stimmung; > 0 = Sympathie, < 0 = Genervtheit
|
||||
// past_it -- aus cinema.ink via KV: Spieler ist an Theater 4 vorbeigegangen
|
||||
// snaks -- aus cinema.ink via KV: Spieler hat Snacks (0/1)
|
||||
// had_sweets -- aus cinema.ink via KV: Spieler hat Süßes gewählt (0/1)
|
||||
// fallbear -- temporär: Bär verliert Gleichgewicht beim Ausweichen
|
||||
// boop_success -- temporär: Einhorn-Nase boopen erfolgreich (0/1)
|
||||
//
|
||||
// Stub-Knoten (noch zu schreiben):
|
||||
// the_show, cbear, shadow_battle, apprentice, quitter,
|
||||
// her_portfolio, performance, practice, seeulater
|
||||
|
||||
VAR favor_nails = 0
|
||||
VAR past_it = false
|
||||
VAR snaks = 0
|
||||
VAR had_sweets = 0
|
||||
VAR fallbear = false
|
||||
VAR boop_success = false
|
||||
|
||||
-> f4r4
|
||||
|
||||
|
||||
== f4r4 ==
|
||||
|
||||
You push the door open to a few steps bringing you the level where the seats are. The theatre screen is lit in a faint pink that floods the dingy room with a pleasant atmosphere. The seats lie in shadow, but they look empty.
|
||||
|
||||
+ [Go to the screen] -> f4r4.to_the_screen
|
||||
+ [Sit down in the closest seat] -> f4r4.frontrow_to_show
|
||||
+ [Go to the back] -> f4r4.backseat
|
||||
|
||||
= to_the_screen
|
||||
You go through the aisle to the very front. You are so close to the screen here that your entire field of view is absorbed by this shade of pink, if you angle your head right.
|
||||
|
||||
+ [Go closer to the screen so your shadow falls on it]
|
||||
You take a few more steps until your silhouette emerges as a dark shape from the dark lower border of the screen.
|
||||
++ [Raise your arms] You raise your arms to see your shadow do the same.
|
||||
++ [Walk to the side] You walk a few steps to the side to see your shadow do the same.
|
||||
--
|
||||
Until the enormous shape of a wolf jumps at you from the side. You only see it come for a second before you flinch away.
|
||||
|
||||
But there is no impact, it is just another shadow. It looked very real out of the corner of your eye. On a second look, you see that it is the projection of masterfully interwoven fingers, cast from the back of the theatre.
|
||||
-> f4r4.first_duet
|
||||
+ [Turn back to the seats]
|
||||
But you turn away from it and to the seats again. From here you have a better view of the theatre and can see a shape, sitting in the elevated rows on the back half of the room.
|
||||
-
|
||||
A voice comes from there.
|
||||
|
||||
Her: OMG! I totally don't believe it? Is that an audience? OK. OK. OK, sit down. The show is about to start.
|
||||
++ [Take a seat]
|
||||
You sit down in the front row and look up to the screen.
|
||||
-> f4r4.the_show
|
||||
++ [Go to the person]
|
||||
You are more curious about this person than the show. So you decide to make your way up the dark rows of seats to get a better look.
|
||||
-> f4r4.the_performer
|
||||
|
||||
= frontrow_to_show
|
||||
You slump down in the closest seat. You are fairly far to the front. So you can lie your head down on the back of the seat to look up into the abyss of pink.
|
||||
|
||||
You have huffed out only one deep breath before the shadow of a giant hand rips the light and colour of the screen apart.
|
||||
|
||||
+ [I'm startled]
|
||||
You startle at that and turn around in your seat to look for the source of the shadow.
|
||||
|
||||
Against the glare of the projector you can just about make out two hands which are raised over the rows of seats.
|
||||
|
||||
You raise a hand against the bright light. But before your eyes can adjust to the dark, you hear a voice.
|
||||
|
||||
Her: Eyes front, please. Or you'll miss the show.
|
||||
|
||||
The voice has the twang of mock annoyance.
|
||||
++ [Turn to the screen] You comply and look to the screen again. -> f4r4.the_show
|
||||
++ [Go to investigate] You get up and go towards the back, where the figure is. -> f4r4.the_performer
|
||||
--
|
||||
+ [This is fine.]
|
||||
++ [I turn to look for the shadow maker]
|
||||
You turn around in your seat to look for the source of the shadow.
|
||||
|
||||
Against the glare of the projector you can just about make out two hands which are raised over the landscape of cushioned backrests.
|
||||
|
||||
You raise a hand against the bright light. But before your eyes can adjust to the dark, you hear a voice.
|
||||
|
||||
Her: Eyes front, please. Or you'll miss the show.
|
||||
|
||||
The voice has the twang of mock annoyance.
|
||||
+++ [Turn to the screen] You comply and look to the screen again. -> f4r4.the_show
|
||||
+++ [Go to investigate] You get up and go towards the back, where the figure is. -> f4r4.the_performer
|
||||
---
|
||||
++ [I keep looking at the screen]
|
||||
You keep your eyes on the screen unperturbed and follow the movements of the shadows with your eyes.
|
||||
-> f4r4.silent_show
|
||||
|
||||
= backseat
|
||||
When you are at the cinema, do you always prefer the seats at the very back? You make your way there now, automatically. You shimmy into the aisles and pick a seat. You sit down. It is comfortable. It is fine. You relax, with the whole room in view.
|
||||
-> f4r4.the_show
|
||||
|
||||
= the_performer
|
||||
Her: No. It's fine. You can sit down in the front as well. Just there will be fine.
|
||||
|
||||
+ [Continue to the back]
|
||||
~ favor_nails = favor_nails - 1
|
||||
You continue your way despite her protests.
|
||||
|
||||
Her: Just sit down! Urgh. Now I have to delay the performance.
|
||||
|
||||
You have reached the row where the figure sits and huffs unhappily at you. You can still only see their outline in the dark. Something about it is strange. Their head is oddly big. It has a weird shape, too.
|
||||
|
||||
Her: Fine, you can sit in the back row if you have to. No respect for the craft.
|
||||
|
||||
+ [Take a seat where you are] She sounds annoyed. You decide to obey and sit down in the middle row. -> f4r4.the_show
|
||||
- (just_sit_damnit)
|
||||
* [Who are you?]
|
||||
You: Who are you?
|
||||
|
||||
Her: Only the greatest visual artist you will ever meet. Not that you would be able to appreciate it, since you refuse to sit down for the performance to start.
|
||||
|
||||
++ [That's not really an answer.]
|
||||
~ favor_nails = favor_nails - 3
|
||||
You: That's not really an answer.
|
||||
|
||||
Her: Oh mahhai, unbelievable. Don't be such a pain in the ass just sit down or get out of my theatre.
|
||||
|
||||
+++ [What kind of performance?]
|
||||
~ favor_nails = favor_nails - 1
|
||||
You: What kind of performance?
|
||||
|
||||
Her: Are you for fudging real? Just sit down and find out?
|
||||
-> just_sit_damnit
|
||||
+++ [Can I sit with you?]
|
||||
Her: I need some space to perform. Just keep a little bit of a distance.
|
||||
++++ [Sit down across the aisle] You just sit down in the first seat across the aisle from her. -> f4r4.the_show
|
||||
++++ [Take a seat two places away from her]
|
||||
You shimmy into the aisle where she is and sit down with a double seat of space to her. A side glance in her direction subjects ruffled knit fabrics and jangling bracelets.
|
||||
-> f4r4.the_show
|
||||
++++ [Sit down in the back row]
|
||||
You'd actually prefer to sit in the back row. So you go and take your seat, your back against the wall, with the whole theatre in view.
|
||||
-> f4r4.the_show
|
||||
+++ [You just sit your ass down across the aisle from her]
|
||||
You just sit down in the first seat across the aisle from her.
|
||||
-> f4r4.the_show
|
||||
+++ [Sit down in the back row]
|
||||
You prefer to sit in the back row. So you go and take your seat, your back against the wall, with the whole theatre in view.
|
||||
-> f4r4.the_show
|
||||
--
|
||||
* [Can I sit with you?]
|
||||
~ favor_nails = favor_nails + 1
|
||||
You: Can I sit with you?
|
||||
|
||||
Her: Oh. Well, actually I need a bit of space to perform. But you can sit here if you want.
|
||||
|
||||
You can just make out a hand with long, pink acrylic nails and glittering rings gesturing to a place two seats away from her.
|
||||
|
||||
You shimmy into the aisle and take the seat. A side glance in her direction subjects ruffled knit fabrics and jangling bracelets.
|
||||
-> f4r4.the_show
|
||||
* [Sit down across the aisle from her]
|
||||
You sit down in the first seat across the aisle from her.
|
||||
-> f4r4.the_show
|
||||
* [Sit down in the back row]
|
||||
You prefer to sit in the back row. So you go and take your seat, your back against the wall, with the whole theatre in view.
|
||||
-> f4r4.the_show
|
||||
|
||||
= first_duet
|
||||
* [Try to see the one making the shadow]
|
||||
You turn, raising your hand against the light of the projector. But too late, the glare has already gotten into your eyes and you can't make out anything in the darkness of the room.
|
||||
|
||||
An amused voice comes out of the darkness.
|
||||
|
||||
Her: Watch out, here it comes again.
|
||||
|
||||
++ [Turn to the screen]
|
||||
Turn back towards the screen and see the wolf pace your shadow. Readying itself for the next attack.
|
||||
-> f4r4.first_duet
|
||||
++ [Go investigate]
|
||||
You start up the aisle between the seats.
|
||||
|
||||
A voice comes out of the darkness.
|
||||
|
||||
Her: Whahat? Don't tell me you didn't like that. That was A-Class theatre. You know I don't get an audience here often. Take a seat and I'll show you a real show.
|
||||
-> f4r4.the_performer
|
||||
* (bunny)[Make the shadow figure of a bunny, to run from the wolf]
|
||||
You position your hands to make the figure of a bunny.
|
||||
++ Its ears wiggle nervously. [] The ears of the wolf twitch in turn, with anticipation.
|
||||
++ It rubs its nose with its front paws in an attempt to be too cute to be eaten. [] But there is only a low hungry growl from the back of the theatre.
|
||||
--
|
||||
Your bunny decides to make a run for it.
|
||||
|
||||
The wolf jumps after it with graceful movements. It is quick and deadly.
|
||||
|
||||
++ [The bunny flees off screen]
|
||||
Your bunny flees to the side of the screen and jumps into the unlit void. Trusting that nonexistence will keep it safe from the jaws of the predator.
|
||||
-> f4r4.quitter
|
||||
++ [The bunny flees across the screen]
|
||||
Your bunny hops across the screen. You have to be fast and clever and change directions often to get away from the monster chasing you.
|
||||
--
|
||||
Soon you are short of breath and turn once more to see the wolf mid-air just above you. Maw wide, ready to consume you. The running is over. You only have a second to decide what to do.
|
||||
|
||||
++ [Accept your fate]
|
||||
So you accept your fate and cower the bunny down in a final primal reflex, before the wolf is on top of you and swallows you whole.
|
||||
|
||||
You are blacked out by the shape of it for a moment and can see the hands raised above the seats silhouetted against the rays of beamer light. Maybe it is just the perspective or something, but they seem gigantic.
|
||||
|
||||
Then the shadow of the wolf moves beside you again. The light punches you in the face and it wags its tail. A voice comes from the back of the room.
|
||||
|
||||
Her: Ahhh! That was SOOOOO FUN. More. More. More.
|
||||
|
||||
+++ [I think I need to catch my breath first.]
|
||||
You: I think I need to catch my breath first.
|
||||
|
||||
Her: Hm. Okie doke. You wanna see one of my specialities?
|
||||
|
||||
++++ [Sure.] You: Sure.
|
||||
You take your front row seat and look up to the screen.
|
||||
-> f4r4.the_show
|
||||
++++ [Who are you?]
|
||||
You: Who are you?
|
||||
|
||||
Her: I'm the baddest bitch alive. Now sit your ass down and let me put on a show.
|
||||
----
|
||||
-> f4r4.the_show
|
||||
++++ [Sit] You indulge her and sit. -> f4r4.the_show
|
||||
++++ [Go up to her] You make your way up the aisles to her. -> f4r4.the_performer
|
||||
+++ [OK. But next time I won't be such easy prey.]
|
||||
You: OK. But next time I won't be such easy prey.
|
||||
|
||||
Her: Uh. You want a shadow battle? Bring it oooooon.
|
||||
-> f4r4.shadow_battle
|
||||
---
|
||||
++ (cheat)[Turn into a crocodile]
|
||||
So you dissolve the bunny to spread your arms wide. Creating the long jaws of a crocodile. It is a desperate move and unexpected enough that the wolf can't stop before plunging dead first into the trap you just created. You snap your arms together.
|
||||
|
||||
The wolf's whine becomes a whiny voice.
|
||||
|
||||
Her: NOOOOOOO. That's not fair. Not fair. Not fair.
|
||||
|
||||
+++ [Says who?]
|
||||
You: Says who?
|
||||
|
||||
Her: Says ME! You can't just change the rules like that.
|
||||
|
||||
You: I wasn't aware there were any rules.
|
||||
|
||||
Her: But I wanted to eat you!
|
||||
|
||||
++++ [You can eat my ass.]
|
||||
She laughs.
|
||||
|
||||
Her: EW! I don't even know you.
|
||||
|
||||
+++++ [We can change that.]
|
||||
~ favor_nails = favor_nails + 1
|
||||
You: We can change that.
|
||||
|
||||
Her: WOW. You coming on strong. I can't even tell if you're cute from up here. We will have to meet somewhere where it is light, some time.
|
||||
|
||||
++++++ [It's a date.] You: It's a date.
|
||||
She giggles.
|
||||
------
|
||||
Her: I wanna practice some more of my figures. Do you wanna watch?
|
||||
-> f4r4.practice
|
||||
++++++ [How about now?] You: How about now?
|
||||
------
|
||||
Her: I wanna practice some more of my figures. Do you wanna watch?
|
||||
-> f4r4.practice
|
||||
+++++ [I don't know you either.]
|
||||
You: I don't know you either.
|
||||
|
||||
Her: You know my work. So you already know I'm fab as fuck.
|
||||
|
||||
++++++ [True.] You: True.
|
||||
Her: Do you wanna see some more?
|
||||
+++++++ [Sure.] You: Sure. -> f4r4.the_show
|
||||
+++++++ [I would actually like to get to know you.]
|
||||
You: I would actually like to get to know you.
|
||||
|
||||
Her: HHHM. I actually wanna practice some more figures. But we can grab snacks after.
|
||||
|
||||
++++++++ [Can I watch you practice?]
|
||||
You: Can I watch you practice?
|
||||
Her: Sure.
|
||||
-> f4r4.practice
|
||||
++++++++ [Should I come back later to pick you up?]
|
||||
You: Should I come back later to pick you up?
|
||||
Her: If you want.
|
||||
--------
|
||||
You: OK, I will see you in a bit.
|
||||
-> f4r4.seeulater
|
||||
-------
|
||||
Her: Nice. What do you want to see? My portfolio or a Full Performance?
|
||||
+++++++ [Portfolio] You: Your portfolio? Now I'm curious. -> f4r4.her_portfolio
|
||||
+++++++ [Performance] You: I would like to see a performance. -> f4r4.performance
|
||||
-----
|
||||
++++ [No don't eat me. I can get you popcorn instead.]
|
||||
Her: NAWWW! OK. Fair is fair.
|
||||
+++ [Sorry.]
|
||||
You: Sorry. But I don't want to die today.
|
||||
|
||||
Her: Well, you shouldn't have been a bunny then, gorgeous. A wolf has to eat.
|
||||
* [Make the shadow figure of a bear, to confront the wolf]
|
||||
You make a bear...
|
||||
|
||||
Do you know how to make a bear shadow figure?
|
||||
|
||||
++ [YES]
|
||||
OK. You make a bear. But due to your position relative to the screen it is too tiny to confront the wolf.
|
||||
++ [NO] You don't make a bear. -> f4r4.first_duet
|
||||
--
|
||||
The wolf is watching you impatiently.
|
||||
++ [Make the bear bigger] You decide to make a bigger bear.
|
||||
++ [Do something else] -> f4r4.first_duet
|
||||
--
|
||||
But the beast on the screen beside you has clearly had enough and is readying its next attack.
|
||||
++ [Make your way to the back of the room]
|
||||
You can't compete from down here. So you start to make your way up the aisles to some high ground.
|
||||
|
||||
As soon as you step out of the light of the screen a voice comes from the back.
|
||||
|
||||
Her: No! Where are you going? I thought we were going to play?
|
||||
|
||||
You squint up and into the dark and see two abnormally large hands raised over the seats and backlit by the projector.
|
||||
|
||||
+++ [I'm just coming up to project better.]
|
||||
You: I'm just coming up to project better.
|
||||
|
||||
Her: I think you'll need a little more than that to get on my level.
|
||||
|
||||
++++ [I'm sure.] You: I'm sure.
|
||||
Her: You can still show me what you've got, though. Come here.
|
||||
-> f4r4.deathmatch
|
||||
++++ [We will see.] You: We will see.
|
||||
Her: OK. A challenge? IT. IS. ON.
|
||||
-> f4r4.deathmatch
|
||||
+++ [Who are you?]
|
||||
You: Who are you?
|
||||
|
||||
Her: Ähm, Hellooho? I'm just the greatest show master in this place. Maybe in the world. Your pleasure.
|
||||
|
||||
++++ [How was I supposed to know that?]
|
||||
~ favor_nails = favor_nails - 1
|
||||
|
||||
Her: OK I forgive you, that you have no taste. I'll even put on a show, yes? Sit down.
|
||||
|
||||
+++++ [Sit] You sit in the seat nearest to you. -> f4r4.the_show
|
||||
+++++ [Go up to her] You continue to go up to her. -> f4r4.the_performer
|
||||
+++++ [I thought we were going to make a wolf and bear death match?]
|
||||
You: I thought we were going to make a wolf and bear death match?
|
||||
Her: Ya. OK. You can come here so I can obliterate you.
|
||||
-> f4r4.deathmatch
|
||||
++++ [I think they have failed to put up a poster for you downstairs.]
|
||||
Her: What do you expect? There is no fudging respect for real art in this place. So lame. Sit down and I'm gonna give you the real off the hook showy show stuff.
|
||||
|
||||
+++++ [Sit] You sit in the seat nearest to you. -> f4r4.the_show
|
||||
+++++ [Go up to her] You continue to go up to her. -> f4r4.the_performer
|
||||
+++++ [I thought we were going to make a wolf and bear death match?]
|
||||
You: I thought we were going to make a wolf and bear death match?
|
||||
Her: Ya. OK. Come here and bring it on then.
|
||||
-> f4r4.deathmatch
|
||||
++ [Run to the back of the room]
|
||||
You are just a tiny thing down here, without a fighting chance. You bolt up the aisle to get yourself some size.
|
||||
|
||||
There is a startled squeak from the back of the room.
|
||||
|
||||
+++ [Ignore it]
|
||||
You charge on. To a spot where you will be big enough. You jump on to a seat for more high ground and make a much better sized bear.
|
||||
-> f4r4.bear
|
||||
+++ [Look up]
|
||||
You look up and slow down. Squinting into the darkness you can see a figure in one of the raised rows. Your opponent.
|
||||
|
||||
You arrive at a spot where you will be big enough. You jump on to a seat for more high ground and make a much better sized bear.
|
||||
-> f4r4.bear
|
||||
++ [Clamber over the seats like a crazy person]
|
||||
You are just a tiny thing down here, begging to be eaten alive. You jump and clamber over the backs of the seats to get yourself some size.
|
||||
|
||||
There is laughter from the back of the theatre.
|
||||
|
||||
Her: HAHAHA what are you doing? The wolf is not actually gonna eat you, you know?
|
||||
|
||||
+++ [Continue] You don't stop. Only slow down a little to look up.
|
||||
+++ [Halt] You stop to look up.
|
||||
---
|
||||
You can see two giant backlit hands. Forming a wolf.
|
||||
|
||||
+++ [Best to be sure it won't eat me.]
|
||||
Her: Jup. OK?
|
||||
|
||||
You have made enough ground and are standing up on a seat now. You make a bear that is much better sized.
|
||||
|
||||
You: Jup. Much better. Thanks. Let's GO.
|
||||
-> f4r4.bear
|
||||
+++ [I was just trying to get some high ground for a counterattack.]
|
||||
Her: Oh! You think you can challenge me? Bring it on.
|
||||
|
||||
You have made enough ground and are standing up on a seat now. You make a bear that is much better sized.
|
||||
|
||||
You: Let's go.
|
||||
-> f4r4.bear
|
||||
* [Mime your bloody death from the wolf attack]
|
||||
Your reaction time is a bit off. But it is not too late yet to mime your bloody murder by the claws of the beast. You put some theatricality into your death scene.
|
||||
|
||||
Your reward is amused laughter from the back of the theatre as the wolf dissolves into hands.
|
||||
|
||||
++ [Take a bow]
|
||||
You take a theatrical bow. Which is rewarded with some fluttery applause.
|
||||
++ [Try to see the shadow maker]
|
||||
You raise your hand and squint against the beamer's glare to see your attacker. You can only just about see two very large hands.
|
||||
--
|
||||
Her: Do another one. Do another one!
|
||||
|
||||
++ [Ok. Attack me again.] You: Ok. Attack me again. -> f4r4.unicorn
|
||||
++ [Make your own shadow puppet]
|
||||
You decide to try your own hand at shadow puppeteering.
|
||||
|
||||
Do you even know how to do that?
|
||||
|
||||
+++ [Yes]
|
||||
Alright. You make a...
|
||||
++++ [Wolf] A small wolf.
|
||||
++++ (bunny_puppet)[Bunny] A bunny.
|
||||
++++ [Butterfly] A butterfly.
|
||||
++++ [Spider] A scuttling spider.
|
||||
----
|
||||
Her: Sorry. Not sorry. I'm not impressed. But it is also veeeerrrrryyyy hard to impress me.
|
||||
+++ [No]
|
||||
You don't really know how but you can still make a shadow figure with your full body.
|
||||
|
||||
So you make...
|
||||
++++ [A worm] A worm, by raising your hand over your head and making a wave with your whole body.
|
||||
++++ (kitty)[Yourself cat ears]
|
||||
Your hands into cat ears. They turn and twitch.
|
||||
+++++ [Miou.]
|
||||
~ favor_nails = favor_nails + 1
|
||||
You: Miou.
|
||||
Her: Naw
|
||||
++++ [Yourself antlers] Your hands into majestic antlers protruding from your head.
|
||||
++++ [A T-pose] A T-pose. You had other ideas, but I guess you like being trash.
|
||||
Her: Hmmm. OK? What are you supposed to be?
|
||||
----
|
||||
---
|
||||
Her: I possibly see the tiniest bit of talent here. Maybe if you work at it, we could make a show together. If you try to upstage me, you are out, though.
|
||||
-> f4r4.apprentice
|
||||
* [Try to replicate the wolf]
|
||||
You try to figure out how exactly the shape of the wolf is made and to interlock your own fingers to replicate the effect.
|
||||
|
||||
++ [Observe] You observe...
|
||||
--
|
||||
++ [Build the finger form] Arrange the fingers...
|
||||
--
|
||||
++ [Project]
|
||||
// TODO: per Shuffle zufällig zwischen "passable" und "ugly" wechseln.
|
||||
// Inklecate unterstützt keine mehrzeiligen {~}-Sequenzen -- braucht
|
||||
// VAR wolf_ugly + { shuffle: - ... - ... }-Syntax oder zwei Pfade.
|
||||
And... you create a passable attempt. Much smaller and a little crooked, maybe.
|
||||
--
|
||||
|
||||
= unicorn
|
||||
Her: OK. OK. Do this one.
|
||||
|
||||
The hands resolve themselves into the shape of a unicorn.
|
||||
|
||||
+ [Try to pacify the beast]
|
||||
You hold out your hand in an attempt to pacify the beast.
|
||||
|
||||
The unicorn huffs and scuffs a hoof against the floor.
|
||||
|
||||
++ [Shhh. Easy. It's fine.]
|
||||
The unicorn doesn't seem convinced. It shakes its head in irritation.
|
||||
|
||||
+++ {snaks} [Present the snacks you picked up as a peace offering]
|
||||
You: Here I have something for you.
|
||||
|
||||
You hold out the sweets you picked up earlier.
|
||||
|
||||
Her: OMG! You have snacks? I want some. I want some! Get up here!
|
||||
|
||||
She sounds so excited, you have to oblige.
|
||||
-> f4r4.snacksharing
|
||||
+++ [Persist in being soothing]
|
||||
You still persist in making soothing noises and hold your hands up.
|
||||
|
||||
But it doesn't help.
|
||||
+++ [Prepare for an attack]
|
||||
You step back a little and square your stance for the next attack.
|
||||
---
|
||||
++ [Prepare for an attack]
|
||||
You step back a little and square your stance for the next attack.
|
||||
--
|
||||
+ [Prepare for the attack]
|
||||
You square your stance in anticipation for the next attack.
|
||||
-
|
||||
It scuffs its hoofs, rears up and charges you.
|
||||
|
||||
+ [Dodge]
|
||||
In the last moment you perform a jump-roll to the side.
|
||||
|
||||
Her: Hey! You can't dodge-roll in two dimensions!
|
||||
|
||||
++ [Worth a try!]
|
||||
You: Worth a try!
|
||||
|
||||
Now you are in the position of squaring off with the unicorn again. It charges once more.
|
||||
|
||||
+++ [Dodge]
|
||||
You dodge-roll again and hear a frustrated shout from the back of the theatre.
|
||||
|
||||
As you get back up again you see the shadow unicorn is already on top of you. Trampling you to death instead.
|
||||
|
||||
Her: There, serves you right, you jumping Jack. Are you trying to steal my scene? You know, for a moment there I thought this was kind of fun. Tell me: what are your acting references?
|
||||
++++ [Get impaled]
|
||||
---
|
||||
---
|
||||
++ [Oh Yeah? Watch me!]
|
||||
You: OH Yeah? Watch me!
|
||||
|
||||
You proceed to dodge-roll across the stage like a hedgehog on speed.
|
||||
|
||||
Between rolls you see the bewildered unicorn watch you from the side.
|
||||
|
||||
+++ [You could probably surprise it and boop it on the nose]
|
||||
~ boop_success = RANDOM(0, 1) == 1
|
||||
{boop_success:
|
||||
You jump-roll towards it, get up and manage a quick boop on its nose before dodge-rolling away again.
|
||||
- else:
|
||||
You jump-roll towards it. But unfortunately it wasn't that distracted and before you can boop it, it has lowered its horn and is making you into crazy-person-shashlik.
|
||||
}
|
||||
{not boop_success: -> after_boop}
|
||||
++++[Celebrate your victory]
|
||||
You stop to raise your hands up into the air to celebrate your victory. Meanwhile there is sarcastic clapping from the backseats.
|
||||
|
||||
Her: wow. OK. Great show, I guess. Very... acrobatic
|
||||
---- (after_boop)
|
||||
+++ [Continue rolling]
|
||||
You can't stop now. So you dodge-roll until you become nauseous and you are out of breath.
|
||||
|
||||
You just collapse on the floor and take some deep breaths. It's getting warm in the beamer light.
|
||||
|
||||
On the screen beside you, you can see the shadow unicorn come up to you cautiously and sniff you.
|
||||
|
||||
++++ [Raise a hand]
|
||||
You raise a hand to show up on the screen. The unicorn raises its head out of reach again.
|
||||
|
||||
Her: OH Good. You are not dead.
|
||||
++++ [Sit up]
|
||||
You sit up and the unicorn steps back from your shadow. Satisfied you are ok.
|
||||
|
||||
Her: Oh Good. You are not dead.
|
||||
----
|
||||
---
|
||||
++ [Just wanted to make it a bit more interesting.]
|
||||
You: Just wanted to make it a bit more interesting.
|
||||
|
||||
Her: Convince me of your acting talent first. We can workshop it once I have decided you are worth it to share a stage with me.
|
||||
|
||||
The unicorn charges again.
|
||||
|
||||
+++ [Dodge]
|
||||
You dodge-roll again.
|
||||
|
||||
Her: HEY!
|
||||
|
||||
As you get back up again you see the shadow unicorn is already on top of you. Trampling you to death.
|
||||
|
||||
Her: There, serves you right, you jumping Jack. Are you trying to steal my scene? Tell me: what are your acting references?
|
||||
++++ [Get impaled]
|
||||
---
|
||||
--
|
||||
You try even harder for your second death scene. Now that you know you have an appreciative scene partner and audience. You cheat to the side of the screen to see the unicorn and its movement. It has got you through the solar plexus and you convulse with the jerks of its head. When it finally pulls its horn up and out, you go with the movement and fall face first to the floor. You just about manage to make it a stage fall and not knock your teeth out on the thin scratchy carpet.
|
||||
|
||||
You stay on the floor until you hear clapping.
|
||||
|
||||
Her: I have to say, that wasn't bad. I mean I clearly carried the scene. But it really makes the action more lively with an acting partner. Tell me: what are your references?
|
||||
|
||||
* [I did some acting in school.] You: I did some acting in school.
|
||||
Her: Wouldn't go boasting with that.
|
||||
* [I actually have a degree in acting.] You: I actually have a degree in acting.
|
||||
Her: Well, there is no such thing as a legitimate art adjudication, you know.
|
||||
* [I am just a natural.] You: I am just a natural.
|
||||
Her: Ha. Sure thing sweety. Don't talk about a natural when I'm at the table.
|
||||
-
|
||||
Her: I can accept this as a first audition, I think. I know I'm hard to impress. The competition is very absent, though. But I think I really saw a bit of style in there. Deep, deep down. Maybe I can make a passable partner of you. Yas. I totally see the vision.
|
||||
-> f4r4.snacksharing
|
||||
|
||||
= snacksharing
|
||||
You go up the aisle towards the dark silhouette. It is too dark to make much out. When you are a few rows away you see the form move. You see arms and shoulders and above them something which is not the shape of a head.
|
||||
|
||||
When you are at her row, she is just stepping out onto the aisle. Her high-heeled shoes make no sound on the carpet. She straightens her frilly dress and puts one of the straps that slipped off her shoulder back in its rightful place.
|
||||
|
||||
When you look up to her face, your eyes adjust enough for you to see. A mess of long fingers unfurls itself into the clear shape of two gigantic but delicate hands, bedecked in rings and acrylic nails, growing from a slender neck with a y2K choker.
|
||||
|
||||
+ [I think she is cool.]
|
||||
She is very cool indeed.
|
||||
|
||||
You hold out the snacks.
|
||||
|
||||
Her: Yummy. Oh maaaan it's been tooooo long.
|
||||
|
||||
She grabs the package from your hand.
|
||||
|
||||
Her: I don't know. I guess I've just been so focused on perfecting my performance lately. I guess I haven't really had any time to get out. And walking up and down all the stairs. Urgh. Hate that.
|
||||
|
||||
One of her hands faces to the front and forms a snout with three fingers to the front while the Pinky and index finger perk up. Her makeshift foxface looks down to the package of snacks.
|
||||
|
||||
{had_sweets:
|
||||
Her: MMHHhhh Yum! Sweets. I always need something sweet.
|
||||
|
||||
She tears at the plastic wrapping and tosses a piece up into her hand which folds into a fist briefly. A second later, when her hand resumes the foxface the piece of candy is gone.
|
||||
|
||||
Her: Hm. OK. Ordinary candy.
|
||||
|
||||
She studies the package again.
|
||||
|
||||
Her: Didn't even know they had those here. Sweet. But that's it. You should try some of the local sorts. They pack a little more ZING.
|
||||
- else:
|
||||
Her: Huh. Salty snacks. OK I guess. Sorry, I normally prefer sweets. But I'd still like to try some.
|
||||
|
||||
She tears at the plastic wrapping and tosses a piece up into her hand which folds into a fist briefly. A second later, when her hand resumes the foxface the snack is gone.
|
||||
|
||||
Her: Hm? Is it just a normal snack?
|
||||
|
||||
She studies the package again.
|
||||
|
||||
Her: Didn't even know they had those here. You should try some of the local stuff. It's a little more interesting.
|
||||
}
|
||||
+ [I think she is scary.]
|
||||
You are a little intimidated.
|
||||
|
||||
Her: What? Don't worry, I don't bite. Well, nah you've seen the worst of my bite down there during the show.
|
||||
|
||||
One of her hands faces to the front and forms a snout with three fingers to the front while the Pinky and index finger perk up. She opens and closes the fingers a little as she talks. It looks like someone comically ventriloquising a hand puppet. It doesn't look genuine.
|
||||
|
||||
Her: Or maybe I will bite if you keep these sweets you promised me.
|
||||
|
||||
You raise your hand with the package and she snatches it from you. Her makeshift foxface looks down at the bag of snacks.
|
||||
|
||||
{had_sweets:
|
||||
Her: MMHHhhh Yum! Sweets. I always need something sweet.
|
||||
|
||||
She tears at the plastic wrapping and tosses a piece up into her hand which folds into a fist briefly. A second later, when her hand resumes the foxface the piece of candy is gone.
|
||||
|
||||
Her: Hm. OK. Ordinary candy.
|
||||
|
||||
She studies the package again.
|
||||
|
||||
Her: Didn't even know they had those here. Sweet. But that's it. You should try some of the local sorts. They pack a little more ZING.
|
||||
- else:
|
||||
Her: Huh. Salty snacks. OK I guess. I normally prefer sweets. But I guess this is a total emergency situation.
|
||||
|
||||
She tears at the plastic wrapping and tosses a piece up into her hand which folds into a fist briefly. A second later, when her hand resumes the foxface the snack is gone.
|
||||
|
||||
Her: Hm? Is it just a normal snack?
|
||||
|
||||
She studies the package again.
|
||||
|
||||
Her: Didn't even know they had those here. You should try some of the local stuff. It's a little more interesting.
|
||||
}
|
||||
-
|
||||
-> END
|
||||
|
||||
= deathmatch
|
||||
Her: If you are a grizzly bear, then I will be a dragon.
|
||||
|
||||
You: Then I will be the winter wind. Blowing out your flame and freezing you.
|
||||
|
||||
Her: Then I will be the ocean. Then you could never blow away.
|
||||
|
||||
You: My wind will be waves then. Sitting on top of you. Disturbing your depths.
|
||||
|
||||
Her: I will be the moon then. So you will have to bow to my every will.
|
||||
|
||||
+ [Flirt... yes please]
|
||||
~ favor_nails = favor_nails + 1
|
||||
+ [I will be the earth so you can only be as bright as I want you to be.]
|
||||
|
||||
-
|
||||
Her: Then I am the sun. So only I can decide where the light is.
|
||||
|
||||
The screen blacks out except for a small globe of light.
|
||||
-> END
|
||||
|
||||
= bear
|
||||
The wolf is snarling and fierce as before, but its tail twitches a little. You have intimidated it, by the looks of it.
|
||||
|
||||
Your bear is on its hind legs and looming tall.
|
||||
|
||||
You must never underestimate how dangerous a desperate animal is.
|
||||
|
||||
+ [Check your stance.]
|
||||
You are standing a bit unsafely on the chairs. So, you take your eyes off your opponent for a second to check your stance.
|
||||
|
||||
As you shift your right foot into a safer position the projector light on your cheek is disturbed. You can see out of the corner of your eye how the shadow grazes you. As you snap your attention up to the screen you see the wolf on your bear's hump. Biting down savagely.
|
||||
|
||||
You don't even have to think about it, as you raise your paws and beat at the side of the wolf. The force of it is enough to send it flying off of you and skidding to the edge of the screen. It is up on its feet again in seconds.
|
||||
|
||||
++ [Roar at it.]
|
||||
Your bear is not very hurt but furious. You send out a roar. A warning and a threat.
|
||||
|
||||
But the wolf will not back down. It charges again.
|
||||
++ [Run to it to attack.]
|
||||
You have no time to lose either, so you jump from the seat. The bear gallops towards the wolf.
|
||||
--
|
||||
++ [Bite] The bear is quick on four feet and opens its massive jaws to welcome the wolf.
|
||||
++ [Thrash] The bear stands tall and swipes a paw at the beast.
|
||||
--
|
||||
The wolf has left itself enough of an opening to jump back in time.
|
||||
|
||||
++ [Bite] You bite. But it jumps over you.
|
||||
++ [Thrash] You thrash. But it jumps around you.
|
||||
--
|
||||
You try a few more attacks. But the wolf is careful and nimble now.
|
||||
|
||||
It is baiting you. Cunning. You can already start to feel the strength of your attacks receding.
|
||||
|
||||
+ [Start your first attack]
|
||||
You are ready.
|
||||
|
||||
++ [Swipe a paw at the wolf]
|
||||
As the wolf jumps toward you the bear stands tall and swipes a massive paw down.
|
||||
|
||||
The wolf is quick but not quick enough to escape the attack completely. You catch it across its back and its jowls as it jumps away again.
|
||||
++ [Bite at the wolf.]
|
||||
The wolf jumps forward and the bear comes down to all four legs to bite at it.
|
||||
|
||||
The wolf is quick and jumps back from the bear's teeth, which scrape its back but don't manage the catch. A pained howling is your only reward.
|
||||
--
|
||||
The wolf paces for a moment.
|
||||
|
||||
++ [Wait] You wait to see its next move.
|
||||
Then it jumps forward again, jaws snapping.
|
||||
|
||||
+++ [Bite] The bear snaps its jaws right back. But the wolf has left itself enough of an opening to jump back in time.
|
||||
+++ [Thrash] But the bear is ready and strikes. The wolf has left itself enough of an opening to jump back in time.
|
||||
+++ [Dodge]
|
||||
~ fallbear = RANDOM(0, 1) == 1
|
||||
{fallbear:
|
||||
You only have to take a step back to be out of reach. But it only takes a step to destabilise you. And you fall.
|
||||
- else:
|
||||
It is slower so, the bear can just step back out of reach.
|
||||
}
|
||||
{not fallbear: -> after_dodge_inner}
|
||||
You can mostly brake your fall by catching the seats. You hang awkwardly in the row.
|
||||
|
||||
++++ [Admit defeat]
|
||||
You: Well played.
|
||||
|
||||
Her: Are you giving up?
|
||||
|
||||
You: What can I say. You got me.
|
||||
|
||||
You disentangle yourself from the seats. The wolf meanwhile resolves itself into a set of triumphant hands.
|
||||
|
||||
Her: Haha. Yes I did. But don't be embarrassed, I can tell you! You totally never stood a chance. I am the master of the craft. You wanna see some of my other specialities?
|
||||
|
||||
+++++ [Yes] You: Yes -> f4r4.her_portfolio
|
||||
++++ [Get back up]
|
||||
You quickly disentangle yourself from your compromised position. The wolf is already sniffing interestedly at the spot where you disappeared. Hungry for its kill.
|
||||
|
||||
++++ [Turn into a crocodile to ambush it]
|
||||
It is right above you now. An easy kill for an ambush predator. Your arms become the strong, crushing maw of a crocodile in a second. Jumping up as if from the watering hole. Swallowing the front half of the wolf in one bite. There isn't even enough time for it to scream in pain. You have become a swift and merciless death.
|
||||
|
||||
You slide back to the depths. Drawing the carcass of the wolf along.
|
||||
|
||||
Her: That was sooooooo not fair!
|
||||
|
||||
She sounds a little out of breath.
|
||||
|
||||
You: Well nature isn't fair.
|
||||
|
||||
Her: You shape shifted. That has nothing to do with nature.
|
||||
|
||||
You: It's called a plot twist.
|
||||
|
||||
Her: Ya a bad one. And what even happened to the bear? This isn't very narratively satisfying.
|
||||
|
||||
You: I'm sure the crocodile is satisfied.
|
||||
|
||||
Her: Oh my god. Just because you wanted to win. This makes no sense whatsoever!? If you could be bothered to stick to a storyline I would have destroyed you.
|
||||
|
||||
+++++ [OK. I'm sorry.]
|
||||
Her: Ya u better be. Now sit your ass down and I'm gonna show you how it's done.
|
||||
-> f4r4.the_show
|
||||
+++++ [You might have. If you were more flexible.]
|
||||
Her: Ah!? What did you just say? You can accuse me of many things but this is just slander! How dare you.
|
||||
-----
|
||||
---- (after_dodge_inner)
|
||||
---
|
||||
++ [Attack]
|
||||
But yours will be the next move.
|
||||
|
||||
+++ [Bite] The bear comes forward to snap its jaws. But the wolf has left itself enough of an opening to jump back in time.
|
||||
+++ [Thrash] The bear is ready and strikes. The wolf has left itself enough of an opening to jump back in time.
|
||||
---
|
||||
--
|
||||
You try a few more attacks. But the wolf is careful and nimble now.
|
||||
|
||||
++ [Bite] You bite. But it jumps over you.
|
||||
++ [Thrash] You thrash. But it jumps around you.
|
||||
--
|
||||
It is baiting you. Cunning. You can already start to feel the strength of your attacks receding.
|
||||
|
||||
= cbear
|
||||
// TODO: Gegenangriff-Bär -- Bär greift aus erhöhter Position an
|
||||
-> END
|
||||
|
||||
= the_show
|
||||
// TODO: Die eigentliche Vorstellung -- Nails' Schattentheater
|
||||
// Übergang in silent_show (stilles Beobachten) oder interaktiv
|
||||
-> silent_show
|
||||
|
||||
= silent_show
|
||||
A second shadowy hand joined the first. They wrap around each other and devolve into a mass of darkness with pins of light, shining between the bends of fingers which you no longer can tell apart or identify.
|
||||
|
||||
The splotch bulges and warps. Forming shapes you almost recognise. Organic shapes. No symmetry or clean edges.
|
||||
|
||||
Does your brain try to identify and categorise the shapes?
|
||||
|
||||
Do you see the pattern formed by projector light in the middle? Is it the fur pattern of an imaginary animal?
|
||||
|
||||
Do you see landscapes or stars?
|
||||
|
||||
The profiles of faces you know but can't place crown the edges of the shadow. There and gone in a moment.
|
||||
|
||||
Are you trying to figure out if the curtains are blue? There are no curtains. And if there were it would be rude to figure out the colour. Don't be distracted. Focus on the show. Someone is performing for you here.
|
||||
|
||||
The ink on the screen devolves itself into a shape your brain can grasp easily now. It is a Swan. Swimming on the water. It is perfect. Wings folded. The body smooth as a pebble. The neck long and arcing, bending up and around and down.
|
||||
|
||||
It dips its head into the water, gracefully. Kissing the ripples of the surface demurely before pulling back and shaking off water.
|
||||
|
||||
-> END
|
||||
|
||||
= shadow_battle
|
||||
// TODO: Schattenkampf -- Nails' wolf vs. Spieler's bear, freie Wahl
|
||||
-> END
|
||||
|
||||
= apprentice
|
||||
// TODO: Nails nimmt Spieler als Lehrling an
|
||||
-> END
|
||||
|
||||
= quitter
|
||||
// TODO: Hase flüchtet vom Bildschirm -- feige Niederlage
|
||||
-> END
|
||||
|
||||
= her_portfolio
|
||||
// TODO: Nails zeigt ihr Shadow-Portfolio
|
||||
-> END
|
||||
|
||||
= performance
|
||||
// TODO: Nails' volle Vorstellung
|
||||
-> END
|
||||
|
||||
= practice
|
||||
// TODO: Nails übt neue Figuren, Spieler schaut zu
|
||||
-> END
|
||||
|
||||
= seeulater
|
||||
// TODO: Verabredung für später -- Spieler kommt nochmal
|
||||
-> END
|
||||
File diff suppressed because one or more lines are too long
@@ -10,7 +10,7 @@ VAR quest_mushroom_done = false
|
||||
|
||||
- quest_mushroom_active && mushrooms_collected >= 10:
|
||||
# color whisper
|
||||
Du hast {mushrooms_collected} Pilze dabei — mehr als genug!
|
||||
Du hast {mushrooms_collected} Pilze dabei -- mehr als genug!
|
||||
* [Hier, nimm sie.]
|
||||
~ quest_mushroom_done = true
|
||||
# color whisper
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"inkVersion":21,"root":[[["ev",{"VAR?":"quest_mushroom_done"},"/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Danke nochmal für die Pilze. Das Rezept ist fast fertig.","\n",{"->":"ende"},{"->":"0.4"},null]}],["ev",{"VAR?":"quest_mushroom_active"},{"VAR?":"mushrooms_collected"},10,">=","&&","/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Du hast ","ev",{"VAR?":"mushrooms_collected"},"out","/ev","^ Pilze dabei — mehr als genug!","\n","ev","str","^Hier, nimm sie.","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Lass mich noch ein paar behalten.","/str","/ev",{"*":".^.c-1","flg":20},{"->":"0.4"},{"c-0":["\n","ev",true,"/ev",{"VAR=":"quest_mushroom_done","re":true},"#","^color whisper","/#","^Wunderbar, vielen Dank! Das wird ein gutes Süppchen.","\n",{"->":"ende"},{"#f":5}],"c-1":["\n","#","^color whisper","/#","^Wie du willst. Komm wieder, wenn du sie loswerden möchtest.","\n",{"->":"ende"},{"#f":5}]}]}],["ev",{"VAR?":"quest_mushroom_active"},"/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Du hast schon ","ev",{"VAR?":"mushrooms_collected"},"out","/ev","^ von 10 Pilzen. Mach ruhig weiter.","\n",{"->":"ende"},{"->":"0.4"},null]}],[{"->":".^.b"},{"b":["\n","#","^color whisper","/#","^TEST1 Hallo! Ich bräuchte 10 Pilze für ein Rezept. Hättest du Lust, welche zu sammeln?","\n","ev","str","^Klar, ich helfe.","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Vielleicht später.","/str","/ev",{"*":".^.c-1","flg":20},{"->":"0.4"},{"c-0":["\n","ev",true,"/ev",{"VAR=":"quest_mushroom_active","re":true},"#","^color whisper","/#","^Danke! Ich warte hier.","\n",{"->":"ende"},{"#f":5}],"c-1":["\n","#","^color whisper","/#","^Schade. Komm gerne nochmal vorbei.","\n",{"->":"ende"},{"#f":5}]}]}],"nop","\n",["done",{"#n":"g-0"}],null],"done",{"ende":[["ev","str","^Bis dann","/str","/ev",{"*":".^.c-0","flg":20},{"c-0":["\n","#","^person_farewell","/#","end",{"#f":5}]}],null],"global decl":["ev",0,{"VAR=":"mushrooms_collected"},false,{"VAR=":"quest_mushroom_active"},false,{"VAR=":"quest_mushroom_done"},"/ev","end",null]}],"listDefs":{}}
|
||||
{"inkVersion":21,"root":[[["ev",{"VAR?":"quest_mushroom_done"},"/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Danke nochmal für die Pilze. Das Rezept ist fast fertig.","\n",{"->":"ende"},{"->":"0.4"},null]}],["ev",{"VAR?":"quest_mushroom_active"},{"VAR?":"mushrooms_collected"},10,">=","&&","/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Du hast ","ev",{"VAR?":"mushrooms_collected"},"out","/ev","^ Pilze dabei -- mehr als genug!","\n","ev","str","^Hier, nimm sie.","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Lass mich noch ein paar behalten.","/str","/ev",{"*":".^.c-1","flg":20},{"->":"0.4"},{"c-0":["\n","ev",true,"/ev",{"VAR=":"quest_mushroom_done","re":true},"#","^color whisper","/#","^Wunderbar, vielen Dank! Das wird ein gutes Süppchen.","\n",{"->":"ende"},{"#f":5}],"c-1":["\n","#","^color whisper","/#","^Wie du willst. Komm wieder, wenn du sie loswerden möchtest.","\n",{"->":"ende"},{"#f":5}]}]}],["ev",{"VAR?":"quest_mushroom_active"},"/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Du hast schon ","ev",{"VAR?":"mushrooms_collected"},"out","/ev","^ von 10 Pilzen. Mach ruhig weiter.","\n",{"->":"ende"},{"->":"0.4"},null]}],[{"->":".^.b"},{"b":["\n","#","^color whisper","/#","^TEST1 Hallo! Ich bräuchte 10 Pilze für ein Rezept. Hättest du Lust, welche zu sammeln?","\n","ev","str","^Klar, ich helfe.","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Vielleicht später.","/str","/ev",{"*":".^.c-1","flg":20},{"->":"0.4"},{"c-0":["\n","ev",true,"/ev",{"VAR=":"quest_mushroom_active","re":true},"#","^color whisper","/#","^Danke! Ich warte hier.","\n",{"->":"ende"},{"#f":5}],"c-1":["\n","#","^color whisper","/#","^Schade. Komm gerne nochmal vorbei.","\n",{"->":"ende"},{"#f":5}]}]}],"nop","\n",["done",{"#n":"g-0"}],null],"done",{"ende":[["ev","str","^Bis dann","/str","/ev",{"*":".^.c-0","flg":20},{"c-0":["\n","#","^person_farewell","/#","end",{"#f":5}]}],null],"global decl":["ev",0,{"VAR=":"mushrooms_collected"},false,{"VAR=":"quest_mushroom_active"},false,{"VAR=":"quest_mushroom_done"},"/ev","end",null]}],"listDefs":{}}
|
||||
@@ -1,5 +0,0 @@
|
||||
iasoidasd
|
||||
|
||||
|
||||
|
||||
jkhjkj
|
||||
+25
-205
@@ -6,223 +6,43 @@
|
||||
"wad" ""
|
||||
// brush 0
|
||||
{
|
||||
( 112 -16 -48 ) ( 112 -15 -48 ) ( 112 -16 -47 ) tarmac -16 -16 0 1 1
|
||||
( 0 0 -48 ) ( 0 0 -47 ) ( 1 0 -48 ) tarmac 0 -16 0 1 1
|
||||
( 0 -16 -48 ) ( 1 -16 -48 ) ( 0 -15 -48 ) tarmac 0 16 0 1 1
|
||||
( 160 96 -32 ) ( 160 97 -32 ) ( 161 96 -32 ) tarmac 0 0 0 0.6 0.6041667
|
||||
( 160 112 -32 ) ( 161 112 -32 ) ( 160 112 -31 ) tarmac 0 -16 0 1 1
|
||||
( 192 96 -32 ) ( 192 96 -31 ) ( 192 97 -32 ) tarmac -16 -16 0 1 1
|
||||
( -80 -16 -32 ) ( -80 -15 -32 ) ( -80 -16 -31 ) 256_arcade_carpet 96 -16 0 0.2 0.2
|
||||
( -112 -16 -32 ) ( -112 -16 -31 ) ( -111 -16 -32 ) 256_arcade_carpet 80 -16 0 0.2 0.2
|
||||
( -112 -16 -32 ) ( -111 -16 -32 ) ( -112 -15 -32 ) 256_arcade_carpet 80 -96 0 0.2 0.2
|
||||
( 48 96 -16 ) ( 48 97 -16 ) ( 49 96 -16 ) 256_arcade_carpet 5.3333435 -57.379303 0 0.2 0.2
|
||||
( 48 112 -16 ) ( 49 112 -16 ) ( 48 112 -15 ) 256_arcade_carpet 80 -16 0 0.2 0.2
|
||||
( 80 96 -16 ) ( 80 96 -15 ) ( 80 97 -16 ) 256_arcade_carpet 96 -16 0 0.2 0.2
|
||||
}
|
||||
// brush 1
|
||||
{
|
||||
( 16 192 0 ) ( 16 112 -32 ) ( 16 112 -48 ) tarmac 38.4 -50.06682 26.565052 1.118034 0.9533479
|
||||
( 16 112 -32 ) ( 176 112 -32 ) ( 176 112 -48 ) tarmac 0 0 0 1 1
|
||||
( 16 192 0 ) ( 176 192 0 ) ( 176 112 -32 ) tarmac 0 -8.470581 0 1 1.0625
|
||||
( 176 112 -48 ) ( 176 192 -16 ) ( 16 192 -16 ) tarmac 0 -8.470581 0 1 1.0625
|
||||
( 176 192 -16 ) ( 176 192 0 ) ( 16 192 0 ) tarmac 0 32 0 1 1
|
||||
( 176 112 -32 ) ( 176 192 0 ) ( 176 192 -16 ) tarmac 38.4 -50.06682 26.565052 1.118034 0.9533479
|
||||
( -48 0 4 ) ( -48 1 4 ) ( -48 0 5 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( 48 -16 -16 ) ( 47 -16 -16 ) ( 48 -16 -15 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( 48 -16 -16 ) ( 48 -15 -16 ) ( 47 -16 -16 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( -48 0 80 ) ( -49 0 80 ) ( -48 1 80 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( -48 0 4 ) ( -48 0 5 ) ( -49 0 4 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( 48 -16 -16 ) ( 48 -16 -15 ) ( 48 -15 -16 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
}
|
||||
// brush 2
|
||||
{
|
||||
( 16 192 0 ) ( 16 256 -16 ) ( 16 256 0 ) tarmac 0 0 0 1 1
|
||||
( 176 192 0 ) ( 16 192 -16 ) ( 16 192 0 ) tarmac 0 0 0 1 1
|
||||
( 176 256 -16 ) ( 16 192 -16 ) ( 176 192 -16 ) tarmac 0 0 0 1 1
|
||||
( 176 256 0 ) ( 16 192 0 ) ( 16 256 0 ) tarmac 0 0 0 1 1
|
||||
( 176 256 0 ) ( 16 256 -16 ) ( 176 256 -16 ) tarmac 0 0 0 1 1
|
||||
( 176 256 0 ) ( 176 192 -16 ) ( 176 192 0 ) tarmac 0 0 0 1 1
|
||||
( -91.71281292110203 32 4 ) ( -91.21281292110203 32.86602540378445 4 ) ( -91.71281292110203 32 5 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( -30.430780618346965 -21.856406460551035 -16 ) ( -31.296806022131403 -21.356406460551035 -16 ) ( -30.430780618346965 -21.856406460551035 -15 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( -30.430780618346965 -21.856406460551035 -16 ) ( -29.930780618346965 -20.990381056766598 -16 ) ( -31.296806022131403 -21.356406460551035 -16 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( -105.56921938165303 40 80 ) ( -106.43524478543748 40.500000000000014 80 ) ( -105.06921938165303 40.86602540378446 80 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( -105.56921938165303 40 4 ) ( -105.56921938165303 40 5 ) ( -106.43524478543748 40.500000000000014 4 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( -44.28718707889798 -13.856406460551028 -16 ) ( -44.28718707889798 -13.856406460551028 -15 ) ( -43.78718707889798 -12.99038105676659 -16 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
}
|
||||
// brush 3
|
||||
{
|
||||
( 9.372583002030481 48 -32 ) ( 10.079689783217027 48.70710678118655 -32 ) ( 9.372583002030481 48 -31 ) placeholder 31.057983 0 0 -0.08838835 0.125
|
||||
( 9.372583002030481 48 -32 ) ( 9.372583002030481 48 -31 ) ( 10.079689783217027 47.29289321881346 -32 ) placeholder 149.9613 256 0 0.088388346 0.125
|
||||
( 9.372583002030481 48 -32 ) ( 10.079689783217027 47.29289321881346 -32 ) ( 10.079689783217027 48.70710678118655 -32 ) placeholder 218.50967 68.54834 315 0.125 0.125
|
||||
( 54.62741699796952 48 0 ) ( 55.33452377915606 48.707106781186546 0 ) ( 55.33452377915606 47.29289321881345 0 ) placeholder 218.50967 68.54834 315 0.125 0.125
|
||||
( 54.62741699796952 48 -16 ) ( 54.62741699796952 48 -15 ) ( 55.33452377915606 48.707106781186546 -16 ) placeholder -31.058044 256 0 0.088388346 0.125
|
||||
( 54.62741699796952 48 -16 ) ( 55.33452377915606 47.29289321881345 -16 ) ( 54.62741699796952 48 -15 ) placeholder 224.94202 0 180 -0.08838835 -0.125
|
||||
}
|
||||
// brush 4
|
||||
{
|
||||
( 32 -16 -48 ) ( 32 -15 -48 ) ( 32 -16 -47 ) tarmac -16 -16 0 1 1
|
||||
( -80 0 -48 ) ( -80 0 -47 ) ( -79 0 -48 ) tarmac 80 -16 0 1 1
|
||||
( -80 -16 -48 ) ( -79 -16 -48 ) ( -80 -15 -48 ) tarmac 80 16 0 1 1
|
||||
( 80 96 -32 ) ( 80 97 -32 ) ( 81 96 -32 ) tarmac 5.3333435 0 0 0.6 0.6041667
|
||||
( 80 112 -32 ) ( 81 112 -32 ) ( 80 112 -31 ) tarmac 80 -16 0 1 1
|
||||
( 112 96 -32 ) ( 112 96 -31 ) ( 112 97 -32 ) tarmac -16 -16 0 1 1
|
||||
}
|
||||
// brush 5
|
||||
{
|
||||
( -48 -16 -48 ) ( -48 -15 -48 ) ( -48 -16 -47 ) tarmac -16 -16 0 1 1
|
||||
( -160 0 -48 ) ( -160 0 -47 ) ( -159 0 -48 ) tarmac 32 -16 0 1 1
|
||||
( -160 -16 -48 ) ( -159 -16 -48 ) ( -160 -15 -48 ) tarmac 32 16 0 1 1
|
||||
( 0 96 -32 ) ( 0 97 -32 ) ( 1 96 -32 ) tarmac 10.666673 0 0 0.6 0.6041667
|
||||
( 0 112 -32 ) ( 1 112 -32 ) ( 0 112 -31 ) tarmac 32 -16 0 1 1
|
||||
( 32 96 -32 ) ( 32 96 -31 ) ( 32 97 -32 ) tarmac -16 -16 0 1 1
|
||||
}
|
||||
// brush 6
|
||||
{
|
||||
( 112 -16 96 ) ( 112 -16 95 ) ( 112 -15 96 ) tarmac 64 16 270 1 1
|
||||
( 0 -16 96 ) ( 1 -16 96 ) ( 0 -16 95 ) tarmac 0 -64 0 1 -1
|
||||
( 160 0 -32 ) ( 161 0 -32 ) ( 160 1 -32 ) tarmac 0 16 0 1 1
|
||||
( 0 -16 80 ) ( 0 -15 80 ) ( 1 -16 80 ) tarmac 0 16 0 1 1
|
||||
( 160 0 -16 ) ( 160 0 -17 ) ( 161 0 -16 ) tarmac -127.99999 -4.413788 0 0.6 -0.6041667
|
||||
( 192 0 -16 ) ( 192 1 -16 ) ( 192 0 -17 ) tarmac 64 16 270 1 1
|
||||
}
|
||||
// brush 7
|
||||
{
|
||||
( 192 48 -16 ) ( 192 48 -17 ) ( 192 49 -16 ) tarmac -69.33332 -4.413788 0 0.6 -0.6041667
|
||||
( 208 0 96 ) ( 208 0 95 ) ( 207 0 96 ) tarmac 64 -48 270 1 -1
|
||||
( 192 48 -32 ) ( 192 49 -32 ) ( 191 48 -32 ) tarmac -16 -48 90 1 1
|
||||
( 208 -112 80 ) ( 207 -112 80 ) ( 208 -111 80 ) tarmac -16 -48 90 1 1
|
||||
( 192 80 -16 ) ( 191 80 -16 ) ( 192 80 -17 ) tarmac 64 -48 270 1 -1
|
||||
( 208 -112 96 ) ( 208 -111 96 ) ( 208 -112 95 ) tarmac -16 -64 0 1 -1
|
||||
}
|
||||
// brush 8
|
||||
{
|
||||
( -48 -128 -48 ) ( -48 -127 -48 ) ( -48 -128 -47 ) tarmac 96 -16 0 1 1
|
||||
( -80 -112 -48 ) ( -80 -112 -47 ) ( -79 -112 -48 ) tarmac 80 -16 0 1 1
|
||||
( -80 -128 -48 ) ( -79 -128 -48 ) ( -80 -127 -48 ) tarmac 80 -96 0 1 1
|
||||
( 80 -16 -32 ) ( 80 -15 -32 ) ( 81 -16 -32 ) tarmac 5.3333435 -57.379303 0 0.6 0.6041667
|
||||
( 80 0 -32 ) ( 81 0 -32 ) ( 80 0 -31 ) tarmac 80 -16 0 1 1
|
||||
( 112 -16 -32 ) ( 112 -16 -31 ) ( 112 -15 -32 ) tarmac 96 -16 0 1 1
|
||||
}
|
||||
// brush 9
|
||||
{
|
||||
( -48 -240 -48 ) ( -48 -239 -48 ) ( -48 -240 -47 ) tarmac 80 -16 0 1 1
|
||||
( -80 -416 -48 ) ( -80 -416 -47 ) ( -79 -416 -48 ) tarmac 80 -16 0 1 1
|
||||
( -80 -240 -48 ) ( -79 -240 -48 ) ( -80 -239 -48 ) tarmac 80 -80 0 1 1
|
||||
( 80 -128 -32 ) ( 80 -127 -32 ) ( 81 -128 -32 ) tarmac 5.3333435 13.241394 0 0.6 0.6041667
|
||||
( 80 -112 -32 ) ( 81 -112 -32 ) ( 80 -112 -31 ) tarmac 80 -16 0 1 1
|
||||
( 208 -128 -32 ) ( 208 -128 -31 ) ( 208 -127 -32 ) tarmac 80 -16 0 1 1
|
||||
}
|
||||
// brush 10
|
||||
{
|
||||
( 85.21224617320368 -369.94112549695416 96 ) ( 85.21224617320368 -369.94112549695416 95 ) ( 85.47106521830621 -368.9751996706651 96 ) tarmac 64 -94.99124 270 1 0.9659258
|
||||
( -22.971446371171922 -340.95339244547165 96 ) ( -22.005520544882856 -341.21221149057413 96 ) ( -22.971446371171922 -340.95339244547165 95 ) tarmac 23.781784 -64 0 0.9659258 -1
|
||||
( 135.7177905567193 -366.90962644125017 -32 ) ( 136.68371638300835 -367.16844548635265 -32 ) ( 135.9766096018218 -365.9437006149611 -32 ) tarmac -66.05652 -47.281128 345 1 1
|
||||
( -22.971446371171922 -340.95339244547165 80 ) ( -22.712627326069395 -339.9874666191826 80 ) ( -22.005520544882856 -341.21221149057413 80 ) tarmac -66.05652 -47.281128 345 1 1
|
||||
( 135.7177905567193 -366.90962644125017 -16 ) ( 135.7177905567193 -366.90962644125017 -17 ) ( 136.68371638300835 -367.16844548635265 -16 ) tarmac -95.50898 -4.413788 0 0.5795555 -0.6041667
|
||||
( 166.62741699796948 -375.19183588453086 -16 ) ( 166.886236043072 -374.22591005824177 -16 ) ( 166.62741699796948 -375.19183588453086 -17 ) tarmac 64 -116.427185 270 1 0.9659258
|
||||
}
|
||||
// brush 11
|
||||
{
|
||||
( 179.05073116289054 -328.8273962226556 -16 ) ( 179.05073116289054 -328.8273962226556 -17 ) ( 179.30955020799308 -327.86147039636654 -16 ) tarmac 66.04529 -4.413788 0 0.5795555 -0.6041667
|
||||
( 182.08223021859456 -379.33294060617123 96 ) ( 182.08223021859456 -379.33294060617123 95 ) ( 181.1163043923055 -379.0741215610687 96 ) tarmac 64 -28.505402 270 1 -0.9659258
|
||||
( 179.05073116289054 -328.8273962226556 -32 ) ( 179.30955020799308 -327.86147039636654 -32 ) ( 178.08480533660148 -328.5685771775531 -32 ) tarmac 47.281128 -114.05652 75 1 1
|
||||
( 153.09449716711205 -487.5166331505468 80 ) ( 152.128571340823 -487.25781410544425 80 ) ( 153.35331621221457 -486.55070732425776 80 ) tarmac 47.281128 -114.05652 75 1 1
|
||||
( 187.33294060617126 -297.9177697814054 -16 ) ( 186.3670147798822 -297.65895073630287 -16 ) ( 187.33294060617126 -297.9177697814054 -17 ) tarmac 64 -49.94133 270 1 -0.9659258
|
||||
( 153.09449716711205 -487.5166331505468 96 ) ( 153.35331621221457 -486.55070732425776 96 ) ( 153.09449716711205 -487.5166331505468 95 ) tarmac 120.714355 -64 0 0.9659258 -1
|
||||
}
|
||||
// brush 12
|
||||
{
|
||||
( 35.31370849898467 -346.71213603437275 96 ) ( 35.31370849898467 -346.71213603437275 95 ) ( 34.60660171779813 -346.0050292531862 96 ) tarmac 64 -74.32501 270 1 0.70710677
|
||||
( 57.941125496954285 -301.4573020384338 -16 ) ( 57.941125496954285 -301.4573020384338 -17 ) ( 58.64823227814084 -300.75019525724724 -16 ) tarmac 81.208374 -4.413788 0 0.42426407 -0.6041667
|
||||
( 57.941125496954285 -301.4573020384338 -32 ) ( 58.64823227814084 -300.75019525724724 -32 ) ( 57.23401871576773 -300.75019525724724 -32 ) tarmac -51.80806 -110.13306 45 1 1
|
||||
( -43.882250993908826 -425.9080955272659 80 ) ( -44.58935777509535 -425.20098874607936 80 ) ( -43.1751442127223 -425.20098874607936 80 ) tarmac -51.80806 -110.13306 45 1 1
|
||||
( 80.56854249492386 -278.8298850404643 -16 ) ( 79.86143571373732 -278.12277825927777 -16 ) ( 80.56854249492386 -278.8298850404643 -17 ) tarmac 64 -122.32501 270 1 0.70710677
|
||||
( -43.882250993908826 -425.9080955272659 96 ) ( -43.1751442127223 -425.20098874607936 96 ) ( -43.882250993908826 -425.9080955272659 95 ) tarmac 90.32501 -64 0 0.70710677 -1
|
||||
}
|
||||
// brush 13
|
||||
{
|
||||
( -43.88225099390854 -290.14359353944883 96 ) ( -43.88225099390854 -290.14359353944883 95 ) ( -43.17514421272199 -289.4364867582623 96 ) tarmac 64 -122.32501 270 1 0.70710677
|
||||
( -123.07821048680171 -210.94763404655532 96 ) ( -122.37110370561516 -211.65474082774185 96 ) ( -123.07821048680171 -210.94763404655532 95 ) tarmac 46.058876 -64 0 0.70710677 -1
|
||||
( 1.3725830020304528 -312.7710105374185 -32 ) ( 2.079689783216992 -313.478117318605 -32 ) ( 2.0796897832169776 -312.06390375623187 -32 ) tarmac -62.13307 51.80806 315 1 1
|
||||
( -123.07821048680171 -210.94763404655532 80 ) ( -122.37110370561516 -210.2405272653688 80 ) ( -122.37110370561516 -211.65474082774185 80 ) tarmac -62.13307 51.80806 315 1 1
|
||||
( 1.3725830020304528 -312.7710105374185 -16 ) ( 1.3725830020304528 -312.7710105374185 -17 ) ( 2.079689783216992 -313.478117318605 -16 ) tarmac 7.4314566 -4.413788 0 0.42426407 -0.6041667
|
||||
( 24 -335.398427535388 -16 ) ( 24.707106781186496 -334.69132075420146 -16 ) ( 24 -335.398427535388 -17 ) tarmac 64 -74.32501 270 1 0.70710677
|
||||
}
|
||||
// brush 14
|
||||
{
|
||||
( 157.45730203843385 -150.05887450304573 -16 ) ( 157.45730203843385 -150.05887450304573 -17 ) ( 156.7501952572473 -149.35176772185918 -16 ) tarmac -19.641144 -4.413788 0 0.42426407 -0.6041667
|
||||
( 134.82988504046438 -127.43145750507611 -16 ) ( 134.12277825927782 -128.13856428626266 -16 ) ( 134.82988504046438 -127.43145750507611 -17 ) tarmac 64 68.2153 270 1 -0.70710677
|
||||
( 157.45730203843385 -150.05887450304573 -32 ) ( 156.7501952572473 -149.35176772185918 -32 ) ( 156.7501952572473 -150.76598128423228 -32 ) tarmac 121.44678 10.768529 135 1 1
|
||||
( 281.9080955272659 -251.88225099390885 80 ) ( 281.20098874607936 -252.58935777509538 80 ) ( 281.20098874607936 -251.17514421272233 80 ) tarmac 121.44678 10.768529 135 1 1
|
||||
( 281.9080955272659 -251.88225099390885 96 ) ( 281.20098874607936 -251.17514421272233 96 ) ( 281.9080955272659 -251.88225099390885 95 ) tarmac 14.678253 -64 180 0.70710677 1
|
||||
( 202.71213603437275 -172.68629150101532 96 ) ( 202.71213603437275 -172.68629150101532 95 ) ( 202.0050292531862 -173.39339828220187 96 ) tarmac 64 20.215332 270 1 -0.70710677
|
||||
}
|
||||
// brush 15
|
||||
{
|
||||
( 128.20246804249456 -210.78775382679612 96 ) ( 128.20246804249456 -210.78775382679612 95 ) ( 127.94364899739205 -209.82182800050708 96 ) tarmac 64 69.77646 270 1 0.9659258
|
||||
( 170.42580298272964 -182.90962644125017 -16 ) ( 170.42580298272964 -182.90962644125017 -17 ) ( 171.39172880901867 -182.6508073961476 -16 ) tarmac -27.396317 -4.413788 0 0.5795555 -0.6041667
|
||||
( 170.42580298272964 -182.90962644125017 -32 ) ( 171.39172880901867 -182.6508073961476 -32 ) ( 170.16698393762704 -181.94370061496107 -32 ) tarmac -85.27817 -76.786575 15.000003 1 1
|
||||
( 20.018775498118814 -239.77548687827812 80 ) ( 19.75995645301633 -238.80956105198902 80 ) ( 20.98470132440788 -239.51666783317557 80 ) tarmac -85.27817 -76.786575 15.000003 1 1
|
||||
( 20.018775498118814 -239.77548687827812 96 ) ( 20.98470132440788 -239.51666783317557 96 ) ( 20.018775498118814 -239.77548687827812 95 ) tarmac -20.72496 -64 0 0.9659258 -1
|
||||
( 201.3354294239798 -174.6274169979695 -16 ) ( 201.07661037887726 -173.66149117168047 -16 ) ( 201.3354294239798 -174.6274169979695 -17 ) tarmac 64 91.21239 270 1 0.9659258
|
||||
}
|
||||
// brush 16
|
||||
{
|
||||
( -16 192 0 ) ( -16 256 -16 ) ( -16 256 0 ) tarmac 0 0 0 1 1
|
||||
( 16 192 0 ) ( -144 192 -16 ) ( -144 192 0 ) tarmac 32 0 0 1 1
|
||||
( 16 256 -16 ) ( -144 192 -16 ) ( 16 192 -16 ) tarmac 32 0 0 1 1
|
||||
( 16 256 4 ) ( -144 192 4 ) ( -144 256 4 ) tarmac 32 0 0 1 1
|
||||
( 16 256 0 ) ( -144 256 -16 ) ( 16 256 -16 ) tarmac 32 0 0 1 1
|
||||
( 16 256 0 ) ( 16 192 -16 ) ( 16 192 0 ) tarmac 0 0 0 1 1
|
||||
}
|
||||
// brush 17
|
||||
{
|
||||
( -48 192 0 ) ( -48 256 -16 ) ( -48 256 0 ) tarmac 0 0 0 1 1
|
||||
( -16 192 0 ) ( -176 192 -16 ) ( -176 192 0 ) tarmac 64 0 0 1 1
|
||||
( -16 256 -16 ) ( -176 192 -16 ) ( -16 192 -16 ) tarmac 64 0 0 1 1
|
||||
( -16 256 12 ) ( -176 192 12 ) ( -176 256 12 ) tarmac 64 0 0 1 1
|
||||
( -16 256 0 ) ( -176 256 -16 ) ( -16 256 -16 ) tarmac 64 0 0 1 1
|
||||
( -16 256 0 ) ( -16 192 -16 ) ( -16 192 0 ) tarmac 0 0 0 1 1
|
||||
}
|
||||
// brush 18
|
||||
{
|
||||
( -80 192 0 ) ( -80 256 -16 ) ( -80 256 0 ) tarmac 0 0 0 1 1
|
||||
( -48 192 0 ) ( -208 192 -16 ) ( -208 192 0 ) tarmac 96 0 0 1 1
|
||||
( -48 256 -16 ) ( -208 192 -16 ) ( -48 192 -16 ) tarmac 96 0 0 1 1
|
||||
( -48 256 24 ) ( -208 192 24 ) ( -208 256 24 ) tarmac 96 0 0 1 1
|
||||
( -48 256 0 ) ( -208 256 -16 ) ( -48 256 -16 ) tarmac 96 0 0 1 1
|
||||
( -48 256 0 ) ( -48 192 -16 ) ( -48 192 0 ) tarmac 0 0 0 1 1
|
||||
}
|
||||
// brush 19
|
||||
{
|
||||
( -112 192 0 ) ( -112 256 -16 ) ( -112 256 0 ) tarmac 0 0 0 1 1
|
||||
( -80 192 0 ) ( -240 192 -16 ) ( -240 192 0 ) tarmac 0 0 0 1 1
|
||||
( -80 256 -16 ) ( -240 192 -16 ) ( -80 192 -16 ) tarmac 0 0 0 1 1
|
||||
( -80 256 40 ) ( -240 192 40 ) ( -240 256 40 ) tarmac 0 0 0 1 1
|
||||
( -80 256 0 ) ( -240 256 -16 ) ( -80 256 -16 ) tarmac 0 0 0 1 1
|
||||
( -80 256 0 ) ( -80 192 -16 ) ( -80 192 0 ) tarmac 0 0 0 1 1
|
||||
}
|
||||
// brush 20
|
||||
{
|
||||
( -144 192 0 ) ( -144 256 -16 ) ( -144 256 0 ) tarmac 0 0 0 1 1
|
||||
( -112 192 0 ) ( -272 192 -16 ) ( -272 192 0 ) tarmac 32 0 0 1 1
|
||||
( -112 256 -16 ) ( -272 192 -16 ) ( -112 192 -16 ) tarmac 32 0 0 1 1
|
||||
( -112 256 60 ) ( -272 192 60 ) ( -272 256 60 ) tarmac 32 0 0 1 1
|
||||
( -112 256 0 ) ( -272 256 -16 ) ( -112 256 -16 ) tarmac 32 0 0 1 1
|
||||
( -112 256 0 ) ( -112 192 -16 ) ( -112 192 0 ) tarmac 0 0 0 1 1
|
||||
}
|
||||
// brush 21
|
||||
{
|
||||
( -176 192 0 ) ( -176 256 -16 ) ( -176 256 0 ) tarmac 0 0 0 1 1
|
||||
( -144 192 0 ) ( -304 192 -16 ) ( -304 192 0 ) tarmac 64 0 0 1 1
|
||||
( -144 256 -16 ) ( -304 192 -16 ) ( -144 192 -16 ) tarmac 64 0 0 1 1
|
||||
( -144 256 84 ) ( -304 192 84 ) ( -304 256 84 ) tarmac 64 0 0 1 1
|
||||
( -144 256 0 ) ( -304 256 -16 ) ( -144 256 -16 ) tarmac 64 0 0 1 1
|
||||
( -144 256 0 ) ( -144 192 -16 ) ( -144 192 0 ) tarmac 0 0 0 1 1
|
||||
}
|
||||
// brush 22
|
||||
{
|
||||
( 16 352 64 ) ( 16 256 0 ) ( 16 256 -16 ) tarmac 0 0 0 1 1
|
||||
( 16 256 0 ) ( 176 256 0 ) ( 176 256 -16 ) tarmac 0 0 0 1 1
|
||||
( 16 352 64 ) ( 176 352 64 ) ( 176 256 0 ) tarmac 0 0 0 1 1
|
||||
( 176 256 -16 ) ( 176 352 48 ) ( 16 352 48 ) tarmac 0 0 0 1 1
|
||||
( 176 352 48 ) ( 176 352 64 ) ( 16 352 64 ) tarmac 0 0 0 1 1
|
||||
( 176 256 0 ) ( 176 352 64 ) ( 176 352 48 ) tarmac 0 0 0 1 1
|
||||
}
|
||||
// brush 23
|
||||
{
|
||||
( 16 352 64 ) ( 16 464 48 ) ( 16 464 64 ) tarmac 0 0 0 1 1
|
||||
( 176 352 64 ) ( 16 352 48 ) ( 16 352 64 ) tarmac 0 0 0 1 1
|
||||
( 176 464 48 ) ( 16 352 48 ) ( 176 352 48 ) tarmac 0 0 0 1 1
|
||||
( 176 464 64 ) ( 16 352 64 ) ( 16 464 64 ) tarmac 0 0 0 1 1
|
||||
( 176 464 64 ) ( 16 464 48 ) ( 176 464 48 ) tarmac 0 0 0 1 1
|
||||
( 176 464 64 ) ( 176 352 48 ) ( 176 352 64 ) tarmac 0 0 0 1 1
|
||||
( 36.28718707889797 0 4 ) ( 35.787187078897965 0.866025403784441 4 ) ( 36.28718707889797 0 5 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( 22.430780618346965 -8 4 ) ( 22.430780618346965 -8 5 ) ( 21.56475521456251 -8.499999999999979 4 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( 113.56921938165306 26.14359353944895 -16 ) ( 113.06921938165306 27.0096189432334 -16 ) ( 112.70319397786861 25.643593539448965 -16 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( 22.430780618346965 -8 80 ) ( 21.56475521456251 -8.499999999999979 80 ) ( 21.930780618346944 -7.1339745962155305 80 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( 113.56921938165306 26.14359353944895 -16 ) ( 112.70319397786861 25.643593539448965 -16 ) ( 113.56921938165306 26.14359353944895 -15 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
( 99.71281292110204 18.143593539448965 -16 ) ( 99.71281292110204 18.143593539448965 -15 ) ( 99.21281292110204 19.009618943233413 -16 ) 256_cement_dirty_rough_wall 0 0 0 1 1
|
||||
}
|
||||
}
|
||||
// entity 1
|
||||
{
|
||||
"classname" "info_player_start"
|
||||
"origin" "130 404 104"
|
||||
"origin" "2 52 8"
|
||||
}
|
||||
|
||||
@@ -50,3 +50,8 @@ actions = [
|
||||
actions = [
|
||||
"debug_log Person hat sich verabschiedet",
|
||||
]
|
||||
|
||||
[tiffany]
|
||||
actions = [
|
||||
"start_ink cinema.ink.json",
|
||||
]
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 192 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 256 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 256 KiB |
File diff suppressed because it is too large
Load Diff
+16
-1
@@ -1,3 +1,18 @@
|
||||
Texturen:
|
||||
# Assets
|
||||
|
||||
## Texturen
|
||||
https://www.manytextures.com/
|
||||
https://opengameart.org/content/arcade-carpet-textures
|
||||
|
||||
|
||||
# Tutorials
|
||||
|
||||
## Blender
|
||||
|
||||
Blender UI Base Setup + Tips
|
||||
https://www.youtube.com/watch?v=sZeGW0otiJI
|
||||
|
||||
Rigging in PS1 Look:
|
||||
https://www.youtube.com/watch?v=puwu9hZmQYI
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@ fn prompt_for(mode: &Mode) -> &'static str {
|
||||
Mode::Dialog(d) if !d.choices.is_empty() => " wahl> ",
|
||||
Mode::Dialog(_) => " [Enter] ",
|
||||
Mode::Menu => "menü> ",
|
||||
Mode::Play => "spiel> ",
|
||||
Mode::FirstPerson => "spiel> ",
|
||||
Mode::Free => "> ",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,44 @@ pub enum Action {
|
||||
HideObject(String),
|
||||
/// WAV unter `assets/audio/<name>` als SFX abspielen.
|
||||
PlaySound(String),
|
||||
/// Anzeige-/Eingabemodus wechseln (Spiel, Flycam, Menü). Vom Frontend
|
||||
/// auf seinen `Mode` gemappt; der Dialog-Modus ist hier bewusst nicht
|
||||
/// wählbar — der entsteht nur aus dem Story-Ablauf.
|
||||
SetMode(ModeTarget),
|
||||
}
|
||||
|
||||
/// Frontend-neutrales Ziel eines Moduswechsels. Spiegelt die nicht-Dialog-
|
||||
/// Varianten von `session::Mode`, ohne dass der Kern die rich `Mode`-Daten
|
||||
/// (Dialog-State) kennen muss. So bleibt `game` ← `session` eine Einbahnstraße.
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum ModeTarget {
|
||||
/// First-Person-Spiel.
|
||||
Play,
|
||||
/// Noclip-Debug-Flycam.
|
||||
Free,
|
||||
/// Menü (pausiert die Welt, gibt die Maus frei).
|
||||
Menu,
|
||||
}
|
||||
|
||||
impl ModeTarget {
|
||||
/// `play`/`free`/`menu` (case-insensitiv) → Ziel; sonst `None`.
|
||||
pub fn parse(s: &str) -> Option<Self> {
|
||||
match s.trim().to_ascii_lowercase().as_str() {
|
||||
"play" => Some(Self::Play),
|
||||
"free" => Some(Self::Free),
|
||||
"menu" => Some(Self::Menu),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Kanonischer Name fürs Echo/Logging.
|
||||
pub fn label(self) -> &'static str {
|
||||
match self {
|
||||
Self::Play => "play",
|
||||
Self::Free => "free",
|
||||
Self::Menu => "menu",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Game {
|
||||
|
||||
+20
-1
@@ -16,6 +16,8 @@
|
||||
//! `clear <name>` KV-Eintrag entfernen
|
||||
//! `hide_object <name>` → Action::HideObject (deferred)
|
||||
//! `play_sound <file>` → Action::PlaySound (deferred)
|
||||
//! `mode <play|free|menu>` → Action::SetMode (deferred): Anzeige-/
|
||||
//! Eingabemodus wechseln
|
||||
//!
|
||||
//! Parameter-Substitution: vor dem Parsen ersetzt `execute` `$self` in den
|
||||
//! Action-Args durch `ctx.instance_name`. Damit kann eine generische Action
|
||||
@@ -30,7 +32,7 @@
|
||||
use std::collections::HashMap;
|
||||
use std::fs::read_to_string;
|
||||
|
||||
use crate::engine::game::{Action, ActionCtx, Signals};
|
||||
use crate::engine::game::{Action, ActionCtx, ModeTarget, Signals};
|
||||
use crate::engine::kv;
|
||||
use crate::engine::story_ctrl;
|
||||
|
||||
@@ -82,6 +84,9 @@ fn execute(cmd: &str, ctx: &mut ActionCtx) {
|
||||
"clear" => kv::apply_clear(args, ctx.kv),
|
||||
"hide_object" => ctx.actions.push(Action::HideObject(args.to_string())),
|
||||
"play_sound" => ctx.actions.push(Action::PlaySound(args.to_string())),
|
||||
"mode" => if let Some(t) = ModeTarget::parse(args) {
|
||||
ctx.actions.push(Action::SetMode(t));
|
||||
},
|
||||
_ => { /* Unbekannter Verb/Tag → still ignorieren */ }
|
||||
}
|
||||
}
|
||||
@@ -176,6 +181,20 @@ mod tests {
|
||||
]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mode_verb_queues_setmode_action() {
|
||||
let mut game = Game::new(Signals::new());
|
||||
let mut ctx = game.action_ctx(None);
|
||||
dispatch("mode free", &mut ctx);
|
||||
assert_eq!(game.actions, vec![Action::SetMode(ModeTarget::Free)]);
|
||||
|
||||
// Unbekanntes Ziel → kein Action (stilles No-Op).
|
||||
game.actions.clear();
|
||||
let mut ctx = game.action_ctx(None);
|
||||
dispatch("mode wat", &mut ctx);
|
||||
assert!(game.actions.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unknown_signal_falls_through_to_builtin() {
|
||||
let mut game = Game::new(Signals::new());
|
||||
|
||||
+8
-6
@@ -339,7 +339,7 @@ impl App {
|
||||
// die Maus (relativer Blick); Menü/Dialog geben sie frei fürs UI. So
|
||||
// gibt es keine parallele Lock-Logik.
|
||||
let fly = matches!(self.session.mode, Mode::Free);
|
||||
let play = matches!(self.session.mode, Mode::Play);
|
||||
let play = matches!(self.session.mode, Mode::FirstPerson);
|
||||
let grab = fly || play;
|
||||
if grab != self.input.grabbed { self.set_grab(grab); }
|
||||
|
||||
@@ -381,13 +381,15 @@ impl App {
|
||||
self.eye_y = target_eye;
|
||||
}
|
||||
|
||||
// View: im Spiel aus dem Player der Session (geglättete Augenhöhe),
|
||||
// sonst aus der Flycam.
|
||||
let view = if play {
|
||||
// View: nur die Noclip-Flycam (Free) rendert aus `self.camera`. Alles
|
||||
// andere — Spiel, Menü, Dialog — sieht durch die Augen des Players
|
||||
// (geglättete Augenhöhe); Menü/Dialog frieren die Sim nur ein, die
|
||||
// Sicht bleibt die First-Person-Sicht.
|
||||
let view = if fly {
|
||||
self.camera.view()
|
||||
} else {
|
||||
let p = self.session.player.pos;
|
||||
Mat4::view([p[0], self.eye_y, p[2]], self.session.player.yaw, self.session.player.pitch)
|
||||
} else {
|
||||
self.camera.view()
|
||||
};
|
||||
// Mausposition über die Letterbox in interne Pixel mappen.
|
||||
let cursor = ui::Cursor {
|
||||
|
||||
+70
-26
@@ -136,13 +136,18 @@ impl ScenePass {
|
||||
}],
|
||||
});
|
||||
|
||||
// Nearest-Sampler: harte Texel, kein Filtering — PS1.
|
||||
// mag=Nearest hält nah dran die harten Texel (der knackige Look);
|
||||
// min/mipmap=Linear glätten nur die Verkleinerung in der Ferne und
|
||||
// blenden weich zwischen den Mip-Ebenen (kein Mip-Popping). Killt das
|
||||
// Texel-Flimmern hochauflösender Texturen auf der kleinen internen
|
||||
// Auflösung. Mipmaps werden in upload_texture per Box-Filter erzeugt.
|
||||
let sampler = device.create_sampler(&wgpu::SamplerDescriptor {
|
||||
label: Some("scene nearest"),
|
||||
label: Some("scene"),
|
||||
address_mode_u: wgpu::AddressMode::Repeat,
|
||||
address_mode_v: wgpu::AddressMode::Repeat,
|
||||
mag_filter: wgpu::FilterMode::Nearest,
|
||||
min_filter: wgpu::FilterMode::Nearest,
|
||||
min_filter: wgpu::FilterMode::Linear,
|
||||
mipmap_filter: wgpu::MipmapFilterMode::Linear,
|
||||
..Default::default()
|
||||
});
|
||||
let tex_layout = pipeline.get_bind_group_layout(1);
|
||||
@@ -176,7 +181,8 @@ impl ScenePass {
|
||||
}
|
||||
|
||||
/// Ein RGBA8-`Image` als GPU-Textur hochladen und die zugehörige
|
||||
/// Bind-Group (Textur + Sampler, group 1) bauen.
|
||||
/// Bind-Group (Textur + Sampler, group 1) bauen. Erzeugt die volle
|
||||
/// Mipchain (bis 1×1) per Box-Filter auf der CPU und lädt jede Ebene hoch.
|
||||
fn upload_texture(
|
||||
device: &wgpu::Device,
|
||||
queue: &wgpu::Queue,
|
||||
@@ -184,15 +190,16 @@ fn upload_texture(
|
||||
sampler: &wgpu::Sampler,
|
||||
img: &Image,
|
||||
) -> wgpu::BindGroup {
|
||||
let size = wgpu::Extent3d {
|
||||
width: img.width,
|
||||
height: img.height,
|
||||
depth_or_array_layers: 1,
|
||||
};
|
||||
// floor(log2(max(w,h))) + 1 = volle Kette bis zur 1×1-Ebene.
|
||||
let mip_level_count = 32 - img.width.max(img.height).leading_zeros();
|
||||
let texture = device.create_texture(&wgpu::TextureDescriptor {
|
||||
label: Some("scene texture"),
|
||||
size,
|
||||
mip_level_count: 1,
|
||||
size: wgpu::Extent3d {
|
||||
width: img.width,
|
||||
height: img.height,
|
||||
depth_or_array_layers: 1,
|
||||
},
|
||||
mip_level_count,
|
||||
sample_count: 1,
|
||||
dimension: wgpu::TextureDimension::D2,
|
||||
// Nicht-sRGB: die Quantisierung im Shader erwartet rohe Werte.
|
||||
@@ -200,21 +207,32 @@ fn upload_texture(
|
||||
usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST,
|
||||
view_formats: &[],
|
||||
});
|
||||
queue.write_texture(
|
||||
wgpu::TexelCopyTextureInfo {
|
||||
texture: &texture,
|
||||
mip_level: 0,
|
||||
origin: wgpu::Origin3d::ZERO,
|
||||
aspect: wgpu::TextureAspect::All,
|
||||
},
|
||||
&img.rgba,
|
||||
wgpu::TexelCopyBufferLayout {
|
||||
offset: 0,
|
||||
bytes_per_row: Some(img.width * 4),
|
||||
rows_per_image: Some(img.height),
|
||||
},
|
||||
size,
|
||||
);
|
||||
|
||||
// Ebene 0 ist das Originalbild; jede weitere wird aus der vorherigen
|
||||
// halbiert. `level` trägt die aktuell hochzuladenden Pixel.
|
||||
let mut level = img.rgba.clone();
|
||||
let (mut w, mut h) = (img.width, img.height);
|
||||
for mip in 0..mip_level_count {
|
||||
queue.write_texture(
|
||||
wgpu::TexelCopyTextureInfo {
|
||||
texture: &texture,
|
||||
mip_level: mip,
|
||||
origin: wgpu::Origin3d::ZERO,
|
||||
aspect: wgpu::TextureAspect::All,
|
||||
},
|
||||
&level,
|
||||
wgpu::TexelCopyBufferLayout {
|
||||
offset: 0,
|
||||
bytes_per_row: Some(w * 4),
|
||||
rows_per_image: Some(h),
|
||||
},
|
||||
wgpu::Extent3d { width: w, height: h, depth_or_array_layers: 1 },
|
||||
);
|
||||
if mip + 1 < mip_level_count {
|
||||
(level, w, h) = downsample(&level, w, h);
|
||||
}
|
||||
}
|
||||
|
||||
let view = texture.create_view(&Default::default());
|
||||
device.create_bind_group(&wgpu::BindGroupDescriptor {
|
||||
label: Some("scene texture"),
|
||||
@@ -225,3 +243,29 @@ fn upload_texture(
|
||||
],
|
||||
})
|
||||
}
|
||||
|
||||
/// Eine RGBA8-Mip-Ebene per 2×2-Box-Filter auf die nächstkleinere halbieren.
|
||||
/// Gibt die neuen Pixel samt Maßen zurück. Ungerade Maße werden via `(d+1)/2`
|
||||
/// aufgerundet (sonst ginge die letzte Spalte/Zeile verloren); die fehlende
|
||||
/// Quell-Spalte/-Zeile wird auf den Rand geklemmt, statt den Mittelwert zu
|
||||
/// verfälschen. Mittelung im (gamma-kodierten) Speicherraum — für den
|
||||
/// stilisierten Look unkritisch.
|
||||
fn downsample(src: &[u8], w: u32, h: u32) -> (Vec<u8>, u32, u32) {
|
||||
let (nw, nh) = ((w + 1) / 2, (h + 1) / 2);
|
||||
let mut dst = vec![0u8; (nw * nh * 4) as usize];
|
||||
for y in 0..nh {
|
||||
for x in 0..nw {
|
||||
let (x0, y0) = (2 * x, 2 * y);
|
||||
let x1 = (x0 + 1).min(w - 1);
|
||||
let y1 = (y0 + 1).min(h - 1);
|
||||
let at = |px: u32, py: u32| ((py * w + px) * 4) as usize;
|
||||
let samples = [at(x0, y0), at(x1, y0), at(x0, y1), at(x1, y1)];
|
||||
let di = ((y * nw + x) * 4) as usize;
|
||||
for c in 0..4 {
|
||||
let sum: u32 = samples.iter().map(|&s| src[s + c] as u32).sum();
|
||||
dst[di + c] = ((sum + 2) / 4) as u8;
|
||||
}
|
||||
}
|
||||
}
|
||||
(dst, nw, nh)
|
||||
}
|
||||
|
||||
@@ -53,9 +53,15 @@ fn bayer4(px: vec2u) -> f32 {
|
||||
return f32(m[(px.y % 4u) * 4u + (px.x % 4u)]);
|
||||
}
|
||||
|
||||
// LOD-Bias für die Mip-Auswahl: negativ = schärfer (greift einen höher
|
||||
// aufgelösten Mip, als die UV-Ableitungen verlangen), positiv = weicher.
|
||||
// 0 = neutral. Bei -1.0 verdoppelt sich praktisch die Texelrate (mehr
|
||||
// Schärfe, etwas mehr Flimmern); -0.5 ist ein sanfter Mittelweg.
|
||||
const MIP_BIAS: f32 = -1.0;
|
||||
|
||||
@fragment
|
||||
fn fs_main(in: VsOut) -> @location(0) vec4f {
|
||||
let texel = textureSample(tex, smp, in.uv);
|
||||
let texel = textureSampleBias(tex, smp, in.uv, MIP_BIAS);
|
||||
if texel.a < 0.5 { discard; } // 1-Bit-Alpha (Cutouts), noch ungenutzt
|
||||
|
||||
// RGB555: 31 Stufen pro Kanal. Bayer-Schwelle vor dem Abrunden →
|
||||
|
||||
+1
-1
@@ -228,7 +228,7 @@ pub(crate) fn layout(internal: [f32; 2], fonts: &Fonts, session: &Session, cur:
|
||||
match &session.mode {
|
||||
// Spiel und Flycam: nur HUD/Cursor, kein Panel (beide laufen
|
||||
// ohnehin gefangen — dieser Zweig greift nur im Übergang).
|
||||
Mode::Play | Mode::Free => {}
|
||||
Mode::FirstPerson | Mode::Free => {}
|
||||
Mode::Menu => menu(&mut ui, f, internal, cur.pos, &mut hover),
|
||||
Mode::Dialog(d) => dialog(&mut ui, f, internal, d, cur.pos, &mut hover),
|
||||
}
|
||||
|
||||
+91
-54
@@ -1,24 +1,5 @@
|
||||
//! Session: der geteilte Anwendungszustand über allen Frontends.
|
||||
//!
|
||||
//! Es existiert genau eine `Session` pro Lauf. CLI und Fenster steuern
|
||||
//! dieselbe — das Fenster besitzt sie, die Terminal-Eingabe schickt nur
|
||||
//! Befehlszeilen hinein. Dadurch kann es keinen Mismatch geben: ein
|
||||
//! `Game`-Zustand, ein `Mode`, beide Frontends stellen ihn nur dar.
|
||||
//!
|
||||
//! Schicht: `engine ← session ← { cli, render }`. Die Session kennt kein
|
||||
//! Frontend — `exec` nimmt eine Befehlszeile und *gibt* Ausgabezeilen
|
||||
//! zurück (statt zu drucken), damit jedes Frontend sie frei darstellt
|
||||
//! (Terminal jetzt, In-Fenster-Konsole später).
|
||||
//!
|
||||
//! Die Session ist auch der alleinige Besitzer der **Lauf-Simulation**:
|
||||
//! `Player` und `CollisionWorld`. Sie hat zwei Eingabe-Tore — `exec` für
|
||||
//! diskrete Befehle/Dialog und `tick` für die kontinuierliche Physik pro
|
||||
//! Frame. Die Frontends sammeln nur Eingaben und stellen den Zustand dar;
|
||||
//! die Flycam dagegen ist reine Frontend-Sicht (kein Sim-Zustand) und bleibt
|
||||
//! im `render`-Modul.
|
||||
|
||||
use crate::engine::collision::CollisionWorld;
|
||||
use crate::engine::game::{Action, Game};
|
||||
use crate::engine::game::{Action, Game, ModeTarget};
|
||||
use crate::engine::ink::StoryState;
|
||||
use crate::engine::map::{self, Map};
|
||||
use crate::engine::player::Player;
|
||||
@@ -27,28 +8,13 @@ use crate::engine::{kv, signals, story_ctrl};
|
||||
/// Maus-Empfindlichkeit der Spieler-Sicht (Radiant/Pixel).
|
||||
const LOOK_SENS: f32 = 0.0025;
|
||||
|
||||
/// Was die Frontends gerade darstellen sollen. Geteilt, damit CLI und GUI
|
||||
/// nie uneins sind, ob ein Dialog läuft.
|
||||
pub enum Mode {
|
||||
/// First-Person-Spiel — der Player bewegt sich mit Physik durch die Welt
|
||||
/// (siehe engine::player). Der Renderer leitet seine View aus dem Player
|
||||
/// ab. Das ist der eigentliche Spielmodus.
|
||||
Play,
|
||||
/// Noclip-Debug-Flycam — frei schwebende Kamera ohne Physik. Per
|
||||
/// `noclip`-Befehl gegen `Play` getauscht.
|
||||
FirstPerson,
|
||||
Free,
|
||||
/// Menü offen — wie der Dialog pausiert das Fenster die Welt und gibt die
|
||||
/// Maus frei; Eingaben sind weiter Engine-Befehle (das Menü ist nur eine
|
||||
/// andere Darstellung). Per `menu`-Befehl getoggelt; „Fortsetzen" führt
|
||||
/// ins Spiel (`Play`).
|
||||
Menu,
|
||||
/// Ein Dialog läuft — das Fenster pausiert die Welt und zeigt Panels;
|
||||
/// Eingaben treiben den Dialog statt Befehle.
|
||||
Dialog(Dialog),
|
||||
}
|
||||
|
||||
/// Aktueller Dialogschritt, frontend-neutral. `choices` leer = reiner Text,
|
||||
/// der auf „weiter" (Leerzeile/Enter) wartet.
|
||||
pub struct Dialog {
|
||||
// Wird vom Panel-Renderer der UI-Phase gelesen; bis dahin läuft der
|
||||
// Dialogtext über die Konsolen-Ausgabe (siehe `step`).
|
||||
@@ -115,7 +81,7 @@ impl Session {
|
||||
/// `exec`. Nur im Spielmodus bewegt sich der Spieler; Menü/Dialog/Flycam
|
||||
/// pausieren die Sim (die Flycam ist reine Frontend-Sicht).
|
||||
pub fn tick(&mut self, input: &FrameInput, dt: f32) {
|
||||
if matches!(self.mode, Mode::Play) {
|
||||
if matches!(self.mode, Mode::FirstPerson) {
|
||||
self.player.look(input.look_dx, input.look_dy, LOOK_SENS);
|
||||
self.player.step(&self.collision, input.fwd, input.right, input.jump, dt);
|
||||
}
|
||||
@@ -135,7 +101,7 @@ impl Session {
|
||||
pub fn exec(&mut self, line: &str) -> ExecResult {
|
||||
match self.mode {
|
||||
Mode::Dialog(_) => self.dialog_input(line),
|
||||
Mode::Play | Mode::Free | Mode::Menu => self.command(line),
|
||||
Mode::FirstPerson | Mode::Free | Mode::Menu => self.command(line),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,19 +114,21 @@ impl Session {
|
||||
// Menü öffnen bzw. ins Spiel zurück. „Fortsetzen" landet im
|
||||
// Spielmodus (Play), nicht in der Debug-Flycam; aus Play oder
|
||||
// Free öffnet es das Menü. (Dialog wird anders geroutet.)
|
||||
self.mode = match self.mode {
|
||||
Mode::Menu => Mode::Play,
|
||||
_ => Mode::Menu,
|
||||
let t = match self.mode {
|
||||
Mode::Menu => ModeTarget::Play,
|
||||
_ => ModeTarget::Menu,
|
||||
};
|
||||
self.set_mode(t);
|
||||
ExecResult::empty()
|
||||
}
|
||||
"noclip" => {
|
||||
// Debug: zwischen First-Person (Play) und freier Flycam (Free)
|
||||
// umschalten.
|
||||
self.mode = match self.mode {
|
||||
Mode::Play => Mode::Free,
|
||||
_ => Mode::Play,
|
||||
let t = match self.mode {
|
||||
Mode::FirstPerson => ModeTarget::Free,
|
||||
_ => ModeTarget::Play,
|
||||
};
|
||||
self.set_mode(t);
|
||||
ExecResult::empty()
|
||||
}
|
||||
"help" => ExecResult::lines(help()),
|
||||
@@ -172,7 +140,20 @@ impl Session {
|
||||
])
|
||||
}
|
||||
_ => {
|
||||
if let Some(sig) = line.strip_prefix("signal ") {
|
||||
if let Some(m) = line.strip_prefix("mode ") {
|
||||
// Modus explizit setzen — über dieselbe Action wie das
|
||||
// `mode`-Verb aus signals.toml/Ink-Tags, damit CLI und
|
||||
// Signals genau einen Wechsel-Pfad teilen.
|
||||
match ModeTarget::parse(m) {
|
||||
Some(t) => {
|
||||
self.game.actions.push(Action::SetMode(t));
|
||||
ExecResult::lines(self.drain_actions())
|
||||
}
|
||||
None => ExecResult::lines(vec![
|
||||
"Modus: play | free | menu".into(),
|
||||
]),
|
||||
}
|
||||
} else if let Some(sig) = line.strip_prefix("signal ") {
|
||||
ExecResult::lines(self.fire(sig.trim(), None))
|
||||
} else if let Some(name) = line.strip_prefix("use ") {
|
||||
// Objekt-Interaktion simulieren: Signal ist der gestrippte
|
||||
@@ -199,7 +180,15 @@ impl Session {
|
||||
_ => return ExecResult::lines(vec![format!(" (1..{})", d.choices.len())]),
|
||||
}
|
||||
};
|
||||
ExecResult::lines(self.step(sel))
|
||||
let mut out = self.step(sel);
|
||||
// Ein start_ink-Tag kann während step() eine neue Story in den Slot
|
||||
// geladen haben, während die alte auf End lief (mode → Play). Falls
|
||||
// das passiert ist, sofort den ersten Schritt der neuen Story ziehen
|
||||
// statt den Spieler im Play-Modus hängen zu lassen.
|
||||
if self.game.story.is_some() && matches!(self.mode, Mode::FirstPerson) {
|
||||
out.extend(self.step(None));
|
||||
}
|
||||
ExecResult::lines(out)
|
||||
}
|
||||
|
||||
/// Signal dispatchen, deferred Actions einsammeln und — falls dadurch
|
||||
@@ -229,7 +218,7 @@ impl Session {
|
||||
let mut out = self.drain_actions();
|
||||
match state {
|
||||
None | Some(StoryState::End) => {
|
||||
self.mode = Mode::Free;
|
||||
self.mode = Mode::FirstPerson;
|
||||
}
|
||||
Some(StoryState::Text(text)) => {
|
||||
out.push(text.clone());
|
||||
@@ -247,10 +236,33 @@ impl Session {
|
||||
}
|
||||
|
||||
fn drain_actions(&mut self) -> Vec<String> {
|
||||
self.game.actions.drain(..).map(|a| match a {
|
||||
Action::HideObject(n) => format!("[action] hide_object {n}"),
|
||||
Action::PlaySound(n) => format!("[action] play_sound {n}"),
|
||||
}).collect()
|
||||
// Erst aus der Queue ziehen (gibt den `&mut self.game`-Borrow frei),
|
||||
// dann anwenden — `SetMode` braucht `&mut self.mode`.
|
||||
let actions: Vec<Action> = self.game.actions.drain(..).collect();
|
||||
let mut out = Vec::with_capacity(actions.len());
|
||||
for a in actions {
|
||||
match a {
|
||||
Action::HideObject(n) => out.push(format!("[action] hide_object {n}")),
|
||||
Action::PlaySound(n) => out.push(format!("[action] play_sound {n}")),
|
||||
Action::SetMode(t) => {
|
||||
self.set_mode(t);
|
||||
out.push(format!("[action] mode {}", t.label()));
|
||||
}
|
||||
}
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
/// Frontend-neutrales [`ModeTarget`] auf den konkreten [`Mode`] mappen.
|
||||
/// Einziger Schreibpfad für die nicht-Dialog-Modi — `menu`/`noclip`/`mode`
|
||||
/// und die `SetMode`-Action laufen alle hier durch. (Der Dialog-Modus
|
||||
/// entsteht ausschließlich in `step` aus dem Story-Ablauf.)
|
||||
fn set_mode(&mut self, t: ModeTarget) {
|
||||
self.mode = match t {
|
||||
ModeTarget::Play => Mode::FirstPerson,
|
||||
ModeTarget::Free => Mode::Free,
|
||||
ModeTarget::Menu => Mode::Menu,
|
||||
};
|
||||
}
|
||||
|
||||
fn dump_kv(&self) -> Vec<String> {
|
||||
@@ -286,6 +298,7 @@ fn help() -> Vec<String> {
|
||||
" kv KV-Store anzeigen".into(),
|
||||
" menu Menü öffnen / ins Spiel zurück".into(),
|
||||
" noclip zwischen First-Person und Debug-Flycam wechseln".into(),
|
||||
" mode <m> Modus direkt setzen: play | free | menu".into(),
|
||||
" reload signals.toml neu laden".into(),
|
||||
" quit beenden".into(),
|
||||
]
|
||||
@@ -329,7 +342,7 @@ mod tests {
|
||||
s.exec("menu");
|
||||
assert!(matches!(s.mode, Mode::Menu));
|
||||
s.exec("menu"); // „Fortsetzen" → ins Spiel
|
||||
assert!(matches!(s.mode, Mode::Play));
|
||||
assert!(matches!(s.mode, Mode::FirstPerson));
|
||||
s.exec("menu"); // aus dem Spiel wieder ins Menü
|
||||
assert!(matches!(s.mode, Mode::Menu));
|
||||
// Im Menü laufen Engine-Befehle weiter (gleiche Route wie Play/Free).
|
||||
@@ -337,14 +350,38 @@ mod tests {
|
||||
assert!(s.game.kv["in_menu"].coerce_to_bool().unwrap());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mode_command_sets_mode_directly() {
|
||||
let mut s = empty_session();
|
||||
s.exec("mode play");
|
||||
assert!(matches!(s.mode, Mode::FirstPerson));
|
||||
s.exec("mode free");
|
||||
assert!(matches!(s.mode, Mode::Free));
|
||||
s.exec("mode menu");
|
||||
assert!(matches!(s.mode, Mode::Menu));
|
||||
// Müll-Argument lässt den Modus stehen und meldet die Nutzung.
|
||||
let r = s.exec("mode dialog");
|
||||
assert!(matches!(s.mode, Mode::Menu));
|
||||
assert_eq!(r.output.len(), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn signal_can_switch_mode() {
|
||||
let mut s = empty_session();
|
||||
s.mode = Mode::Free;
|
||||
// `mode`-Verb direkt als Action (Ink-Tag-/signals.toml-Pfad).
|
||||
s.exec("signal mode play");
|
||||
assert!(matches!(s.mode, Mode::FirstPerson));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn noclip_toggles_play_and_free() {
|
||||
let mut s = empty_session();
|
||||
s.mode = Mode::Play;
|
||||
s.mode = Mode::FirstPerson;
|
||||
s.exec("noclip");
|
||||
assert!(matches!(s.mode, Mode::Free));
|
||||
s.exec("noclip");
|
||||
assert!(matches!(s.mode, Mode::Play));
|
||||
assert!(matches!(s.mode, Mode::FirstPerson));
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -54,12 +54,37 @@ if [ ! -d "$ink_dir" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Prüft eine .ink-Datei auf Zeichen außerhalb von CP437 und gibt sie aus.
|
||||
# Exit-Code 1 wenn Treffer gefunden, sonst 0.
|
||||
check_cp437() {
|
||||
python3 - "$1" <<'PYEOF'
|
||||
import sys
|
||||
path = sys.argv[1]
|
||||
cp437 = set(bytes(range(256)).decode('cp437', errors='replace'))
|
||||
hits = []
|
||||
with open(path, encoding='utf-8') as f:
|
||||
for lineno, line in enumerate(f, 1):
|
||||
for ch in line:
|
||||
if ord(ch) > 127 and ch not in cp437:
|
||||
hits.append(f' Z.{lineno}: U+{ord(ch):04X} {repr(ch)}')
|
||||
for h in hits:
|
||||
print(h)
|
||||
sys.exit(1 if hits else 0)
|
||||
PYEOF
|
||||
}
|
||||
|
||||
built=0 skipped=0 failed=0
|
||||
shopt -s nullglob
|
||||
for src in "$ink_dir"/*.ink; do
|
||||
out="${src%.ink}.ink.json"
|
||||
name="$(basename "$src")"
|
||||
|
||||
# CP437-Warnung: läuft immer, unabhängig vom Build-Status.
|
||||
if ! cp437_warn="$(check_cp437 "$src")"; then
|
||||
printf ' WARNUNG %s -- Nicht-CP437-Zeichen:\n' "$name"
|
||||
printf '%s\n' "$cp437_warn"
|
||||
fi
|
||||
|
||||
# Inkrementell: überspringen, wenn Ausgabe existiert und neuer ist.
|
||||
if [ "$force" -eq 0 ] && [ -f "$out" ] && [ "$out" -nt "$src" ]; then
|
||||
printf ' aktuell %s\n' "$name"
|
||||
|
||||
Reference in New Issue
Block a user