Status space_setDoor(Space *s, int n, int x, int y, int sId, int nx, int ny) { if (s == NULL || x < 0 || y < 0 || numdoors(s) <= n || n < 0) return ERROR; doors(s)[n].x = x; doors(s)[n].y = y; doors(s)[n].neighbour = sId; doors(s)[n].nx = nx; doors(s)[n].ny = ny; return OK; }
Door *space_checkDoorPoint(Space *s, int x, int y) { int i; if (s == NULL || x < 0 || y < 0) return NULL; for (i = 0; i < numdoors(s); i++) { if (doors(s)[i].x == x && doors(s)[i].y == y) { return(s->doors + i); } } return NULL; }
Status space_setNDoors(Space *s, int num) { if (s == NULL || num < 0) return ERROR; numdoors(s) = num; /*if there is more than a door we give it memory*/ if (num > 0) { doors(s) = (Door *) malloc(sizeof(Door) * num); if (doors(s) == NULL) return ERROR; } return OK; }
bool no_change_strategy() { // doors - это множество доступных дверей (1, 2, 3) для выбора игроком. std::set<int> doors(all_doors, all_doors + 3); // Выбираем истинную дверь (от 1 до 3). int real_door = (std::rand() % 3) + 1; // Выбираем первый и окончательный выбор игрока (от 1 до 3). int primary_choice_door = (std::rand() % 3) + 1; return real_door == primary_choice_door; }
void space_free(Space *s) { int i; if (!s) return; if (sDesc(s)) free(sDesc(s)); if (lDesc(s)) free(lDesc(s)); if (map(s)) { for (i = 0; i < rows(s); i++) { if (map(s)[i]) free(map(s)[i]); } free(map(s)); } if (doors(s) != NULL) { free(doors(s)); } free(s); }
bool change_strategy() { // doors - это множество доступных дверей (1, 2, 3) для выбора двери, // открываемой ведущим после первого выбора игрока. std::set<int> doors(all_doors, all_doors + 3); // Выбираем истинную дверь (от 1 до 3). int real_door = (std::rand() % 3) + 1; // Выбираем первый выбор игрока (от 1 до 3) int primary_choice_door = (std::rand() % 3) + 1; // Исключаем из множества дверей истинную дверь и выбор игрока. doors.erase(real_door); doors.erase(primary_choice_door); // На всякий пожарный проверим целостность данных. assert(doors.size() == 1 || doors.size() == 2); // Из оставшихся элементов (их может быть 1 или 2 штуки) выбираем дверь, // которую откроет ведущий. reveal_door равно либо 1, либо 2. int reveal_door = (std::rand() % doors.size()) + 1; // i указывает на первый элемент в множестве (всего в нем 1 или 2 элемента). std::set<int>::const_iterator i = doors.begin(); // Сдвигаем итератор на элемент, номер которого равен reveal_door. // Можно было бы написать "if (reveal_door == 2) ++i;", но цикл как-то // универсальнее. while (--reveal_door) ++i; reveal_door = *i; // 'doors2' - это множество доступных дверей (1, 2, 3) для игрока, // меняющего свой первоначальный выбор. std::set<int> doors2(all_doors, all_doors + 3); // Исключаем из множества дверей первый выбор игрока и // и дверь, открытую ведущим. doors2.erase(primary_choice_door); doors2.erase(reveal_door); // На всякий пожарный проверим целостность данных. assert(doors2.size() == 1); // В множестве оставшихся дверь будет только одна дверь, так как истинная // дверь точно не равна двери, открытой ведущим, во второй выбор игрока // точно отличается от первоначального. Поэтому просто берем из этого // множества первый элемент. int second_choice = *doors2.begin(); return real_door == second_choice; }
Space * space_ini() { int i; Space *s; s = (Space *) malloc(sizeof(Space)); if (!s) return NULL; sId(s) = -1; sDesc(s) = NULL; lDesc(s) = NULL; light(s) = FALSE; isLocked(s) = FALSE; map(s) = NULL; rows(s) = -1; cols(s) = -1; numdoors(s) = -1; doors(s) = NULL; return s; }
void DoorsDebugUI::Render() { if (!m_showDoorsUI) return; ImGui::SetNextWindowSize(ImVec2(500, 120), ImGuiSetCond_FirstUseEver); if (!ImGui::Begin("EQ Doors", &m_showDoorsUI)) return; PDOORTABLE pDoorTable = (PDOORTABLE)pSwitchMgr; ImGui::Text("%d door objects", pDoorTable->NumEntries); ImGui::Columns(6, "doorcolumns"); ImGui::Separator(); auto header = [this](const char* name, int id) { if (ImGui::Selectable(name, m_doorsSortColumn == id)) { m_sortReverse = (m_doorsSortColumn == id) ? !m_sortReverse : false; m_doorsSortColumn = id; } ImGui::NextColumn(); }; header("ID", Sort_ID); header("Name", Sort_Name); header("Type", Sort_Type); header("State", Sort_State); header("Distance", Sort_Distance); /* buttons */ ImGui::NextColumn(); ImGui::Separator(); std::vector<PDOOR> doors(pDoorTable->NumEntries); for (DWORD count = 0; count < pDoorTable->NumEntries; count++) { doors[count] = pDoorTable->pDoor[count]; } std::sort(doors.begin(), doors.end(), [this](PDOOR a, PDOOR b) -> bool { bool less = false; if (m_doorsSortColumn == Sort_ID) less = a->ID < b->ID; else if (m_doorsSortColumn == Sort_Name) less = strcmp(a->Name, b->Name) < 0; else if (m_doorsSortColumn == Sort_Type) less = a->Type < b->Type; else if (m_doorsSortColumn == Sort_State) less = a->State < b->State; else if (m_doorsSortColumn == Sort_Distance) less = GetDistance(a) < GetDistance(b); return less; }); if (m_sortReverse) std::reverse(doors.begin(), doors.end()); for (auto iter = doors.begin(); iter != doors.end(); ++iter) { PDOOR door = *iter; ImGui::PushID(door->ID); bool targetted = (m_lastDoorTargetId == door->ID); if (targetted) ImGui::PushStyleColor(ImGuiCol_Text, ImColor(0, 255, 0)); ImGui::Text("%d", door->ID); ImGui::NextColumn(); if (ImGui::Selectable(door->Name, targetted)) { CHAR temp[256]; sprintf_s(temp, "/doortarget id %d", door->ID); // would be nice if there was an easier way to do this. EzCommand(temp); } ImGui::NextColumn(); ImGui::Text("%d", door->Type); ImGui::NextColumn(); ImGui::Text("%d", door->State); ImGui::NextColumn(); ImGui::Text("%.2f", GetDistance(door)); ImGui::NextColumn(); if (targetted) ImGui::PopStyleColor(); if (ImGui::Button("Click")) ClickDoor(door); if (targetted) { ImGui::SameLine(); ImGui::Text("<Target>"); } if (IsSwitchStationary(door)) { ImGui::SameLine(); ImGui::Text("*stationary*"); } ImGui::NextColumn(); ImGui::PopID(); } ImGui::Separator(); ImGui::Columns(1); ImGui::Separator(); ImGui::End(); }