bool Character::afflictStatus(const std::string& status, int duration) { auto it = getStatusEffectIterator(status); if (it == m_status.end()) { // Dead status removes all other statuses. if (status == "Dead") { resetStatus(); } if (hasStatus("Normal")) { m_status.clear(); } m_status.push_back(get_status_effect(status)); if (duration > 0) { m_statusDurations[get_status_effect(status)] = duration; } return true; } return false; }
bool Entity::removeStatus(unsigned int status) { if (hasStatus(status)) { // clear status bit statusBits &= ~(1 << status); return 1; // status successfully removed } return 0; // entity does not have status }
bool Entity::setStatus(unsigned int status) { if (hasStatus(status)) { return 0; // entity already has status } // set status bit statusBits |= 1 << status; return 1; // status successfully set }
ZJson* zjsonInitWithString(char* jsonStr) { ZJson* json = (ZJson*)malloc(sizeof(ZJson)); json->type = ZJSON; json->data = (zjsonNode*)malloc(sizeof(zjsonNode)); json->originString = jsonStr; char c = (char)(*jsonStr); zjsonStr* zjstr = (zjsonStr*)malloc(sizeof(zjsonStr)); zjstr->str = jsonStr; zjstr->nextTokenIndex = 0; int i = 0; size_t len = strlen(jsonStr); ZStack* stack = zstackInit(10, typePtr); int status = STATUS_EXPECT_SINGLE_VALUE | STATUS_EXPECT_BEGIN_OBJECT | STATUS_EXPECT_BEGIN_ARRAY; for (; ;) { int type = zjsonStrNextType(zjstr); switch (type) { case idnumber: if (hasStatus(status, STATUS_EXPECT_SINGLE_VALUE)) {//single number zjsonNumber number = zjsonStrReadNumber(zjstr); zstackPush(stack, number); status = STATUS_EXPECT_END_DOCUMENT; continue; } if (hasStatus(status, STATUS_EXPECT_OBJECT_VALUE)) { zjsonNumber number = zjsonStrReadNumber(zjstr); char* key = zstackPop(stack); zmapPut(zstackPeek(stack), key, number); status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT; continue; } if (hasStatus(status, STATUS_EXPECT_ARRAY_VALUE)) { zjsonNumber number = zjsonStrReadNumber(zjstr); zarrayAdd(zstackPeek(stack), number); status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_ARRAY; continue; } printf("Unexpected umber\n"); break; case idbool: if (hasStatus(status, STATUS_EXPECT_SINGLE_VALUE)) {// single boolean: zjsonBoolean boolean = zjsonStrReadBoolean(zjstr); zstackPush(stack, boolean); status = STATUS_EXPECT_END_DOCUMENT; continue; } if (hasStatus(status, STATUS_EXPECT_OBJECT_VALUE)) { zjsonBoolean boolean = zjsonStrReadBoolean(zjstr); char* key = zstackPop(stack); zmapPut(zstackPeek(stack), key, boolean); status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT; continue; } if (hasStatus(status, STATUS_EXPECT_ARRAY_VALUE)) { zjsonBoolean boolean = zjsonStrReadBoolean(zjstr); zarrayAdd(zstackPeek(stack), boolean); status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_ARRAY; continue; } printf("Unexpected bool\n"); break; case idstring: if (hasStatus(status, STATUS_EXPECT_SINGLE_VALUE)) {// single string: char* str = zjsonStrReadString(zjstr); zstackPush(stack, str); status = STATUS_EXPECT_END_DOCUMENT; continue; } if (hasStatus(status, STATUS_EXPECT_OBJECT_KEY)) { char* str = zjsonStrReadString(zjstr); zstackPush(stack, str); status = STATUS_EXPECT_COLON; continue; } if (hasStatus(status, STATUS_EXPECT_OBJECT_VALUE)) { char* str = zjsonStrReadString(zjstr); char* key = zstackPop(stack); zmapPut(zstackPeek(stack), key, str); status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT; continue; } if (hasStatus(status, STATUS_EXPECT_ARRAY_VALUE)) { char* str = zjsonStrReadString(zjstr); zarrayAdd(zstackPeek(stack), str); status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_ARRAY; continue; } printf("Unexpected string \n"); break; case idnull: if (hasStatus(status, STATUS_EXPECT_SINGLE_VALUE)) {// single null: zjsonStrReadNull(zjstr); zstackPush(stack, NULL); status = STATUS_EXPECT_END_DOCUMENT; continue; } if (hasStatus(status, STATUS_EXPECT_OBJECT_VALUE)) { zjsonStrReadNull(zjstr); char* key = zstackPop(stack); zmapPut(zstackPeek(stack), key, NULL); status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT; continue; } if (hasStatus(status, STATUS_EXPECT_ARRAY_VALUE)) { zjsonStrReadNull(zjstr); zarrayAdd(zstackPeek(stack), NULL); status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_ARRAY; continue; } printf("Unexpected null\n"); break; case idobjbegin:// { if (hasStatus(status, STATUS_EXPECT_BEGIN_OBJECT)) { zstackPush(stack, zmapInit()); status = STATUS_EXPECT_OBJECT_KEY | STATUS_EXPECT_BEGIN_OBJECT | STATUS_EXPECT_END_OBJECT; continue; } printf("Unexpected '{'\n"); break; case idobjend:// } if (hasStatus(status, STATUS_EXPECT_END_OBJECT)) { ZMap* map = zstackPop(stack); if (zstackEmpty(stack)) {//root object zstackPush(stack, map); status = STATUS_EXPECT_END_DOCUMENT; continue; } int type = zstackPreValueType(stack); if (type == typeZArray) { zarrayAdd(zstackPeek(stack), map); status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_ARRAY; continue; }else { char* key = zstackPop(stack); zmapPut(zstackPeek(stack), key, map); status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT; continue; } // if (type == TYPE_OBJECT_KEY) { // char* key = zstackPop(stack); // zmapPut(zstackPeek(stack), key, map); // status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT; // continue; // } } printf("Unexpected '}'\n"); break; case idlistbegin:// [ if (hasStatus(status, STATUS_EXPECT_BEGIN_ARRAY)) { zstackPush(stack, zarrayInit(true)); status = STATUS_EXPECT_ARRAY_VALUE | STATUS_EXPECT_BEGIN_OBJECT | STATUS_EXPECT_BEGIN_ARRAY | STATUS_EXPECT_END_ARRAY; continue; } printf("Unexpected '['\n"); break; case idlistend: // ] if (hasStatus(status, STATUS_EXPECT_END_ARRAY)) { ZArray* array = zstackPop(stack); if (zstackEmpty(stack)) { zstackPush(stack, array); status = STATUS_EXPECT_END_DOCUMENT; continue; } int type = zstackPreValueType(stack); if (type == typeZArray) {// xx, xx, [CURRENT] ,] zarrayAdd(zstackPeek(stack), array); status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_ARRAY; continue; } // 没有类型字段的先默认是字符串的 if (type > typeZStruct || type < typeZStack) {// key: [ CURRENT ] ,} char* key = zstackPop(stack); zmapPut(zstackPeek(stack), key, array); status = STATUS_EXPECT_COMMA | STATUS_EXPECT_END_OBJECT; continue; } } printf("Unexpected char ']'\n"); break; case idcolon://: if (status == STATUS_EXPECT_COLON) { status = STATUS_EXPECT_OBJECT_VALUE | STATUS_EXPECT_BEGIN_OBJECT | STATUS_EXPECT_BEGIN_ARRAY; continue; } printf("Unexpected colon char\n"); break; case idcomma://, if (hasStatus(status, STATUS_EXPECT_COMMA)) { if (hasStatus(status, STATUS_EXPECT_END_OBJECT)) { status = STATUS_EXPECT_OBJECT_KEY; continue; } if (hasStatus(status, STATUS_EXPECT_END_ARRAY)) { status = STATUS_EXPECT_ARRAY_VALUE | STATUS_EXPECT_BEGIN_ARRAY | STATUS_EXPECT_BEGIN_OBJECT; continue; } } printf("Unexpected comma char\n"); break; case idend: if (hasStatus(status, STATUS_EXPECT_END_DOCUMENT)) {//STATUS_EXPECT_END_OBJECT void* jsonData = zstackPop(stack); if (zstackEmpty(stack)) { json->data = jsonData; return json; } } printf("Unexpected EOF \n"); return NULL; default: break; } } return json; }