Пример #1
0
void CTrueTalkManager::load(SimpleFile *file) {
	loadStatics(file);

	// Iterate through loading characters
	int charId = file->readNumber();
	while (charId) {
		loadNPC(file, charId);

		int ident1 = file->readNumber();
		int ident2 = file->readNumber();

		if (ident1 != MKTAG_BE('U', 'R', 'A', 'H')) {
			while (ident2 != MKTAG_BE('A', 'K', 'E', 'R')) {
				ident1 = ident2;
				ident2 = file->readNumber();

				if (!ident1)
					break;
			}
		}

		// Get start of next character
		charId = file->readNumber();
	}
}
Пример #2
0
void CTrueTalkManager::saveNPC(SimpleFile *file, int charId) const {
	TTnpcScript *script = _scripts.getNpcScript(charId);
	if (script) {
		script->save(file);
		file->writeNumber(MKTAG_BE('U', 'R', 'A', 'H'));
		file->writeNumber(MKTAG_BE('A', 'K', 'E', 'R'));
	}
}
Пример #3
0
void CStarCloseup::draw(const FPose &pose, const FVector &vector, const FVector &vector2,
		CSurfaceArea *surfaceArea, CStarCamera *camera) {
	const int VALUES[] = { 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4 };
	float val1 = camera->getThreshold();
	StarColor starColor = camera->getStarColor();
	if (!_flag)
		return;

	int f1, f3, size2, size1;
	float f2, f4, f5, f6, f7, f8, f9;
	float f10, incr, f12, f13, f14, f15, f16, f17, f18, f19;
	float f20, f21, f22;
	FVector tempV;

	if (vector2._z < 6.0e9) {
		int count, start;
		if (vector._x != 0.0 && (vector._y != 0.0 || vector._z != 0.0)) {
			// WORKAROUND: Ignoring non-sensical randSeed((int)vector._x);
			count = VALUES[g_vm->getRandomNumber(15)];
			start = 5 * g_vm->getRandomNumber(255);
		} else {
			count = 9;
			start = 0;
		}

		Entry *entryP = &_entries[start];
		for (; count > 0; --count, ++entryP) {
			f1 = _multiplier * entryP->_field8;
			f2 = entryP->_field14;
			f3 = (f1 + entryP->_fieldC) & 0x1FF;
			f4 = _sineTable[f1 & 0x1FF] * entryP->_field10;
			f5 = _sineTable[f3];
			f6 = cos(f4);
			f7 = sin(f4);
			f8 = _sineTable[f3 + 128];
			f9 = f7;
			f10 = f6 * f8;
			incr = f6;
			f12 = f6 * f5;
			f13 = f2 * f10;
			f14 = f8 * f2;
			f15 = f9 * f2;
			f16 = f2 * f12;
			f17 = -(f7 * f8 * f2);
			f18 = incr * f2;
			f19 = -(f9 * f5 * f2);
			f20 = -(f5 * f2);
			f21 = f14;
			_sub1._row1._x = f13;
			_sub1._row1._y = f15;
			_sub1._row1._z = f16;
			_sub1._row2._x = f17;
			_sub1._row2._y = f18;
			_sub1._row2._z = f19;
			_sub1._row3._x = f20;
			_sub1._row3._z = f14;

			f22 = (float)entryP->_field0;
			_sub1._vector._x = f22 * f10 + vector._x;
			_sub1._vector._y = f9 * f22 + vector._y;
			_sub1._vector._z = f22 * f12 + vector._z;
			_sub2._row1._x = pose._row1._x * f13 + f16 * pose._row3._x + f15 * pose._row2._x;
			_sub2._row1._y = f15 * pose._row2._y + f16 * pose._row3._y + f13 * pose._row1._y;
			_sub2._row1._z = f16 * pose._row3._z + f13 * pose._row1._z + f15 * pose._row2._z;
			_sub2._row2._x = pose._row1._x * f17 + f19 * pose._row3._x + f18 * pose._row2._x;
			_sub2._row2._y = f18 * pose._row2._y + f17 * pose._row1._y + f19 * pose._row3._y;
			_sub2._row2._z = f18 * pose._row2._z + f19 * pose._row3._z + f17 * pose._row1._z;
			_sub2._row3._x = pose._row1._x * f20 + f21 * pose._row3._x;
			_sub2._row3._y = f20 * pose._row1._y + f21 * pose._row3._y;
			_sub2._row3._z = f20 * pose._row1._z + f21 * pose._row3._z;

			_sub2._vector._x = pose._row1._x * _sub1._vector._x
				+ pose._row3._x * _sub1._vector._z
				+ pose._row2._x * _sub1._vector._y + pose._vector._x;
			_sub2._vector._y = pose._row2._y * _sub1._vector._y
				+ pose._row3._y * _sub1._vector._z
				+ pose._row1._y * _sub1._vector._x + pose._vector._y;
			_sub2._vector._z = pose._row3._z * _sub1._vector._z
				+ pose._row1._z * _sub1._vector._x
				+ pose._row2._z * _sub1._vector._y + pose._vector._z;

			size2 = (int)_array[1]._data2.size();
			size1 = (int)_array[1]._data1.size();

			if (size2 > 0) {
				for (int ctr2 = 0; ctr2 < size2; ++ctr2) {
					FVector &currVector = _array[1]._data2[ctr2];
					GridEntry &gridEntry = _grid[ctr2];

					gridEntry._x = currVector._z * _sub2._row3._x
						+ currVector._y * _sub2._row2._x
						+ currVector._x * _sub2._row1._x + _sub2._vector._x;
					gridEntry._y = currVector._z * _sub2._row3._y
						+ currVector._y * _sub2._row2._y
						+ currVector._x * _sub2._row1._y + _sub2._vector._y;
					gridEntry._z = currVector._z * _sub2._row3._z
						+ currVector._y * _sub2._row2._z
						+ currVector._x * _sub2._row1._z + _sub2._vector._z;
				}
			}

			switch (starColor) {
			case WHITE: 
				surfaceArea->setMode(SA_SOLID);
				surfaceArea->_pixel = MKTAG_BE(entryP->_pixel1, entryP->_pixel2,
					entryP->_pixel3, 0);
				surfaceArea->setColorFromPixel();

				for (int ctr2 = 0; ctr2 < size2; ++ctr2) {
					GridEntry &gridEntry = _grid[ctr2];
					tempV = camera->getRelativePos(2, gridEntry);
					gridEntry._position._x = tempV._x;
					gridEntry._position._y = tempV._y + vector2._y;
				}

				for (int ctr2 = 0; ctr2 < size1; ++ctr2) {
					Data1 &d1 = _array[1]._data1[ctr2];
					GridEntry &grid1 = _grid[d1._index1];
					GridEntry &grid2 = _grid[d1._index2];

					if (grid1._z > val1 && grid2._z > val1) {
						surfaceArea->drawLine(FRect(grid1._position._x, grid1._position._y,
							grid2._position._x, grid2._position._y));
					}
				}
				break;
			case PINK:
				surfaceArea->setMode(SA_SOLID);
				surfaceArea->_pixel = entryP->_pixel1;
				surfaceArea->setColorFromPixel();

				for (int ctr2 = 0; ctr2 < size2; ++ctr2) {
					GridEntry &gridEntry = _grid[ctr2];
					tempV = camera->getRelativePos(0, gridEntry);
					gridEntry._position._x = tempV._x + vector2._x;
					gridEntry._position._y = tempV._y + vector2._y;
				}

				for (int ctr2 = 0; ctr2 < size1; ++ctr2) {
					Data1 &d1 = _array[1]._data1[ctr2];
					GridEntry &grid1 = _grid[d1._index1];
					GridEntry &grid2 = _grid[d1._index2];

					if (grid1._z > val1 && grid2._z > val1) {
						surfaceArea->drawLine(FRect(grid1._position._x, grid1._position._y,
							grid2._position._x, grid2._position._y));
					}
				}

				surfaceArea->_pixel = entryP->_pixel3;
				surfaceArea->setColorFromPixel();
				surfaceArea->setMode(SA_MODE2);

				for (int ctr2 = 0; ctr2 < size2; ++ctr2) {
					GridEntry &gridEntry = _grid[ctr2];
					tempV = camera->getRelativePos(1, gridEntry);
					gridEntry._position._x = tempV._x + vector2._x;
					gridEntry._position._y = tempV._y + vector2._y;
				}

				for (int ctr2 = 0; ctr2 < size1; ++ctr2) {
					Data1 &d1 = _array[1]._data1[ctr2];
					GridEntry &grid1 = _grid[d1._index1];
					GridEntry &grid2 = _grid[d1._index2];

					if (grid1._z > val1 && grid2._z > val1) {
						surfaceArea->drawLine(FRect(grid1._position._x, grid1._position._y,
							grid2._position._x, grid2._position._y));
					}
				}
				break;
			default:
				assert(0);
			}
		}
	}

	uint pixel1 = 0x81EEF5, pixel2 = 0xF5, pixel3 = 0x810000;
	int arrIndex = 0;

	if (vector2._z >= 200000000.0) {
		if (vector2._z >= 900000000.0) {
			if (vector2._z >= 6000000000.0) {
				arrIndex = 3;
				if (vector2._z >= 1.0e10)
					arrIndex = 4;
			} else {
				arrIndex = 2;
			}
		} else {
			arrIndex = 1;
		}
	} else {
		arrIndex = 0;
	}

	SubEntry &entry = _array[arrIndex];

	for (uint ctr = 0; ctr < entry._data2.size(); ++ctr) {
		GridEntry &gridEntry = _grid[ctr];
		const FVector &d2v = entry._data2[ctr];
		FVector newV = d2v + vector;

		gridEntry._x = pose._row1._x * newV._x + pose._row3._x * newV._z
			+ pose._row2._x * newV._y + pose._vector._x;
		gridEntry._y = newV._y * pose._row2._y + newV._z * pose._row3._y
			+ newV._x * pose._row1._y + pose._vector._y;
		gridEntry._z = newV._z * pose._row3._z + newV._y * pose._row2._z
			+ newV._x * pose._row1._z + pose._vector._z;
	}

	switch(starColor) {
	case WHITE:
		surfaceArea->setMode(SA_SOLID);
		surfaceArea->_pixel = pixel1;
		surfaceArea->setColorFromPixel();

		for (uint ctr = 0; ctr < entry._data2.size(); ++ctr) {
			GridEntry &gridEntry = _grid[ctr];
			tempV = camera->getRelativePos(2, gridEntry);
			gridEntry._position._x = tempV._x + vector2._x;
			gridEntry._position._y = tempV._y + vector2._y;
		}

		for (uint ctr = 0; ctr < entry._data1.size(); ++ctr) {
			Data1 &d1 = entry._data1[ctr];
			GridEntry &grid1 = _grid[d1._index1];
			GridEntry &grid2 = _grid[d1._index2];

			if (grid2._z > val1 && grid1._z > val1) {
				surfaceArea->drawLine(FRect(grid1._position._x, grid1._position._y,
					grid2._position._x, grid2._position._y));
			}
		}		
		break;
	case PINK:
		surfaceArea->setMode(SA_SOLID);
		surfaceArea->_pixel = pixel2;
		surfaceArea->setColorFromPixel();

		for (uint ctr = 0; ctr < entry._data2.size(); ++ctr) {
			GridEntry &gridEntry = _grid[ctr];
			tempV = camera->getRelativePos(2, gridEntry);
			gridEntry._position._x = tempV._x + vector2._x;
			gridEntry._position._y = tempV._y + vector2._y;
		}

		for (uint ctr = 0; ctr < entry._data1.size(); ++ctr) {
			Data1 &d1 = entry._data1[ctr];
			GridEntry &grid1 = _grid[d1._index1];
			GridEntry &grid2 = _grid[d1._index2];

			if (grid2._z > val1 && grid1._z > val1) {
				surfaceArea->drawLine(FRect(grid1._position._x, grid1._position._y,
					grid2._position._x, grid2._position._y));
			}
		}

		surfaceArea->_pixel = pixel3;
		surfaceArea->setColorFromPixel();
		surfaceArea->setMode(SA_MODE2);

		for (uint ctr = 0; ctr < entry._data2.size(); ++ctr) {
			GridEntry &gridEntry = _grid[ctr];
			tempV = camera->getRelativePos(2, gridEntry);
			gridEntry._position._x = tempV._x + vector2._x;
			gridEntry._position._y = tempV._y + vector2._y;
		}

		for (uint ctr = 0; ctr < entry._data1.size(); ++ctr) {
			Data1 &d1 = entry._data1[ctr];
			GridEntry &grid1 = _grid[d1._index1];
			GridEntry &grid2 = _grid[d1._index2];

			if (grid2._z > val1 && grid1._z > val1) {
				surfaceArea->drawLine(FRect(grid1._position._x, grid1._position._y,
					grid2._position._x, grid2._position._y));
			}
		}
		break;
	default:
		assert(0);
	}
}