Пример #1
0
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;
}
Пример #2
0
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
}
Пример #3
0
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
}
Пример #4
0
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;
}