mirror of
https://github.com/Kapendev/parin.git
synced 2025-04-27 21:49:57 +03:00
Fixed story set bug.
This commit is contained in:
parent
3fd13c0518
commit
a7a26d6244
1 changed files with 44 additions and 7 deletions
|
@ -36,8 +36,9 @@ enum StoryOp : ubyte {
|
||||||
CLEAR,
|
CLEAR,
|
||||||
SWAP,
|
SWAP,
|
||||||
COPY,
|
COPY,
|
||||||
|
IF,
|
||||||
|
ELSE,
|
||||||
THEN,
|
THEN,
|
||||||
NEXT,
|
|
||||||
END,
|
END,
|
||||||
ECHO,
|
ECHO,
|
||||||
LEAK,
|
LEAK,
|
||||||
|
@ -49,6 +50,7 @@ enum StoryOp : ubyte {
|
||||||
DROP,
|
DROP,
|
||||||
INC,
|
INC,
|
||||||
DEC,
|
DEC,
|
||||||
|
TOG,
|
||||||
MENU,
|
MENU,
|
||||||
SKIP,
|
SKIP,
|
||||||
JUMP,
|
JUMP,
|
||||||
|
@ -97,12 +99,21 @@ struct StoryVariable {
|
||||||
|
|
||||||
struct Story {
|
struct Story {
|
||||||
LStr script;
|
LStr script;
|
||||||
List!uint startPoints;
|
List!uint scriptStartEndPairs;
|
||||||
List!StoryVariable variables;
|
|
||||||
int previousMenuResult;
|
int previousMenuResult;
|
||||||
|
List!StoryVariable variables;
|
||||||
|
|
||||||
void prepare() {
|
void prepare() {
|
||||||
// TODO: Add stuff like points.
|
scriptStartEndPairs.clear();
|
||||||
|
previousMenuResult = 0;
|
||||||
|
if (script.isEmpty) return;
|
||||||
|
scriptStartEndPairs.append(0);
|
||||||
|
foreach (i, c; script) {
|
||||||
|
if (c == '\n') {
|
||||||
|
scriptStartEndPairs.append(cast(uint) i);
|
||||||
|
scriptStartEndPairs.append(cast(uint) i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Fault evaluate(IStr expression) {
|
Fault evaluate(IStr expression) {
|
||||||
|
@ -115,7 +126,8 @@ struct Story {
|
||||||
auto token = expression.skipValue(' ');
|
auto token = expression.skipValue(' ');
|
||||||
if (token.length == 0) continue;
|
if (token.length == 0) continue;
|
||||||
if (ifCounter > 0) {
|
if (ifCounter > 0) {
|
||||||
if (token == NEXT.toStr()) ifCounter -= 1;
|
if (token == IF.toStr()) ifCounter += 1;
|
||||||
|
if (token == ELSE.toStr() || token == THEN.toStr()) ifCounter -= 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (token.isMaybeStoryOp) {
|
if (token.isMaybeStoryOp) {
|
||||||
|
@ -178,13 +190,16 @@ struct Story {
|
||||||
if (stack.length < 1) return Fault.invalid;
|
if (stack.length < 1) return Fault.invalid;
|
||||||
stack.append(stack[$ - 1]);
|
stack.append(stack[$ - 1]);
|
||||||
break;
|
break;
|
||||||
case THEN:
|
case IF:
|
||||||
if (stack.length < 1) return Fault.invalid;
|
if (stack.length < 1) return Fault.invalid;
|
||||||
auto da = stack.pop();
|
auto da = stack.pop();
|
||||||
if (!da.isType!long) return Fault.invalid;
|
if (!da.isType!long) return Fault.invalid;
|
||||||
if (!da.get!long) ifCounter += 1;
|
if (!da.get!long) ifCounter += 1;
|
||||||
break;
|
break;
|
||||||
case NEXT:
|
case ELSE:
|
||||||
|
ifCounter += 1;
|
||||||
|
break;
|
||||||
|
case THEN:
|
||||||
break;
|
break;
|
||||||
case END:
|
case END:
|
||||||
return Fault.none;
|
return Fault.none;
|
||||||
|
@ -280,6 +295,7 @@ struct Story {
|
||||||
foreach (ref variable; variables) {
|
foreach (ref variable; variables) {
|
||||||
if (b == variable.name) {
|
if (b == variable.name) {
|
||||||
variable.value = da;
|
variable.value = da;
|
||||||
|
isNotThere = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -326,6 +342,27 @@ struct Story {
|
||||||
if (b == variable.name) {
|
if (b == variable.name) {
|
||||||
if (variable.value.isType!StoryNumber) {
|
if (variable.value.isType!StoryNumber) {
|
||||||
variable.value.get!StoryNumber() += a * (op == INC ? 1 : -1);
|
variable.value.get!StoryNumber() += a * (op == INC ? 1 : -1);
|
||||||
|
stack.append(variable.value);
|
||||||
|
} else {
|
||||||
|
return Fault.invalid;
|
||||||
|
}
|
||||||
|
isNotThere = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isNotThere) return Fault.invalid;
|
||||||
|
break;
|
||||||
|
case TOG:
|
||||||
|
if (stack.length < 1) return Fault.invalid;
|
||||||
|
auto da = stack.pop();
|
||||||
|
if (!da.isType!StoryWord) return Fault.invalid;
|
||||||
|
auto a = da.get!StoryWord();
|
||||||
|
auto isNotThere = true;
|
||||||
|
foreach (ref variable; variables) {
|
||||||
|
if (a == variable.name) {
|
||||||
|
if (variable.value.isType!StoryNumber) {
|
||||||
|
variable.value.get!StoryNumber() = !variable.value.get!StoryNumber();
|
||||||
|
stack.append(variable.value);
|
||||||
} else {
|
} else {
|
||||||
return Fault.invalid;
|
return Fault.invalid;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue