VECTOR* handFingerPos (ENTITY* entHand, BOOL bLeftHand, int fingerId, VECTOR* vecFingerPos, VECTOR* vecFingerDir) { VECTOR vecFinger0, vecFinger1; char* j0 = _chr((g_handBoneFarNames->pstring)[fingerId]); char* j1 = _chr((g_handBoneNearNames->pstring)[fingerId]); vec_for_bone(&vecFinger0, entHand, j0); vec_for_bone(&vecFinger1, entHand, j1); if (bLeftHand) { vec_to_ent(&vecFinger0, entHand); vecFinger0.x *= -1; vec_for_ent(&vecFinger0, entHand); vec_to_ent(&vecFinger1, entHand); vecFinger1.x *= -1; vec_for_ent(&vecFinger1, entHand); } vec_lerp(vecFingerPos, &vecFinger0, &vecFinger1, 0.5); vec_diff(vecFingerDir, &vecFinger1, &vecFinger0); return vecFingerPos; }
int ini_read(STRING *targetValue, STRING *filename, char* section, STRING *entry, STRING *defaultValue) { int length = GetPrivateProfileString(section, _chr(entry), _chr(defaultValue), iniBuffer, 2047, _chr(filename)); if(targetValue != NULL) str_cpy(targetValue, iniBuffer); return length; }
int la_checkFile(STRING *file) { STRING *filepath; la_asset *asset; filepath = str_create(work_dir); str_cat(filepath, "\\"); str_cat(filepath, file); la_lock(); asset = la_assetForFile(_chr(file), _chr(filepath)); switch(asset->state) { case LA_ASSET_STATE_LOADED: { la_unlock(); ptr_remove(filepath); return 1; } break; case LA_ASSET_STATE_NOSUCHFILE: { printf("No such file or directory \"%s\"", asset->file); la_unlock(); ptr_remove(filepath); return -1; } break; case LA_ASSET_STATE_READFAIL: { printf("Failed to load \"%s\"", asset->file); la_unlock(); ptr_remove(filepath); return -2; } break; default: break; } la_unlock(); ptr_remove(filepath); return 0; }
ActionInformation *actinfo_add(List *list, STRING *name) { ActionInformation *info = NULL; for(info = list_first(list); info != NULL; info = list_next(list, info)) { if(strcmp(info->actionname, _chr(name)) == 0) return NULL; } info = sys_malloc(sizeof(ActionInformation)); strcpy(info->actionname, _chr(name)); list_insert_last(list, info); return info; }
ChapterData *ChapterDataCreate(const char *name, const char *internal_name, const STRING *thumbnail_name, const COLOR *vsun_color, const COLOR *vfog_color, const VECTOR *vfog_range, const float vsun_light) { ASSERT(internal_name, _chr("Fatal error in ChapterDataCreate(): A null char * pointer was given to the function, cannot create the data block.")); ASSERT(strlen(internal_name) < CHAPTER_INAME_MAX_LENGTH, _chr("Fatal error in ChapterDataCreate(): Chapter name's length exceeds CHAPTER_INAME_MAX_LENGTH.")); ChapterData *data = (ChapterData *) sys_malloc(sizeof(ChapterData)); data->chapter_name = (char *) sys_malloc(CHAPTER_NAME_MAX_LENGTH * sizeof(char)); data->chapter_iname = (char *) sys_malloc(CHAPTER_INAME_MAX_LENGTH * sizeof(char)); data->pad = (float *) sys_malloc(CHAPTER_PAD_VARS_MAX_LENGTH * sizeof(float)); data->sun_light = -1.0; // The chapter name can be left blank, whilist the chapter's internal name (its scene file) // must not be blank - each ChapterData struct has to be linked to a scene in some way. if(name) if(strlen(name) <= CHAPTER_NAME_MAX_LENGTH) strcpy(data->chapter_name, name); strcpy(data->chapter_iname, internal_name); // Continue to allocate and set up any additional parameters. if(thumbnail_name) if(file_exists(thumbnail_name)) data->thumbnail = bmap_create(thumbnail_name); if(vsun_color) { data->sun_color = (COLOR *) sys_malloc(sizeof(COLOR)); vec_set(data->sun_color, vsun_color); } if(vfog_color) { data->fog_color = (COLOR *) sys_malloc(sizeof(COLOR)); vec_set(data->fog_color, vfog_color); if(vfog_range) { data->fog_range = (VECTOR *) sys_malloc(sizeof(VECTOR)); vec_set(data->fog_range, vfog_range); } } if(vsun_light >= 0.0) data->sun_light = vsun_light; return data; }
RegAction *action_register(STRING *name, void *ptr) { if(registeredActions == NULL) registeredActions = list_create(); RegAction *info = NULL; for(info = list_first(registeredActions); info != NULL; info = list_next(registeredActions, info)) { if(strcmp(info->actionname, _chr(name)) == 0) return NULL; } info = sys_malloc(sizeof(RegAction)); strcpy(info->actionname, _chr(name)); info->ptr = ptr; list_insert_last(registeredActions, info); return info; }
// Initializes the scene list, the scenes, and push them into the list. void nov_scene_list_init() { on_level = __level_load_event; // Open the scene list. scene_new(); // Creates the scene nodes. day[0] = scene_data_new("Fragment #1", // Name of the chapter. _chr(game_asset_get_scene("fragment1.wmb")), // Internal name of the chapter. (scene name) NULL, // Name of the thumbnail image. NULL, // Sun color. NULL, // Fog color. NULL, // Fog range. 150.0); // Sun light intensity. day[1] = scene_data_new("Fragment #2", _chr(game_asset_get_scene("fragment2.wmb")), NULL, NULL, NULL, NULL, 150.0); day[2] = scene_data_new("Fragment #3", _chr(game_asset_get_scene("fragment3.wmb")), NULL, NULL, NULL, NULL, 150.0); day[3] = scene_data_new("Fragment #4", _chr(game_asset_get_scene("fragment4.wmb")), NULL, NULL, NULL, NULL, 150.0); day[4] = scene_data_new("Fragment #5", _chr(game_asset_get_scene("fragment5.wmb")), NULL, NULL, NULL, NULL, 150.0); day[5] = scene_data_new("Fragment #6", _chr(game_asset_get_scene("fragment6.wmb")), NULL, NULL, NULL, NULL, 150.0); day[6] = scene_data_new("Fragment #7", _chr(game_asset_get_scene("empty.wmb")), NULL, NULL, NULL, NULL, 150.0); int i = 0; for(; i < TOTAL_DAYS; i++) scene_add( day[i] ); }
void *actinfo_remove(List *list, STRING *name) { ActionInformation *info = NULL; for(info = list_first(list); info != NULL; ) { if(strcmp(info->actionname, _chr(name)) == 0) info = list_remove(list, info); else info = list_next(list, info); } }
// Creates a volume texture from the given filename LPDIRECT3DVOLUMETEXTURE9 sc_volumeTexture_create(STRING *filename) { LPDIRECT3DVOLUMETEXTURE9 temptex; HRESULT res = D3DXCreateVolumeTextureFromFile((LPDIRECT3DDEVICE9)pd3ddev, _chr(filename), &temptex); if(res != S_OK) { printf("error: %x", res); return NULL; } return temptex; }
void *action_getptr(STRING *name) { if(registeredActions == NULL) registeredActions = list_create(); RegAction *info = NULL; for(info = list_first(registeredActions); info != NULL; info = list_next(registeredActions, info)) { if(strcmp(info->actionname, _chr(name)) == 0) return info->ptr; } return NULL; }
int ini_read_sections(TEXT *txt, STRING *filename) { int length = GetPrivateProfileString(NULL, NULL, NULL, iniBuffer, 2047, _chr(filename)); int i = 0; char *str = iniBuffer; while(str < (iniBuffer + length)) { (txt->pstring)[i] = str_create(str); str = str + strlen(str) + 1; i++; } return i; }
void ebCreateHandJoints (ENTITY* entHand) { if (entHand == NULL) return; BOOL* arr = NULL; if (entHand->skill20 == 1) // left arr = g_handChopL; else // right arr = g_handChopR; int i; for (i = 0; i < HAND_FINGERS; i++) { if (arr[i] == false) { char* j0 = _chr((g_handBoneFarNames->pstring)[i]); char* j1 = _chr((g_handBoneNearNames->pstring)[i]); VECTOR v0, v1, v; vec_for_bone(&v0, entHand, j0); vec_for_bone(&v1, entHand, j1); vec_lerp(&v, &v0, &v1, 0.5); if (entHand->skill20 != 0) { vec_to_ent(&v, entHand); v.x *= -1; vec_for_ent(&v, entHand); } ENTITY* e = ent_create("handjoint.mdl", &v, ebHandJoint); e->skill1 = i; e->skill2 = entHand; } } }
/** * Changes the grayscale mode * * mode * Grayscale mode, see modes-section in the file "ppFxGrayscale.h" */ void ppGrayscaleSetMode (MATERIAL* m, int mode) { if (m == NULL) return NULL; if (m->PP_GRAYSCALE_MTL_MODE == mode) return m; char* strTechnique = _chr((txt_ppGrayscaleTechniques->pstring)[clamp(mode, 0, PP_GRAYSCALE_MODE_CNT)]); MATERIAL* m = ppMtlLoad(m, PP_GRAYSCALE_MTL_FX, strTechnique); m->PP_GRAYSCALE_MTL_MODE = mode; return m; }
// Picks a language and perform string initialization based on the chosen language. void nov_region_init(const char *language) { ASSERT(language != NULL, "Crash in nov_region_init() due to empty parameters being passed. This should not happen!"); // Detect supported languages. region_new(); region_scan(); bool b = region_set_language(language); if(b) { game_log_write( str_printf( NULL, "Language successfully set to %s", _chr(region_get_language()) ) ); } localized_init(); }
InlinePolymorph<ROM> load_ROM(IBus *bus, const char *path) { std::ifstream file(path); if (!( file.get() == 'N' && file.get() == 'E' && file.get() == 'S' && file.get() == 0x1A)) { throw std::runtime_error("Not iNES format"); } uint8_t prg_rom_size = file.get(); uint8_t chr_rom_size = file.get(); uint8_t flag6 = file.get(); uint8_t flag7 = file.get(); // int prg_ram_size = file.get(); // flag9 = file.get(); // flag10 = file.get(); file.seekg(0x10); bool four_screen = flag6 & 4; bool horizontal_mirroring = !(flag6 & 1); int mapper_id{ (flag6 >> 4) | (flag7 & 0xf0) }; std::cout << "Mapper " << mapper_id << '\n'; std::cout << "_prg banks: " << (int)prg_rom_size << '\n'; std::cout << "_chr banks: " << (int)chr_rom_size << '\n'; InlinePolymorph<ROM> rom; switch (mapper_id) { case 0: rom.emplace<NROM>(); break; case 1: rom.emplace<SxROM>(); break; case 2: rom.emplace<UxROM>(); break; case 3: rom.emplace<CNROM>(); break; case 4: rom.emplace<MMC3>(bus); break; case 71: rom.emplace<Camerica>(); break; default: throw std::runtime_error("Unsupported mapper"); } rom->set_mirroring(four_screen ? ROM::MirrorMode::FOUR_SCREEN : horizontal_mirroring ? ROM::MirrorMode::HORIZONTAL : ROM::MirrorMode::VERTICAL); // rom->write_prg(0xc, 0x8000); // fixme: move "set_prg" stuff to constructor? std::shared_ptr<std::vector<uint8_t>> _prg(new std::vector<uint8_t>(rom->get_prg_size_for_count(prg_rom_size))); std::shared_ptr<std::vector<uint8_t>> _chr(new std::vector<uint8_t>(rom->get_chr_size_for_count(chr_rom_size))); file.read(reinterpret_cast<char *>(_prg->data()), _prg->size()); file.read(reinterpret_cast<char *>(_chr->data()), _chr->size()); rom->set_prg(prg_rom_size, _prg); rom->set_chr(chr_rom_size, _chr); return rom; }
void ini_write(STRING *filename, char* section, STRING *entry, STRING *value) { WritePrivateProfileString(section, _chr(entry), _chr(value), _chr(filename)); }
void creditsText () { static char strIni [256]; sprintf(strIni, "%s\\credits.ini", _chr(work_dir)); // start music and lyrics { snd_stop(g_fhCreditsSong); g_fhCreditsSong = snd_play(g_musicCredits, 100, 0); lyricsStart(NULL, g_txtCreditsLyrics, g_fhCreditsSong); } int pos = 0; int count = ini_read_int(strIni, "Credits", "max", "0"); var duration = ini_read_int(strIni, "Credits", "duration", "15"); var itemDuration = duration / (var)count; creditsHead1.flags |= SHOW; creditsBody1.flags |= SHOW; creditsHead2.flags |= SHOW; creditsBody2.flags |= SHOW; creditsHead2.pos_y = screen_size.y - g_lyricsBarHeight - 150; creditsBody2.pos_y = screen_size.y - g_lyricsBarHeight - 100; int size1 = 300; int size2 = 600; var x = 0; var len = 0; while (snd_playing(g_fhCreditsSong) != 0 && !g_bCreditsAllExplode) { static char section [256]; sprintf(section, "Credit%d", pos + 1); ini_read(creditsText1Head, strIni, section, "Head1", " "); ini_read(creditsText1Body, strIni, section, "Body1", " "); ini_read(creditsText2Head, strIni, section, "Head2", " "); ini_read(creditsText2Body, strIni, section, "Body2", " "); str_replaceall(creditsText1Body, "##", "\n"); str_replaceall(creditsText2Body, "##", "\n"); creditsHead1.pos_x = -size1; creditsBody1.pos_x = -size1; creditsHead2.pos_x = screen_size.x + size2; creditsBody2.pos_x = screen_size.x + size2; var fadetime = 0.22 * itemDuration; var fade = 0; var fadespeed = 16 / fadetime; for (fade = 0; fade < 100; fade += fadespeed * time_step) { creditsHead1.pos_x = -size1 + 1.5 * size1 * (1 - pow(1 - 0.01 * fade, 2)); creditsBody1.pos_x = -size1 + 1.7 * size1 * (1 - pow(1 - 0.01 * fade, 2)); if (g_bCreditsAllExplode) break; wait(1); } for (fade = 0; fade < 100; fade += fadespeed * time_step) { creditsHead2.pos_x = screen_size.x + size2 - 1.2 * size2 * (1 - pow(1 - 0.01 * fade, 2)); creditsBody2.pos_x = screen_size.x + size2 - 1.3 * size2 * (1 - pow(1 - 0.01 * fade, 2)); if (g_bCreditsAllExplode) break; wait(1); } var t_id = 0.6 * itemDuration * 16; while (t_id > 0 && !g_bCreditsAllExplode) { t_id -= time_step; wait(1); } var scrollspeed = 100; for (fade = 0; fade < 100; fade += fadespeed * time_step) { creditsHead1.pos_x += scrollspeed * time_step; if (fade > 20) creditsBody1.pos_x += scrollspeed * time_step; if (g_bCreditsAllExplode) break; wait(1); } for (fade = 0; fade < 100; fade += fadespeed * time_step) { creditsHead2.pos_x -= scrollspeed * time_step; if (fade > 20) creditsBody2.pos_x -= scrollspeed * time_step; if (g_bCreditsAllExplode) break; wait(1); } pos += 1; wait(1); } snd_stopall(4); creditsHead1.flags &= ~SHOW; creditsBody1.flags &= ~SHOW; creditsHead2.flags &= ~SHOW; creditsBody2.flags &= ~SHOW; g_bCreditsAllExplode = true; creditsFinished = true; var et = 5 * 16; while (et > 0) { camera->tilt += time_step * 0.2; camera->arc += time_step * 0.2; et -= time_step; wait(1); } // show space text { set(g_txtCreditsSpace, SHOW); g_txtCreditsSpace->pos_x = screen_size.x / 2; g_txtCreditsSpace->pos_y = screen_size.y * 0.8; on_space = creditsSpace; } }
void qlevel_export(char *filename) { FILE *f = fopen(filename, "wb+"); TQLevelHeader header; header.a = 42; header.b = 1337; header.c = -55; fwrite(&header, sizeof(TQLevelHeader), 1, f); fflush(f); TQLevelItemHeader item; for(you = ent_next(NULL); you != NULL; you = ent_next(you)) { switch(you->group) { case GROUP_LEVEL: item.type = GROUP_LEVEL; item.length = sizeof(TQLevelEntity); fwrite(&item, sizeof(TQLevelItemHeader), 1, f); TQLevelEntity entityEntry; strcpy(entityEntry.filename, _chr(you->type)); vec_set(&entityEntry.pos, &you->x); vec_set(&entityEntry.angle, &you->pan); vec_set(&entityEntry.scale, &you->scale_x); entityEntry.actioncount = 0; ActionInformation *entry; for(entry = list_first(you->string1); entry != NULL; entry = list_next(you->string1, entry)) { entityEntry.actioncount++; } fwrite(&entityEntry, sizeof(TQLevelEntity), 1, f); ActionInformation *entry; for(entry = list_first(you->string1); entry != NULL; entry = list_next(you->string1, entry)) { TQLevelAction entryAction; strcpy(entryAction.actionname, entry->actionname); fwrite(&entryAction, sizeof(TQLevelAction), 1, f); } break; case GROUP_LIGHT: item.type = GROUP_LIGHT; item.length = sizeof(TQLevelLight); fwrite(&item, sizeof(TQLevelItemHeader), 1, f); TQLevelLight lightEntry; vec_set(&lightEntry.pos, &you->x); vec_set(&lightEntry.angle, &you->pan); vec_set(&lightEntry.color, &you->blue); lightEntry.range = you->lightrange; if(you->string2 != NULL) { strcpy(lightEntry.lightmap, _chr(you->string2)); } fwrite(&lightEntry, sizeof(TQLevelLight), 1, f); break; } } item.type = -1; item.length = 0; fwrite(&item, sizeof(TQLevelItemHeader), 1, f); fclose(f); }