Choices are also a c++ struct
This commit is contained in:
parent
6aed8ed768
commit
2ad0587242
95
cyoa.leg
95
cyoa.leg
@ -5,9 +5,35 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
typedef struct statcheck_t statcheck_t;
|
#define STATCHECK_GT 1
|
||||||
typedef struct statchange_t statchange_t;
|
#define STATCHECK_LT 2
|
||||||
typedef struct choice_t choice_t;
|
|
||||||
|
struct statcheck_t {
|
||||||
|
char *stat;
|
||||||
|
int value;
|
||||||
|
int rel;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct statchange_t {
|
||||||
|
char *stat;
|
||||||
|
int addend;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ChoiceFlags : int {
|
||||||
|
StatCheck = 0x1,
|
||||||
|
StatChange = 0x2,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Choice {
|
||||||
|
int flags;
|
||||||
|
int option;
|
||||||
|
char *flavor;
|
||||||
|
statcheck_t statcheck;
|
||||||
|
char *id;
|
||||||
|
statchange_t statchange;
|
||||||
|
|
||||||
|
Choice(char*, statcheck_t*, statchange_t*);
|
||||||
|
};
|
||||||
|
|
||||||
enum class FooterType {
|
enum class FooterType {
|
||||||
End,
|
End,
|
||||||
@ -18,7 +44,7 @@ enum class FooterType {
|
|||||||
struct Footer {
|
struct Footer {
|
||||||
FooterType type;
|
FooterType type;
|
||||||
union {
|
union {
|
||||||
std::vector<choice_t*> choices;
|
std::vector<Choice*> choices;
|
||||||
char *link;
|
char *link;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -35,37 +61,8 @@ struct Page {
|
|||||||
~Page();
|
~Page();
|
||||||
};
|
};
|
||||||
|
|
||||||
#define STATCHECK_GT 1
|
|
||||||
#define STATCHECK_LT 2
|
|
||||||
|
|
||||||
struct statcheck_t {
|
|
||||||
char *stat;
|
|
||||||
int value;
|
|
||||||
int rel;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct statchange_t {
|
|
||||||
char *stat;
|
|
||||||
int addend;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#define CHOICE_STATCHECK 0x1
|
|
||||||
#define CHOICE_STATCHANGE 0x2
|
|
||||||
|
|
||||||
struct choice_t {
|
|
||||||
int flags;
|
|
||||||
int option;
|
|
||||||
char *flavor;
|
|
||||||
statcheck_t statcheck;
|
|
||||||
char *redirect;
|
|
||||||
statchange_t statchange;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::vector<Page*> pages;
|
std::vector<Page*> pages;
|
||||||
|
|
||||||
choice_t *make_choice();
|
|
||||||
|
|
||||||
Page *emit_ending();
|
Page *emit_ending();
|
||||||
Page *emit_goto(char*);
|
Page *emit_goto(char*);
|
||||||
Page *emit_choices();
|
Page *emit_choices();
|
||||||
@ -75,9 +72,11 @@ void append_body(Page *page, char *str);
|
|||||||
union value {
|
union value {
|
||||||
Page *page;
|
Page *page;
|
||||||
char *string;
|
char *string;
|
||||||
choice_t *choice;
|
Choice *choice;
|
||||||
std::vector<choice_t*> *choices;
|
std::vector<Choice*> *choices;
|
||||||
int num;
|
int num;
|
||||||
|
statcheck_t *statcheck;
|
||||||
|
statchange_t *statchange;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define YYSTYPE union value
|
#define YYSTYPE union value
|
||||||
@ -111,7 +110,7 @@ Goto = 'GOTO' Spacing < i:Identifier > Newline
|
|||||||
Ending = 'THE END' Newline;
|
Ending = 'THE END' Newline;
|
||||||
|
|
||||||
ChoiceList = c:Choice l:ChoiceList { $$ = l; $$.choices->push_back(c.choice); }
|
ChoiceList = c:Choice l:ChoiceList { $$ = l; $$.choices->push_back(c.choice); }
|
||||||
| c:Choice { $$.choices = new std::vector<choice_t*>(); $$.choices->push_back(c.choice); }
|
| c:Choice { $$.choices = new std::vector<Choice*>(); $$.choices->push_back(c.choice); }
|
||||||
|
|
||||||
Choice = b:Bullet f:Freetext r:Redirect
|
Choice = b:Bullet f:Freetext r:Redirect
|
||||||
{
|
{
|
||||||
@ -124,9 +123,10 @@ Bullet = < [0-9]+ > ')' Spacing { $$.num = atoi(yytext); };
|
|||||||
|
|
||||||
Freetext = < (!Redirect .)+ > { $$.string = strndup(yytext, yyleng); };
|
Freetext = < (!Redirect .)+ > { $$.string = strndup(yytext, yyleng); };
|
||||||
|
|
||||||
Redirect = StatCheck? Spacing '[' Identifier ']' Spacing StatChange? Newline;
|
Redirect = ck:StatCheck? '[' i:Identifier ']' Spacing cg:StatChange? Newline
|
||||||
|
{ $$.choice = new Choice(i.string, ck.statcheck, cg.statchange); }
|
||||||
|
|
||||||
StatCheck = '<' StatName Spacing [0-9]+ ('+' | '-')? '>';
|
StatCheck = '<' StatName Spacing [0-9]+ ('+' | '-')? '>' Spacing;
|
||||||
|
|
||||||
StatChange = '(' ('+' | '-') [0-9]+ Spacing StatName ')';
|
StatChange = '(' ('+' | '-') [0-9]+ Spacing StatName ')';
|
||||||
|
|
||||||
@ -142,6 +142,18 @@ Newline = '\r\n' | '\r' | '\n';
|
|||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
Choice::Choice(char *id, statcheck_t *ck, statchange_t *cg) {
|
||||||
|
this->id = id;
|
||||||
|
if (ck) {
|
||||||
|
statcheck = *ck;
|
||||||
|
flags |= StatCheck;
|
||||||
|
}
|
||||||
|
if (cg) {
|
||||||
|
statchange = *cg;
|
||||||
|
flags |= StatChange;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Footer::Footer() {
|
Footer::Footer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,13 +174,6 @@ Page::~Page() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline choice_t *make_choice() {
|
|
||||||
choice_t *mychoice = (choice_t*) malloc(sizeof(choice_t));
|
|
||||||
mychoice->flags = 0x0;
|
|
||||||
printf("choice 0x%x\n", mychoice);
|
|
||||||
return mychoice;
|
|
||||||
}
|
|
||||||
|
|
||||||
Page *emit_goto(char *id) {
|
Page *emit_goto(char *id) {
|
||||||
Page *mypage = new Page;
|
Page *mypage = new Page;
|
||||||
mypage->footer.type = FooterType::Goto;
|
mypage->footer.type = FooterType::Goto;
|
||||||
|
Loading…
Reference in New Issue
Block a user