From c35f19225e631ad4623a2dc83e53603467d3ace8 Mon Sep 17 00:00:00 2001 From: Steve Williams <90905675+stevewgr@users.noreply.github.com> Date: Sat, 20 Jul 2024 15:22:08 -0400 Subject: [PATCH 1/7] Implement script to transcode encoding and line feeds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The script converts all text files to UTF-8 encoding with LF (Line Feed) for consistent cross-platform compatibility. It also updates all resource files to UTF-16 LE encoding, aligning with Microsoft’s official format as of Visual Studio 2010. Note that some resource files are UTF-16 BE. The script ensures these instances are properly transcoded to Little Endian. The script reliably splits the process into multiple stages: - Detect file encoding and generate CSV files with results: - ko-encoding.csv: reliable detection, no need to touch - ko-encoding-manual.csv: for manual review where detection was not 100% confidence - ko-encoding-invalid.csv: for invalid results, such as empty text files - Transcode encoding based on the given CSV results: - If a Microsoft resource file (.rc), convert to UTF-16 LE - Otherwise, convert to UTF-8 - Convert Windows CRLF line feeds to Unix LF or vice versa This script standardizes encoding across the project, improving compatibility and reducing potential issues with text and resource file handling. --- script/fix-encoding.py | 417 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 417 insertions(+) create mode 100644 script/fix-encoding.py diff --git a/script/fix-encoding.py b/script/fix-encoding.py new file mode 100644 index 00000000..2ada2767 --- /dev/null +++ b/script/fix-encoding.py @@ -0,0 +1,417 @@ +# pip install python-magic python-magic-bin chardet +# if there are problems with loading library, uninstall python-magic-bin and install again. +import argparse +import csv +import datetime +import logging +import os +import re +import shutil +from collections import deque +from pathlib import Path + +import chardet +import magic + +#from charset_normalizer import from_path, detect + +# Notes: +# Only problematic case was in src\server\LoginServer\ZipArchive.cpp, where it contained Polish and Korean characters. +# This was fixed manually by encoding it from CP949 and copying the polish chars from CP1250. + +COMMON_ENCODING = ['ascii', 'utf-8', 'utf-8-sig', 'utf-16', 'utf-16-be', 'utf-16-le', 'cp949', 'cp950'] + +logger = logging.getLogger('fix-encoding') +logger.setLevel(logging.DEBUG) + +# Default to Unix LF on all write operations +newline_feed = '\n' + +class ColoredFormatter(logging.Formatter): + COLORS = { + 'DEBUG': '\033[94m', # Blue + 'INFO': '\033[92m', # Green + 'WARNING': '\033[93m', # Yellow + 'ERROR': '\033[91m', # Red + 'CRITICAL': '\033[95m', # Magenta + 'RESET': '\033[0m' # Reset color + } + + def format(self, record): + log_color = self.COLORS.get(record.levelname, self.COLORS['RESET']) + reset_color = self.COLORS['RESET'] + message = super().format(record) + return f"{log_color}{message}{reset_color}" + +def prompt_user(message): + response = input(f"{message} (y/n): ").strip().lower() + if response != 'y': + print("Operation cancelled.") + return False + + return True + +def get_bom_encoding(file_path): + with open(file_path, 'rb') as file: + bom = file.read(3) + if bom.startswith(b'\xef\xbb\xbf'): + return 'UTF-8-SIG' + + file.seek(0) + bom = file.read(2) + if bom == b'\xff\xfe': + return 'UTF-16-LE' + elif bom == b'\xfe\xff': + return 'UTF-16-BE' + else: + return '' + +def is_text_file(file_path): + # just to speed up for known files to this project, and also this all prevent + # from empty text file to return as not a text file. + known_exts = ['txt', 'c', 'cpp', 'h', 'hpp', 'py', 'ps1', 'cmd' 'md', 'yml', 'json'] + ext = Path(file_path).suffix.strip('.').lower() + if ext in known_exts: + return True + + try: + mime = magic.Magic(mime=True) + mime_type = mime.from_file(file_path) + return mime_type.startswith('text') + except Exception as e: + logger.error(f"Error determining file type: {e}") + return False + +def convert_line_feed(file_path, crlf_to_lf): + logger.info(f"Processing file: [{file_path}]") + try: + content = b'' + with open(file_path, 'rb') as file: + content = file.read() + + if crlf_to_lf: + content = content.replace(b'\r\n', b'\n') + else: + content = content.replace(b'\n', b'\r\n') + + with open(file_path, 'wb') as file: + file.write(content) + except Exception as e: + logger.error(f"Error processing {file_path}: {e}") + +def alter_line_feed(dir_path, encoding_csv_file, crlf_to_lf): + global newline_feed + if crlf_to_lf: + logger.info(f"Converting from CRLF to LF line feed") + newline_feed = '\n' + else: + logger.info(f"Converting from LF to CRLF line feed") + newline_feed = '\r\n' + + # if a csv file is provided, use it instead of a directory + if encoding_csv_file: + if not os.path.isfile(encoding_csv_file): + logger.error(f"File '{encoding_csv_file}' does not exist.") + exit(1) + + with open(encoding_csv_file, mode='r') as csv_file: + csv_reader = csv.DictReader(csv_file) + for row in csv_reader: + file_path = row['file'] + if not is_text_file(file_path): + logger.debug(f"'{file_path}' not a text file. Skipping...") + continue + + convert_line_feed(file_path, crlf_to_lf) + else: + if not os.path.isdir(dir_path): + logger.error(f"Directory '{dir_path}' does not exist.") + exit(1) + + root_path = os.path.abspath(dir_path) + + exclude_dirs = ['.git', '.vs', 'assets', 'db', 'vendor'] + exclude_files = [] + exclude_exts = [] + for root, dirs, files in os.walk(root_path): + dirs[:] = [d for d in dirs if d.lower() not in exclude_dirs] + files = [f for f in files if f not in exclude_files] + files = [f for f in files if not any(Path(f).suffix.lower() == ext for ext in exclude_exts)] + + for file in files: + file_path = os.path.join(root, file) + if not is_text_file(file_path): + logger.debug(f"'{file_path}' not a text file. Skipping...") + continue + + convert_line_feed(file_path, crlf_to_lf) + + +def detect_encoding(dir_path): + if not os.path.isdir(dir_path): + logger.error(f"Directory '{dir_path}' does not exist.") + exit(1) + + root_path = os.path.abspath(dir_path) + + logger.info("Detect encoding...") + csv_file = "ko-encoding.csv" + csv_manual_file = "ko-encoding-manual.csv" + csv_invalid_file = "ko-encoding-invalid.csv" + with open(csv_file, mode='w', newline=newline_feed) as f: + writer = csv.writer(f) + writer.writerow(["confidence", "encoding", "file"]) + + shutil.copy2(csv_file, csv_manual_file) + + with open(csv_manual_file, mode='w', newline=newline_feed) as f: + writer = csv.writer(f) + writer.writerow(["confidence", "encoding", "file"]) + + with open(csv_invalid_file, mode='w', newline=newline_feed) as f: + writer = csv.writer(f) + writer.writerow(["output", "file"]) + + exclude_dirs = ['.git', '.vs', 'assets', 'db', 'vendor'] + exclude_files = [csv_file, csv_manual_file, csv_invalid_file, 'fix-encoding.py'] + exclude_exts = [] + for root, dirs, files in os.walk(root_path): + dirs[:] = [d for d in dirs if d.lower() not in exclude_dirs] + files = [f for f in files if f not in exclude_files] + files = [f for f in files if not any(Path(f).suffix.lower() == ext for ext in exclude_exts)] + + for file in files: + file_path = os.path.join(root, file) + logger.info(f"Detecting encoding for: [{file_path}]") + + if not is_text_file(file_path): + logger.debug(f"'{file_path}' is not a text file.") + continue + + try: + encoding = '' + confidence = 0.0 + + # Note that chardet doesn't indicate whether UTF-16 is LE or BE, therefore we do this step + # since if we have some instances with UTF-16-BE, as some of the rc2 files, we want to make + # sure they're converted to UTF-16-LE. + bom_enc = get_bom_encoding(file_path) + if bom_enc != '': + encoding = bom_enc + confidence = 1.0 + else: + #result = from_path(file_path) + with open(file_path, 'rb') as f: + result = chardet.detect(f.read()) + encoding = result['encoding'] + confidence = result['confidence'] + if encoding is None or confidence is None: + raise ValueError(result) + + encoding_low = encoding.lower() + + # To prevent the potential of losing characters, note that it is generally better using + # Microsoft's CP949, which is an extension of EUC-KR and backward compatible. It also + # also contain additional Hanja characters. + if encoding_low == 'euc-kr' or encoding_low == 'johab': + logger.debug(f"Mapping '{encoding}' to 'CP949' Microsoft encoding") + encoding = 'CP949' + + # Same here as with euc-kr, just for Big5 where CP950 is Microsoft's extended encoding + # for traditional Chinese text. + if encoding_low == 'big5': + logger.debug(f"Mapping '{encoding}' to 'CP950' Microsoft encoding") + encoding = 'CP950' + + target_csv_file = csv_file + if confidence < 0.90: + target_csv_file = csv_manual_file + + if confidence >= 0.90 and encoding.lower() not in COMMON_ENCODING: + logger.warning(f"High confidence but uncommon encoding detected: [{confidence},{encoding},{file_path}]") + target_csv_file = csv_manual_file + + with open(target_csv_file, mode='a', newline=newline_feed) as f: + writer = csv.writer(f) + writer.writerow([confidence, encoding, file_path]) + except Exception as e: + logger.warning(f"[{file_path}] received unexpected output: [{str(e)}]") + with open(csv_invalid_file, mode='a', newline=newline_feed) as f: + writer = csv.writer(f) + writer.writerow([str(e), file_path]) + + +def convert_file_encoding(in_file, out_file, in_enc, out_enc): + with open(in_file, 'r', encoding=in_enc, errors='ignore') as ifile: + with open(out_file, mode='w', encoding=out_enc, newline=newline_feed) as ofile: + BLOCK_SIZE = 5*1024*1024 # 5mb + while True: + content = ifile.read(BLOCK_SIZE) + if not content: + break + ofile.write(content) + +# As of Visual Studio 2010, they're utf-16 little endian with BOM encoded to better handle unicode characters. +# Note that in python when explicitly saving using utf-16-le, it will not include the BOM (byte order marker), +# therefore we write the file with utf-16 encoding, which will default to include LE in the BOM (0xFFFE). +# More insights: https://developercommunity.visualstudio.com/t/visualstudio-v1590-resource-editor-using-utf-8-bom/384705 +# Note however that we can still UTF-8 it, but this is not the default behavior of Visual Studio and it may +# introduce other problems or corrupt it eventually: https://devblogs.microsoft.com/oldnewthing/20190607-00/?p=102569 +def migrate_rc_to_utf16le(input_file, output_file, input_enc): + logger.info(f"Migrating Visual Studio resource file from '{input_enc}' to 'utf-16-le' -> [{output_file}]") + f_in_history = deque(maxlen=10) + + with open(input_file, 'r', encoding=input_enc, errors='ignore') as f_in: + with open(output_file, mode='w', encoding='utf-16', newline=newline_feed) as f_out: + while True: + pos = f_in.tell() + line = f_in.readline() + if not line: + break + + f_in_history.append((pos, line)) + f_out.write(line) + # In some special cases, the LANG_* part may be defined as a value rather than a constant. + # However let's assume that all use actual constants. Undefined RC files should be fixed manually. + # Shouldn't be an issue unless one messed up their own RC file. + if line.startswith('LANGUAGE LANG_'): + current_lang = line.split()[1].strip(',') + logger.info(f"Current language section -> {current_lang}") + resource_section_str = '' + while f_in_history: + prev_line = f_in_history.pop() + if re.match(r"// .* resources", prev_line[1]) and f_in_history.pop()[1].startswith('//////////////'): + resource_section_str = prev_line[1] + logger.debug(f"Language section start str -> {resource_section_str}") + break + + # Most cases I've seen were Big5 or CP950 (Microsoft variant of extending Big5) encoded when both Korean and + # Chinese (Taiwan) characters are included. However since Korean character set are CP949 + if current_lang == 'LANG_KOREAN': + logger.info(f"Fixing {current_lang} resources...") + with open(input_file, 'r', encoding='euc-kr', errors='ignore') as f_korean: + f_korean.seek(f_in.tell()) + while True: + korean_line = f_korean.readline() + if not korean_line: + logger.error(f"We shouldn't reach end of file here without #endif ({f_korean.tell()})") + exit(1) + + f_out.write(korean_line) + if korean_line == f"#endif {resource_section_str}": + f_in.seek(f_korean.tell()) + break + +def transcode_encoding(file_path): + if not os.path.isfile(file_path): + logger.error(f"File '{file_path}' does not exist.") + exit(1) + + with open(file_path, mode='r') as csv_file: + csv_reader = csv.DictReader(csv_file) + for row in csv_reader: + confidence = float(row['confidence']) + in_file = row['file'] + in_enc = row['encoding'].lower() + out_tmp_file = in_file + ".tmp" + + if in_file.endswith('.rc') or in_file.endswith('.rc2'): + if in_enc != 'utf-16-le': + logger.info(f"Processing RC file: [{in_file}]") + os.replace(in_file, out_tmp_file) + migrate_rc_to_utf16le(out_tmp_file, in_file, in_enc) + os.remove(out_tmp_file) + else: + logger.info(f"RC file already utf-16-le encoded: [{in_file}], skipping...") + continue + + if in_enc == 'utf-8': + continue + + logger.info(f"Processing file: [{in_file}]") + if confidence >= 0.99: + os.replace(in_file, out_tmp_file) + convert_file_encoding(out_tmp_file, in_file, in_enc, 'utf-8') + os.remove(out_tmp_file) + else: + logger.warning(f"Low confidence ({confidence}) for file {in_file}, skipping.") + + +def validate_and_init_args(args): + if args.crlf_to_lf and args.lf_to_crlf: + print("ERROR: --crlf-to-lf and --lf-to-crlf cannot be provided at the same time.") + exit(1) + + verbosity_level = args.verbosity + if verbosity_level == 0: + verbosity = logging.ERROR + elif verbosity_level == 1: + verbosity = logging.INFO + elif verbosity_level >= 2: + verbosity = logging.DEBUG + + console_handler = logging.StreamHandler() + file_handler = logging.FileHandler(f'fix-encoding_{datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")}.log') + + console_handler.setLevel(logging.DEBUG) + file_handler.setLevel(logging.DEBUG) + + formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') + colored_formatter = ColoredFormatter('%(asctime)s - %(levelname)s - %(message)s') + console_handler.setFormatter(colored_formatter) + file_handler.setFormatter(formatter) + + logger.addHandler(console_handler) + logger.addHandler(file_handler) + +def main(args): + root_dir = '' + if args.root_dir: + root_dir = os.path.abspath(args.root_dir) + else: + root_dir = os.path.abspath('.') + + if args.detect_encoding: + detect_encoding(root_dir) + + # for dangerous operations, let's confirm with the user before proceeding + if args.encoding_file: + # file based + if args.crlf_to_lf: + if prompt_user(f"Convert CRLF to LF based on csv file '{args.encoding_file}'?"): + alter_line_feed(root_dir, args.encoding_file, True) + elif args.lf_to_crlf: + if prompt_user(f"Convert LF to CRLF based on csv file '{args.encoding_file}'?"): + alter_line_feed(root_dir, args.encoding_file, False) + else: + # dir based + if args.crlf_to_lf: + if prompt_user(f"Convert CRLF to LF in all files within '{root_dir}'?"): + alter_line_feed(root_dir, args.encoding_file, True) + elif args.lf_to_crlf: + if prompt_user(f"Convert LF to CRLF in all files within '{root_dir}'?"): + alter_line_feed(root_dir, args.encoding_file, False) + + if args.encoding_file: + if prompt_user(f"Alter encoding based on '{args.encoding_file}'?"): + transcode_encoding(args.encoding_file) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Script to detect and update encoding") + parser.add_argument('-d', '--root-dir', type=str, required=False, + help='Path to the target root directory') + parser.add_argument('-e', '--detect-encoding', action='store_true', required=False, + help='Detect encoding and generate csv files with matches and confidence.') + parser.add_argument('-f', '--encoding-file', type=str, required=False, + help='Path to the CSV file for encoding') + parser.add_argument('-l', '--crlf-to-lf', action='store_true', required=False, + help='Convert the line feed from Windows CRLF to Unix LF.') + parser.add_argument('-c', '--lf-to-crlf', action='store_true', required=False, + help='Convert the line feed from Unix LF to Windows CRLF.') + parser.add_argument('-v', '--verbosity', action='count', default=2, required=False, + help='Increase verbosity level. Use -v for INFO, -vv for DEBUG. Defaults to DEBUG.') + + args = parser.parse_args() + validate_and_init_args(args) + main(args) From 4789772d389a82713963b0547bbca7adce4ef34d Mon Sep 17 00:00:00 2001 From: Steve Williams <90905675+stevewgr@users.noreply.github.com> Date: Sat, 20 Jul 2024 15:45:09 -0400 Subject: [PATCH 2/7] Transcode and normalize encoding of all files across the project. Also configured `.gitattributes` to handle `*.rc` files as text with UTF-16 encoding, preventing them from being misinterpreted as binary and ensuring proper diff display. --- .gitattributes | 3 + src/All.sln | 2 +- src/Game.sln | 2 +- src/Server.sln | 2 +- src/Tool.sln | 2 +- src/engine/N3Base/BitMapFile.cpp | 70 +- src/engine/N3Base/BitMapFile.h | 4 +- src/engine/N3Base/DFont.cpp | 122 +- src/engine/N3Base/DFont.h | 60 +- src/engine/N3Base/JPEG.CPP | 84 +- src/engine/N3Base/JPEG.H | 166 +- src/engine/N3Base/JpegFile.cpp | 12 +- src/engine/N3Base/LogWriter.cpp | 8 +- src/engine/N3Base/My_3DStruct.h | 90 +- src/engine/N3Base/N3AlphaPrimitiveManager.cpp | 30 +- src/engine/N3Base/N3AlphaPrimitiveManager.h | 16 +- src/engine/N3Base/N3AnimControl.h | 42 +- src/engine/N3Base/N3AnimKey.cpp | 34 +- src/engine/N3Base/N3AnimKey.h | 6 +- src/engine/N3Base/N3AnimatedTexures.cpp | 12 +- src/engine/N3Base/N3Base.cpp | 36 +- src/engine/N3Base/N3Base.h | 82 +- src/engine/N3Base/N3BaseFileAccess.cpp | 14 +- src/engine/N3Base/N3BaseFileAccess.h | 16 +- src/engine/N3Base/N3Board.cpp | 32 +- src/engine/N3Base/N3Board.h | 4 +- src/engine/N3Base/N3Camera.cpp | 50 +- src/engine/N3Base/N3Camera.h | 12 +- src/engine/N3Base/N3Chr.cpp | 346 +-- src/engine/N3Base/N3Chr.h | 148 +- src/engine/N3Base/N3Cloak.cpp | 4 +- src/engine/N3Base/N3Cloak.h | 6 +- src/engine/N3Base/N3Cloud.cpp | 50 +- src/engine/N3Base/N3Cloud.h | 28 +- src/engine/N3Base/N3ColorChange.cpp | 8 +- src/engine/N3Base/N3ColorChange.h | 24 +- src/engine/N3Base/N3Eng.cpp | 86 +- src/engine/N3Base/N3Eng.h | 16 +- src/engine/N3Base/N3EngTool.cpp | 30 +- src/engine/N3Base/N3EngTool.h | 56 +- src/engine/N3Base/N3FXBundle.cpp | 12 +- src/engine/N3Base/N3FXBundle.h | 48 +- src/engine/N3Base/N3FXDef.h | 30 +- src/engine/N3Base/N3FXGroup.cpp | 2 +- src/engine/N3Base/N3FXGroup.h | 6 +- src/engine/N3Base/N3FXPMesh.cpp | 12 +- src/engine/N3Base/N3FXPMeshInstance.cpp | 30 +- src/engine/N3Base/N3FXPMeshInstance.h | 2 +- src/engine/N3Base/N3FXPartBase.cpp | 52 +- src/engine/N3Base/N3FXPartBase.h | 42 +- src/engine/N3Base/N3FXPartBillBoard.cpp | 20 +- src/engine/N3Base/N3FXPartBillBoard.h | 18 +- src/engine/N3Base/N3FXPartBottomBoard.cpp | 16 +- src/engine/N3Base/N3FXPartBottomBoard.h | 20 +- src/engine/N3Base/N3FXPartMesh.cpp | 14 +- src/engine/N3Base/N3FXPartMesh.h | 18 +- src/engine/N3Base/N3FXPartParticles.cpp | 50 +- src/engine/N3Base/N3FXPartParticles.h | 54 +- src/engine/N3Base/N3FXParticle.cpp | 4 +- src/engine/N3Base/N3FXParticle.h | 14 +- src/engine/N3Base/N3FXPlug.cpp | 24 +- src/engine/N3Base/N3FXPlug.h | 10 +- src/engine/N3Base/N3FXShape.cpp | 82 +- src/engine/N3Base/N3FXShape.h | 12 +- src/engine/N3Base/N3GERain.cpp | 44 +- src/engine/N3Base/N3GESnow.cpp | 46 +- src/engine/N3Base/N3GESnow.h | 24 +- src/engine/N3Base/N3GlobalEffect.cpp | 10 +- src/engine/N3Base/N3GlobalEffect.h | 4 +- src/engine/N3Base/N3GlobalEffectMng.cpp | 8 +- src/engine/N3Base/N3GlobalEffectMng.h | 28 +- src/engine/N3Base/N3IME.cpp | 20 +- src/engine/N3Base/N3IMesh.cpp | 20 +- src/engine/N3Base/N3IMesh.h | 24 +- src/engine/N3Base/N3Joint.cpp | 54 +- src/engine/N3Base/N3Joint.h | 6 +- src/engine/N3Base/N3Light.cpp | 6 +- src/engine/N3Base/N3Light.h | 20 +- src/engine/N3Base/N3Mesh.cpp | 64 +- src/engine/N3Base/N3Mesh.h | 10 +- src/engine/N3Base/N3Mng.h | 32 +- src/engine/N3Base/N3Moon.cpp | 8 +- src/engine/N3Base/N3Moon.h | 10 +- src/engine/N3Base/N3PMesh.cpp | 26 +- src/engine/N3Base/N3PMesh.h | 26 +- src/engine/N3Base/N3PMeshCreate.cpp | 60 +- src/engine/N3Base/N3PMeshCreate.h | 14 +- src/engine/N3Base/N3PMeshInstance.cpp | 30 +- src/engine/N3Base/N3PMeshInstance.h | 8 +- src/engine/N3Base/N3Pond.cpp | 40 +- src/engine/N3Base/N3Pond.h | 22 +- src/engine/N3Base/N3River.h | 6 +- src/engine/N3Base/N3River2.h | 4 +- src/engine/N3Base/N3RiverPatch.h | 8 +- src/engine/N3Base/N3Scene.cpp | 56 +- src/engine/N3Base/N3Scene.h | 6 +- src/engine/N3Base/N3Shape.cpp | 232 +- src/engine/N3Base/N3Shape.h | 44 +- src/engine/N3Base/N3ShapeEx.cpp | 28 +- src/engine/N3Base/N3ShapeEx.h | 48 +- src/engine/N3Base/N3ShapeExtra.cpp | 10 +- src/engine/N3Base/N3ShapeExtra.h | 10 +- src/engine/N3Base/N3ShapeMgr.cpp | 282 +-- src/engine/N3Base/N3ShapeMgr.h | 62 +- src/engine/N3Base/N3ShapeMod.cpp | 54 +- src/engine/N3Base/N3ShapeMod.h | 62 +- src/engine/N3Base/N3Skin.cpp | 2 +- src/engine/N3Base/N3Skin.h | 10 +- src/engine/N3Base/N3Sky.cpp | 30 +- src/engine/N3Base/N3SkyMng.cpp | 308 +-- src/engine/N3Base/N3SkyMng.h | 88 +- src/engine/N3Base/N3SndDef.h | 12 +- src/engine/N3Base/N3SndEng.cpp | 4 +- src/engine/N3Base/N3SndMgr.cpp | 40 +- src/engine/N3Base/N3SndMgr.h | 6 +- src/engine/N3Base/N3SndObj.cpp | 20 +- src/engine/N3Base/N3SndObj.h | 4 +- src/engine/N3Base/N3SndObj2D.cpp | 4 +- src/engine/N3Base/N3SndObj2D.h | 2 +- src/engine/N3Base/N3SndObjStream.cpp | 16 +- src/engine/N3Base/N3SndObjStream.h | 16 +- src/engine/N3Base/N3Star.cpp | 2 +- src/engine/N3Base/N3Star.h | 8 +- src/engine/N3Base/N3Sun.cpp | 10 +- src/engine/N3Base/N3Sun.h | 10 +- src/engine/N3Base/N3TableBase.h | 106 +- src/engine/N3Base/N3Texture.cpp | 180 +- src/engine/N3Base/N3Texture.h | 14 +- src/engine/N3Base/N3Transform.cpp | 60 +- src/engine/N3Base/N3Transform.h | 10 +- src/engine/N3Base/N3TransformCollision.cpp | 16 +- src/engine/N3Base/N3TransformCollision.h | 22 +- src/engine/N3Base/N3UIArea.cpp | 22 +- src/engine/N3Base/N3UIArea.h | 2 +- src/engine/N3Base/N3UIBase.cpp | 128 +- src/engine/N3Base/N3UIBase.h | 48 +- src/engine/N3Base/N3UIButton.cpp | 156 +- src/engine/N3Base/N3UIButton.h | 10 +- src/engine/N3Base/N3UIDef.h | 182 +- src/engine/N3Base/N3UIEdit.cpp | 72 +- src/engine/N3Base/N3UIEdit.h | 32 +- src/engine/N3Base/N3UIImage.cpp | 78 +- src/engine/N3Base/N3UIImage.h | 40 +- src/engine/N3Base/N3UIList.cpp | 28 +- src/engine/N3Base/N3UIList.h | 2 +- src/engine/N3Base/N3UIManager.cpp | 34 +- src/engine/N3Base/N3UIManager.h | 2 +- src/engine/N3Base/N3UIProgress.cpp | 54 +- src/engine/N3Base/N3UIProgress.h | 30 +- src/engine/N3Base/N3UIScrollBar.cpp | 16 +- src/engine/N3Base/N3UIScrollBar.h | 8 +- src/engine/N3Base/N3UIStatic.cpp | 22 +- src/engine/N3Base/N3UIStatic.h | 12 +- src/engine/N3Base/N3UIString.cpp | 116 +- src/engine/N3Base/N3UIString.h | 24 +- src/engine/N3Base/N3UITooltip.cpp | 40 +- src/engine/N3Base/N3UITooltip.h | 20 +- src/engine/N3Base/N3UITrackBar.cpp | 86 +- src/engine/N3Base/N3UITrackBar.h | 22 +- src/engine/N3Base/N3VMesh.cpp | 44 +- src/engine/N3Base/N3VMesh.h | 12 +- src/engine/N3Base/Pick.h | 18 +- src/engine/N3Base/StreamSoundObj.cpp | 16 +- src/engine/N3Base/StreamSoundObj.h | 16 +- src/engine/N3Base/WaveFile.cpp | 8 +- src/engine/N3Base/WaveFile.h | 8 +- src/game/APISocket.cpp | 40 +- src/game/APISocket.h | 20 +- src/game/Bird.cpp | 20 +- src/game/Bird.h | 18 +- src/game/BirdMng.cpp | 6 +- src/game/BirdMng.h | 2 +- src/game/Catapult.cpp | 68 +- src/game/Catapult.h | 42 +- src/game/CountableItemEditDlg.cpp | 4 +- src/game/CountableItemEditDlg.h | 4 +- src/game/DungeonManager.cpp | 12 +- src/game/DungeonManager.h | 12 +- src/game/GameBase.cpp | 194 +- src/game/GameBase.h | 40 +- src/game/GameDef.h | 1142 ++++----- src/game/GameEng.cpp | 164 +- src/game/GameEng.h | 62 +- src/game/GameProcCharacterCreate.cpp | 88 +- src/game/GameProcCharacterCreate.h | 8 +- src/game/GameProcCharacterSelect.cpp | 214 +- src/game/GameProcCharacterSelect.h | 48 +- src/game/GameProcLogIn.cpp | 160 +- src/game/GameProcLogIn.h | 6 +- src/game/GameProcMain.cpp | 2036 ++++++++--------- src/game/GameProcMain.h | 160 +- src/game/GameProcNationSelect.cpp | 40 +- src/game/GameProcOption.cpp | 4 +- src/game/GameProcedure.cpp | 272 +-- src/game/GameProcedure.h | 42 +- src/game/GrassBoard.cpp | 32 +- src/game/GrassBoard.h | 14 +- src/game/GrassMng.cpp | 64 +- src/game/GrassMng.h | 10 +- src/game/ItemRepairMgr.cpp | 52 +- src/game/KnightOnLine.vcxproj.filters | 2 +- src/game/KnightOnLine.vcxproj.user | 2 +- src/game/LightMgr.cpp | 14 +- src/game/LocalInput.cpp | 74 +- src/game/LocalInput.h | 46 +- src/game/MachineBase.cpp | 88 +- src/game/MachineBase.h | 36 +- src/game/MachineMng.cpp | 8 +- src/game/MagicSkillMng.cpp | 268 +-- src/game/MagicSkillMng.h | 12 +- src/game/Main.cpp | 54 +- src/game/N3EffectWave2.cpp | 40 +- src/game/N3EffectWave2.h | 24 +- src/game/N3FXBundleGame.cpp | 6 +- src/game/N3FXBundleGame.h | 4 +- src/game/N3FXMgr.cpp | 64 +- src/game/N3FXMgr.h | 2 +- src/game/N3MP3.cpp | 16 +- src/game/N3Terrain.cpp | 170 +- src/game/N3Terrain.h | 36 +- src/game/N3TerrainDef.h | 38 +- src/game/N3TerrainManager.cpp | 22 +- src/game/N3TerrainManager.h | 22 +- src/game/N3TerrainPatch.cpp | 24 +- src/game/N3TerrainPatch.h | 2 +- src/game/N3UIDBCLButton.cpp | 4 +- src/game/N3UIIcon.cpp | 36 +- src/game/N3UIWndBase.cpp | 26 +- src/game/N3UIWndBase.h | 12 +- src/game/N3WorldBase.h | 12 +- src/game/N3WorldManager.cpp | 4 +- src/game/PacketDef.h | 250 +- src/game/PlayerBase.cpp | 734 +++--- src/game/PlayerBase.h | 184 +- src/game/PlayerMySelf.cpp | 374 +-- src/game/PlayerMySelf.h | 52 +- src/game/PlayerNPC.cpp | 72 +- src/game/PlayerNPC.h | 2 +- src/game/PlayerOther.cpp | 32 +- src/game/PlayerOther.h | 2 +- src/game/PlayerOtherMgr.cpp | 124 +- src/game/PlayerOtherMgr.h | 46 +- src/game/PortalVolume.cpp | 48 +- src/game/PortalVolume.h | 32 +- src/game/PvsMgr.cpp | 20 +- src/game/PvsMgr.h | 14 +- src/game/ServerMesh.cpp | 16 +- src/game/SharedMem.cpp | 10 +- src/game/SharedMem.h | 10 +- src/game/SubProcPerTrade.cpp | 334 +-- src/game/SubProcPerTrade.h | 58 +- src/game/UICharacterCreate.cpp | 98 +- src/game/UICharacterCreate.h | 2 +- src/game/UICharacterSelect.cpp | 18 +- src/game/UIChat.cpp | 138 +- src/game/UIChat.h | 54 +- src/game/UIClassChange.cpp | 6 +- src/game/UICmd.cpp | 82 +- src/game/UICmd.h | 42 +- src/game/UICreateClanName.cpp | 4 +- src/game/UIDead.cpp | 44 +- src/game/UIDroppedItemDlg.cpp | 142 +- src/game/UIEndingDisplay.cpp | 8 +- src/game/UIHotKeyDlg.cpp | 94 +- src/game/UIImageTooltipDlg.cpp | 18 +- src/game/UIImageTooltipDlg.h | 16 +- src/game/UIInn.cpp | 8 +- src/game/UIInventory.cpp | 476 ++-- src/game/UIInventory.h | 12 +- src/game/UIItemExchange.cpp | 68 +- src/game/UIKnightsOperation.cpp | 40 +- src/game/UIKnightsOperation.h | 6 +- src/game/UILoading.cpp | 10 +- src/game/UILogin.cpp | 26 +- src/game/UILogin.h | 8 +- src/game/UIManager.cpp | 64 +- src/game/UIManager.h | 16 +- src/game/UIMessageBox.cpp | 38 +- src/game/UIMessageBox.h | 4 +- src/game/UIMessageBoxManager.cpp | 6 +- src/game/UIMessageWnd.cpp | 98 +- src/game/UIMessageWnd.h | 26 +- src/game/UINPCChangeEvent.cpp | 4 +- src/game/UINPCEvent.cpp | 4 +- src/game/UIPartyBBS.cpp | 30 +- src/game/UIPartyBBS.h | 6 +- src/game/UIPartyBBSSelector.cpp | 6 +- src/game/UIPartyOrForce.cpp | 52 +- src/game/UIPartyOrForce.h | 24 +- src/game/UIPerTradeDlg.cpp | 116 +- src/game/UIPerTradeDlg.h | 4 +- src/game/UIQuestMenu.cpp | 36 +- src/game/UIRepairTooltipDlg.cpp | 8 +- src/game/UIRepairTooltipDlg.h | 4 +- src/game/UISkillTreeDlg.cpp | 142 +- src/game/UISkillTreeDlg.h | 22 +- src/game/UIStateBar.cpp | 40 +- src/game/UIStateBar.h | 20 +- src/game/UITargetBar.cpp | 4 +- src/game/UITargetBar.h | 2 +- src/game/UITradeBBSSelector.cpp | 8 +- src/game/UITradeEditDlg.cpp | 4 +- src/game/UITradeEditDlg.h | 2 +- src/game/UITradeList.cpp | 18 +- src/game/UITradeList.h | 4 +- src/game/UITradeSellBBS.cpp | 46 +- src/game/UITradeSellBBS.h | 18 +- src/game/UITransactionDlg.cpp | 186 +- src/game/UITransactionDlg.h | 6 +- src/game/UIVarious.cpp | 188 +- src/game/UIVarious.h | 44 +- src/game/UIWareHouseDlg.cpp | 312 +-- src/game/UIWareHouseDlg.h | 2 +- src/game/UIWarp.cpp | 4 +- src/game/UIWarp.h | 8 +- src/game/WarMessage.cpp | 2 +- src/game/res/Resource.rc | Bin 64427 -> 111684 bytes src/server/AIServer/AIServer.vcxproj.filters | 2 +- src/server/AIServer/AIServer.vcxproj.user | 2 +- src/server/AIServer/AIServerDlg.cpp | 524 ++--- src/server/AIServer/AIServerDlg.h | 44 +- src/server/AIServer/CircularBuffer.h | 8 +- src/server/AIServer/Define.h | 114 +- src/server/AIServer/Extern.h | 20 +- src/server/AIServer/GameSocket.cpp | 114 +- src/server/AIServer/GameSocket.h | 2 +- src/server/AIServer/IOCPSocket2.cpp | 6 +- src/server/AIServer/IOCPort.cpp | 6 +- src/server/AIServer/IOCPort.h | 8 +- src/server/AIServer/Ini.cpp | 8 +- src/server/AIServer/MAP.cpp | 94 +- src/server/AIServer/MAP.h | 24 +- src/server/AIServer/MagicProcess.cpp | 82 +- src/server/AIServer/N3BASE/My_3DStruct.h | 86 +- src/server/AIServer/N3BASE/N3ShapeMgr.cpp | 270 +-- src/server/AIServer/N3BASE/N3ShapeMgr.h | 62 +- .../AIServer/N3BASE/N3VectorAndMatrix.cpp | 8 +- src/server/AIServer/Npc.cpp | 1192 +++++----- src/server/AIServer/Npc.h | 314 +-- src/server/AIServer/NpcInfoTable.cpp | 20 +- src/server/AIServer/NpcInfoTable.h | 28 +- src/server/AIServer/NpcMagicProcess.cpp | 16 +- src/server/AIServer/NpcPosTable.h | 2 +- src/server/AIServer/NpcTable.cpp | 74 +- src/server/AIServer/NpcTable.h | 86 +- src/server/AIServer/NpcThread.cpp | 24 +- src/server/AIServer/Packet.h | 36 +- src/server/AIServer/Party.cpp | 8 +- src/server/AIServer/Party.h | 4 +- src/server/AIServer/PartyUser.h | 4 +- src/server/AIServer/PathFind.cpp | 6 +- src/server/AIServer/RoomEvent.cpp | 68 +- src/server/AIServer/RoomEvent.h | 18 +- src/server/AIServer/Server/MAP.cpp | 46 +- src/server/AIServer/StdAfx.h | 6 +- src/server/AIServer/User.cpp | 118 +- src/server/AIServer/User.h | 80 +- src/server/AIServer/global.cpp | 12 +- src/server/AIServer/res/AIServer.rc | Bin 5409 -> 10590 bytes src/server/AIServer/res/AIServer.rc2 | Bin 387 -> 776 bytes src/server/Aujard/Aujard.rc | Bin 4431 -> 8822 bytes src/server/Aujard/Aujard.vcxproj.filters | 2 +- src/server/Aujard/Aujard.vcxproj.user | 2 +- src/server/Aujard/AujardDlg.cpp | 22 +- src/server/Aujard/AujardDlg.h | 6 +- src/server/Aujard/DBAgent.cpp | 22 +- src/server/Aujard/Define.h | 228 +- src/server/Aujard/Optex.cpp | 1 + src/server/Aujard/Optex.h | 1 + src/server/Aujard/SharedMem.cpp | 2 +- src/server/Aujard/res/Aujard.rc2 | Bin 385 -> 772 bytes src/server/Ebenezer/AIPacket.h | 34 +- src/server/Ebenezer/AISocket.cpp | 174 +- src/server/Ebenezer/CircularBuffer.h | 8 +- src/server/Ebenezer/Define.h | 70 +- src/server/Ebenezer/EVENT.cpp | 2 +- src/server/Ebenezer/EXEC.cpp | 70 +- src/server/Ebenezer/Ebenezer.rc | Bin 10748 -> 19518 bytes src/server/Ebenezer/Ebenezer.vcxproj.filters | 2 +- src/server/Ebenezer/Ebenezer.vcxproj.user | 2 +- src/server/Ebenezer/EbenezerDlg.cpp | 132 +- src/server/Ebenezer/EbenezerDlg.h | 30 +- src/server/Ebenezer/GameDefine.h | 308 +-- src/server/Ebenezer/IOCPSocket2.cpp | 14 +- src/server/Ebenezer/IOCPort.cpp | 6 +- src/server/Ebenezer/IOCPort.h | 2 +- src/server/Ebenezer/Ini.cpp | 8 +- src/server/Ebenezer/Knights.cpp | 12 +- src/server/Ebenezer/Knights.h | 14 +- src/server/Ebenezer/KnightsManager.cpp | 106 +- src/server/Ebenezer/LOGIC_ELSE.cpp | 6 +- src/server/Ebenezer/MagicProcess.cpp | 102 +- src/server/Ebenezer/MagicTable.h | 52 +- src/server/Ebenezer/Map.cpp | 48 +- src/server/Ebenezer/N3BASE/My_3DStruct.h | 86 +- src/server/Ebenezer/N3BASE/N3ShapeMgr.cpp | 270 +-- src/server/Ebenezer/N3BASE/N3ShapeMgr.h | 62 +- src/server/Ebenezer/Npc.cpp | 34 +- src/server/Ebenezer/Npc.h | 28 +- src/server/Ebenezer/PacketDefine.h | 38 +- src/server/Ebenezer/SharedMem.cpp | 2 +- src/server/Ebenezer/UdpSocket.cpp | 56 +- src/server/Ebenezer/User.cpp | 582 ++--- src/server/Ebenezer/User.h | 98 +- src/server/Ebenezer/map/1.evt | 50 +- src/server/Ebenezer/map/1_.evt | 36 +- src/server/Ebenezer/map/2.evt | 50 +- src/server/Ebenezer/map/2_.evt | 40 +- src/server/Ebenezer/res/Ebenezer.rc2 | Bin 387 -> 776 bytes src/server/ItemManager/DBAgent.cpp | 4 +- src/server/ItemManager/Define.h | 8 +- src/server/ItemManager/ItemManager.rc | Bin 4986 -> 9926 bytes .../ItemManager/ItemManager.vcxproj.filters | 2 +- .../ItemManager/ItemManager.vcxproj.user | 2 +- src/server/ItemManager/ItemManagerDlg.cpp | 4 +- src/server/ItemManager/SharedMem.cpp | 2 +- src/server/ItemManager/res/ItemManager.rc2 | Bin 390 -> 782 bytes src/server/LoginServer/CentralDir.cpp | 2 +- src/server/LoginServer/CircularBuffer.h | 8 +- src/server/LoginServer/DBProcess.cpp | 8 +- src/server/LoginServer/DlgBrowsePath.cpp | 8 +- src/server/LoginServer/FileHeader.cpp | 2 +- src/server/LoginServer/IOCPSocket2.cpp | 6 +- src/server/LoginServer/IOCPort.cpp | 4 +- src/server/LoginServer/IOCPort.h | 2 +- src/server/LoginServer/LoginServer.rc | Bin 6938 -> 13816 bytes .../LoginServer/LoginServer.vcxproj.filters | 2 +- .../LoginServer/LoginServer.vcxproj.user | 2 +- src/server/LoginServer/SettingDlg.cpp | 4 +- src/server/LoginServer/User.cpp | 6 +- src/server/LoginServer/Zip.vcxproj.filters | 2 +- src/server/LoginServer/Zip.vcxproj.user | 2 +- src/server/LoginServer/ZipArchive.cpp | 4 +- src/server/LoginServer/res/LoginServer.rc2 | Bin 390 -> 782 bytes src/tool/KscViewer/KscViewer.rc | Bin 10895 -> 20536 bytes src/tool/KscViewer/KscViewer.vcxproj.filters | 2 +- src/tool/KscViewer/KscViewer.vcxproj.user | 2 +- src/tool/KscViewer/res/KscViewer.rc2 | Bin 388 -> 778 bytes src/tool/Launcher/Launcher/APISocket.cpp | 8 +- src/tool/Launcher/Launcher/APISocket.h | 4 +- .../Launcher/Launcher/BB_CircularBuffer.h | 8 +- src/tool/Launcher/Launcher/Launcher.rc | Bin 10778 -> 20514 bytes .../Launcher/Launcher.vcxproj.filters | 2 +- .../Launcher/Launcher/Launcher.vcxproj.user | 2 +- src/tool/Launcher/Launcher/LauncherDlg.cpp | 44 +- src/tool/Launcher/Launcher/LauncherDlg.h | 2 +- .../Launcher/Launcher/MacProgressCtrl.cpp | 2 +- src/tool/Launcher/Launcher/PacketDef.h | 8 +- src/tool/Launcher/Launcher/ServerMesh.cpp | 16 +- src/tool/Launcher/Launcher/res/Launcher.rc2 | Bin 387 -> 776 bytes src/tool/Launcher/ZipArchive/ZipArchive.cpp | 2 +- .../ZipArchive/ZipArchive.vcxproj.filters | 2 +- .../ZipArchive/ZipArchive.vcxproj.user | 2 +- .../Launcher/ZipArchive/ZipCentralDir.cpp | 2 +- .../Launcher/ZipArchive/ZipFileHeader.cpp | 2 +- src/tool/N3CE/DlgChrProperty.cpp | 52 +- src/tool/N3CE/FormViewAnimation.cpp | 58 +- src/tool/N3CE/FormViewAnimation.h | 2 +- src/tool/N3CE/FormViewProperty.cpp | 82 +- src/tool/N3CE/FormViewTool.cpp | 14 +- src/tool/N3CE/MainFrm.cpp | 4 +- src/tool/N3CE/N3CE.rc | Bin 25571 -> 48284 bytes src/tool/N3CE/N3CE.vcxproj.filters | 2 +- src/tool/N3CE/N3CE.vcxproj.user | 2 +- src/tool/N3CE/N3CEDoc.cpp | 68 +- src/tool/N3CE/N3CEView.cpp | 76 +- src/tool/N3CE/PosDummy.cpp | 6 +- src/tool/N3CE/StdAfx.h | 2 +- src/tool/N3CE/TransDummy.cpp | 14 +- src/tool/N3CE/TransDummy.h | 40 +- src/tool/N3CE/res/N3CE.rc2 | Bin 383 -> 768 bytes src/tool/N3FXE/DlgEditFxg.cpp | 12 +- src/tool/N3FXE/DlgEditPartBillBoard.cpp | 10 +- src/tool/N3FXE/DlgEditPartGround.cpp | 10 +- src/tool/N3FXE/DlgEditPartMesh.cpp | 6 +- src/tool/N3FXE/DlgEditPartParticle.cpp | 12 +- src/tool/N3FXE/DlgEditScript.cpp | 16 +- src/tool/N3FXE/Ground.h | 4 +- src/tool/N3FXE/MainFrm.cpp | 44 +- src/tool/N3FXE/N3FXE.rc | Bin 46798 -> 91148 bytes src/tool/N3FXE/N3FXE.vcxproj.filters | 2 +- src/tool/N3FXE/N3FXE.vcxproj.user | 2 +- src/tool/N3FXE/res/N3FXE.rc2 | Bin 384 -> 770 bytes src/tool/N3Indoor/DlgBase.cpp | 74 +- src/tool/N3Indoor/DlgBrowsePath.cpp | 8 +- src/tool/N3Indoor/DlgSceneGraph.h | 2 +- src/tool/N3Indoor/DlgShapeList.cpp | 18 +- src/tool/N3Indoor/DlgShapeList.h | 10 +- src/tool/N3Indoor/DlgUnusedFiles.cpp | 2 +- src/tool/N3Indoor/FloorDlg.cpp | 2 +- src/tool/N3Indoor/MainFrm.cpp | 106 +- src/tool/N3Indoor/MainFrm.h | 30 +- src/tool/N3Indoor/N3Indoor.cpp | 4 +- src/tool/N3Indoor/N3Indoor.rc | Bin 27357 -> 52626 bytes src/tool/N3Indoor/N3Indoor.vcxproj.filters | 2 +- src/tool/N3Indoor/N3Indoor.vcxproj.user | 2 +- src/tool/N3Indoor/N3IndoorView.cpp | 26 +- src/tool/N3Indoor/N3IndoorView.h | 2 +- src/tool/N3Indoor/OrganizeView.cpp | 82 +- src/tool/N3Indoor/OrganizeView.h | 2 +- src/tool/N3Indoor/PVSDef.h | 1 + src/tool/N3Indoor/PVSManager.cpp | 54 +- src/tool/N3Indoor/PVSManager.h | 14 +- src/tool/N3Indoor/PortalVol.cpp | 64 +- src/tool/N3Indoor/PortalVol.h | 10 +- src/tool/N3Indoor/PortalVolume.cpp | 64 +- src/tool/N3Indoor/PortalVolume.h | 12 +- src/tool/N3Indoor/PortalWall.cpp | 6 +- src/tool/N3Indoor/PosDummy.cpp | 12 +- src/tool/N3Indoor/PvsMgr.cpp | 96 +- src/tool/N3Indoor/PvsMgr.h | 18 +- src/tool/N3Indoor/RotDummy.cpp | 6 +- src/tool/N3Indoor/ShapeTypeDlg.cpp | 2 +- src/tool/N3Indoor/SwappedDummy.cpp | 8 +- src/tool/N3Indoor/TransDummy.cpp | 22 +- src/tool/N3Indoor/TransDummy.h | 42 +- src/tool/N3Indoor/res/N3Indoor.rc2 | Bin 387 -> 776 bytes src/tool/N3ME/DTex.cpp | 2 +- src/tool/N3ME/DTexGroup.cpp | 8 +- src/tool/N3ME/DTexGroupMng.cpp | 12 +- src/tool/N3ME/DTexGroupMng.h | 8 +- src/tool/N3ME/DTexMng.cpp | 24 +- src/tool/N3ME/DTexMng.h | 2 +- src/tool/N3ME/DlgAddSoundGroup.cpp | 18 +- src/tool/N3ME/DlgBar.cpp | 2 +- src/tool/N3ME/DlgBase.cpp | 106 +- src/tool/N3ME/DlgBrowsePath.cpp | 8 +- src/tool/N3ME/DlgDTexGroupView.cpp | 2 +- src/tool/N3ME/DlgDTexGroupView.h | 2 +- src/tool/N3ME/DlgEditWarp.cpp | 4 +- src/tool/N3ME/DlgFolderSelect.cpp | 6 +- src/tool/N3ME/DlgLight.cpp | 2 +- src/tool/N3ME/DlgMakeNPCPath.cpp | 10 +- src/tool/N3ME/DlgPondProperty.cpp | 22 +- src/tool/N3ME/DlgRegenUser.cpp | 6 +- src/tool/N3ME/DlgRiverProperty.cpp | 22 +- src/tool/N3ME/DlgSceneGraph.cpp | 2 +- src/tool/N3ME/DlgSceneGraph.h | 4 +- src/tool/N3ME/DlgSetDTex.cpp | 20 +- src/tool/N3ME/DlgShapeList.h | 2 +- src/tool/N3ME/DlgSowSeed.cpp | 8 +- src/tool/N3ME/DlgUnusedFiles.cpp | 2 +- src/tool/N3ME/EventCell.cpp | 4 +- src/tool/N3ME/EventMgr.cpp | 14 +- src/tool/N3ME/EventMgr.h | 2 +- src/tool/N3ME/LightObjMgr.cpp | 26 +- src/tool/N3ME/LightObjMgr.h | 2 +- src/tool/N3ME/LyTerrain.cpp | 472 ++-- src/tool/N3ME/LyTerrain.h | 88 +- src/tool/N3ME/LyTerrainDef.h | 46 +- src/tool/N3ME/MainFrm.cpp | 32 +- src/tool/N3ME/MapMng.cpp | 442 ++-- src/tool/N3ME/MapMng.h | 150 +- src/tool/N3ME/N3ME.rc | Bin 69990 -> 135826 bytes src/tool/N3ME/N3ME.vcxproj.filters | 2 +- src/tool/N3ME/N3ME.vcxproj.user | 2 +- src/tool/N3ME/N3MEDoc.cpp | 4 +- src/tool/N3ME/N3MEView.cpp | 4 +- src/tool/N3ME/NPCPath.h | 22 +- src/tool/N3ME/NPCPathMgr.cpp | 64 +- src/tool/N3ME/NPCPathMgr.h | 8 +- src/tool/N3ME/PondMesh.cpp | 218 +- src/tool/N3ME/PondMesh.h | 78 +- src/tool/N3ME/PondMng.cpp | 146 +- src/tool/N3ME/PondMng.h | 60 +- src/tool/N3ME/PosDummy.cpp | 8 +- src/tool/N3ME/ProgressBar.cpp | 18 +- src/tool/N3ME/ProgressBar.h | 10 +- src/tool/N3ME/QTNode.cpp | 76 +- src/tool/N3ME/QTNode.h | 12 +- src/tool/N3ME/ReadMe.txt | 34 +- src/tool/N3ME/RegenUser.cpp | 8 +- src/tool/N3ME/RegenUser.h | 2 +- src/tool/N3ME/RiverMesh.cpp | 64 +- src/tool/N3ME/RiverMesh.h | 24 +- src/tool/N3ME/RiverMng.cpp | 98 +- src/tool/N3ME/RiverMng.h | 36 +- src/tool/N3ME/RiverMng2.cpp | 6 +- src/tool/N3ME/RotDummy.cpp | 2 +- src/tool/N3ME/SoundCell.cpp | 4 +- src/tool/N3ME/SoundMgr.cpp | 28 +- src/tool/N3ME/SoundMgr.h | 4 +- src/tool/N3ME/SowSeedMng.cpp | 56 +- src/tool/N3ME/SowSeedMng.h | 6 +- src/tool/N3ME/StdAfx.h | 2 +- src/tool/N3ME/TransDummy.cpp | 16 +- src/tool/N3ME/TransDummy.h | 40 +- src/tool/N3ME/VtxPosDummy.cpp | 30 +- src/tool/N3ME/VtxPosDummy.h | 16 +- src/tool/N3ME/Wall.h | 4 +- src/tool/N3ME/WallMgr.cpp | 44 +- src/tool/N3ME/WallMgr.h | 8 +- src/tool/N3ME/WarpMgr.cpp | 2 +- src/tool/N3ME/WarpMgr.h | 2 +- src/tool/N3ME/res/N3ME.rc2 | Bin 383 -> 768 bytes src/tool/N3TexViewer/DlgFormat.cpp | 2 +- src/tool/N3TexViewer/MainFrm.cpp | 90 +- src/tool/N3TexViewer/N3TexViewer.rc | Bin 13815 -> 25782 bytes .../N3TexViewer/N3TexViewer.vcxproj.filters | 2 +- src/tool/N3TexViewer/N3TexViewer.vcxproj.user | 2 +- src/tool/N3TexViewer/N3TexViewerDoc.cpp | 10 +- src/tool/N3TexViewer/ProgressBar.cpp | 18 +- src/tool/N3TexViewer/res/N3TexViewer.rc2 | Bin 390 -> 782 bytes src/tool/N3Viewer/DlgBrowsePath.cpp | 8 +- src/tool/N3Viewer/DlgPMeshEdit.cpp | 22 +- src/tool/N3Viewer/MainFrm.cpp | 10 +- src/tool/N3Viewer/N3Viewer.rc | Bin 25733 -> 49106 bytes src/tool/N3Viewer/N3Viewer.vcxproj.filters | 2 +- src/tool/N3Viewer/N3Viewer.vcxproj.user | 2 +- src/tool/N3Viewer/N3ViewerDoc.cpp | 10 +- src/tool/N3Viewer/N3ViewerView.cpp | 24 +- src/tool/N3Viewer/N3ViewerView.h | 2 +- src/tool/N3Viewer/ViewProperty.cpp | 104 +- src/tool/N3Viewer/ViewSceneTree.cpp | 6 +- src/tool/N3Viewer/res/N3Viewer.rc2 | Bin 387 -> 776 bytes src/tool/Option/Option.rc | Bin 8491 -> 16984 bytes src/tool/Option/Option.vcxproj.filters | 2 +- src/tool/Option/Option.vcxproj.user | 2 +- src/tool/Option/OptionDlg.cpp | 2 +- src/tool/Option/res/Option.rc2 | Bin 385 -> 772 bytes src/tool/PlugIn_Max/My_3DStruct.h | 60 +- src/tool/PlugIn_Max/N3DExp.cpp | 422 ++-- src/tool/PlugIn_Max/N3DExp.h | 4 +- src/tool/PlugIn_Max/N3DExp.rc | Bin 6705 -> 13372 bytes src/tool/PlugIn_Max/StdAfx.h | 4 +- src/tool/PlugIn_Maya/N3E2Wrapper.cpp | 564 ++--- src/tool/PlugIn_Maya/N3E2Wrapper.h | 8 +- src/tool/PlugIn_Maya/Resource.rc | Bin 6112 -> 12176 bytes src/tool/RscTables/RscTables.rc | Bin 9345 -> 18640 bytes src/tool/RscTables/RscTables.vcxproj.filters | 2 +- src/tool/RscTables/RscTables.vcxproj.user | 2 +- src/tool/RscTables/RscTablesDlg.cpp | 38 +- src/tool/RscTables/TableGenerator.cpp | 282 +-- src/tool/RscTables/TableGenerator.h | 6 +- src/tool/RscTables/res/RscTables.rc2 | Bin 388 -> 778 bytes src/tool/ServerInfoViewer/MainFrm.cpp | 2 +- src/tool/ServerInfoViewer/ServerInfoViewer.rc | Bin 11055 -> 20502 bytes .../ServerInfoViewer.vcxproj.filters | 2 +- .../ServerInfoViewer.vcxproj.user | 2 +- .../ServerInfoViewer/ServerInfoViewerDoc.h | 10 +- .../ServerInfoViewer/ServerInfoViewerView.cpp | 8 +- .../ServerInfoViewer/res/ServerInfoViewer.rc2 | Bin 395 -> 792 bytes src/tool/SkyViewer/FormViewProperty.cpp | 90 +- src/tool/SkyViewer/MainFrm.cpp | 6 +- src/tool/SkyViewer/SkyViewer.rc | Bin 15332 -> 28806 bytes src/tool/SkyViewer/SkyViewer.vcxproj.filters | 2 +- src/tool/SkyViewer/SkyViewer.vcxproj.user | 2 +- src/tool/SkyViewer/SkyViewerView.cpp | 2 +- src/tool/SkyViewer/res/SkyViewer.rc2 | Bin 388 -> 778 bytes src/tool/UIE/DlgBar.cpp | 2 +- src/tool/UIE/DlgChangeImage.cpp | 6 +- src/tool/UIE/DlgTexture.cpp | 20 +- src/tool/UIE/DlgTexture.h | 2 +- src/tool/UIE/HierarchyView.cpp | 16 +- src/tool/UIE/HierarchyView.h | 6 +- src/tool/UIE/MainFrm.cpp | 4 +- src/tool/UIE/PropertyView.cpp | 148 +- src/tool/UIE/PropertyView.h | 30 +- src/tool/UIE/TexViewer.cpp | 86 +- src/tool/UIE/TexViewer.h | 64 +- src/tool/UIE/UIE.cpp | 2 +- src/tool/UIE/UIE.rc | Bin 24430 -> 46264 bytes src/tool/UIE/UIE.vcxproj.filters | 2 +- src/tool/UIE/UIE.vcxproj.user | 2 +- src/tool/UIE/UIEDoc.cpp | 216 +- src/tool/UIE/UIEDoc.h | 6 +- src/tool/UIE/UIEView.cpp | 44 +- src/tool/UIE/UIEView.h | 36 +- src/tool/UIE/res/UIE.rc2 | Bin 382 -> 766 bytes src/tool/Widget/PropertyList.cpp | 20 +- src/tool/Widget/PropertyList.h | 6 +- 671 files changed, 15818 insertions(+), 15812 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..edcba996 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +* text=auto +*.rc text working-tree-encoding=UTF-16 +*.rc2 text working-tree-encoding=UTF-16 diff --git a/src/All.sln b/src/All.sln index a1dd1736..71bbfbfa 100644 --- a/src/All.sln +++ b/src/All.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.2.32630.192 diff --git a/src/Game.sln b/src/Game.sln index 8a334e6d..067ebd50 100644 --- a/src/Game.sln +++ b/src/Game.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.2.32616.157 diff --git a/src/Server.sln b/src/Server.sln index c3b7c021..050c67e4 100644 --- a/src/Server.sln +++ b/src/Server.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.2.32616.157 diff --git a/src/Tool.sln b/src/Tool.sln index b4fc3903..5535333c 100644 --- a/src/Tool.sln +++ b/src/Tool.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.2.32616.157 diff --git a/src/engine/N3Base/BitMapFile.cpp b/src/engine/N3Base/BitMapFile.cpp index 2abd342f..335b5ec0 100644 --- a/src/engine/N3Base/BitMapFile.cpp +++ b/src/engine/N3Base/BitMapFile.cpp @@ -21,50 +21,50 @@ CBitMapFile::~CBitMapFile() { void CBitMapFile::Release() { memset(&m_bmfHeader, 0, sizeof(m_bmfHeader)); memset(&m_bmInfoHeader, 0, sizeof(m_bmInfoHeader)); - ::GlobalFree(m_pPixels); // ȼ + ::GlobalFree(m_pPixels); // 실제 픽셀 데이터 m_pPixels = NULL; } bool CBitMapFile::Load(HANDLE hFile) { - this->Release(); // ϴ ϰ.. + this->Release(); // 일단 다 해제하고.. DWORD dwRWC = 0; - // б + // 파일 헤더 읽기 ReadFile(hFile, &m_bmfHeader, sizeof(m_bmfHeader), &dwRWC, NULL); - // bmp Ÿ "BM"Ŀ Ȯ + // bmp 파일임을 나타내는 "BM"마커 확인 if (m_bmfHeader.bfType != 0x4D42) { - MessageBox(::GetActiveWindow(), " bitmap ƴմϴ.", "error", MB_OK); + MessageBox(::GetActiveWindow(), "원본 파일이 bitmap파일이 아닙니다.", "error", MB_OK); return FALSE; } - // BITMAPINFOHEADER + // BITMAPINFOHEADER 얻기 ReadFile(hFile, &m_bmInfoHeader, sizeof(m_bmInfoHeader), &dwRWC, NULL); - // ȼ Ʈ Ȯ + // 픽셀당 비트 수 확인 WORD wBitCount = m_bmInfoHeader.biBitCount; if (24 != wBitCount || m_bmInfoHeader.biWidth <= 0 || - m_bmInfoHeader.biHeight <= 0) // 24Ʈ bmp ƴϸ return . + m_bmInfoHeader.biHeight <= 0) // 24비트 bmp가 아니면 return해 버린다. { - MessageBox(::GetActiveWindow(), " bitmap ʺ, ̿ ̻ ְų 24bit ƴմϴ.", "error", + MessageBox(::GetActiveWindow(), "원본 bitmap이 너비, 높이에 이상이 있거나 24bit파일이 아닙니다.", "error", NULL); return FALSE; } - // ̹ ޸𸮻 (24bit) + // 실제 이미지의 메모리상에 잡힌 가로 길이 (24bit) int iRealWidth = ((int)((m_bmInfoHeader.biWidth * 3 + 3) / 4)) * 4; - // ̹ ޸ Ҵ + // 새로 만들 이미지 메모리 할당 int iDIBSize = iRealWidth * m_bmInfoHeader.biHeight; if ((m_pPixels = ::GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, iDIBSize)) == NULL) { - MessageBox(::GetActiveWindow(), "޸𸮸 Ҵ ߽ϴ.", "error", MB_OK); + MessageBox(::GetActiveWindow(), "메모리를 할당하지 못했습니다.", "error", MB_OK); return FALSE; } - // ȼ д´.. - for (int y = m_bmInfoHeader.biHeight - 1; y >= 0; y--) // Ʈ Ʒ Ųٷ ִ.. + // 픽셀을 읽는다.. + for (int y = m_bmInfoHeader.biHeight - 1; y >= 0; y--) // 비트맵은 위아래가 거꾸로 있다.. { ReadFile(hFile, (BYTE *)m_pPixels + y * iRealWidth, iRealWidth, &dwRWC, NULL); } @@ -85,17 +85,17 @@ void * CBitMapFile::Pixels(int x, int y) { bool CBitMapFile::Save(HANDLE hFile) { DWORD dwRWC = 0; - // + // 파일 헤더 쓰기 WriteFile(hFile, &m_bmfHeader, sizeof(m_bmfHeader), &dwRWC, NULL); - // BITMAPINFOHEADER + // BITMAPINFOHEADER 쓰기 WriteFile(hFile, &m_bmInfoHeader, sizeof(m_bmInfoHeader), &dwRWC, NULL); - // ̹ ޸𸮻 (24bit) + // 실제 이미지의 메모리상에 잡힌 가로 길이 (24bit) int iRealWidth = this->Pitch(); - // ȼ Ѵ... - for (int y = m_bmInfoHeader.biHeight - 1; y >= 0; y--) // Ʈ Ʒ Ųٷ ִ.. + // 픽셀을 저장한다... + for (int y = m_bmInfoHeader.biHeight - 1; y >= 0; y--) // 비트맵은 위아래가 거꾸로 있다.. { WriteFile(hFile, (BYTE *)m_pPixels + y * iRealWidth, iRealWidth, &dwRWC, NULL); } @@ -131,30 +131,30 @@ bool CBitMapFile::SaveRectToFile(const std::string & szFN, RECT rc) { int nHeight = rc.bottom - rc.top; if (nWidth <= 0 || nHeight <= 0) { - MessageBox(::GetActiveWindow(), " ΰ 0 bitmap Ҽ ϴ.", "error", MB_OK); + MessageBox(::GetActiveWindow(), "가로 세로가 0이하인 bitmap으로 저장할수 없습니다.", "error", MB_OK); return FALSE; } DWORD dwRWC = 0; HANDLE hFile = ::CreateFile(szFN.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - // + // 쓰기 모드로 파일 열기 if (INVALID_HANDLE_VALUE == hFile) { - MessageBox(::GetActiveWindow(), " bitmap ϴ.", "error", MB_OK); + MessageBox(::GetActiveWindow(), "원본 bitmap을 열 수 없습니다.", "error", MB_OK); return false; } - // ̹ ޸𸮻 (24bit) + // 실제 이미지의 메모리상에 잡힌 가로 길이 (24bit) int iRealWidthDest = ((int)((nWidth * 3 + 3) / 4)) * 4; int iDestDIBSize = sizeof(BITMAPINFOHEADER) + iRealWidthDest * nHeight; - // ̹ file header ä + // 새로 만들 이미지 file header 정보 채우기 BITMAPFILEHEADER bmfHeaderDest = m_bmfHeader; bmfHeaderDest.bfType = 0x4D42; // "BM" bmfHeaderDest.bfSize = sizeof(bmfHeaderDest) + iDestDIBSize; bmfHeaderDest.bfOffBits = sizeof(bmfHeaderDest) + sizeof(BITMAPINFOHEADER); - // ̹ bitmap info header ä + // 새로 만들 이미지 bitmap info header 정보 채우기 BITMAPINFOHEADER bmInfoHeaderDest = m_bmInfoHeader; bmInfoHeaderDest.biSize = sizeof(bmInfoHeaderDest); bmInfoHeaderDest.biWidth = nWidth; @@ -162,17 +162,17 @@ bool CBitMapFile::SaveRectToFile(const std::string & szFN, RECT rc) { bmInfoHeaderDest.biPlanes = 1; bmInfoHeaderDest.biSizeImage = iRealWidthDest * nHeight; - // + // 파일 헤더 쓰기 WriteFile(hFile, &bmfHeaderDest, sizeof(bmfHeaderDest), &dwRWC, NULL); - // BITMAPINFOHEADER + // BITMAPINFOHEADER 쓰기 WriteFile(hFile, &bmInfoHeaderDest, sizeof(bmInfoHeaderDest), &dwRWC, NULL); - // ȼ Ѵ... + // 픽셀을 저장한다... int iRealWidth = ((int)((m_bmInfoHeader.biWidth * 3 + 3) / 4)) * 4; for (int y = rc.bottom - 1; y >= rc.top; y--) { void * pPixelDest = ((uint8_t *)m_pPixels) + iRealWidth * y + (rc.left * 3); - WriteFile(hFile, pPixelDest, iRealWidthDest, &dwRWC, NULL); // .. + WriteFile(hFile, pPixelDest, iRealWidthDest, &dwRWC, NULL); // 라인 쓰기.. } CloseHandle(hFile); @@ -220,28 +220,28 @@ bool CBitMapFile::Create(int nWidth, int nHeight, int nBPP) { if (nWidth <= 0 || nHeight <= 0) { return false; } - this->Release(); // ϴ ϰ.. + this->Release(); // 일단 다 해제하고.. if (24 != nBPP) { return FALSE; } - int iRealWidth = ((nWidth * 3 + 3) / 4) * 4; // ̹ ޸𸮻 (24bit) - int iDIBSize = iRealWidth * nHeight; // ̹ ޸ Ҵ + int iRealWidth = ((nWidth * 3 + 3) / 4) * 4; // 실제 이미지의 메모리상에 잡힌 가로 길이 (24bit) + int iDIBSize = iRealWidth * nHeight; // 새로 만들 이미지 메모리 할당 if ((m_pPixels = ::GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, iDIBSize)) == NULL) { - MessageBox(::GetActiveWindow(), "޸𸮸 Ҵ ߽ϴ.", "error", MB_OK); + MessageBox(::GetActiveWindow(), "메모리를 할당하지 못했습니다.", "error", MB_OK); return FALSE; } memset(m_pPixels, 0, iDIBSize); - // ̹ file header ä + // 새로 만들 이미지 file header 정보 채우기 m_bmfHeader.bfType = 0x4D42; // "BM" m_bmfHeader.bfSize = sizeof(m_bmfHeader) + iDIBSize; m_bmfHeader.bfOffBits = sizeof(m_bmfHeader) + sizeof(BITMAPINFOHEADER); - // ̹ bitmap info header ä + // 새로 만들 이미지 bitmap info header 정보 채우기 m_bmInfoHeader.biSize = sizeof(m_bmInfoHeader); m_bmInfoHeader.biWidth = nWidth; m_bmInfoHeader.biHeight = nHeight; diff --git a/src/engine/N3Base/BitMapFile.h b/src/engine/N3Base/BitMapFile.h index 296b5cb0..039d04b0 100644 --- a/src/engine/N3Base/BitMapFile.h +++ b/src/engine/N3Base/BitMapFile.h @@ -10,8 +10,8 @@ class CBitMapFile { BITMAPINFOHEADER m_bmInfoHeader; public: - void * m_pPixels; // ȼ - int Pitch() { return ((int)((m_bmInfoHeader.biWidth * 3 + 3) / 4)) * 4; } // Ʈ ʺ(byte ).. + void * m_pPixels; // 실제 픽셀 데이터 + int Pitch() { return ((int)((m_bmInfoHeader.biWidth * 3 + 3) / 4)) * 4; } // 비트맵의 실제 너비(byte 단위).. bool Create(int nWidth, int nHeight, int nBPP = 24); bool SaveRectToFile(const std::string & szFN, RECT rc); void * Pixels(int x = 0, int y = 0); diff --git a/src/engine/N3Base/DFont.cpp b/src/engine/N3Base/DFont.cpp index c86ef10c..d6f10e97 100644 --- a/src/engine/N3Base/DFont.cpp +++ b/src/engine/N3Base/DFont.cpp @@ -18,9 +18,9 @@ HFONT CDFont::s_hFontOld = NULL; CDFont::CDFont(const std::string & szFontName, DWORD dwHeight, DWORD dwFlags) { if (0 == s_iInstanceCount) { s_hDC = CreateCompatibleDC(NULL); - // ӽ Ʈ s_hFontOld ´. + // 임시 폰트를 만들고 s_hFontOld를 얻는다. HFONT hFont = CreateFont(0, 0, 0, 0, 0, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, VARIABLE_PITCH, ""); + CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, VARIABLE_PITCH, "굴림"); if (hFont) { s_hFontOld = (HFONT)(SelectObject(s_hDC, hFont)); SelectObject(s_hDC, s_hFontOld); @@ -193,7 +193,7 @@ HRESULT CDFont::SetText(const std::string & szText, DWORD dwFlags) { int iStrLen = szText.size(); HRESULT hr; - // \n ٷ  ϱ + // \n을 빼고 한줄로 만들어서 글자 길이 계산하기 int iCount = 0; int iTempCount = 0; SIZE size; @@ -202,26 +202,26 @@ HRESULT CDFont::SetText(const std::string & szText, DWORD dwFlags) { while (iCount < iStrLen) { if ('\n' == szText[iCount]) { // \n ++iCount; - } else if (0x80 & szText[iCount]) { // 2BYTE - if ((iCount + 2) > iStrLen) { // ̻ ڿ̴.. - // __ASSERT(0, "̻ ڿ̴.!!!"); + } else if (0x80 & szText[iCount]) { // 2BYTE 문자 + if ((iCount + 2) > iStrLen) { // 이상한 문자열이다.. + // __ASSERT(0, "이상한 문자열이다.!!!"); break; } else { memcpy(&(szTemp[iTempCount]), &(szText[iCount]), 2); iTempCount += 2; iCount += 2; } - } else { // 1BYTE + } else { // 1BYTE 문자 memcpy(&(szTemp[iTempCount]), &(szText[iCount]), 1); ++iTempCount; ++iCount; } - __ASSERT(iCount <= iStrLen, "??"); // ̻ ڰ + __ASSERT(iCount <= iStrLen, "??"); // 이상한 문자가 들어왔을 경우 } // szTemp[iTempCount] = 0x00; - // ؽ ϱ + // 텍스쳐 사이즈 결정하기 SelectObject(s_hDC, m_hFont); GetTextExtentPoint32(s_hDC, szTemp.c_str(), szTemp.size(), &size); szTemp = ""; @@ -232,8 +232,8 @@ HRESULT CDFont::SetText(const std::string & szText, DWORD dwFlags) { } int iExtent = size.cx * size.cy; - SIZE size2; // ѱ ݱ ũ.. - GetTextExtentPoint32(s_hDC, "", lstrlen(""), &size2); + SIZE size2; // 한글 반글자의 크기.. + GetTextExtentPoint32(s_hDC, "진", lstrlen("진"), &size2); size2.cx = ((size2.cx / 2) + (size2.cx % 2)); int iTexSizes[7] = {32, 64, 128, 256, 512, 1024, 2048}; @@ -257,7 +257,7 @@ HRESULT CDFont::SetText(const std::string & szText, DWORD dwFlags) { m_dwTexWidth = m_dwTexHeight = d3dCaps.MaxTextureWidth; } - // ؽ ũⰡ ؽ ũ ٸ ٽ . + // 기존 텍스쳐 크기가 새로 만들 텍스쳐 크기와 다를 경우 다시 만든다. if (m_pTexture) { D3DSURFACE_DESC sd; ZeroMemory(&sd, sizeof(sd)); @@ -272,7 +272,7 @@ HRESULT CDFont::SetText(const std::string & szText, DWORD dwFlags) { if (NULL == m_pTexture) { int iMipMapCount = 1; if (dwFlags & D3DFONT_FILTERED) { - iMipMapCount = 0; // ͸ ؽƮ Ӹ .. + iMipMapCount = 0; // 필터링 텍스트는 밉맵을 만든다.. } hr = m_pd3dDevice->CreateTexture(m_dwTexWidth, m_dwTexHeight, iMipMapCount, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, @@ -297,7 +297,7 @@ HRESULT CDFont::SetText(const std::string & szText, DWORD dwFlags) { HBITMAP hbmBitmap = CreateDIBSection(s_hDC, &bmi, DIB_RGB_COLORS, (VOID **)&pBitmapBits, NULL, 0); if (NULL == hbmBitmap) { - __ASSERT(0, "CreateDIBSection "); + __ASSERT(0, "CreateDIBSection 실패"); if (m_pTexture) { m_pTexture->Release(); m_pTexture = NULL; @@ -315,7 +315,7 @@ HRESULT CDFont::SetText(const std::string & szText, DWORD dwFlags) { // Loop through all printable character and output them to the bitmap.. // Meanwhile, keep track of the corresponding tex coords for each character. - // ۾ ۾ Ƕ + // 글씨 찍기 및 글씨 찍을 판떼기 만들기 if (m_Is2D) { Make2DVertex(size.cy, szText); } else { @@ -343,11 +343,11 @@ HRESULT CDFont::SetText(const std::string & szText, DWORD dwFlags) { // Done updating texture, so clean up used objects m_pTexture->UnlockRect(0); - ::SelectObject(s_hDC, hObjPrev); // ݵ ǰ ؾ.. - DeleteObject(hbmBitmap); // .. + ::SelectObject(s_hDC, hObjPrev); // 반드시 전의걸 선택해야.. + DeleteObject(hbmBitmap); // 제대로 지워진다.. //////////////////////////////////////////////////////////// - // ͸ ؽó... MipMap .. + // 필터링 텍스처는... MipMap 만든다.. if (dwFlags & D3DFONT_FILTERED) { int iMMC = m_pTexture->GetLevelCount(); for (int i = 1; i < iMMC; i++) { @@ -358,7 +358,7 @@ HRESULT CDFont::SetText(const std::string & szText, DWORD dwFlags) { if (lpSurfSrc && lpSurfDest) { ::D3DXLoadSurfaceFromSurface(lpSurfDest, NULL, NULL, lpSurfSrc, NULL, NULL, D3DX_FILTER_TRIANGLE, - 0); // ǽ + 0); // 서피스 복사 } if (lpSurfSrc) { @@ -369,7 +369,7 @@ HRESULT CDFont::SetText(const std::string & szText, DWORD dwFlags) { } } } - // ͸ ؽó... MipMap .. + // 필터링 텍스처는... MipMap 만든다.. //////////////////////////////////////////////////////////// return S_OK; @@ -399,17 +399,17 @@ void CDFont::Make2DVertex(const int iFontHeight, const std::string & szText) { int iTempCount = 0; char szTempChar[3] = ""; - DWORD dwColor = 0xffffffff; // Ʈ + DWORD dwColor = 0xffffffff; // 폰트의 색 m_dwFontColor = 0xffffffff; SIZE size; - float fMaxX = 0.0f, fMaxY = 0.0f; // ۾ ִ ּҰ ϱ ؼ. + float fMaxX = 0.0f, fMaxY = 0.0f; // 글씨가 찍히는 범위의 최대 최소값을 조사하기 위해서. while (iCount < iStrLen) { if ('\n' == szText[iCount]) { // \n ++iCount; - // vertex + // vertex 만들기 if (sx != x) { FLOAT tx1 = ((FLOAT)(sx)) / m_dwTexWidth; FLOAT ty1 = ((FLOAT)(y)) / m_dwTexHeight; @@ -419,7 +419,7 @@ void CDFont::Make2DVertex(const int iFontHeight, const std::string & szText) { FLOAT w = (tx2 - tx1) * m_dwTexWidth / m_fTextScale; FLOAT h = (ty2 - ty1) * m_dwTexHeight / m_fTextScale; - __ASSERT(dwNumTriangles + 2 < MAX_NUM_VERTICES, "??"); // Vertex buffer ڶ. + __ASSERT(dwNumTriangles + 2 < MAX_NUM_VERTICES, "??"); // Vertex buffer가 모자란다. if (dwNumTriangles + 2 >= MAX_NUM_VERTICES) { break; } @@ -450,16 +450,16 @@ void CDFont::Make2DVertex(const int iFontHeight, const std::string & szText) { fMaxY = fBottom; } } - // ȭ ٷ ѱ + // 화면의 다음 줄로 넘기기 sx = x; vtx_sx = 0; vtx_sy = vtx_sy + ((float)(iFontHeight)) / m_fTextScale; continue; - } else if (0x80 & szText[iCount]) { // 2BYTE + } else if (0x80 & szText[iCount]) { // 2BYTE 문자 memcpy(szTempChar, &(szText[iCount]), 2); iCount += 2; szTempChar[2] = 0x00; - } else { // 1BYTE + } else { // 1BYTE 문자 memcpy(szTempChar, &(szText[iCount]), 1); iCount += 1; szTempChar[1] = 0x00; @@ -467,8 +467,8 @@ void CDFont::Make2DVertex(const int iFontHeight, const std::string & szText) { SelectObject(s_hDC, m_hFont); GetTextExtentPoint32(s_hDC, szTempChar, lstrlen(szTempChar), &size); - if ((x + size.cx) > m_dwTexWidth) { // vertex ٷ ѱ.. - // vertex + if ((x + size.cx) > m_dwTexWidth) { // vertex 만들고 다음 줄로 넘기기.. + // vertex 만들기 if (sx != x) { FLOAT tx1 = ((FLOAT)(sx)) / m_dwTexWidth; FLOAT ty1 = ((FLOAT)(y)) / m_dwTexHeight; @@ -478,7 +478,7 @@ void CDFont::Make2DVertex(const int iFontHeight, const std::string & szText) { FLOAT w = (tx2 - tx1) * m_dwTexWidth / m_fTextScale; FLOAT h = (ty2 - ty1) * m_dwTexHeight / m_fTextScale; - __ASSERT(dwNumTriangles + 2 < MAX_NUM_VERTICES, "??"); // Vertex buffer ڶ. + __ASSERT(dwNumTriangles + 2 < MAX_NUM_VERTICES, "??"); // Vertex buffer가 모자란다. if (dwNumTriangles + 2 >= MAX_NUM_VERTICES) { break; } @@ -508,7 +508,7 @@ void CDFont::Make2DVertex(const int iFontHeight, const std::string & szText) { fMaxY = fBottom; } - // ؽ ٷ ѱ + // 텍스쳐의 다음 줄로 넘기기 x = sx = 0; y += iFontHeight; vtx_sx = vtx_sx + w; @@ -518,13 +518,13 @@ void CDFont::Make2DVertex(const int iFontHeight, const std::string & szText) { } } - // dc + // dc에 찍기 SelectObject(s_hDC, m_hFont); ExtTextOut(s_hDC, x, y, ETO_OPAQUE, NULL, szTempChar, lstrlen(szTempChar), NULL); x += size.cx; } - // vertex + // 마지막 남은 vertex 만들기 if (sx != x) { FLOAT tx1 = ((FLOAT)(sx)) / m_dwTexWidth; FLOAT ty1 = ((FLOAT)(y)) / m_dwTexHeight; @@ -534,7 +534,7 @@ void CDFont::Make2DVertex(const int iFontHeight, const std::string & szText) { FLOAT w = (tx2 - tx1) * m_dwTexWidth / m_fTextScale; FLOAT h = (ty2 - ty1) * m_dwTexHeight / m_fTextScale; - __ASSERT(dwNumTriangles + 2 < MAX_NUM_VERTICES, "??"); // Vertex buffer ڶ. + __ASSERT(dwNumTriangles + 2 < MAX_NUM_VERTICES, "??"); // Vertex buffer가 모자란다. FLOAT fLeft = vtx_sx + 0 - 0.5f; FLOAT fRight = vtx_sx + w - 0.5f; @@ -578,7 +578,7 @@ void CDFont::Make3DVertex(const int iFontHeight, const std::string & szText, DWO int iStrLen = szText.size(); - // ӽ vertex buffer ֱ + // 임시 vertex buffer에 넣기 __VertexXyzColorT1 TempVertices[MAX_NUM_VERTICES]; __VertexXyzColorT1 * pVertices = TempVertices; DWORD dwNumTriangles = 0; @@ -594,14 +594,14 @@ void CDFont::Make3DVertex(const int iFontHeight, const std::string & szText, DWO char szTempChar[3] = ""; SIZE size; - float fMaxX = 0.0f, fMaxY = 0.0f; // ۾ ִ ּҰ ϱ ؼ. + float fMaxX = 0.0f, fMaxY = 0.0f; // 글씨가 찍히는 범위의 최대 최소값을 조사하기 위해서. while (iCount < iStrLen) { if ('\n' == szText[iCount]) // \n { ++iCount; - // vertex + // vertex 만들기 if (sx != x) { FLOAT tx1 = ((FLOAT)(sx)) / m_dwTexWidth; FLOAT ty1 = ((FLOAT)(y)) / m_dwTexHeight; @@ -611,7 +611,7 @@ void CDFont::Make3DVertex(const int iFontHeight, const std::string & szText, DWO FLOAT w = (tx2 - tx1) * m_dwTexWidth / m_fTextScale; FLOAT h = (ty2 - ty1) * m_dwTexHeight / m_fTextScale; - __ASSERT(dwNumTriangles + 2 < MAX_NUM_VERTICES, "??"); // Vertex buffer ڶ. + __ASSERT(dwNumTriangles + 2 < MAX_NUM_VERTICES, "??"); // Vertex buffer가 모자란다. if (dwNumTriangles + 2 >= MAX_NUM_VERTICES) { break; } @@ -641,17 +641,17 @@ void CDFont::Make3DVertex(const int iFontHeight, const std::string & szText, DWO fMaxY = (-fBottom); } } - // ȭ ٷ ѱ + // 화면의 다음 줄로 넘기기 sx = x; vtx_sx = 0; vtx_sy = vtx_sy - ((float)(iFontHeight)) / m_fTextScale; continue; - } else if (0x80 & szText[iCount]) // 2BYTE + } else if (0x80 & szText[iCount]) // 2BYTE 문자 { memcpy(szTempChar, &(szText[iCount]), 2); iCount += 2; szTempChar[2] = 0x00; - } else // 1BYTE + } else // 1BYTE 문자 { memcpy(szTempChar, &(szText[iCount]), 1); iCount += 1; @@ -660,8 +660,8 @@ void CDFont::Make3DVertex(const int iFontHeight, const std::string & szText, DWO SelectObject(s_hDC, m_hFont); GetTextExtentPoint32(s_hDC, szTempChar, lstrlen(szTempChar), &size); - if ((x + size.cx) > m_dwTexWidth) { // vertex ٷ ѱ.. - // vertex + if ((x + size.cx) > m_dwTexWidth) { // vertex 만들고 다음 줄로 넘기기.. + // vertex 만들기 if (sx != x) { FLOAT tx1 = ((FLOAT)(sx)) / m_dwTexWidth; FLOAT ty1 = ((FLOAT)(y)) / m_dwTexHeight; @@ -671,7 +671,7 @@ void CDFont::Make3DVertex(const int iFontHeight, const std::string & szText, DWO FLOAT w = (tx2 - tx1) * m_dwTexWidth / m_fTextScale; FLOAT h = (ty2 - ty1) * m_dwTexHeight / m_fTextScale; - __ASSERT(dwNumTriangles + 2 < MAX_NUM_VERTICES, "??"); // Vertex buffer ڶ. + __ASSERT(dwNumTriangles + 2 < MAX_NUM_VERTICES, "??"); // Vertex buffer가 모자란다. if (dwNumTriangles + 2 >= MAX_NUM_VERTICES) { break; } @@ -700,7 +700,7 @@ void CDFont::Make3DVertex(const int iFontHeight, const std::string & szText, DWO fMaxY = (-fBottom); } - // ؽ ٷ ѱ + // 텍스쳐의 다음 줄로 넘기기 x = sx = 0; y += iFontHeight; vtx_sx = vtx_sx + w; @@ -710,13 +710,13 @@ void CDFont::Make3DVertex(const int iFontHeight, const std::string & szText, DWO } } - // dc + // dc에 찍기 SelectObject(s_hDC, m_hFont); ExtTextOut(s_hDC, x, y, ETO_OPAQUE, NULL, szTempChar, lstrlen(szTempChar), NULL); x += size.cx; } - // vertex + // 마지막 남은 vertex 만들기 if (sx != x) { FLOAT tx1 = ((FLOAT)(sx)) / m_dwTexWidth; FLOAT ty1 = ((FLOAT)(y)) / m_dwTexHeight; @@ -726,7 +726,7 @@ void CDFont::Make3DVertex(const int iFontHeight, const std::string & szText, DWO FLOAT w = (tx2 - tx1) * m_dwTexWidth / m_fTextScale; FLOAT h = (ty2 - ty1) * m_dwTexHeight / m_fTextScale; - __ASSERT(dwNumTriangles + 2 < MAX_NUM_VERTICES, "??"); // Vertex buffer ڶ. + __ASSERT(dwNumTriangles + 2 < MAX_NUM_VERTICES, "??"); // Vertex buffer가 모자란다. FLOAT fLeft = vtx_sx + 0; FLOAT fRight = vtx_sx + w; @@ -753,9 +753,9 @@ void CDFont::Make3DVertex(const int iFontHeight, const std::string & szText, DWO } } - if (dwFlags & D3DFONT_CENTERED) //  ̸ vertexǥ  ؼ ijֱ + if (dwFlags & D3DFONT_CENTERED) // 가운데 정렬이면 vertex좌표를 가운데로 계산해서 고쳐넣기 { - // ã.. + // 제일 긴 줄 찾기.. int iRectangleCount = dwNumTriangles / 2; int iContinueCount = 1; @@ -769,10 +769,10 @@ void CDFont::Make3DVertex(const int iFontHeight, const std::string & szText, DWO fCY = TempVertices[iCount * 6].y; while (iCount + iContinueCount < iRectangleCount) { - if (TempVertices[(iCount + iContinueCount) * 6].y == fCY) { // 簢 ̴. + if (TempVertices[(iCount + iContinueCount) * 6].y == fCY) { // 다음 사각형과 같은 줄이다. fCX = TempVertices[(iCount + iContinueCount) * 6 + 3].x; ++iContinueCount; - } else { // 簢 ٸ ̴. + } else { // 다음 사각형과 다른 줄이다. break; } } @@ -787,14 +787,14 @@ void CDFont::Make3DVertex(const int iFontHeight, const std::string & szText, DWO } } - // Vertex buffer ű. + // Vertex buffer로 옮기기. // lock vertex buffer m_pVB->Lock(0, 0, (VOID **)&pVertices, 0); iCount = dwNumTriangles * 3; for (int i = 0; i < iCount; ++i) { - TempVertices[i].x /= ((float)m_dwFontHeight); // ũ ̱ - TempVertices[i].y /= ((float)m_dwFontHeight); // ũ ̱ + TempVertices[i].x /= ((float)m_dwFontHeight); // 일정 크기로 줄이기 + TempVertices[i].y /= ((float)m_dwFontHeight); // 일정 크기로 줄이기 *pVertices++ = TempVertices[i]; } @@ -820,7 +820,7 @@ HRESULT CDFont::DrawText(FLOAT sx, FLOAT sy, DWORD dwColor, DWORD dwFlags, FLOAT return E_FAIL; } - // ġ + // 위치 색 조정 D3DXVECTOR2 vDiff = D3DXVECTOR2(sx, sy) - m_PrevLeftTop; if (fabs(vDiff.x) > 0.5f || fabs(vDiff.y) > 0.5f || dwColor != m_dwFontColor) { // lock vertex buffer @@ -851,7 +851,7 @@ HRESULT CDFont::DrawText(FLOAT sx, FLOAT sy, DWORD dwColor, DWORD dwFlags, FLOAT } } - // if (fZ != 1.0f) { // Z 1.0f ٲپش. + // if (fZ != 1.0f) { // Z값이 1.0f 가 들어오지 않으면 바꾸어준다. // for (int i = 0; i < iVC; ++i) { // pVertices[i].z = fZ; // } @@ -894,7 +894,7 @@ HRESULT CDFont::DrawText(FLOAT sx, FLOAT sy, DWORD dwColor, DWORD dwFlags, FLOAT m_pd3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); } // } - // else if ( D3DZB_TRUE != dwZEnable) m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE ); // fZ 1.0 ƴϸ z Ѱ ׸. + // else if ( D3DZB_TRUE != dwZEnable) m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE ); // fZ가 1.0이 아니면 z 버퍼 켜고 그린다. if (FALSE != dwFog) { m_pd3dDevice->SetRenderState(D3DRS_FOGENABLE, FALSE); } @@ -1233,7 +1233,7 @@ void CDFont::AddToAlphaManager(DWORD dwColor, float fDist, __Matrix44 & mtxWorld dwFVF = FVF_TRANSFORMED; dwFVFSize = sizeof(__VertexTransformed); - // ġ + // 위치 색 조정 D3DXVECTOR2 vDiff = D3DXVECTOR2(mtxWorld._41, mtxWorld._42) - m_PrevLeftTop; if (fabs(vDiff.x) > 0.5f || fabs(vDiff.y) > 0.5f || dwColor != m_dwFontColor) { // lock vertex buffer @@ -1264,7 +1264,7 @@ void CDFont::AddToAlphaManager(DWORD dwColor, float fDist, __Matrix44 & mtxWorld } } - // if (fZ != 1.0f) { // Z 1.0f ٲپش. + // if (fZ != 1.0f) { // Z값이 1.0f 가 들어오지 않으면 바꾸어준다. // for (int i = 0; i < iVC; ++i) { // pVertices[i].z = fZ; // } @@ -1291,6 +1291,6 @@ void CDFont::AddToAlphaManager(DWORD dwColor, float fDist, __Matrix44 & mtxWorld pAP->MtxWorld = mtxWorld; if (!(dwFlags & D3DFONT_FILTERED)) { - pAP->nRenderFlags |= RF_POINTSAMPLING; // ͸ ؽƮ ʴ´. + pAP->nRenderFlags |= RF_POINTSAMPLING; // 필터링 텍스트를 쓰지 않는다. } } \ No newline at end of file diff --git a/src/engine/N3Base/DFont.h b/src/engine/N3Base/DFont.h index b4768107..0e05dca2 100644 --- a/src/engine/N3Base/DFont.h +++ b/src/engine/N3Base/DFont.h @@ -1,11 +1,11 @@ // DFont.h: interface for the CDFont class. -// -// 1. SetTextԼ 귮 .(۾ ٲܶ θ(߿)) -// 2. DrawText Լ 2d ׷ش. -// 3. DrawText3D Լ 3d ׸ Ѵ.(SetTextԼ 3D Ѵ.) -// : Ƕ⸦ 50ۿ Ѵ.( ̻ Ϸ MAX_NUM_VERTICES ָ ȴ.) -// 4. InvalidateDeviceObjects(); ȣ ٽ ۾ ٽ SetTextԼ ȣ Ѵ. -// 5. 3D ۾  ؼ SetTextԼ ι° ĶͿ (D3DFONT_3D|D3DFONT_CENTERED) ־ش. +// 사용법 및 사용제한 +// 1. SetText함수는 계산량이 많다.(글씨를 바꿀때만 부르자(중요)) +// 2. DrawText 함수는 2d평면상에 그려준다. +// 3. DrawText3D 함수는 3d로 그릴때 사용한다.(SetText함수에서 3D라고 명시해줘야 한다.) +// 제한 : 판때기를 현재 50개밖에 생성하지 못한다.(이 이상 나오게 하려면 MAX_NUM_VERTICES 를 고쳐주면 된다.) +// 4. InvalidateDeviceObjects();를 호출한후 다시 글씨를 쓰려면 다시 SetText함수를 호출해줘야 한다. +// 5. 3D공간상에 글씨를 찍을때 가운데 정렬해서 찍고 싶으면 SetText함수에 두번째 파라미터에 (D3DFONT_3D|D3DFONT_CENTERED)를 넣어준다. ////////////////////////////////////////////////////////////////////// #pragma warning(disable : 4786) @@ -26,11 +26,11 @@ #define D3DFONT_3D 0x0008 // 3D text // set text flag -#define D3DFONT_CENTERED 0x0004 // 3D font.. +#define D3DFONT_CENTERED 0x0004 // 3D font에서만.. -// Font rendering flags (drawtext or DrawText3D Լ flag) -#define D3DFONT_TWOSIDED 0x0010 // 3D font.. -#define D3DFONT_FILTERED 0x0020 // texture D3DSAMP_MAGFILTER +// Font rendering flags (drawtext or DrawText3D 함수에서 쓰는 flag) +#define D3DFONT_TWOSIDED 0x0010 // 3D font에서만.. +#define D3DFONT_FILTERED 0x0020 // texture를 D3DSAMP_MAGFILTER 로 찍기 class CDFont : public CN3Base { public: @@ -60,17 +60,17 @@ class CDFont : public CN3Base { LPDIRECT3DVERTEXBUFFER9 m_pVB; // VertexBuffer for rendering text DWORD m_dwTexWidth; // Texture dimensions DWORD m_dwTexHeight; // Texture dimensions - FLOAT m_fTextScale; // Ʈ ʹ Ŭ ī忡 - // texture ũ Ѿ - // ̷ Scale ̿Ͽ ũ ÷ ´. + FLOAT m_fTextScale; // 쓸 폰트가 너무 클경우 비디오 카드에 + // 따른 texture 크기 제한을 넘어버리기 때문에 + // 이런 경우 Scale을 이용하여 크게 늘려 찍는다. // HDC m_hDC; // DC handle HFONT m_hFont; // Font handle - UINT m_iPrimitiveCount; // ۾ - D3DXVECTOR2 m_PrevLeftTop; // DrawText ġ Ǿ - DWORD m_dwFontColor; // ۾ - BOOL m_Is2D; // 2D Textΰ? - SIZE m_Size; // ۾ ϴ ũ(pixel, ) + UINT m_iPrimitiveCount; // 글씨 찍을 판의 갯수 + D3DXVECTOR2 m_PrevLeftTop; // DrawText의 경우 찍는 곳의 위치가 변경되었을때를 위한 변수 + DWORD m_dwFontColor; // 글씨 색 + BOOL m_Is2D; // 2D Text인가? + SIZE m_Size; // 쓴 글씨들이 차지하는 크기(pixel단위, 가로 세로) // Operations public: @@ -81,24 +81,24 @@ class CDFont : public CN3Base { return false; } void AddToAlphaManager(DWORD dwColor, float fDist, __Matrix44 & mtxWorld, DWORD dwFlags); - HRESULT SetFontColor(DWORD dwColor); // ۾ ٲ۴. - HRESULT InitDeviceObjects(LPDIRECT3DDEVICE9 pd3dDevice); // d3d device ִ ʱȭ Լ (InitҶ ȣ) - HRESULT RestoreDeviceObjects(); // resource ޸𸮿 ϴ ʱȭ Լ (InitҶ ȣ) - HRESULT InvalidateDeviceObjects(); // resource ȿȭŰ Լ (releaseҶ ȣ) - HRESULT DeleteDeviceObjects(); // resource ޸𸮿 (releaseҶ ȣ) + HRESULT SetFontColor(DWORD dwColor); // 글씨 색을 바꾼다. + HRESULT InitDeviceObjects(LPDIRECT3DDEVICE9 pd3dDevice); // d3d device를 정해주는 초기화 함수 (Init할때 호출) + HRESULT RestoreDeviceObjects(); // resource를 메모리에 세팅하는 초기화 함수 (Init할때 호출) + HRESULT InvalidateDeviceObjects(); // resource등을 무효화시키는 함수 (release할때 호출) + HRESULT DeleteDeviceObjects(); // resource등을 메모리에서 해제 (release할때 호출) - HRESULT SetText(const std::string & szText, DWORD dwFlags = 0L); // ۾ ޶ ȣϴ ߿. + HRESULT SetText(const std::string & szText, DWORD dwFlags = 0L); // 출력할 글씨가 달라졌을때만 호출하는 것이 중요. HRESULT DrawText(FLOAT sx, FLOAT sy, DWORD dwColor, DWORD dwFlags, - FLOAT fZ = 1.0f); // ۿ ۾ ׸.(2d) - HRESULT DrawText3D(DWORD dwColor, DWORD dwFlags); // ۿ ۾ ׸.(3d) + FLOAT fZ = 1.0f); // 버퍼에 저장된 글씨를 그린다.(2d) + HRESULT DrawText3D(DWORD dwColor, DWORD dwFlags); // 버퍼에 저장된 글씨를 그린다.(3d) HRESULT SetFont(const std::string & szFontName, DWORD dwHeight, - DWORD dwFlags = 0L); // Font ٲٰ ȣѴ. (dwHeight point size ִ´.) + DWORD dwFlags = 0L); // Font를 바꾸고 싶을때 호출한다. (dwHeight는 point size를 넣는다.) BOOL GetTextExtent(const std::string & szString, int iStrLen, SIZE * pSize); protected: void Make2DVertex(const int iFontHeight, - const std::string & szText); // Է ڸ ϰ ġ 2d . + const std::string & szText); // 입력 받은 문자를 적절하게 배치된 2d 폴리곤으로 만든다. void Make3DVertex(const int iFontHeight, const std::string & szText, - DWORD dwFlags); // Է ڸ ϰ ġ 3d . + DWORD dwFlags); // 입력 받은 문자를 적절하게 배치된 3d 폴리곤을 만든다. }; diff --git a/src/engine/N3Base/JPEG.CPP b/src/engine/N3Base/JPEG.CPP index ac392f1b..9cb4126d 100644 --- a/src/engine/N3Base/JPEG.CPP +++ b/src/engine/N3Base/JPEG.CPP @@ -57,11 +57,11 @@ void CJpeg::LoadJPG(LPCSTR FileName) { FindSOF(); // Frame Header Loading FindSOS(); // Scan Header Loading & Decoding - if ((*pByte == 0xff) && (*(pByte + 1) == 0xd9)) { // + if ((*pByte == 0xff) && (*(pByte + 1) == 0xd9)) { // 끝을 만났을 때 break; } Count++; - if (Count > 50) { // Loop ɼ + if (Count > 50) { // Loop가 끝날 가능성이 거의 없을 때 break; } } @@ -79,7 +79,7 @@ void CJpeg::FindSOI() { void CJpeg::FindDHT() { if ((m_pBuf[m_Index] == 0xff) && (m_pBuf[m_Index + 1] == 0xc4)) { WORD SegSize = m_pBuf[m_Index + 2] * 256 + m_pBuf[m_Index + 3]; - // ġ ͷ Ѵ. + //버퍼의 현재 위치를 포인터로 설정한다. BYTE * p = &m_pBuf[m_Index + 4]; do { @@ -89,7 +89,7 @@ void CJpeg::FindDHT() { BYTE Th = *p; // Table Number memcpy(BITS, p, 17); p = p + 17; - //17 ؼ Num + //17개의 값을 모두 더해서 Num에 저장 for (i = 1; i < 17; i++) { Num = Num + BITS[i]; } @@ -99,9 +99,9 @@ void CJpeg::FindDHT() { TbH[Th].HUFFCODE = new WORD[Num + 1]; TbH[Th].HUFFSIZE = new BYTE[Num + 1]; TbH[Th].HUFFVAL = new BYTE[Num + 1]; - //Huffman Value Numũ⸸ŭ p д´. + //Huffman Value 값을 Num크기만큼 p에서 읽는다. memcpy(TbH[Th].HUFFVAL, p, Num); - //p + //p가 증가 p = p + Num; // Generation of table of Huffman code sizes // @@ -236,7 +236,7 @@ void CJpeg::FindSOS() { m_Index = m_Index + SegSize + 2; - // ִ Sampling Factor // + // 최대 Sampling Factor 구함 // Hmax = Vmax = 0; for (int i = 0; i < FrameHeader.Nf; i++) { if (FrameHeader.H[i] > Hmax) { @@ -247,11 +247,11 @@ void CJpeg::FindSOS() { } } - // ̹ // + // 실제 이미지 사이즈 저장 // m_rWidth = FrameHeader.X; m_rHeight = FrameHeader.Y; - // ̹  MCU ũ⿡ ¾ ٽ // + // 이미지 사이즈를 MCU 크기에 맞아 떨어지도록 다시 계산 // if (FrameHeader.X % (8 * Hmax) != 0) { FrameHeader.X = (FrameHeader.X / (8 * Hmax) + 1) * (8 * Hmax); } @@ -334,8 +334,8 @@ void CJpeg::DecodeAC(int Th) { memset((LPSTR)&ZZ[1], 0, 63 * sizeof(short)); BYTE RS, SSSS, RRRR, R; - // RRRR : ZZ 0 ƴ κ ġ - // SSSS : 0 ƴ (category) + // RRRR : ZZ에서 0 이 아닌 전 값으로부터의 상대적인 위치 + // SSSS : 0이 아닌 값의 범위(category) while (TRUE) { RS = hDecode(Th); @@ -517,10 +517,10 @@ void CJpeg::Decode() { MCU = new SET[Vmax * Hmax * 64]; - // NextByte Լ // + // NextByte 함수를 위한 포인터 리셋 // pByte = &m_pBuf[m_Index]; - // Decoding Procedure // + // 실질적인 Decoding Procedure // int Count = 0; /// for (int i = 0; i < my; i++) { @@ -543,7 +543,7 @@ void CJpeg::Decode() { delete[] MCU; - // RGB ٲ // + // RGB 로 바꿈 // ConvertYUV2RGB(); } @@ -631,7 +631,7 @@ void CJpeg::ConvertYUV2RGB() { delete[] m_pData; m_pData = pBuf2; - // ̹ // + // 본래의 이미지 사이즈로 복원 // FrameHeader.X = m_rWidth; FrameHeader.Y = m_rHeight; } @@ -651,18 +651,18 @@ void CJpeg::SaveJPG(LPCSTR FileName, int Width, int Height, BYTE * pp) { m_rWidth = Width; m_rHeight = Height; - int BMPWidth = (Width * 3 + 3) / 4 * 4; // BITMAP 4 + int BMPWidth = (Width * 3 + 3) / 4 * 4; // BITMAP의 4의 배수인 넓이 int bWidth = Width; int bHeight = Height; if (Width % 8 != 0) { - bWidth = (Width / 8 + 1) * 8; // bWidth 8 + bWidth = (Width / 8 + 1) * 8; // bWidth 는 8의 배수로 만든 넓이 } if (Height % 8 != 0) { - bHeight = (Height / 8 + 1) * 8; // bHeight 8 + bHeight = (Height / 8 + 1) * 8; // bHeight 는 8의 배수로 만든 높이 } - // Huffman Table ʱȭ // + // Huffman Table 초기화 // for (int i = 0; i < 20; i++) { if (TbH[i].Flag) { delete[] TbH[i].HUFFCODE; @@ -677,25 +677,25 @@ void CJpeg::SaveJPG(LPCSTR FileName, int Width, int Height, BYTE * pp) { return; } PutSOI(fh); // Start Of Image // - PutDQT(fh); // Quantization Table // - PutDHT(fh); // Huffman Table // - PutSOF(fh, Width, Height); // FrameHeader // - PutSOS(fh); // Scan Header // + PutDQT(fh); // Quantization Table 저장 // + PutDHT(fh); // Huffman Table 저장 // + PutSOF(fh, Width, Height); // FrameHeader 저장 // + PutSOS(fh); // Scan Header 저장 // - // ۸ սô! // + // 버퍼를 마련합시다! // if (m_pData != NULL) { delete[] m_pData; } m_pData = new BYTE[(bWidth * 3) * bHeight]; - memset(m_pData, 0, (bWidth * 3) * bHeight); // 0 ʱȭ // + memset(m_pData, 0, (bWidth * 3) * bHeight); // 0으로 초기화 // - // 8 µ ۸  ̹ մϴ // + // 8의 배수에 맞도록 버퍼를 만들어서 원래 이미지를 복사합니다 // for (int i = 0; i < Height; i++) { memcpy(&m_pData[i * (bWidth * 3)], &pp[i * BMPWidth], BMPWidth); } - // RGB Color YCbCr Color ȯմϴ. // + // RGB Color를 YCbCr Color로 변환합니다. // float R, G, B; float y, cb, cr; BYTE * pos; @@ -811,8 +811,8 @@ void CJpeg::SaveJPG(LPCSTR FileName, int Width, int Height, BYTE * pp) { delete[] DC2; delete[] DC3; - /* AC ̺ ˻ ϱ Ͽ - ̺ ü ִ *PT Ѵ. */ + /* AC 허프만 테이블 검색을 빠르게 하기 위하여 + 허프만 테이블 구조체에 있는 *PT를 설정한다. */ int Num, iTh[4] = {16, 17}, Th, key; @@ -836,9 +836,9 @@ void CJpeg::SaveJPG(LPCSTR FileName, int Width, int Height, BYTE * pp) { /* HUFFMAN CODE ENCODEING!! */ - m_pBuf = new BYTE[bWidth * bHeight * 3]; // ڵ Ͱ - m_Index = 0; // ε - cnt = 0; // Bit + m_pBuf = new BYTE[bWidth * bHeight * 3]; // 실제로 인코딩된 데이터가 저장될 버퍼 + m_Index = 0; // 인덱스 리셋 + cnt = 0; // Bit총 리셋 hEncode(bWidth, bHeight); @@ -852,7 +852,7 @@ void CJpeg::SaveJPG(LPCSTR FileName, int Width, int Height, BYTE * pp) { PutEOI(fh); - // ӽ ޸ // + // 임시 메모리 모두 해제 // for (int i = 0; i < 2; i++) { Th = iTh[i]; @@ -872,13 +872,13 @@ void CJpeg::SaveJPG(LPCSTR FileName, int Width, int Height, BYTE * pp) { delete[] Cb; delete[] Cr; - // // + // 파일 폐쇄 // CloseHandle(fh); } void CJpeg::PutSOI(HANDLE hFile) { - // SOI // + // SOI 저장 // DWORD dwWritten; WORD Marker = (0xd8 << 8) | 0xff; WriteFile(hFile, (LPSTR)&Marker, 2, &dwWritten, NULL); @@ -1006,7 +1006,7 @@ void CJpeg::PutDQT(HANDLE hFile) { } void CJpeg::DCT(short * pos, int bWidth, BOOL Flag) { - // DCT и ƴ϶, DCT Zigzag ... Դٰ Quantization !?// + // DCT 분만 아니라, DCT 후의 Zigzag 까지... 게다가 Quantization 까지!?// BYTE Qtb0[64] = {16, 11, 12, 14, 12, 10, 16, 14, 13, 14, 18, 17, 16, 19, 24, 40, 26, 24, 22, 22, 24, 49, 36, 37, 29, 40, 58, 51, 61, 60, 57, 51, 56, 55, 64, 72, 92, 78, 64, 68, 87, 69, 66, 57, @@ -1083,8 +1083,8 @@ void CJpeg::Zigzag2() { } void CJpeg::PutDHT(HANDLE hFile) { - /* standard ̺ о鿩 ü - ϰ ϴ Ͽ ִ ԼԴϴ. */ + /* standard 허프만 테이블을 읽어들여서 멤버 구조체에 설정한 + 후 저장하고자 하는 파일에 적어넣는 함수입니다. */ m_pBuf = new BYTE[421]; BYTE HuffTb[421] = { @@ -1109,7 +1109,7 @@ void CJpeg::PutDHT(HANDLE hFile) { 213, 214, 215, 216, 217, 218, 226, 227, 228, 229, 230, 231, 232, 233, 234, 242, 243, 244, 245, 246, 247, 248, 249, 250, 255}; memcpy(m_pBuf, HuffTb, 421); - m_Index = 0; // Huffman Table о̱ Ͽ Index Reset + m_Index = 0; // Huffman Table을 읽어들이기 위하여 Index를 Reset FindDHT(); //_lwrite(hFile, (LPSTR)m_pBuf, 420); DWORD dwWritten; @@ -1117,7 +1117,7 @@ void CJpeg::PutDHT(HANDLE hFile) { delete[] m_pBuf; } -// ־ Ƽ ҼӵǴ ȯϴ Լ // +// 주어진 값이 어느 케티고리에 소속되는 지를 반환하는 함수 // BYTE CJpeg::GetCategory(short V) { BYTE Num = 0; if (V < 0) { @@ -1236,7 +1236,7 @@ void CJpeg::ShotBit(BYTE Bit) { cnt = 0; m_pBuf[m_Index] = Bullet; m_Index++; - if (Bullet == 0xff) // 0xff 0x00 Byte Stuffing!! + if (Bullet == 0xff) // 0xff가 나오면 0x00으로 Byte Stuffing!! { m_pBuf[m_Index] = 0x00; m_Index++; @@ -1246,7 +1246,7 @@ void CJpeg::ShotBit(BYTE Bit) { } void CJpeg::PutEOI(HANDLE hFile) { - // EOI // + // EOI 저장 // WORD Marker = (0xd9 << 8) | 0xff; DWORD dwWritten; WriteFile(hFile, (LPSTR)&Marker, 2, &dwWritten, NULL); diff --git a/src/engine/N3Base/JPEG.H b/src/engine/N3Base/JPEG.H index e1027091..2665e54f 100644 --- a/src/engine/N3Base/JPEG.H +++ b/src/engine/N3Base/JPEG.H @@ -2,50 +2,50 @@ // // Jpeg.h: interface for the CJpeg class. // -// ֿ䵿 : JPEG ڵϿ о̰ų ũ . +// 주요동작 : JPEG 파일을 디코드하여 읽어들이거나 디스크에 쓴다. // -// : -// : +// 원저자 : 모름 +// 변경자 : 이현석 // E-Mail : evaasuka1004@hotmail.com ////////////////////////////////////////////////////////////////////// #pragma once struct SET { - BYTE C[3]; // Y, Cb, Cr + BYTE C[3]; // Y, Cb, Cr 성분 }; struct DQT { - BYTE Q[64]; // Qantization Table + BYTE Q[64]; // Qantization Table 값 }; struct DHT { - BOOL Flag; // Ǿ θ Ÿ ÷ - int Num; // ڵ - WORD * HUFFCODE; // ڵ - BYTE * HUFFSIZE; // ڵ - BYTE * HUFFVAL; // ڵ尡 Ÿ - WORD MAXCODE[17]; // ش ̿ ū ڵ - WORD MINCODE[17]; // ش ̿ ڵ - int VALPTR[17]; // ش ڵ尡 ۵Ǵ ε - int * PT; // VALUE INDEX ã + BOOL Flag; // 사용되었는지 여부를 나타내는 플래그 + int Num; // 허프만 코드의 수 + WORD * HUFFCODE; // 허프만 코드 + BYTE * HUFFSIZE; // 허프만 코드의 길이 + BYTE * HUFFVAL; // 허프만 코드가 나타내는 값 + WORD MAXCODE[17]; // 해당 길이에서 가장 큰 코드 + WORD MINCODE[17]; // 해당 길이에서 가장 작은 코드 + int VALPTR[17]; // 해당 길이의 코드가 시작되는 인덱스 + int * PT; // VALUE로 INDEX를 빠르게 찾기 위한 포인터 }; struct FRAMEHEADER { - WORD Y; // ̹ - WORD X; // ̹ - BYTE Nf; // Ʈ - BYTE C[3]; // Ʈ ̵ - BYTE H[3]; // Ʈ Horizontal Sampling Factor - BYTE V[3]; // Ʈ Vertical Sampling Factor - BYTE Tq[3]; // ش Ʈ Ǵ ȭ̺ ȣ + WORD Y; // 이미지의 높이 + WORD X; // 이미지의 넓이 + BYTE Nf; // 컴포넌트 수 + BYTE C[3]; // 컴포넌트 아이디 + BYTE H[3]; // 컴포넌트의 Horizontal Sampling Factor + BYTE V[3]; // 컴포넌트의 Vertical Sampling Factor + BYTE Tq[3]; // 해당 컴포넌트에 사용되는 양자화테이블 번호 }; struct SCANHEADER { - BYTE Ns; // Ʈ - BYTE Cs[3]; // Ʈ ̵ - BYTE Td[3]; // Ʈ DC Huffman Table ȣ - BYTE Ta[3]; // Ʈ AC Huffman Table ȣ + BYTE Ns; // 컴포넌트 수 + BYTE Cs[3]; // 컴포넌트 아이디 + BYTE Td[3]; // 컴포넌트의 DC Huffman Table 번호 + BYTE Ta[3]; // 컴포넌트의 AC Huffman Table 번호 BYTE Ss; BYTE Se; BYTE Ah; @@ -54,75 +54,75 @@ struct SCANHEADER { class CJpeg { public: - // JPEG File Loadϱ Լ // - void LoadJPG(LPCSTR FileName); // JPEG File Loadϴ Լ - void FindSOI(); // Start of Image Ŀ ã Լ - void FindDQT(); // Quantization Table ã ü ϴ Լ - void FindDHT(); // Huffman Table ã ü ϴ Լ - void FindSOF(); // Frame Header ã ü ϴ Լ - void FindSOS(); // Scan Header ã ü ϴ Լ - void FindETC(); // DRI(Define Restart Interval) ε - void Decode(); // ڵ带 ϰ ڵ带 - void DecodeMCU(int mx, int my); // MCU ڵϴ Լ - void DecodeDU(int N); // 8x8 Data Unit ڵϴ Լ - void IDCT(); // Inverse DCT ϴ Լ - void Zigzag(); // Zigzag Ǿִ DU 󺹱ͽŰ Լ - void DecodeAC(int Th); // DU, AC ڵϴ Լ - void DecodeDC(int Th); // DU, DC ڵϴ Լ - short Extend(WORD V, BYTE T); // V īװ T µ Ȯ - WORD Receive(BYTE SSSS); // ۿ SSSSƮŭ о Լ - BYTE hDecode(int Th); // ȣ ڵϴ κ - BYTE NextByte(); // ۿ 1 Ʈ о Լ - WORD NextBit(); // ۿ 1 Ʈ о Լ - void ConvertYUV2RGB(); // ڵ ͸ ÷ ٲް ÿ - // Ʈʿ ȣȯǵ ȯϴ Լ - - // JPEG File Saveϱ Լ // - void SaveJPG(LPCSTR FileName, int Width, int Height, BYTE * pp); // JPEG ϴ Լ - - void PutSOI(HANDLE hFile); // Start of Image Ŀ - void PutDQT(HANDLE hFile); // Quantizatino Table - void PutDHT(HANDLE hFile); // Huffmann Table - void PutSOF(HANDLE hFile, int Width, int Height); // FrameHeader - void PutSOS(HANDLE hFile); // ScanHeader - void PutEOI(HANDLE hFile); // End of Image Ŀ - - void ShotBit(BYTE Bit); // 1Ʈ ۿ ϴ Լ - void ChargeCode(WORD Code, int Size); // Sizeŭ (Ʒڸκ) Code ۿ ϴ Լ - void EncodeDU(short * pos, BOOL Flag, int bWidth); // 8x8 Block ڵϴ Լ - void hEncode(int bWidth, int bHeight); // ڵ ϴ κ - BYTE GetCategory(short V); // ־ īװ ϴ Լ - void Zigzag2(); // Zigzag Լ - void DCT(short * pos, int bWidth, BOOL Flag); // DCT Zigzag Quantization ϴ Լ - - int GetHeight(); // ̹ ̸ ȯϴ Լ - int GetWidth(); // ̹ ̸ ȯϴ Լ + // JPEG File을 Load하기 위한 함수들 // + void LoadJPG(LPCSTR FileName); // JPEG File을 Load하는 함수 + void FindSOI(); // Start of Image 마커를 찾는 함수 + void FindDQT(); // Quantization Table을 찾아 구조체에 설정하는 함수 + void FindDHT(); // Huffman Table을 찾아 구조체에 설정하는 함수 + void FindSOF(); // Frame Header를 찾아 구조체에 설정하는 함수 + void FindSOS(); // Scan Header를 찾아 구조체에 설정하는 함수 + void FindETC(); // DRI(Define Restart Interval) 로드 + void Decode(); // 디코드를 위한 정보를 설정하고 디코드를 시작 + void DecodeMCU(int mx, int my); // MCU블럭을 디코드하는 함수 + void DecodeDU(int N); // 8x8 Data Unit를 디코드하는 함수 + void IDCT(); // Inverse DCT를 하는 함수 + void Zigzag(); // Zigzag순으로 되어있는 DU를 원상복귀시키는 함수 + void DecodeAC(int Th); // DU중, AC성분을 디코드하는 함수 + void DecodeDC(int Th); // DU중, DC성분을 디코드하는 함수 + short Extend(WORD V, BYTE T); // V를 카테고리 T에 맞도록 확장 + WORD Receive(BYTE SSSS); // 버퍼에서 SSSS비트만큼 읽어오는 함수 + BYTE hDecode(int Th); // 허프만 부호를 디코드하는 부분 + BYTE NextByte(); // 버퍼에서 다음 1 바이트를 읽어오는 함수 + WORD NextBit(); // 버퍼에서 다음 1 비트를 읽어오는 함수 + void ConvertYUV2RGB(); // 디코드된 데이터를 컬러모델을 바꿈과 동시에 + // 비트맵에 호환되도록 변환하는 함수 + + // JPEG File을 Save하기 위한 함수들 // + void SaveJPG(LPCSTR FileName, int Width, int Height, BYTE * pp); // JPEG 파일을 저장하는 함수 + + void PutSOI(HANDLE hFile); // Start of Image 마커를 삽입 + void PutDQT(HANDLE hFile); // Quantizatino Table을 삽입 + void PutDHT(HANDLE hFile); // Huffmann Table을 삽입 + void PutSOF(HANDLE hFile, int Width, int Height); // FrameHeader를 삽입 + void PutSOS(HANDLE hFile); // ScanHeader를 삽입 + void PutEOI(HANDLE hFile); // End of Image 마커를 삽입 + + void ShotBit(BYTE Bit); // 1비트를 버퍼에 저장하는 함수 + void ChargeCode(WORD Code, int Size); // Size만큼의 길이(아랫자리로부터)로 Code를 버퍼에 저장하는 함수 + void EncodeDU(short * pos, BOOL Flag, int bWidth); // 8x8 Block을 인코드하는 함수 + void hEncode(int bWidth, int bHeight); // 허프만 인코딩 하는 부분 + BYTE GetCategory(short V); // 주어진 값의 카테고리를 구하는 함수 + void Zigzag2(); // Zigzag순서로 만드는 함수 + void DCT(short * pos, int bWidth, BOOL Flag); // DCT를 한 후 Zigzag 및 Quantization 하는 함수 + + int GetHeight(); // 이미지의 높이를 반환하는 함수 + int GetWidth(); // 이미지의 넓이를 반환하는 함수 WORD Ri; // Restart Interval - int m_rWidth; // ̹ - int m_rHeight; // ̹ - BYTE * pByte; // NextByte()Լ + int m_rWidth; // 이미지의 실제적인 넓이 + int m_rHeight; // 이미지의 실제적인 높이 + BYTE * pByte; // NextByte()함수에서 쓰임 - int cnt; // Ʈ ̴ ī + int cnt; // 비트단위로 연산할 때 쓰이는 카운터 - short * Y; // Save ̴ Y Buffer - short * Cb; // Save ̴ Cb Buffer - short * Cr; // Save ̴ Cr Buffer + short * Y; // Save할 때 쓰이는 Y Buffer + short * Cb; // Save할 때 쓰이는 Cb Buffer + short * Cr; // Save할 때 쓰이는 Cr Buffer - SET * MCU; // MCU + SET * MCU; // MCU 단위의 블럭 BYTE Hmax; // Maximum Horizontal Sampling Factor BYTE Vmax; // Maximum Vertical Sampling Factor - BYTE * m_pData; // ̹ - BYTE * m_pBuf; // - int m_Index; // ġ Ÿ ε + BYTE * m_pData; // 이미지 버퍼 + BYTE * m_pBuf; // 버퍼 + int m_Index; // 버퍼의 위치를 나타내는 인덱스 DQT TbQ[20]; // Quantization Table DHT TbH[20]; // Huffman Table - short ZZ[64]; // 8x8 Block 迭 - FRAMEHEADER FrameHeader; // FrameHeader ä - SCANHEADER ScanHeader; // ScanHeader ü - short PrevDC[3]; // DC Predictor + short ZZ[64]; // 8x8 Block 정보를 담는 배열 + FRAMEHEADER FrameHeader; // FrameHeader 구조채 + SCANHEADER ScanHeader; // ScanHeader 구조체 + short PrevDC[3]; // DC 성분의 Predictor CJpeg(); virtual ~CJpeg(); diff --git a/src/engine/N3Base/JpegFile.cpp b/src/engine/N3Base/JpegFile.cpp index 9b5cdcdb..e094184e 100644 --- a/src/engine/N3Base/JpegFile.cpp +++ b/src/engine/N3Base/JpegFile.cpp @@ -1700,7 +1700,7 @@ BOOL CJpegFile::EncryptJPEG(HANDLE hDib, //Handle to DIB BYTE * data_byte; DWORD encrypt_len; - // JPEG о + // JPEG 파일 읽어오기 fh = CreateFile(csJpeg.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (fh == INVALID_HANDLE_VALUE) { return false; @@ -1728,13 +1728,13 @@ BOOL CJpegFile::EncryptJPEG(HANDLE hDib, //Handle to DIB CloseHandle(fh); m_r = 1124; - // JPEG Encoding + // JPEG 파일 Encoding encrypt_len = loSize + 8; for (int i = 0; i < encrypt_len; i++) { data_byte[i] = Encrypt(data_byte[i]); } - // Encoding Writing + // Encoding 파일 Writing fh = CreateFile(csJpeg.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (fh == INVALID_HANDLE_VALUE) { delete[] data_byte; @@ -1766,13 +1766,13 @@ BOOL CJpegFile::DecryptJPEG(std::string csJpeg) { } if (GetTempFileName((LPCTSTR)szDstpath.c_str(), "ksc", 0, szTempName) == 0) { - // AfxMessageBox("ӽ ϴ.", MB_ICONSTOP|MB_OK); + // AfxMessageBox("임시 파일을 생성할 수가 없습니다.", MB_ICONSTOP|MB_OK); return FALSE; } hSrc = CreateFile((LPCTSTR)csJpeg.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hSrc == INVALID_HANDLE_VALUE) { - // AfxMessageBox("ҽ ʽϴ. ٸ ּ.", MB_ICONSTOP|MB_OK); + // AfxMessageBox("소스 파일이 존재하지 않습니다. 다른 파일을 선택해주세요.", MB_ICONSTOP|MB_OK); return FALSE; } @@ -1805,7 +1805,7 @@ BOOL CJpegFile::DecryptJPEG(std::string csJpeg) { } if (magic[0] == 'K' && magic[1] == 'S' && magic[2] == 'C' && magic[3] == 1) { - // 1 + //버전 1번 } else { CloseHandle(hSrc); CloseHandle(hDst); diff --git a/src/engine/N3Base/LogWriter.cpp b/src/engine/N3Base/LogWriter.cpp index 6878e95f..d493192f 100644 --- a/src/engine/N3Base/LogWriter.cpp +++ b/src/engine/N3Base/LogWriter.cpp @@ -36,7 +36,7 @@ void CLogWriter::Open(const std::string & szFN) { DWORD dwSizeHigh = 0; DWORD dwSizeLow = ::GetFileSize(hFile, &dwSizeHigh); - if (dwSizeLow > 256000) //  ʹ ũ .. + if (dwSizeLow > 256000) // 파일 사이즈가 너무 크면 지운다.. { CloseHandle(hFile); ::DeleteFile(s_szFileName.c_str()); @@ -46,7 +46,7 @@ void CLogWriter::Open(const std::string & szFN) { } } - ::SetFilePointer(hFile, 0, NULL, FILE_END); // ߰ ϱ ؼ ű.. + ::SetFilePointer(hFile, 0, NULL, FILE_END); // 추가 하기 위해서 파일의 끝으로 옮기고.. char szBuff[1024]; SYSTEMTIME time; @@ -75,7 +75,7 @@ void CLogWriter::Close() { } if (hFile) { - ::SetFilePointer(hFile, 0, NULL, FILE_END); // ߰ ϱ ؼ ű.. + ::SetFilePointer(hFile, 0, NULL, FILE_END); // 추가 하기 위해서 파일의 끝으로 옮기고.. char szBuff[1024]; SYSTEMTIME time; @@ -129,7 +129,7 @@ void CLogWriter::Write(const char * lpszFormat, ...) { } if (hFile) { - ::SetFilePointer(hFile, 0, NULL, FILE_END); // ߰ ϱ ؼ ű.. + ::SetFilePointer(hFile, 0, NULL, FILE_END); // 추가 하기 위해서 파일의 끝으로 옮기고.. WriteFile(hFile, szFinal, iLength, &dwRWC, NULL); CloseHandle(hFile); diff --git a/src/engine/N3Base/My_3DStruct.h b/src/engine/N3Base/My_3DStruct.h index 3dde2f14..946d7765 100644 --- a/src/engine/N3Base/My_3DStruct.h +++ b/src/engine/N3Base/My_3DStruct.h @@ -605,10 +605,10 @@ inline __Matrix44 __Matrix44::operator*(const D3DXMATRIX & mtx) { mtxTmp._43 = _41 * mtx._13 + _42 * mtx._23 + _43 * mtx._33 + _44 * mtx._43; mtxTmp._44 = _41 * mtx._14 + _42 * mtx._24 + _43 * mtx._34 + _44 * mtx._44; - // ȭ ڵ.. - // dino .. Ʒ ڵ 4° Ͽ Ȯ Ѵ. - // 4° (0, 0, 0, 1) matrix projection matrix - // (0, 0, 1, 0) matrix Ƿ ̻ ʷѴ. + // 최적화 된 코드.. + // dino 막음.. 아래 코드는 4번째 행들의 계산을 생략하여서 부정확한 계산을 한다. + // 보통 4번째 행이 (0, 0, 0, 1)인 matrix를 쓰지만 projection matrix의 경우 + // (0, 0, 1, 0)인 matrix를 쓰므로 이상한 결과를 초래한다. // mtxTmp._11 = _11 * mtx._11 + _12 * mtx._21 + _13 * mtx._31; // mtxTmp._12 = _11 * mtx._12 + _12 * mtx._22 + _13 * mtx._32; // mtxTmp._13 = _11 * mtx._13 + _12 * mtx._23 + _13 * mtx._33; @@ -657,9 +657,9 @@ inline void __Matrix44::operator*=(const D3DXMATRIX & mtx) { _43 = mtxTmp._41 * mtx._13 + mtxTmp._42 * mtx._23 + mtxTmp._43 * mtx._33 + mtxTmp._44 * mtx._43; _44 = mtxTmp._41 * mtx._14 + mtxTmp._42 * mtx._24 + mtxTmp._43 * mtx._34 + mtxTmp._44 * mtx._44; - // dino .. Ʒ ڵ 4° Ͽ Ȯ Ѵ. - // 4° (0, 0, 0, 1) matrix projection matrix - // (0, 0, 1, 0) matrix Ƿ ̻ ʷѴ. + // dino 막음.. 아래 코드는 4번째 행들의 계산을 생략하여서 부정확한 계산을 한다. + // 보통 4번째 행이 (0, 0, 0, 1)인 matrix를 쓰지만 projection matrix의 경우 + // (0, 0, 1, 0)인 matrix를 쓰므로 이상한 결과를 초래한다. // _11 = mtxTmp._11 * mtx._11 + mtxTmp._12 * mtx._21 + mtxTmp._13 * mtx._31; // _12 = mtxTmp._11 * mtx._12 + mtxTmp._12 * mtx._22 + mtxTmp._13 * mtx._32; // _13 = mtxTmp._11 * mtx._13 + mtxTmp._12 * mtx._23 + mtxTmp._13 * mtx._33; @@ -816,23 +816,23 @@ const DWORD FVF_XYZNORMALCOLORT1 = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | const DWORD RF_NOTHING = 0x0; const DWORD RF_ALPHABLENDING = 0x1; // Alpha blending -const DWORD RF_NOTUSEFOG = 0x2; // Ȱ -const DWORD RF_DOUBLESIDED = 0x4; // - D3DCULL_NONE -const DWORD RF_BOARD_Y = 0x8; // Y ؼ.. ī޶ . -const DWORD RF_POINTSAMPLING = 0x10; // MipMap .. PointSampling Ѵ.. -const DWORD RF_WINDY = 0x20; // ٶ .. ٶ CN3Base::s_vWindFactor Ѵ.. +const DWORD RF_NOTUSEFOG = 0x2; // 안개 무시 +const DWORD RF_DOUBLESIDED = 0x4; // 양면 - D3DCULL_NONE +const DWORD RF_BOARD_Y = 0x8; // Y 축으로 해서.. 카메라를 본다. +const DWORD RF_POINTSAMPLING = 0x10; // MipMap 에서.. PointSampling 으로 한다.. +const DWORD RF_WINDY = 0x20; // 바람에 날린다.. 바람의 값은 CN3Base::s_vWindFactor 를 참조 한다.. const DWORD RF_NOTUSELIGHT = 0x40; // Light Off -const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse ϰ Alpha blending -const DWORD RF_NOTZWRITE = 0x100; // ZBuffer Ⱦ. -const DWORD RF_UV_CLAMP = 0x200; // texture UV Clamp Ѵ..default wrap̴.. -const DWORD RF_NOTZBUFFER = 0x400; // ZBuffer . +const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse 값을 갖고 투명하게 Alpha blending +const DWORD RF_NOTZWRITE = 0x100; // ZBuffer 에 안쓴다. +const DWORD RF_UV_CLAMP = 0x200; // texture UV적용을 Clamp로 한다..default는 wrap이다.. +const DWORD RF_NOTZBUFFER = 0x400; // ZBuffer 무시. struct __Material : public _D3DMATERIAL9 { public: DWORD dwColorOp, dwColorArg1, dwColorArg2; - BOOL nRenderFlags; // 1-AlphaBlending | 2-Ȱ | 4-Double Side | 8- ?? - DWORD dwSrcBlend; // ҽ - DWORD dwDestBlend; // Ʈ + BOOL nRenderFlags; // 1-AlphaBlending | 2-안개랑 관계없음 | 4-Double Side | 8- ?? + DWORD dwSrcBlend; // 소스 블렌딩 방법 + DWORD dwDestBlend; // 데스트 블렌딩 방법 public: void Init(const _D3DCOLORVALUE & diffuseColor) { @@ -852,7 +852,7 @@ struct __Material : public _D3DMATERIAL9 { dwDestBlend = D3DBLEND_INVSRCALPHA; } - void Init() // ⺻ .. + void Init() // 기본 흰색으로 만든다.. { D3DCOLORVALUE crDiffuse = {1.0f, 1.0f, 1.0f, 1.0f}; this->Init(crDiffuse); @@ -1019,7 +1019,7 @@ struct __VertexT2 : public __VertexT1 { struct __VertexTransformed : public __Vector3 { public: float rhw; - D3DCOLOR color; // ʿ .. + D3DCOLOR color; // 필요 없다.. float tu, tv; public: @@ -1344,7 +1344,7 @@ struct __VertexXyzNormalColor : public __Vector3 { } }; -const int MAX_MIPMAP_COUNT = 10; // 1024 * 1024 ܰ +const int MAX_MIPMAP_COUNT = 10; // 1024 * 1024 단계까지 생성 const DWORD OBJ_UNKNOWN = 0; const DWORD OBJ_BASE = 0x1; @@ -1467,7 +1467,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir static __Vector3 Vertices[36]; int nFace = 0; - // z + // z 축 음의 면 nFace = 0; Vertices[nFace + 0].Set(vMin.x, vMax.y, vMin.z); Vertices[nFace + 1].Set(vMax.x, vMax.y, vMin.z); @@ -1476,7 +1476,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMin.x, vMin.y, vMin.z); - // x + // x 축 양의 면 nFace = 6; Vertices[nFace + 0].Set(vMax.x, vMax.y, vMin.z); Vertices[nFace + 1].Set(vMax.x, vMax.y, vMax.z); @@ -1485,7 +1485,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMax.x, vMin.y, vMin.z); - // z + // z 축 양의 면 nFace = 12; Vertices[nFace + 0].Set(vMax.x, vMax.y, vMax.z); Vertices[nFace + 1].Set(vMin.x, vMax.y, vMax.z); @@ -1494,7 +1494,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMax.x, vMin.y, vMax.z); - // x + // x 축 음의 면 nFace = 18; Vertices[nFace + 0].Set(vMin.x, vMax.y, vMax.z); Vertices[nFace + 1].Set(vMin.x, vMax.y, vMin.z); @@ -1503,7 +1503,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMin.x, vMin.y, vMax.z); - // y + // y 축 양의 면 nFace = 24; Vertices[nFace + 0].Set(vMin.x, vMax.y, vMax.z); Vertices[nFace + 1].Set(vMax.x, vMax.y, vMax.z); @@ -1512,7 +1512,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMin.x, vMax.y, vMin.z); - // y + // y 축 음의 면 nFace = 30; Vertices[nFace + 0].Set(vMin.x, vMin.y, vMin.z); Vertices[nFace + 1].Set(vMax.x, vMin.y, vMin.z); @@ -1521,7 +1521,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMin.x, vMin.y, vMax.z); - // 鿡 ؼ 浹 ˻.. + // 각 면에 대해서 충돌 검사.. for (int i = 0; i < 12; i++) { if (true == ::_IntersectTriangle(vOrig, vDir, Vertices[i * 3 + 0], Vertices[i * 3 + 1], Vertices[i * 3 + 2])) { return true; @@ -1544,7 +1544,7 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, __Vector3 pVec; float fDet; - // By : Ecli666 ( On 2001-09-12 10:39:01 ) + // By : Ecli666 ( On 2001-09-12 오전 10:39:01 ) pVec.Cross(vEdge1, vEdge2); fDet = pVec.Dot(vDir); @@ -1552,13 +1552,13 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, return FALSE; } - // ~(By Ecli666 On 2001-09-12 10:39:01 ) + // ~(By Ecli666 On 2001-09-12 오전 10:39:01 ) pVec.Cross(vDir, vEdge2); // If determinant is near zero, ray lies in plane of triangle fDet = vEdge1.Dot(pVec); - if (fDet < 0.0001f) { // 0 ﰢ ϴ. + if (fDet < 0.0001f) { // 거의 0에 가까우면 삼각형 평면과 지나가는 선이 평행하다. return FALSE; } @@ -1588,17 +1588,17 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, fU *= fInvDet; fV *= fInvDet; - // t Ŭ ָ ִ. - // t*dir + orig ϸ ִ. - // u v ǹ̴ ϱ? - // : v0 (0,0), v1(1,0), v2(0,1) <ȣ (U, V)ǥ> ̷ Ÿ + // t가 클수록 멀리 직선과 평면과 만나는 점이 멀다. + // t*dir + orig 를 구하면 만나는 점을 구할 수 있다. + // u와 v의 의미는 무엇일까? + // 추측 : v0 (0,0), v1(1,0), v2(0,1) <괄호안은 (U, V)좌표> 이런식으로 어느 점에 가깝나 나타낸 것 같음 // if (pVCol) { - (*pVCol) = vOrig + (vDir * fT); // .. + (*pVCol) = vOrig + (vDir * fT); // 접점을 계산.. } - // *t < 0 ̸ ... + // *t < 0 이면 뒤쪽... if (fT < 0.0f) { return FALSE; } @@ -1616,7 +1616,7 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, vEdge1 = v1 - v0; vEdge2 = v2 - v0; - // By : Ecli666 ( On 2001-09-12 10:39:01 ) + // By : Ecli666 ( On 2001-09-12 오전 10:39:01 ) pVec.Cross(vEdge1, vEdge2); fDet = pVec.Dot(vDir); @@ -1624,13 +1624,13 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, return FALSE; } - // ~(By Ecli666 On 2001-09-12 10:39:01 ) + // ~(By Ecli666 On 2001-09-12 오전 10:39:01 ) pVec.Cross(vDir, vEdge2); // If determinant is near zero, ray lies in plane of triangle fDet = vEdge1.Dot(pVec); - if (fDet < 0.0001f) { // 0 ﰢ ϴ. + if (fDet < 0.0001f) { // 거의 0에 가까우면 삼각형 평면과 지나가는 선이 평행하다. return FALSE; } @@ -1655,7 +1655,7 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, // Calculate t, scale parameters, ray intersects triangle fT = D3DXVec3Dot(&vEdge2, &qVec) / fDet; - // *t < 0 ̸ ... + // *t < 0 이면 뒤쪽... if (fT < 0.0f) { return FALSE; } @@ -1705,7 +1705,7 @@ inline void _Convert2D_To_3DCoordinate(int ixScreen, int iyScreen, const __Matri inline float _Yaw2D(float fDirX, float fDirZ) { //////////////////////////////// - // ϰ.. -> ȸ ϴ ƾ̴.. + // 방향을 구하고.. -> 회전할 값을 구하는 루틴이다.. if (fDirX >= 0.0f) // ^^ { if (fDirZ >= 0.0f) { @@ -1720,7 +1720,7 @@ inline float _Yaw2D(float fDirX, float fDirZ) { return (D3DXToRadian(180.0f) + (float)(asin(-fDirX))); } } - // ϰ.. + // 방향을 구하고.. //////////////////////////////// } @@ -1731,7 +1731,7 @@ inline short int _IsKeyDowned(int iVirtualKey) { return (GetAsyncKeyState(iVirtualKey) & 0x00ff); } -//macro.. -> Template ٲ.. +//macro.. -> Template 로 바꿨다.. template const T T_Max(const T a, const T b) { return ((a > b) ? b : a); } diff --git a/src/engine/N3Base/N3AlphaPrimitiveManager.cpp b/src/engine/N3Base/N3AlphaPrimitiveManager.cpp index bb83e352..0baf8cc3 100644 --- a/src/engine/N3Base/N3AlphaPrimitiveManager.cpp +++ b/src/engine/N3Base/N3AlphaPrimitiveManager.cpp @@ -26,7 +26,7 @@ void CN3AlphaPrimitiveManager::Render() { for (int i = 0; i < m_nToDrawCount; i++) { pBuffs[i] = &(m_Buffers[i]); } - qsort(pBuffs, m_nToDrawCount, 4, SortByCameraDistance); // ۿ Ƽ ϰ.. + qsort(pBuffs, m_nToDrawCount, 4, SortByCameraDistance); // 버퍼에 쌓인 프리미티브대로 정렬하고.. struct __RenderState { DWORD dwAlpha, dwFog, dwCull, dwLgt, dwZWrite, dwAO, dwAA1, dwAA2, dwCO, dwCA1, dwCA2, dwPointSampling; @@ -34,8 +34,8 @@ void CN3AlphaPrimitiveManager::Render() { DWORD dwSrcBlend, dwDestBlend; DWORD dwZEnable; }; - __RenderState RS_old; // render state (߿ ǵ ) - __RenderState RS_current; // render state (  ΰ Ǵϱ ) + __RenderState RS_old; // 이전 render state (나중에 되돌려놓기 위해) + __RenderState RS_current; // 현재 render state (현재 어떤 상태인가 판단하기 위해) CN3Base::s_lpD3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &RS_old.dwAlpha); CN3Base::s_lpD3DDev->GetRenderState(D3DRS_FOGENABLE, &RS_old.dwFog); @@ -136,7 +136,7 @@ void CN3AlphaPrimitiveManager::Render() { CN3Base::s_lpD3DDev->SetFVF(pBuffs[i]->dwFVF); CN3Base::s_lpD3DDev->SetTexture(0, pBuffs[i]->lpTex); - CN3Base::s_lpD3DDev->SetTransform(D3DTS_WORLD, &(pBuffs[i]->MtxWorld)); // + CN3Base::s_lpD3DDev->SetTransform(D3DTS_WORLD, &(pBuffs[i]->MtxWorld)); // 월드 행렬 적용 if (pBuffs[i]->lpTex) { CN3Base::s_lpD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); @@ -147,7 +147,7 @@ void CN3AlphaPrimitiveManager::Render() { CN3Base::s_lpD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); } - if (pBuffs[i]->pwIndices && pBuffs[i]->nPrimitiveCount > 0) // Index .. + if (pBuffs[i]->pwIndices && pBuffs[i]->nPrimitiveCount > 0) // Index 가 있으면.. { if (pBuffs[i]->bUseVB) { CN3Base::s_lpD3DDev->SetStreamSource(0, (LPDIRECT3DVERTEXBUFFER9)pBuffs[i]->pVertices, 0, @@ -176,7 +176,7 @@ void CN3AlphaPrimitiveManager::Render() { #endif } - m_nToDrawCount = 0; // ׷ȴ... + m_nToDrawCount = 0; // 다 그렸다... // restore CN3Base::s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, RS_old.dwAlpha); @@ -207,14 +207,14 @@ void CN3AlphaPrimitiveManager::Render() { for (int i = 0; i < m_nToDrawCount; i++) { pBuffs[i] = &(m_Buffers[i]); } - qsort(pBuffs, m_nToDrawCount, 4, SortByCameraDistance); // ۿ Ƽ ϰ.. + qsort(pBuffs, m_nToDrawCount, 4, SortByCameraDistance); // 버퍼에 쌓인 프리미티브대로 정렬하고.. struct __RenderState { DWORD dwAlpha, dwFog, dwCull, dwLgt, dwZWrite, dwAO, dwAA1, dwAA2, dwCO, dwCA1, dwCA2, dwPointSampling; DWORD dwSrcBlend, dwDestBlend; }; - __RenderState RS_old; // render state (߿ ǵ ) - __RenderState RS_current; // render state (  ΰ Ǵϱ ) + __RenderState RS_old; // 이전 render state (나중에 되돌려놓기 위해) + __RenderState RS_current; // 현재 render state (현재 어떤 상태인가 판단하기 위해) CN3Base::s_lpD3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &RS_old.dwAlpha); CN3Base::s_lpD3DDev->GetRenderState(D3DRS_FOGENABLE, &RS_old.dwFog); @@ -247,7 +247,7 @@ void CN3AlphaPrimitiveManager::Render() { RS_current.dwFog = FALSE; CN3Base::s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); } - } else { // Fog .. + } else { // Fog 무시.. if (TRUE != RS_current.dwFog) { RS_current.dwFog = TRUE; CN3Base::s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); @@ -338,7 +338,7 @@ void CN3AlphaPrimitiveManager::Render() { CN3Base::s_lpD3DDev->SetFVF(pBuffs[i]->dwFVF); CN3Base::s_lpD3DDev->SetTexture(0, pBuffs[i]->lpTex); - CN3Base::s_lpD3DDev->SetTransform(D3DTS_WORLD, &(pBuffs[i]->MtxWorld)); // + CN3Base::s_lpD3DDev->SetTransform(D3DTS_WORLD, &(pBuffs[i]->MtxWorld)); // 월드 행렬 적용 if (pBuffs[i]->lpTex) { if (D3DTOP_MODULATE != RS_current.dwCO) { @@ -364,7 +364,7 @@ void CN3AlphaPrimitiveManager::Render() { } } - if (pBuffs[i]->pwIndices && pBuffs[i]->nPrimitiveCount > 0) // Index .. + if (pBuffs[i]->pwIndices && pBuffs[i]->nPrimitiveCount > 0) // Index 가 있으면.. { if (pBuffs[i]->bUseVB) { CN3Base::s_lpD3DDev->SetStreamSource(0, (LPDIRECT3DVERTEXBUFFER9)pBuffs[i]->pVertices, 0, @@ -393,7 +393,7 @@ void CN3AlphaPrimitiveManager::Render() { #endif } - m_nToDrawCount = 0; // ׷ȴ... + m_nToDrawCount = 0; // 다 그렸다... // restore if (RS_old.dwAlpha != RS_current.dwAlpha) { @@ -458,7 +458,7 @@ __AlphaPrimitive * CN3AlphaPrimitiveManager::Add(__Vector3 & vCamera, DWORD dwBl int nVertexCount, const void * pVertices, const __Matrix44 & MtxWorld) { __ASSERT(m_nToDrawCount < MAX_ALPHAPRIMITIVE_BUFFER, "Alpha primnitive buffer is full"); - // η ݵ Ŭ Render() ѹ ȣ־ ۸ ش.. + // 메인렌더링시 반드시 이 클래스의 Render() 를 한번 호출해주어야 버퍼를 비워준다.. __Vector3 vPos = *((__Vector3 *)pVertices); @@ -487,7 +487,7 @@ int CN3AlphaPrimitiveManager::SortByCameraDistance(const void * pArg1, const voi __AlphaPrimitive * pObj2 = *((__AlphaPrimitive **)pArg2); if (pObj1->fCameraDistance > pObj2->fCameraDistance) { - return -1; // Ÿ հͺ .. + return -1; // 거리가 먼것부터 소팅.. } else if (pObj1->fCameraDistance < pObj2->fCameraDistance) { return 1; } else { diff --git a/src/engine/N3Base/N3AlphaPrimitiveManager.h b/src/engine/N3Base/N3AlphaPrimitiveManager.h index 0970389c..a50c0fae 100644 --- a/src/engine/N3Base/N3AlphaPrimitiveManager.h +++ b/src/engine/N3Base/N3AlphaPrimitiveManager.h @@ -12,19 +12,19 @@ //const DWORD RF_DOUBLESIDED = 4; struct __AlphaPrimitive { - float fCameraDistance; // ī޶ Ÿ.. + float fCameraDistance; // 카메라와의 거리.. DWORD dwBlendSrc; DWORD dwBlendDest; - int nRenderFlags; // ÷.. RF_... .. + int nRenderFlags; // 렌더링 플래그.. RF_... 참조.. LPDIRECT3DTEXTURE9 lpTex; // Texture pointer DWORD dwFVF; // flexible vertex format D3DPRIMITIVETYPE ePrimitiveType; // Primitive Type int nPrimitiveCount; // PrimitiveCount DWORD dwPrimitiveSize; // Primitive Size .. stream 0 stride - BOOL bUseVB; // ؽ , ε ۸ ΰ ƴѰ - const void * pwIndices; // Index ̸... NULL ƴѰ ȴ. + BOOL bUseVB; // 버텍스 버퍼, 인덱스 버퍼를 사용할 것인가 아닌가 + const void * pwIndices; // 만약 Index 기반이면... NULL 이 아닌것을 넣으면 된다. int nVertexCount; - const void * pVertices; // ﰢ.. .. ȯ پ Ѵ.. + const void * pVertices; // 삼각형.. 벡터 형이지만.. 강제 형변환을 통해 다양한 점형식이 들어오도록 써야 한다.. __Matrix44 MtxWorld; // Matrix }; @@ -32,8 +32,8 @@ const int MAX_ALPHAPRIMITIVE_BUFFER = 1024; class CN3AlphaPrimitiveManager { protected: - int m_nToDrawCount; // ׷ - __AlphaPrimitive m_Buffers[MAX_ALPHAPRIMITIVE_BUFFER]; // Ƽ .. + int m_nToDrawCount; // 그려야 할 버퍼 갯수 + __AlphaPrimitive m_Buffers[MAX_ALPHAPRIMITIVE_BUFFER]; // 프리미티브 버퍼.. public: int ToDrawCount() { return m_nToDrawCount; } @@ -41,7 +41,7 @@ class CN3AlphaPrimitiveManager { void Render(); - static int SortByCameraDistance(const void * pArg1, const void * pArg2); // Լ.. + static int SortByCameraDistance(const void * pArg1, const void * pArg2); // 정렬 함수.. CN3AlphaPrimitiveManager(); virtual ~CN3AlphaPrimitiveManager(); diff --git a/src/engine/N3Base/N3AnimControl.h b/src/engine/N3Base/N3AnimControl.h index f9fbe9f6..1b051fc7 100644 --- a/src/engine/N3Base/N3AnimControl.h +++ b/src/engine/N3Base/N3AnimControl.h @@ -16,9 +16,9 @@ typedef struct __AnimData { public: std::string szName; - float fFrmStart; // ü - float fFrmEnd; // ü - float fFrmPerSec; // ʴ 30 ǥ̴.. + float fFrmStart; // 상체 시작 + float fFrmEnd; // 상체 끝 + float fFrmPerSec; // 초당 30프레임이 표준이다.. float fFrmPlugTraceStart; float fFrmPlugTraceEnd; @@ -26,20 +26,20 @@ typedef struct __AnimData { float fFrmSound0; float fFrmSound1; - float fTimeBlend; // ٸ ۰ ð - int iBlendFlags; // ÷ 0 ̸ .. 1̸ ν ŸӸŭ ð + float fTimeBlend; // 다른 동작과 연결시 블렌딩 시간 + int iBlendFlags; // 블렌딩 플래그 0 이면 걍 블렌딩.. 1이면 루핑시 블렌딩 타임만큼 시간 지연 float fFrmStrike0; float fFrmStrike1; __AnimData() { - fFrmPerSec = 30.0f; // ʴ 30 ǥ̴.. + fFrmPerSec = 30.0f; // 초당 30프레임이 표준이다.. fFrmStart = fFrmEnd = 0; fFrmPlugTraceStart = fFrmPlugTraceEnd = 0; fFrmSound0 = fFrmSound1 = 0; - fTimeBlend = 0.25f; // ⺻ ð.. - iBlendFlags = 0; // ÷ 0 ̸ .. 1̸ ν ŸӸŭ ð + fTimeBlend = 0.25f; // 기본 블렌딩 시간.. + iBlendFlags = 0; // 블렌딩 플래그 0 이면 걍 블렌딩.. 1이면 루핑시 블렌딩 타임만큼 시간 지연 fFrmStrike0 = fFrmStrike1 = 0; } @@ -55,7 +55,7 @@ typedef struct __AnimData { fFrmSound1 = other.fFrmSound1; fTimeBlend = other.fTimeBlend; - iBlendFlags = other.iBlendFlags; // ÷ 0 ̸ .. 1̸ ν ŸӸŭ ð + iBlendFlags = other.iBlendFlags; // 블렌딩 플래그 0 이면 걍 블렌딩.. 1이면 루핑시 블렌딩 타임만큼 시간 지연 fFrmStrike0 = other.fFrmStrike0; fFrmStrike1 = other.fFrmStrike1; @@ -71,11 +71,11 @@ typedef struct __AnimData { DWORD dwRWC = 0; int nL = 0; - ReadFile(hFile, &nL, 4, &dwRWC, NULL); // ڿ Ͱ ִڸ̴.. ȣȯ 켭.. ... + ReadFile(hFile, &nL, 4, &dwRWC, NULL); // 원래는 문자열 포인터가 있던자리이다.. 호환성을 위헤서.. 걍... - ReadFile(hFile, &fFrmStart, 4, &dwRWC, NULL); // ü - ReadFile(hFile, &fFrmEnd, 4, &dwRWC, NULL); // ü - ReadFile(hFile, &fFrmPerSec, 4, &dwRWC, NULL); // ʴ 30 ǥ̴.. + ReadFile(hFile, &fFrmStart, 4, &dwRWC, NULL); // 상체 시작 + ReadFile(hFile, &fFrmEnd, 4, &dwRWC, NULL); // 상체 끝 + ReadFile(hFile, &fFrmPerSec, 4, &dwRWC, NULL); // 초당 30프레임이 표준이다.. ReadFile(hFile, &fFrmPlugTraceStart, 4, &dwRWC, NULL); ReadFile(hFile, &fFrmPlugTraceEnd, 4, &dwRWC, NULL); @@ -85,12 +85,12 @@ typedef struct __AnimData { ReadFile(hFile, &fTimeBlend, 4, &dwRWC, NULL); ReadFile(hFile, &iBlendFlags, 4, &dwRWC, - NULL); // ÷ 0 ̸ .. 1̸ ν ŸӸŭ ð + NULL); // 블렌딩 플래그 0 이면 걍 블렌딩.. 1이면 루핑시 블렌딩 타임만큼 시간 지연 ReadFile(hFile, &fFrmStrike0, 4, &dwRWC, NULL); ReadFile(hFile, &fFrmStrike1, 4, &dwRWC, NULL); - // ̸ б.. + // 이름 읽기.. szName = ""; ReadFile(hFile, &nL, 4, &dwRWC, NULL); if (nL > 0) { @@ -107,11 +107,11 @@ typedef struct __AnimData { DWORD dwRWC = 0; int nL = 0; - WriteFile(hFile, &nL, 4, &dwRWC, NULL); // ڿ Ͱ ִڸ̴.. ȣȯ 켭.. ... + WriteFile(hFile, &nL, 4, &dwRWC, NULL); // 원래는 문자열 포인터가 있던자리이다.. 호환성을 위헤서.. 걍... - WriteFile(hFile, &fFrmStart, 4, &dwRWC, NULL); // ü - WriteFile(hFile, &fFrmEnd, 4, &dwRWC, NULL); // ü - WriteFile(hFile, &fFrmPerSec, 4, &dwRWC, NULL); // ʴ 30 ǥ̴.. + WriteFile(hFile, &fFrmStart, 4, &dwRWC, NULL); // 상체 시작 + WriteFile(hFile, &fFrmEnd, 4, &dwRWC, NULL); // 상체 끝 + WriteFile(hFile, &fFrmPerSec, 4, &dwRWC, NULL); // 초당 30프레임이 표준이다.. WriteFile(hFile, &fFrmPlugTraceStart, 4, &dwRWC, NULL); WriteFile(hFile, &fFrmPlugTraceEnd, 4, &dwRWC, NULL); @@ -121,12 +121,12 @@ typedef struct __AnimData { WriteFile(hFile, &fTimeBlend, 4, &dwRWC, NULL); WriteFile(hFile, &iBlendFlags, 4, &dwRWC, - NULL); // ÷ 0 ̸ .. 1̸ ν ŸӸŭ ð + NULL); // 블렌딩 플래그 0 이면 걍 블렌딩.. 1이면 루핑시 블렌딩 타임만큼 시간 지연 WriteFile(hFile, &fFrmStrike0, 4, &dwRWC, NULL); WriteFile(hFile, &fFrmStrike1, 4, &dwRWC, NULL); - // ̸ б.. + // 이름 읽기.. nL = szName.size(); WriteFile(hFile, &nL, 4, &dwRWC, NULL); if (nL > 0) { diff --git a/src/engine/N3Base/N3AnimKey.cpp b/src/engine/N3Base/N3AnimKey.cpp index 54a1040a..dea0c50d 100644 --- a/src/engine/N3Base/N3AnimKey.cpp +++ b/src/engine/N3Base/N3AnimKey.cpp @@ -11,7 +11,7 @@ CN3AnimKey::CN3AnimKey() { m_eType = KEY_VECTOR3; - m_nCount = 0; // Ű īƮ + m_nCount = 0; // 키 카운트 m_fSamplingRate = 30.0; m_pDatas = NULL; } @@ -22,7 +22,7 @@ CN3AnimKey::~CN3AnimKey() { } void CN3AnimKey::Release() { - m_nCount = 0; // Ű īƮ + m_nCount = 0; // 키 카운트 m_fSamplingRate = 30.0; delete[] m_pDatas; m_pDatas = NULL; @@ -38,7 +38,7 @@ void CN3AnimKey::Alloc(int nCount, float fSamplingRate, ANIMATION_KEY_TYPE eType return; } if (fSamplingRate <= 0.0f) { - __ASSERT(0, "Animation Sampling Rate ݵ 0 Ŀ մϴ."); + __ASSERT(0, "Animation Sampling Rate 는 반드시 0 보다 커야 합니다."); return; } @@ -53,10 +53,10 @@ void CN3AnimKey::Alloc(int nCount, float fSamplingRate, ANIMATION_KEY_TYPE eType m_fSamplingRate = fSamplingRate; if (KEY_VECTOR3 == m_eType) { - m_pDatas = new __Vector3[nCount + 1]; // Ѱ ְ Ҵ. + m_pDatas = new __Vector3[nCount + 1]; // 한개 더 여유있게 할당. memset(m_pDatas, 0, sizeof(__Vector3) * (nCount + 1)); } else if (KEY_QUATERNION == m_eType) { - m_pDatas = new __Quaternion[nCount + 1]; // Ѱ ְ Ҵ. + m_pDatas = new __Quaternion[nCount + 1]; // 한개 더 여유있게 할당. memset(m_pDatas, 0, sizeof(__Quaternion) * (nCount + 1)); } } @@ -67,9 +67,9 @@ bool CN3AnimKey::Load(HANDLE hFile) { } DWORD dwRWC = 0; - ReadFile(hFile, &m_nCount, 4, &dwRWC, NULL); // Ű  ִ + ReadFile(hFile, &m_nCount, 4, &dwRWC, NULL); // 키가 몇개 있는지 - // Ű Ͽ б.. + // 키값을 파일에서 읽기.. if (m_nCount > 0) { ReadFile(hFile, &m_eType, 4, &dwRWC, NULL); // Key Type ReadFile(hFile, &m_fSamplingRate, 4, &dwRWC, NULL); // Sampling Rate @@ -77,11 +77,11 @@ bool CN3AnimKey::Load(HANDLE hFile) { this->Alloc(m_nCount, m_fSamplingRate, m_eType); if (KEY_VECTOR3 == m_eType) { ReadFile(hFile, m_pDatas, sizeof(__Vector3) * m_nCount, &dwRWC, NULL); - __Vector3 * pKeys = (__Vector3 *)m_pDatas; // ϳ ش. + __Vector3 * pKeys = (__Vector3 *)m_pDatas; // 끝에 하나더 복사해준다. pKeys[m_nCount] = pKeys[m_nCount - 1]; } else if (KEY_QUATERNION == m_eType) { ReadFile(hFile, m_pDatas, sizeof(__Quaternion) * m_nCount, &dwRWC, NULL); - __Quaternion * pKeys = (__Quaternion *)m_pDatas; // ϳ ش. + __Quaternion * pKeys = (__Quaternion *)m_pDatas; // 끝에 하나더 복사해준다. pKeys[m_nCount] = pKeys[m_nCount - 1]; } } @@ -92,7 +92,7 @@ bool CN3AnimKey::Load(HANDLE hFile) { #ifdef _N3TOOL bool CN3AnimKey::Save(HANDLE hFile) { DWORD dwRWC = 0; - WriteFile(hFile, &m_nCount, 4, &dwRWC, NULL); // Ű  ִ + WriteFile(hFile, &m_nCount, 4, &dwRWC, NULL); // 키가 몇개 있는지 if (m_nCount > 0) { WriteFile(hFile, &m_eType, 4, &dwRWC, NULL); // Key Type @@ -135,7 +135,7 @@ void CN3AnimKey::Add(CN3AnimKey & AKSrc, int nIndexS, int nIndexE) { return; } - int nAddCount = nIndexE - nIndexS + 1; // ߰ + int nAddCount = nIndexE - nIndexS + 1; // 추가할 갯수 int nPrevCount = m_nCount; void * pVBackup = NULL; @@ -150,17 +150,17 @@ void CN3AnimKey::Add(CN3AnimKey & AKSrc, int nIndexS, int nIndexE) { } } - this->Alloc(nPrevCount + nAddCount, AKSrc.SamplingRate(), AKSrc.Type()); // Ҵ. + this->Alloc(nPrevCount + nAddCount, AKSrc.SamplingRate(), AKSrc.Type()); // 새로 할당. if (nPrevCount > 0) { if (KEY_VECTOR3 == m_eType) { - memcpy(m_pDatas, pVBackup, sizeof(__Vector3) * nPrevCount); // restore + memcpy(m_pDatas, pVBackup, sizeof(__Vector3) * nPrevCount); // 백업받은걸 restore } else if (KEY_QUATERNION == m_eType) { - memcpy(m_pDatas, pVBackup, sizeof(__Quaternion) * nPrevCount); // restore + memcpy(m_pDatas, pVBackup, sizeof(__Quaternion) * nPrevCount); // 백업받은걸 restore } } if (KEY_VECTOR3 == m_eType) { - for (int i = 0; i < nAddCount; i++) // ߰. + for (int i = 0; i < nAddCount; i++) // 추가. { __Vector3 * pvTmp = (__Vector3 *)AKSrc.DataGet(nIndexS + i); if (pvTmp) { @@ -170,7 +170,7 @@ void CN3AnimKey::Add(CN3AnimKey & AKSrc, int nIndexS, int nIndexE) { } } } else if (KEY_QUATERNION == m_eType) { - for (int i = 0; i < nAddCount; i++) // ߰. + for (int i = 0; i < nAddCount; i++) // 추가. { __Quaternion * pvTmp = (__Quaternion *)AKSrc.DataGet(nIndexS + i); if (pvTmp) { @@ -194,7 +194,7 @@ void CN3AnimKey::Duplicate(CN3AnimKey * pSrc) { m_nCount = pSrc->Count(); - // Ű Ͽ б.. + // 키값을 파일에서 읽기.. if (m_nCount > 0) { m_eType = pSrc->Type(); m_fSamplingRate = pSrc->SamplingRate(); diff --git a/src/engine/N3Base/N3AnimKey.h b/src/engine/N3Base/N3AnimKey.h index 2d354cb3..7fd6d0c7 100644 --- a/src/engine/N3Base/N3AnimKey.h +++ b/src/engine/N3Base/N3AnimKey.h @@ -17,12 +17,12 @@ class CN3AnimKey : CN3Base { protected: ANIMATION_KEY_TYPE m_eType; // Key Type - Position Rotation Scale - int m_nCount; // Ű īƮ - float m_fSamplingRate; // Sampling Rate - ǥ 30 Frame Per Sec ̴.. + int m_nCount; // 키 카운트 + float m_fSamplingRate; // Sampling Rate - 표준은 30 Frame Per Sec 이다.. void * m_pDatas; public: - ANIMATION_KEY_TYPE Type() { return m_eType; } // Ű , Ϳ ʹϾ ° ִ.. + ANIMATION_KEY_TYPE Type() { return m_eType; } // 키 형태, 벡터워 쿼터니언 형태가 있다.. void Add(CN3AnimKey & AKSrc, int nIndexS, int nIndexE); // void Translate(int nIndexStart, int nIndexEnd, float fDelta, int nKFlags); bool DataGet(float fFrm, __Vector3 & v) { diff --git a/src/engine/N3Base/N3AnimatedTexures.cpp b/src/engine/N3Base/N3AnimatedTexures.cpp index bb732565..77710df7 100644 --- a/src/engine/N3Base/N3AnimatedTexures.cpp +++ b/src/engine/N3Base/N3AnimatedTexures.cpp @@ -51,13 +51,13 @@ bool CN3AnimatedTexures::Load(HANDLE hFile) { int nL = 0; char szFN[256] = ""; - m_TexRefs.assign(iTC, NULL); // Texture Pointer Pointer Ҵ.. - for (int i = 0; i < iTC; i++) // Texture Count ŭ ̸ о ؽó θ.. + m_TexRefs.assign(iTC, NULL); // Texture Pointer Pointer 할당.. + for (int i = 0; i < iTC; i++) // Texture Count 만큼 파일 이름 읽어서 텍스처 부르기.. { ReadFile(hFile, &nL, 4, &dwRWC, NULL); if (nL > 0) { ReadFile(hFile, szFN, nL, &dwRWC, NULL); - szFN[nL] = NULL; // ؽó ̸.. + szFN[nL] = NULL; // 텍스처 파일 이름.. m_TexRefs[i] = s_MngTex.Get(szFN); } } @@ -75,7 +75,7 @@ bool CN3AnimatedTexures::Save(HANDLE hFile) { int iTC = m_TexRefs.size(); WriteFile(hFile, &iTC, 4, &dwRWC, NULL); - for (int i = 0; i < iTC; i++) // Texture Count ŭ ̸ о ؽó θ.. + for (int i = 0; i < iTC; i++) // Texture Count 만큼 파일 이름 읽어서 텍스처 부르기.. { nL = 0; if (m_TexRefs[i]) { @@ -83,7 +83,7 @@ bool CN3AnimatedTexures::Save(HANDLE hFile) { } WriteFile(hFile, &nL, 4, &dwRWC, NULL); if (nL > 0) { - WriteFile(hFile, m_TexRefs[i]->FileName().c_str(), nL, &dwRWC, NULL); // ؽó ̸.. + WriteFile(hFile, m_TexRefs[i]->FileName().c_str(), nL, &dwRWC, NULL); // 텍스처 파일 이름.. } } @@ -99,6 +99,6 @@ void CN3AnimatedTexures::Tick() { int iTC = m_TexRefs.size(); m_fTexIndex += CN3Base::s_fSecPerFrm * m_fTexFPS; if (m_fTexIndex >= iTC) { - m_fTexIndex -= (iTC * m_fTexIndex) / iTC; // Ҽ ȴ??(Ͽư ~) + m_fTexIndex -= (iTC * m_fTexIndex) / iTC; // 정수로 나누면 소숫점만 남기게 된다??(하여튼 비슷해~) } } diff --git a/src/engine/N3Base/N3Base.cpp b/src/engine/N3Base/N3Base.cpp index 010591b3..53810f2c 100644 --- a/src/engine/N3Base/N3Base.cpp +++ b/src/engine/N3Base/N3Base.cpp @@ -15,50 +15,50 @@ ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// -LPDIRECT3DDEVICE9 CN3Base::s_lpD3DDev = NULL; // .. ڴ ϸ ȵȴ.. -DWORD CN3Base::s_dwTextureCaps = 0; // Texture ȣȯ.. +LPDIRECT3DDEVICE9 CN3Base::s_lpD3DDev = NULL; // 참조 포인터.. 멋대로 해제하면 안된다.. +DWORD CN3Base::s_dwTextureCaps = 0; // Texture 호환성.. float CN3Base::s_fFrmPerSec = 30.0f; // Frame Per Second float CN3Base::s_fSecPerFrm = 1.0f / 30.0f; // Second per Frame -HWND CN3Base::s_hWndBase = NULL; // Init Ҷ Window Handle -HWND CN3Base::s_hWndPresent = NULL; // ֱٿ Present Window Handle +HWND CN3Base::s_hWndBase = NULL; // Init 할때 쓴 Window Handle +HWND CN3Base::s_hWndPresent = NULL; // 최근에 Present 한 Window Handle -D3DPRESENT_PARAMETERS CN3Base::s_DevParam; // Device Present Parameter -D3DCAPS9 CN3Base::s_DevCaps; // Device ȣȯ... +D3DPRESENT_PARAMETERS CN3Base::s_DevParam; // Device 생성 Present Parameter +D3DCAPS9 CN3Base::s_DevCaps; // Device 호환성... std::string CN3Base::s_szPath; __CameraData CN3Base::s_CameraData; // Camera Data __ResrcInfo CN3Base::s_ResrcInfo; // Rendering Information -__Options CN3Base::s_Options; // ɼǵ... +__Options CN3Base::s_Options; // 각종 옵션등... #ifdef _DEBUG __RenderInfo CN3Base::s_RenderInfo; // Rendering Information #endif -#ifdef _N3GAME // ƴ ʿ... -CN3SndMgr CN3Base::s_SndMgr; // ޴. +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... +CN3SndMgr CN3Base::s_SndMgr; //사운드 메니저. #endif -#ifdef _N3UIE // ui ϶ ʿϴ. -CN3SndMgr CN3Base::s_SndMgr; // ޴. +#ifdef _N3UIE // ui 에디터일때는 필요하다. +CN3SndMgr CN3Base::s_SndMgr; //사운드 메니저. #endif CN3Mng CN3Base::s_MngTex; // Texture Manager CN3Mng CN3Base::s_MngMesh; // Mesh Manager -CN3Mng CN3Base::s_MngVMesh; // ܼ ︸ ִ ޽ - ַ 浹 üũ .. +CN3Mng CN3Base::s_MngVMesh; // 단순히 폴리곤만 갖고 있는 메시 - 주로 충돌 체크에 쓴다.. CN3Mng CN3Base::s_MngPMesh; // Progressive Mesh Manager CN3Mng CN3Base::s_MngJoint; // Joint Manager CN3Mng CN3Base::s_MngSkins; // Character Part Skins Manager CN3Mng CN3Base::s_MngAniCtrl; // Animation Manager -CN3Mng CN3Base::s_MngFXPMesh; // FX PMesh - Ϲ PMesh ٸ. -CN3Mng CN3Base::s_MngFXShape; // FX Shape - Ϲ shape ٸ. +CN3Mng CN3Base::s_MngFXPMesh; // FX에서 쓰는 PMesh - 파일은 일반 PMesh를 쓰지만 속은 다르다. +CN3Mng CN3Base::s_MngFXShape; // FX에서 쓰는 Shape - 파일은 일반 shape를 쓰지만 속은 다르다. CN3AlphaPrimitiveManager CN3Base:: - s_AlphaMgr; // Alpha blend .. ߰ߴٰ.. ī޶ Ÿ ߾ ϰ Ѳ ׸.. + s_AlphaMgr; // Alpha blend 할 폴리곤들을 관리.. 추가했다가.. 카메라 거리에 맟추어 정렬하고 한꺼번에 그린다.. #ifdef _N3GAME -CLogWriter g_Log; // α ... +CLogWriter g_Log; // 로그 남기기... #endif CN3Base::CN3Base() { - m_dwType = OBJ_BASE; // "MESH", "CAMERA", "SCENE", "???" .... ... + m_dwType = OBJ_BASE; // "MESH", "CAMERA", "SCENE", "???" .... 등등등... m_szName = ""; } @@ -260,7 +260,7 @@ void CN3Base::PathSet(const std::string & szPath) { return; } - CharLower(&(s_szPath[0])); // ݵ ҹڷ ش.. + CharLower(&(s_szPath[0])); // 반드시 소문자로 만들어 준다.. if (s_szPath.size() > 1) { if (s_szPath[s_szPath.size() - 1] != '\\') { s_szPath += '\\'; diff --git a/src/engine/N3Base/N3Base.h b/src/engine/N3Base/N3Base.h index ce989b91..6b0747c1 100644 --- a/src/engine/N3Base/N3Base.h +++ b/src/engine/N3Base/N3Base.h @@ -15,10 +15,10 @@ #include -#if _N3GAME // ƴ ʿ... +#if _N3GAME // 게임이 아닌 툴에서는 필요없다... #include "N3SndMgr.h" #endif -#ifdef _N3UIE // ui ϶ ʿϴ. +#ifdef _N3UIE // ui 에디터일때는 필요하다. #include "N3SndMgr.h" #endif @@ -32,7 +32,7 @@ const DWORD TEX_CAPS_MIPMAP = 0x00000040; const DWORD TEX_CAPS_POW2 = 0x00000080; const float CAMERA_RADIUS_UNIT = 2.0f; -const int MAX_CAMERA_RADIUS = 512; // 2 128 Ʈ δƮ ̸ ´.. +const int MAX_CAMERA_RADIUS = 512; // 2미터 단위로 128 개의 도트 프로덕트 미리 계산해 놓는다.. enum TIMER_COMMAND { TIMER_RESET, @@ -56,9 +56,9 @@ struct __CameraData { __Vector3 vAt; // Camera At Vector __Vector3 vUp; // Camera Up Vector - float fFOV; // ī޶ : Field Of View + float fFOV; // 카메라 렌즈 각 : Field Of View // float fInverse_SineHalfOfFOV; - float fAspect; // Ⱦ + float fAspect; // 종횡비 float fNP; // NearPlane float fFP; // FarPlane D3DVIEWPORT9 vp; // ViewPort; @@ -68,12 +68,12 @@ struct __CameraData { float fFrustum[6][4]; - // fRadius - ü ణ ְ ׸ŭ Ŭ ְ Ѵ.. + // fRadius - 물체의 반지름보다 약간 더 여유 있게 잡고 넣으면 그만큼 클리핑을 여유있게 한다.. BOOL IsOutOfFrustum(const __Vector3 & vPosition, float fRadius) - // ̸ ī޶ Ʈ δƮ ī޶ ü ۿ ش. + // 미리 계산된 카메라 평면의 도트 프로덕트 값을 기준으로 카메라 사면체 밖에 있으면 참을 돌려준다. { if ((vEye - vPosition).Magnitude() > fFP + fRadius) { - return TRUE; // Far Plane Ÿüũ + return TRUE; // Far Plane 거리체크 } int p; @@ -91,16 +91,16 @@ struct __CameraData { struct __RenderInfo { int nShape; int nShape_Part; - int nShape_Polygon; // ܼ + int nShape_Polygon; // 단순 폴리곤 int nChr; int nChr_Part; - int nChr_Polygon; // ij - int nChr_Plug; // ijͿ .. - int nChr_Plug_Polygon; // ijͿ .. + int nChr_Polygon; // 캐릭터 폴리곤 + int nChr_Plug; // 캐릭터에 붙은 무기등.. + int nChr_Plug_Polygon; // 캐릭터에 붙은 무기등의 폴리곤.. - int nTerrain_Polygon; // Ÿ .. - int nTerrain_Tile_Polygon; // Ÿ .. + int nTerrain_Polygon; // 타일 적용된 지형 폴리곤.. + int nTerrain_Tile_Polygon; // 타일 적용된 지형 폴리곤.. int nAlpha_Polygon; @@ -109,7 +109,7 @@ struct __RenderInfo { int nTexture_128X128; // 128 X 128 Texture int nTexture_256X256; // 256 X 256 Texture int nTexture_512X512; // 512 X 512 Texture - int nTexture_Huge; // 512 X 512 ̻ size + int nTexture_Huge; // 512 X 512 이상 size int nTexture_OtherSize; // Other size }; @@ -119,24 +119,24 @@ struct __ResrcInfo { int nTexture_Loaded_128X128; // 128 X 128 Texture int nTexture_Loaded_256X256; // 256 X 256 Texture int nTexture_Loaded_512X512; // 512 X 512 Texture - int nTexture_Loaded_Huge; // 512 X 512 ̻ size + int nTexture_Loaded_Huge; // 512 X 512 이상 size int nTexture_Loaded_OtherSize; // Other size }; struct __Options { int iUseShadow; - int iTexLOD_Chr; // 0 - ũ.. 1 - Ѵܰ ۰. 2 - δܰ ۰.. - int iTexLOD_Shape; // 0 - ũ.. 1 - Ѵܰ ۰. 2 - δܰ ۰.. - int iTexLOD_Terrain; // 0 - ũ.. 1 - Ѵܰ ۰. 2 - δܰ ۰.. + int iTexLOD_Chr; // 0 - 원래 크기.. 1 - 한단계 작게. 2 - 두단계 작게.. + int iTexLOD_Shape; // 0 - 원래 크기.. 1 - 한단계 작게. 2 - 두단계 작게.. + int iTexLOD_Terrain; // 0 - 원래 크기.. 1 - 한단계 작게. 2 - 두단계 작게.. int iViewWidth; int iViewHeight; int iViewColorDepth; int iViewDist; - int iEffectSndDist; // Ʈ Ÿ + int iEffectSndDist; // 이펙트 사운드 거리 bool bSndEnable; // 0 - High, 1 - Low - bool bSndDuplicated; // ߺ - bool bWindowCursor; // 0 - ӿ ׷ִ Ŀ 1 - Ŀ + bool bSndDuplicated; // 중복된 음원 사용 + bool bWindowCursor; // 0 - 게임에서 그려주는 커서 1 - 윈도우 커서 사용 void InitDefault() { iUseShadow = true; @@ -157,47 +157,47 @@ struct __Options { class CN3Base { public: - static LPDIRECT3DDEVICE9 s_lpD3DDev; // Device .. ڴ ϸ ȵȴ.. - static D3DPRESENT_PARAMETERS s_DevParam; // Device Present Parameter - static D3DCAPS9 s_DevCaps; // Device ȣȯ... - static DWORD s_dwTextureCaps; // Texture .. DXT1 ~ DXT5, Square Only - static HWND s_hWndBase; // Init Ҷ Window Handle - static HWND s_hWndPresent; // ֱٿ Present Window Handle - - static __CameraData s_CameraData; // ī޶ .. + static LPDIRECT3DDEVICE9 s_lpD3DDev; // Device 참조 포인터.. 멋대로 해제하면 안된다.. + static D3DPRESENT_PARAMETERS s_DevParam; // Device 생성 Present Parameter + static D3DCAPS9 s_DevCaps; // Device 호환성... + static DWORD s_dwTextureCaps; // Texture 지원.. DXT1 ~ DXT5, Square Only + static HWND s_hWndBase; // Init 할때 쓴 Window Handle + static HWND s_hWndPresent; // 최근에 Present 한 Window Handle + + static __CameraData s_CameraData; // 카메라 데이터 정적 변수.. static __ResrcInfo s_ResrcInfo; // Rendering Information.. - static __Options s_Options; // ɼǵ... + static __Options s_Options; // 각종 옵션등... #ifdef _DEBUG static __RenderInfo s_RenderInfo; // Rendering Information.. #endif static float s_fFrmPerSec; // Frame Per Second - static float s_fSecPerFrm; // Second Per Frame = 1.0f/s_fFrmPerSec (Dino ߰) + static float s_fSecPerFrm; // Second Per Frame = 1.0f/s_fFrmPerSec (Dino가 추가) -#ifdef _N3GAME // ƴ ʿ... +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... static CN3SndMgr s_SndMgr; #endif -#ifdef _N3UIE // ui ϶ ʿϴ. +#ifdef _N3UIE // ui 에디터일때는 필요하다. static CN3SndMgr s_SndMgr; #endif static CN3AlphaPrimitiveManager - s_AlphaMgr; // Alpha blend .. ߰ߴٰ.. ī޶ Ÿ ߾ ϰ Ѳ ׸.. + s_AlphaMgr; // Alpha blend 할 폴리곤들을 관리.. 추가했다가.. 카메라 거리에 씗추어 정렬하고 한꺼번에 그린다.. static CN3Mng s_MngTex; // Texture Manager static CN3Mng s_MngMesh; // Normal Mesh Manager - static CN3Mng s_MngVMesh; // ܼ ︸ ִ ޽ - ַ 浹 üũ .. + static CN3Mng s_MngVMesh; // 단순히 폴리곤만 갖고 있는 메시 - 주로 충돌 체크에 쓴다.. static CN3Mng s_MngPMesh; // Progressive Mesh Manager static CN3Mng s_MngJoint; // Joint Manager static CN3Mng s_MngSkins; // Character Part Skin Manager static CN3Mng s_MngAniCtrl; // Animation Manager - static CN3Mng s_MngFXPMesh; // FX PMesh - Ϲ PMesh ٸ. - static CN3Mng s_MngFXShape; // FX Shape - Ϲ shape ٸ. + static CN3Mng s_MngFXPMesh; // FX에서 쓰는 PMesh - 파일은 일반 PMesh를 쓰지만 속은 다르다. + static CN3Mng s_MngFXShape; // FX에서 쓰는 Shape - 파일은 일반 shape를 쓰지만 속은 다르다. protected: - static std::string s_szPath; // α׷ .. + static std::string s_szPath; // 프로그램이 실행된 경로.. protected: - DWORD m_dwType; // "MESH", "CAMERA", "SCENE", "???" .... ... + DWORD m_dwType; // "MESH", "CAMERA", "SCENE", "???" .... 등등등... public: std::string m_szName; @@ -212,7 +212,7 @@ class CN3Base { static float TimerProcess(TIMER_COMMAND command); - DWORD Type() { return m_dwType; } // ü .. + DWORD Type() { return m_dwType; } // 객체 종류.. void ReleaseResrc(); //#ifdef _N3TOOL diff --git a/src/engine/N3Base/N3BaseFileAccess.cpp b/src/engine/N3Base/N3BaseFileAccess.cpp index a94b8d25..587e8109 100644 --- a/src/engine/N3Base/N3BaseFileAccess.cpp +++ b/src/engine/N3Base/N3BaseFileAccess.cpp @@ -12,14 +12,14 @@ CN3BaseFileAccess::CN3BaseFileAccess() { m_dwType |= OBJ_BASE_FILEACCESS; m_szFileName = ""; - m_iLOD = 0; // εҶ LOD + m_iLOD = 0; // 로딩할때 쓸 LOD } CN3BaseFileAccess::~CN3BaseFileAccess() {} void CN3BaseFileAccess::Release() { m_szFileName = ""; - m_iLOD = 0; // εҶ LOD + m_iLOD = 0; // 로딩할때 쓸 LOD CN3Base::Release(); } @@ -27,11 +27,11 @@ void CN3BaseFileAccess::FileNameSet(const std::string & szFileName) { std::string szTmpFN = szFileName; if (!szTmpFN.empty()) { - CharLower(&(szTmpFN[0])); // ҹڷ .. + CharLower(&(szTmpFN[0])); // 모두 소문자로 만든다.. } - int iPos = szTmpFN.find(s_szPath); // ڿ Base Path ġϴ ̸ ִ . + int iPos = szTmpFN.find(s_szPath); // 문자열에 Base Path 와 일치하는 이름이 있는지 본다. if (iPos >= 0) { - m_szFileName = szTmpFN.substr(s_szPath.size()); // ΰ ġϸ.. δ ©ش.. + m_szFileName = szTmpFN.substr(s_szPath.size()); // 경로가 일치하면.. 긴경로는 짤라준다.. } else { m_szFileName = szTmpFN; } @@ -62,7 +62,7 @@ bool CN3BaseFileAccess::LoadFromFile() { std::string szFullPath; if (-1 != m_szFileName.find(':') || -1 != m_szFileName.find("\\\\") || - -1 != m_szFileName.find("//")) // ڿ ':', '\\', '//' ü ̴.. + -1 != m_szFileName.find("//")) // 문자열에 ':', '\\', '//' 이 들어 있으면 전체 경로이다.. { szFullPath = m_szFileName; } else { @@ -107,7 +107,7 @@ bool CN3BaseFileAccess::SaveToFile() { std::string szFullPath; if (-1 != m_szFileName.find(':') || -1 != m_szFileName.find("\\\\") || - -1 != m_szFileName.find("//")) // ڿ ':', '\\', '//' ü ̴.. + -1 != m_szFileName.find("//")) // 문자열에 ':', '\\', '//' 이 들어 있으면 전체 경로이다.. { szFullPath = m_szFileName; } else { diff --git a/src/engine/N3Base/N3BaseFileAccess.h b/src/engine/N3Base/N3BaseFileAccess.h index 95b5301c..a44333f6 100644 --- a/src/engine/N3Base/N3BaseFileAccess.h +++ b/src/engine/N3Base/N3BaseFileAccess.h @@ -11,22 +11,22 @@ class CN3BaseFileAccess : public CN3Base { protected: - std::string m_szFileName; // Base Path + ̸ + std::string m_szFileName; // Base Path 를 제외한 로컬 경로 + 파일 이름 public: - int m_iLOD; // εҶ LOD + int m_iLOD; // 로딩할때 쓸 LOD public: const std::string & FileName() const { return m_szFileName; } // Full Path void FileNameSet(const std::string & szFileName); - bool LoadFromFile(); // Ͽ о. - virtual bool LoadFromFile(const std::string & szFileName); // Ͽ о. - virtual bool Load(HANDLE hFile); // ڵ鿡 о.. + bool LoadFromFile(); // 파일에서 읽어오기. + virtual bool LoadFromFile(const std::string & szFileName); // 파일에서 읽어오기. + virtual bool Load(HANDLE hFile); // 핸들에서 읽어오기.. - virtual bool SaveToFile(); // ̸ . - virtual bool SaveToFile(const std::string & szFileName); // ̸ . - virtual bool Save(HANDLE hFile); // ڵ .. + virtual bool SaveToFile(); // 현재 파일 이름대로 저장. + virtual bool SaveToFile(const std::string & szFileName); // 새이름으로 저장. + virtual bool Save(HANDLE hFile); // 핸들을 통해 저장.. public: void Release(); diff --git a/src/engine/N3Base/N3Board.cpp b/src/engine/N3Base/N3Board.cpp index 88e2f778..71252e7a 100644 --- a/src/engine/N3Base/N3Board.cpp +++ b/src/engine/N3Base/N3Board.cpp @@ -48,7 +48,7 @@ void CN3Board::Release() { } void CN3Board::Tick(float fFrm) { - // ȸ Ų.. + // 회전 시킨다.. if (m_dwBoardType == BOARD_Y) { __Vector3 vDir = s_CameraData.vEye - m_vPos; if (vDir.x > 0.0f) { @@ -67,7 +67,7 @@ void CN3Board::Tick(float fFrm) { if (iTC > 1) { m_fTexIndex += CN3Base::s_fSecPerFrm * m_fTexFPS; if (m_fTexIndex >= iTC) { - m_fTexIndex -= (iTC * m_fTexIndex) / iTC; // Ҽ ȴ??(Ͽư ~) + m_fTexIndex -= (iTC * m_fTexIndex) / iTC; // 정수로 나누면 소숫점만 남기게 된다??(하여튼 비슷해~) } } } @@ -82,7 +82,7 @@ void CN3Board::Render() { s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); static DWORD dwAlpha, dwFog, dwCull; - if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) // Alpha + if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) // Alpha 사용 { s_lpD3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &dwAlpha); if (TRUE != dwAlpha) { @@ -91,7 +91,7 @@ void CN3Board::Render() { s_lpD3DDev->SetRenderState(D3DRS_SRCBLEND, m_Mtl.dwSrcBlend); s_lpD3DDev->SetRenderState(D3DRS_DESTBLEND, m_Mtl.dwDestBlend); } - if (m_Mtl.nRenderFlags & RF_NOTUSEFOG) // Fog .. + if (m_Mtl.nRenderFlags & RF_NOTUSEFOG) // Fog 무시.. { s_lpD3DDev->GetRenderState(D3DRS_FOGENABLE, &dwFog); if (TRUE == dwFog) { @@ -117,7 +117,7 @@ void CN3Board::Render() { s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); } if ((m_Mtl.nRenderFlags & RF_NOTUSEFOG) && TRUE == dwFog) { - s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); // Ȱ ʴ´.. + s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); // 안개 사용하지 않는다.. } if ((m_Mtl.nRenderFlags & RF_DOUBLESIDED) && D3DCULL_NONE != dwCull) { s_lpD3DDev->SetRenderState(D3DRS_CULLMODE, dwCull); @@ -174,38 +174,38 @@ void CN3Board::LoadFromText(const std::string & szFName) { Release(); FILE * stream = fopen(szFName.c_str(), "r"); - __ASSERT(stream, " ã ϴ."); + __ASSERT(stream, "지정한 파일을 찾을 수 없습니다."); int result, iCount; char szBoardType[64] = ""; __Vector3 vPos; float fWidth, fHeight; result = fscanf(stream, "Position = %f %f %f\n", &(vPos.x), &(vPos.y), &(vPos.z)); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Size = %f %f\n", &fWidth, &fHeight); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Rotation Axis = %s\n", szBoardType); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Frame per Sec = %f\n", &m_fTexFPS); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Render Flag = %d\n", &m_Mtl.nRenderFlags); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Source Blend = %d\n", &m_Mtl.dwSrcBlend); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Dest Blend = %d\n", &m_Mtl.dwDestBlend); - __ASSERT(result != EOF, "߸ Machine "); - // Ȱ, culling ɼ 켱 . + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); + // 안개, culling 옵션은 우선 정하지 말자. result = fscanf(stream, "Texture Count = %d\n", &iCount); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); if (iCount > 0) { char szTexFName[_MAX_PATH]; TexAlloc(iCount); for (int i = 0; i < iCount; ++i) { result = fscanf(stream, "Texture Name = %s\n", &szTexFName); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); TexSet(i, szTexFName); } } diff --git a/src/engine/N3Base/N3Board.h b/src/engine/N3Base/N3Board.h index 93543bbc..13dffd2a 100644 --- a/src/engine/N3Base/N3Board.h +++ b/src/engine/N3Base/N3Board.h @@ -17,12 +17,12 @@ class CN3Board : public CN3Transform { protected: __VertexT1 m_vRects[4]; float m_fTexIndex; - std::vector m_TexRefs; // ؽó Ʈ.. + std::vector m_TexRefs; // 텍스처 포인터 리스트.. public: DWORD m_dwBoardType; // Board Type float m_fTexFPS; // Frame Per Second - __Material m_Mtl; // .. + __Material m_Mtl; // 재질.. public: void TexSet(int index, const std::string & szFN); diff --git a/src/engine/N3Base/N3Camera.cpp b/src/engine/N3Base/N3Camera.cpp index 3341944b..26800d81 100644 --- a/src/engine/N3Base/N3Camera.cpp +++ b/src/engine/N3Base/N3Camera.cpp @@ -15,7 +15,7 @@ CN3Camera::CN3Camera() { m_Data.vAt = m_vAt = __Vector3(0, 0, 0); m_Data.vUp = m_vScale = __Vector3(0, 1, 0); - m_Data.fFOV = D3DXToRadian(55.0f); // ⺻ 55 + m_Data.fFOV = D3DXToRadian(55.0f); // 기본값 55 도 m_Data.fNP = 0.7f; m_Data.fFP = 512.0f; @@ -37,7 +37,7 @@ void CN3Camera::Release() { m_Data.vAt = m_vAt = __Vector3(0, 0, 0); m_Data.vUp = m_vScale = __Vector3(0, 1, 0); - m_Data.fFOV = D3DXToRadian(55.0f); // ⺻ 55 + m_Data.fFOV = D3DXToRadian(55.0f); // 기본값 55 도 m_Data.fNP = 0.7f; m_Data.fFP = 512.0f; @@ -210,7 +210,7 @@ BOOL CN3Camera::MoveByWindowMessage(MSG * pMsg) { return TRUE; } } - default: // 콺 ޼ ƴҰ ī޶ ƴϴ. + default: // 마우스 메세지가 아닐경우 카메라 움직임이 아니다. return FALSE; } } @@ -230,9 +230,9 @@ void CN3Camera::Zoom(float fDelta) { float fDist = (vPos - m_Data.vAt).Magnitude(); #ifndef _N3INDOOR if (fDist < 0.3f) { - return; // ʹ ʴ´.. + return; // 너무 가까우면 적용하지 않는다.. } else if (fDist > m_Data.fFP * 2.0f) { - return; // ʹ ָ ʴ´. + return; // 너무 멀면 적용하지 않는다. } #endif @@ -250,7 +250,7 @@ void CN3Camera::Rotate(float fRadianX, float fRadianY) { __Matrix44 mtx; //by lynus... mtx.RotationY(fRadianY); - __Vector3 v1 = m_vAt - m_vPos, v2; // Rotation LookAt Position ó, Scale UpVector ó .. + __Vector3 v1 = m_vAt - m_vPos, v2; // Rotation 은 LookAt Position 처럼, Scale 은 UpVector 처럼 쓴다.. v1 *= mtx; m_vScale *= mtx; @@ -270,7 +270,7 @@ void CN3Camera::Rotate(float fRadianX, float fRadianY) { } #ifdef _N3TOOL -void CN3Camera::LookAround(float fRadianX, float fRadianY) //At Postion ߽ ī޶ .. ġ ٲ.. +void CN3Camera::LookAround(float fRadianX, float fRadianY) //At Postion을 중심으로 카메라가 돈다..고로 위치가 바뀐다.. { //static __Matrix44 mtx; //static __Vector3 v1, v2; @@ -296,7 +296,7 @@ void CN3Camera::Rotate(float fRadianX, float fRadianY) { m_vScale *= mtx; #endif */ - m_vPos = m_vAt + v1; // Rotation LookAt Position ó, Scale UpVector ó .. + m_vPos = m_vAt + v1; // Rotation 은 LookAt Position 처럼, Scale 은 UpVector 처럼 쓴다.. } #endif // end of #ifdef _N3TOOL @@ -322,7 +322,7 @@ void CN3Camera::MoveStraight(float fDistance, bool bSmall) { #ifdef _N3TOOL void CN3Camera::MovePlane(float fX, float fY) { - __Vector3 vDir = m_vAt - m_vPos; // Rotation LookAt Position ó, Scale UpVector ó .. + __Vector3 vDir = m_vAt - m_vPos; // Rotation 은 LookAt Position 처럼, Scale 은 UpVector 처럼 쓴다.. vDir.Normalize(); __Vector3 vHoriz; @@ -337,7 +337,7 @@ void CN3Camera::MovePlane(float fX, float fY) { __Vector3 vMove = (vHoriz * fX) + (vDown * fY); m_vPos += vMove; - m_vAt += vMove; // Rotation LookAt Position ó, Scale UpVector ó .. + m_vAt += vMove; // Rotation 은 LookAt Position 처럼, Scale 은 UpVector 처럼 쓴다.. } #endif // end of #ifdef _N3TOOL @@ -363,7 +363,7 @@ void CN3Camera::Apply() { s_lpD3DDev->SetTransform(D3DTS_PROJECTION, &m_Data.mtxProjection); // Projection Matrix Setting memcpy(&(CN3Base::s_CameraData), &m_Data, sizeof(__CameraData)); // Static Data Update... - // Ȱ ߱.. + // 안개 색깔 맞추기.. s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, m_bFogUse); s_lpD3DDev->SetRenderState(D3DRS_FOGCOLOR, m_FogColor); // s_lpD3DDev->SetRenderState( D3DRS_FOGVERTEXMODE, D3DFOG_EXP2); @@ -371,15 +371,15 @@ void CN3Camera::Apply() { s_lpD3DDev->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_NONE); s_lpD3DDev->SetRenderState(D3DRS_FOGVERTEXMODE, D3DFOG_LINEAR); s_lpD3DDev->SetRenderState(D3DRS_RANGEFOGENABLE, TRUE); - // Range Fog : - Ÿ fog ȴ. - poligon fog ȴ.(ū fog ִ.) - // range fog = FALSE depth fog Ǿ ȴ. + // Range Fog : 장점 - 거리기반으로 fog가 적용된다. 단점 - poligon단위로 같은 fog값이 적용된다.(큰 폴리곤이 있을경우 어색한 fog가 될 수 있다.) + // range fog = FALSE로 했을때는 depth버퍼 기반으로 fog가 계산되어 적용된다. - // vertex fog pixel fog(table fog) - Dino.. - // vertex fog : vertex depth vertex Ǵ . - // ī޶ ٺ vertex ߽ fog ϴ° ȴ. - // pixel fog : pixel depth fog ϴ° . + // vertex fog 와 pixel fog(table fog)의 차이 - Dino씀.. + // vertex fog : vertex의 depth값을 기반으로 vertex사이의 보간으로 계산되는 것 같다. + // 따라서 카메라를 돌리다보면 vertex주위를 중심으로 fog가 변하는것이 관찰된다. + // pixel fog : pixel의 depth값을 기반으로 fog를 계산하는것 같다. - // fog ̸ ū ϳ ׷ fog ־ ִ. + // 위의 모든 fog의 차이를 보려면 큰판을 하나 그려서 fog를 넣어보면 쉽게 관찰할 수 있다. // s_lpD3DDev->SetRenderState( D3DRS_FOGSTART, *(DWORD*)&m_fFogStart); // s_lpD3DDev->SetRenderState( D3DRS_FOGEND, *(DWORD*)&m_fFogEnd); @@ -397,22 +397,22 @@ void CN3Camera::Tick(float fFrm) { CN3Transform::Tick(fFrm); //////////////////////////////////////////////////////////////////////// - // View Matrix Projection Matrix Setting + // View Matrix 및 Projection Matrix Setting ///////////////////////////////////////////////////////////////////////////////////////////////////////// - // __Vector3 m_vEye, m_vUp ->> m_vPos, m_vScale Ѵ.. ߿!! + // __Vector3 m_vEye, m_vUp ->> m_vPos, m_vScale 로 대신한다.. 중요!! m_Data.vEye = m_vPos; m_Data.vAt = m_vAt; - m_Data.vUp = m_vScale; // Up Vector ó . + m_Data.vUp = m_vScale; // Up Vector 처럼 쓴다. ///////////////////////////////////////////////////////////////////////////////////////////////////////// // m_Data.fInverse_SineHalfOfFOV = 1.0f/sinf(m_Data.fFOV*0.5f); - ::D3DXMatrixLookAtLH(&m_Data.mtxView, &m_Data.vEye, &m_Data.vAt, &m_Data.vUp); // Look At - ::D3DXMatrixInverse(&m_Data.mtxViewInverse, NULL, &m_Data.mtxView); // View Inverse ϱ.. - CN3Base::s_lpD3DDev->GetViewport(&m_Data.vp); // View port ... + ::D3DXMatrixLookAtLH(&m_Data.mtxView, &m_Data.vEye, &m_Data.vAt, &m_Data.vUp); // Look At 적용 + ::D3DXMatrixInverse(&m_Data.mtxViewInverse, NULL, &m_Data.mtxView); // View Inverse 행렬 구하기.. + CN3Base::s_lpD3DDev->GetViewport(&m_Data.vp); // View port 가져오기... - m_Data.fAspect = (float)m_Data.vp.Width / (float)m_Data.vp.Height; // Ⱦ + m_Data.fAspect = (float)m_Data.vp.Width / (float)m_Data.vp.Height; // 종횡비 if (m_bOrtho) { float fL = (m_Data.vAt - m_Data.vEye).Magnitude() / 2.0f; ::D3DXMatrixOrthoLH(&m_Data.mtxProjection, fL, fL / m_Data.fAspect, m_Data.fNP * (1.0f + fL / 1000.0f), diff --git a/src/engine/N3Base/N3Camera.h b/src/engine/N3Base/N3Camera.h index 7097f950..c2f6e429 100644 --- a/src/engine/N3Base/N3Camera.h +++ b/src/engine/N3Base/N3Camera.h @@ -23,19 +23,19 @@ class CN3Camera : public CN3Transform { void LookAt(const __Vector3 & vEye, const __Vector3 & vAt, const __Vector3 & vUp); __Vector3 EyePos() { return m_vPos; } __Vector3 AtPos() { return m_vAt; } - __Vector3 UpVector() { return m_vScale; } // Rotation LookAt Position ó, Scale UpVector ó .. + __Vector3 UpVector() { return m_vScale; } // Rotation 은 LookAt Position 처럼, Scale 은 UpVector 처럼 쓴다.. __Vector3 Dir() { __Vector3 vDir = m_vAt - m_vPos; vDir.Normalize(); return vDir; - } // ǵ. + } // 방향을 되돌린다. void EyePosSet(const __Vector3 & v) { m_vPos = v; } void EyePosSet(float x, float y, float z) { m_vPos.Set(x, y, z); } void AtPosSet(const __Vector3 & v) { m_vAt = v; } void AtPosSet(float x, float y, float z) { m_vAt.Set(x, y, z); } - void UpVectorSet(const __Vector3 & v) { m_vScale = v; } // Scale UpVector ó .. - void UpVectorSet(float x, float y, float z) { m_vScale.Set(x, y, z); } // Scale UpVector ó .. + void UpVectorSet(const __Vector3 & v) { m_vScale = v; } // Scale 은 UpVector 처럼 쓴다.. + void UpVectorSet(float x, float y, float z) { m_vScale.Set(x, y, z); } // Scale 은 UpVector 처럼 쓴다.. bool Load(HANDLE hFile); @@ -52,7 +52,7 @@ class CN3Camera : public CN3Transform { CN3Camera(); virtual ~CN3Camera(); - void Tick(float fFrm = FRAME_SELFPLAY); // ī޶󰪸 ܼ ϱ⸸ Ѵ.. + void Tick(float fFrm = FRAME_SELFPLAY); // 카메라값만 단순히 세팅하기만 한다.. void Render(float fUnitSize = 1.0f); - void Apply(); // õ ī޶ D3DDevice + void Apply(); // 세팅된 카메라값을 실제 D3DDevice 에 적용 }; diff --git a/src/engine/N3Base/N3Chr.cpp b/src/engine/N3Base/N3Chr.cpp index 33416243..0ae6206a 100644 --- a/src/engine/N3Base/N3Chr.cpp +++ b/src/engine/N3Base/N3Chr.cpp @@ -177,7 +177,7 @@ void CN3CPart::Render(int nLOD) { #endif static DWORD dwAlpha, dwFog, dwCull; - if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) { // Alpha + if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) { // Alpha 사용 s_lpD3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &dwAlpha); if (TRUE != dwAlpha) { s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); @@ -185,7 +185,7 @@ void CN3CPart::Render(int nLOD) { s_lpD3DDev->SetRenderState(D3DRS_SRCBLEND, m_Mtl.dwSrcBlend); s_lpD3DDev->SetRenderState(D3DRS_DESTBLEND, m_Mtl.dwDestBlend); } - if (m_Mtl.nRenderFlags & RF_NOTUSEFOG) { // Fog .. + if (m_Mtl.nRenderFlags & RF_NOTUSEFOG) { // Fog 무시.. s_lpD3DDev->GetRenderState(D3DRS_FOGENABLE, &dwFog); if (TRUE == dwFog) { s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); @@ -236,7 +236,7 @@ void CN3CPart::Render(int nLOD) { s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); } if ((m_Mtl.nRenderFlags & RF_NOTUSEFOG) && TRUE == dwFog) { - s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); // Ȱ ʴ´.. + s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); // 안개 사용하지 않는다.. } if ((m_Mtl.nRenderFlags & RF_DOUBLESIDED) && D3DCULL_NONE != dwCull) { s_lpD3DDev->SetRenderState(D3DRS_CULLMODE, dwCull); @@ -322,7 +322,7 @@ void CN3CPlugBase::ReCalcMatrix() { // m_Matrix *= m_MtxRot; // m_Matrix.PosSet(m_vPosition); - // __Matrix44 mtxScale; // Ϻη ߿ ϵ ٲپ... + // __Matrix44 mtxScale; // 일부러 스케일 값을 나중에 적용하도록 바꾸었다... // mtxScale.Scale(m_vScale); // m_Matrix *= mtxScale; } @@ -345,7 +345,7 @@ void CN3CPlugBase::Render(const __Matrix44 & mtxParent, const __Matrix44 & mtxJo #endif DWORD dwAlpha = 0, dwFog = 0, dwCull = 0; - if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) { // Alpha + if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) { // Alpha 사용 s_lpD3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &dwAlpha); if (TRUE != dwAlpha) { s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); @@ -353,7 +353,7 @@ void CN3CPlugBase::Render(const __Matrix44 & mtxParent, const __Matrix44 & mtxJo s_lpD3DDev->SetRenderState(D3DRS_SRCBLEND, m_Mtl.dwSrcBlend); s_lpD3DDev->SetRenderState(D3DRS_DESTBLEND, m_Mtl.dwDestBlend); } - if (m_Mtl.nRenderFlags & RF_NOTUSEFOG) { // Fog .. + if (m_Mtl.nRenderFlags & RF_NOTUSEFOG) { // Fog 무시.. s_lpD3DDev->GetRenderState(D3DRS_FOGENABLE, &dwFog); if (TRUE == dwFog) { s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); @@ -402,7 +402,7 @@ void CN3CPlugBase::Render(const __Matrix44 & mtxParent, const __Matrix44 & mtxJo s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); } if ((m_Mtl.nRenderFlags & RF_NOTUSEFOG) && TRUE == dwFog) { - s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); // Ȱ ʴ´.. + s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); // 안개 사용하지 않는다.. } if ((m_Mtl.nRenderFlags & RF_DOUBLESIDED) && D3DCULL_NONE != dwCull) { s_lpD3DDev->SetRenderState(D3DRS_CULLMODE, dwCull); @@ -414,7 +414,7 @@ void CN3CPlugBase::Render(const __Matrix44 & mtxParent, const __Matrix44 & mtxJo m_PMeshInst.Render(); } - if (bUseTwoUV) // ؽó ΰ Ѵ...!! + if (bUseTwoUV) // 텍스처 스테이지 두개로 렌더링한다...!! { s_lpD3DDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); s_lpD3DDev->SetTexture(1, NULL); @@ -460,7 +460,7 @@ bool CN3CPlugBase::Load(HANDLE hFile) { ReadFile(hFile, &m_MtxRot, sizeof(m_MtxRot), &dwRWC, NULL); ReadFile(hFile, &m_vScale, sizeof(m_vScale), &dwRWC, NULL); - ReadFile(hFile, &m_Mtl, sizeof(__Material), &dwRWC, NULL); // + ReadFile(hFile, &m_Mtl, sizeof(__Material), &dwRWC, NULL); // 재질 ReadFile(hFile, &nL, 4, &dwRWC, NULL); if (nL > 0) { @@ -476,7 +476,7 @@ bool CN3CPlugBase::Load(HANDLE hFile) { this->TexSet(szFN); } - this->ReCalcMatrix(); // ... + this->ReCalcMatrix(); // 행렬 계산... return 0; } @@ -495,7 +495,7 @@ bool CN3CPlugBase::Save(HANDLE hFile) { WriteFile(hFile, &m_MtxRot, sizeof(m_MtxRot), &dwRWC, NULL); WriteFile(hFile, &m_vScale, sizeof(m_vScale), &dwRWC, NULL); - WriteFile(hFile, &m_Mtl, sizeof(__Material), &dwRWC, NULL); // + WriteFile(hFile, &m_Mtl, sizeof(__Material), &dwRWC, NULL); // 재질 nL = 0; CN3PMesh * pPMesh = m_PMeshInst.GetMesh(); @@ -525,7 +525,7 @@ e_PlugType CN3CPlugBase::GetPlugTypeByFileName(const std::string & szFN) { return PLUGTYPE_UNDEFINED; } // berserk - // ϴ Ȯڷ Ѵ. .. N3CPlug, N3CPlug_Cloak + // 일단 확장자로 구분한다. 별로 좋은 방법 같지는 않지만.. N3CPlug, N3CPlug_Cloak int nL = szFN.size(); if (szFN[nL - 2] == 'u' && szFN[nL - 1] == 'g') { // PLUGTYPE_NORMAL return PLUGTYPE_NORMAL; @@ -540,10 +540,10 @@ CN3CPlug::CN3CPlug() { m_ePlugType = PLUGTYPE_NORMAL; m_bRenderTrace = false; - m_nTraceStep = 0; // Ҹ ð.. - m_crTrace = 0xfffffff; // .. ̸ .. - m_fTrace0 = 0; // ġ.. - m_fTrace1 = 0; // ġ.. + m_nTraceStep = 0; // 궤적 소멸 시간.. + m_crTrace = 0xfffffff; // 궤적 색깔.. 검은색이면 없다.. + m_fTrace0 = 0; // 궤적 위치.. + m_fTrace1 = 0; // 궤적 위치.. m_pFXMainBundle = NULL; m_pFXPart = NULL; @@ -576,12 +576,12 @@ void CN3CPlug::Release() { CN3CPlugBase::Release(); m_bRenderTrace = false; - m_nTraceStep = 0; // Ҹ ð.. - m_crTrace = 0xffffffff; // .. ̸ .. - m_fTrace0 = 0; // ġ.. - m_fTrace1 = 0; // ġ.. + m_nTraceStep = 0; // 궤적 소멸 시간.. + m_crTrace = 0xffffffff; // 궤적 색깔.. 검은색이면 없다.. + m_fTrace0 = 0; // 궤적 위치.. + m_fTrace1 = 0; // 궤적 위치.. - m_PMeshInstFX.Release(); // FX PMesh Instance + m_PMeshInstFX.Release(); // FX 에 쓸 PMesh Instance if (m_pFXMainBundle) { delete m_pFXMainBundle; @@ -600,17 +600,17 @@ bool CN3CPlug::Load(HANDLE hFile) { CN3CPlugBase::Load(hFile); DWORD dwRWC = 0; - ReadFile(hFile, &m_nTraceStep, 4, &dwRWC, NULL); // .. + ReadFile(hFile, &m_nTraceStep, 4, &dwRWC, NULL); // 궤적 갯수.. if (m_nTraceStep > 0) { - ReadFile(hFile, &m_crTrace, 4, &dwRWC, NULL); // .. ̸ .. - ReadFile(hFile, &m_fTrace0, 4, &dwRWC, NULL); // ġ.. - ReadFile(hFile, &m_fTrace1, 4, &dwRWC, NULL); // ġ.. + ReadFile(hFile, &m_crTrace, 4, &dwRWC, NULL); // 궤적 색깔.. 검은색이면 없다.. + ReadFile(hFile, &m_fTrace0, 4, &dwRWC, NULL); // 궤적 위치.. + ReadFile(hFile, &m_fTrace1, 4, &dwRWC, NULL); // 궤적 위치.. } else { m_nTraceStep = 0; } int iUseVMesh = 0; - ReadFile(hFile, &iUseVMesh, 4, &dwRWC, NULL); // ޽ø °?? + ReadFile(hFile, &iUseVMesh, 4, &dwRWC, NULL); // 메시를 쓰는가?? if (iUseVMesh) { CN3PMesh * pPMesh = new CN3PMesh(); pPMesh->Load(hFile); @@ -619,7 +619,7 @@ bool CN3CPlug::Load(HANDLE hFile) { sprintf(szFNTmp, "Temp_Plug_%d.N3PMesh", iSN++); pPMesh->FileNameSet(szFNTmp); s_MngPMesh.Add(pPMesh); - m_PMeshInstFX.Create(pPMesh); // FX PMesh Instance + m_PMeshInstFX.Create(pPMesh); // FX 에 쓸 PMesh Instance } m_strFXMainName = ""; @@ -701,17 +701,17 @@ bool CN3CPlug::Save(HANDLE hFile) { CN3CPlugBase::Save(hFile); DWORD dwRWC = 0; - WriteFile(hFile, &m_nTraceStep, 4, &dwRWC, NULL); // .. + WriteFile(hFile, &m_nTraceStep, 4, &dwRWC, NULL); // 궤적 갯수.. if (m_nTraceStep > 0 && m_nTraceStep <= MAX_PLUG_TRACE_VERTEX / 2 - 1) { - WriteFile(hFile, &m_crTrace, 4, &dwRWC, NULL); // .. ̸ .. - WriteFile(hFile, &m_fTrace0, 4, &dwRWC, NULL); // ġ.. - WriteFile(hFile, &m_fTrace1, 4, &dwRWC, NULL); // ġ.. + WriteFile(hFile, &m_crTrace, 4, &dwRWC, NULL); // 궤적 색깔.. 검은색이면 없다.. + WriteFile(hFile, &m_fTrace0, 4, &dwRWC, NULL); // 궤적 위치.. + WriteFile(hFile, &m_fTrace1, 4, &dwRWC, NULL); // 궤적 위치.. } else { m_nTraceStep = 0; } - int iUseVMesh = (m_PMeshInstFX.GetMesh()) ? true : false; // ޽.. FX .. - WriteFile(hFile, &iUseVMesh, 4, &dwRWC, NULL); // ġ ޽ø °?? + int iUseVMesh = (m_PMeshInstFX.GetMesh()) ? true : false; // 메쉬.. FX에 쓴다.. + WriteFile(hFile, &iUseVMesh, 4, &dwRWC, NULL); // 위치 정보 메시를 쓰는가?? if (iUseVMesh) { m_PMeshInstFX.GetMesh()->Save(hFile); } @@ -731,7 +731,7 @@ void CN3CPlug::ImportPMesh(const std::string & szFileName) { #endif #ifdef _N3TOOL -void CN3CPlug::RenderFXLines(const __Matrix44 & mtxParent, const __Matrix44 & mtxJoint) // FX  ׷ش. +void CN3CPlug::RenderFXLines(const __Matrix44 & mtxParent, const __Matrix44 & mtxJoint) // FX 들어갈 곳에 선을 그려준다. { static __Matrix44 mtx; mtx = m_Matrix; @@ -808,7 +808,7 @@ void CN3CPlug::RenderFX(const __Matrix44 & mtxParent, const __Matrix44 & mtxJoin //main... ///////////////////////////////////////////////////////////////////// /// - if (m_pFXPart->m_dwRenderFlag & RF_ALPHABLENDING) // Alpha + if (m_pFXPart->m_dwRenderFlag & RF_ALPHABLENDING) // Alpha 사용 { int iTexIdx = m_pFXPart->m_iTexIdx; mtx = m_Matrix; @@ -1037,7 +1037,7 @@ void CN3CPlug_Cloak::SetLOD(int nLOD) { // Part, Plug.... //////////////////////////////// -int CN3Chr::s_iLODDelta = 0; // LOD 꿡 ʿ ε.. +int CN3Chr::s_iLODDelta = 0; // LOD 계산에 필요한 인덱스.. CN3Chr::CN3Chr() { m_dwType |= OBJ_CHARACTER; @@ -1050,7 +1050,7 @@ CN3Chr::CN3Chr() { m_pFXPlug = NULL; // m_pSkinCollision = NULL; - m_fAniSpeedDelta = 1.0f; // ϸ̼ ӵ 1 ̺, ũ .. + m_fAniSpeedDelta = 1.0f; // 에니메이션 속도 조정 변수 1 이보통, 더 크면 빨라진다.. this->Release(); } @@ -1078,7 +1078,7 @@ CN3Chr::~CN3Chr() { // Animation Control s_MngAniCtrl.Delete(&m_pAniCtrlRef); - // 浹 ޽ô ijͿ .. + // 충돌 메시는 캐릭터에서는 지운다.. delete m_pMeshCollision; m_pMeshCollision = NULL; @@ -1118,16 +1118,16 @@ void CN3Chr::Release() { s_MngAniCtrl.Delete(&m_pAniCtrlRef); for (int i = 0; i < MAX_CHR_ANI_PART; i++) { - m_nJointPartStarts[i] = -1; // Ʈ Ϻκ ϸ̼ Ǿ Ѵٸ.. Ʈ ε ȣ - m_nJointPartEnds[i] = -1; // Ʈ Ϻκ ϸ̼ Ǿ Ѵٸ.. Ʈ ε ȣ + m_nJointPartStarts[i] = -1; // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 시작 번호 + m_nJointPartEnds[i] = -1; // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 끝 번호 m_FrmCtrl.Init(); m_FrmCtrlUpper.Init(); } - m_fAniSpeedDelta = 1.0f; // ϸ̼ ӵ 1 ̺, ũ .. + m_fAniSpeedDelta = 1.0f; // 에니메이션 속도 조정 변수 1 이보통, 더 크면 빨라진다.. - // 浹 ޽ô ijͿ .. + // 충돌 메시는 캐릭터에서는 지운다.. delete m_pMeshCollision; m_pMeshCollision = NULL; @@ -1154,7 +1154,7 @@ bool CN3Chr::Load(HANDLE hFile) { ReadFile(hFile, &nL, 4, &dwRWC, NULL); ReadFile(hFile, szFN, nL, &dwRWC, NULL); szFN[nL] = NULL; - this->JointSet(szFN); // .. + this->JointSet(szFN); // 뼈대 세팅.. // Part Allocation, Loading .. int iPC = 0; @@ -1213,12 +1213,12 @@ bool CN3Chr::Load(HANDLE hFile) { } ReadFile(hFile, m_nJointPartStarts, sizeof(m_nJointPartStarts), &dwRWC, - NULL); // Ʈ Ϻκ ϸ̼ Ǿ Ѵٸ.. Ʈ ε ȣ + NULL); // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 시작 번호 ReadFile(hFile, m_nJointPartEnds, sizeof(m_nJointPartEnds), &dwRWC, - NULL); // Ʈ Ϻκ ϸ̼ Ǿ Ѵٸ.. Ʈ ε ȣ + NULL); // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 끝 번호 ////////////////////////////////////////////////// - // Coded (By Dino On 2002-10-10 2:33:07 ) + // Coded (By Dino On 2002-10-10 오후 2:33:07 ) // FXPlug nL = 0; ReadFile(hFile, &nL, sizeof(nL), &dwRWC, NULL); @@ -1227,10 +1227,10 @@ bool CN3Chr::Load(HANDLE hFile) { szFN[nL] = NULL; FXPlugSet(szFN); } - // End Of Code (By Dino On 2002-10-10 2:33:07 ) + // End Of Code (By Dino On 2002-10-10 오후 2:33:07 ) ////////////////////////////////////////////////// - this->Init(); // ϸ̼, Ʈ, ÷׵.... ʱȭ ۾ .. + this->Init(); // 에니메이션, 조인트, 플러그등.... 초기화 작업 수행.. return 0; } @@ -1256,7 +1256,7 @@ bool CN3Chr::Save(HANDLE hFile) { DWORD dwRWC = 0; int nL = 0; - // ̸ ֱ.. + // 관절 파일 이름 써주기.. if (m_pRootJointRef) { nL = m_pRootJointRef->FileName().size(); } @@ -1265,7 +1265,7 @@ bool CN3Chr::Save(HANDLE hFile) { WriteFile(hFile, m_pRootJointRef->FileName().c_str(), nL, &dwRWC, NULL); } - // Part Data ɷ.. + // 내용이 없는 Part Data는 걸러낸다.. std::vector PartsTmp = m_Parts; m_Parts.clear(); m_Parts.reserve(64); @@ -1285,16 +1285,16 @@ bool CN3Chr::Save(HANDLE hFile) { } } - if (bHaveData) // Ͱ .. + if (bHaveData) // 실제 데이터가 있으면.. { m_Parts.push_back(pPart); - } else { // .. - delete pPart; // .. + } else { // 없으면.. + delete pPart; // 지운다.. *it = NULL; } } - // .. + // 실제 저장.. int iPC = m_Parts.size(); WriteFile(hFile, &iPC, 4, &dwRWC, NULL); for (int i = 0; i < iPC; i++) { @@ -1347,12 +1347,12 @@ bool CN3Chr::Save(HANDLE hFile) { } WriteFile(hFile, m_nJointPartStarts, sizeof(m_nJointPartStarts), &dwRWC, - NULL); // Ʈ Ϻκ ϸ̼ Ǿ Ѵٸ.. Ʈ ε ȣ + NULL); // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 시작 번호 WriteFile(hFile, m_nJointPartEnds, sizeof(m_nJointPartEnds), &dwRWC, - NULL); // Ʈ Ϻκ ϸ̼ Ǿ Ѵٸ.. Ʈ ε ȣ + NULL); // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 끝 번호 ////////////////////////////////////////////////// - // Coded (By Dino On 2002-10-11 2:19:11 ) + // Coded (By Dino On 2002-10-11 오후 2:19:11 ) // FXPlug nL = 0; if (m_pFXPlug) { @@ -1363,7 +1363,7 @@ bool CN3Chr::Save(HANDLE hFile) { WriteFile(hFile, m_pFXPlug->FileName().c_str(), nL, &dwRWC, NULL); m_pFXPlug->SaveToFile(); } - // End Of Code (By Dino On 2002-10-11 2:19:11 ) + // End Of Code (By Dino On 2002-10-11 오후 2:19:11 ) ////////////////////////////////////////////////// return true; @@ -1376,26 +1376,26 @@ void CN3Chr::Tick(float fFrm) { return; } - // ī޶ ָ .. + // 카메라와 멀리 떨어지면 지나간다.. float fDist = (m_vPos - s_CameraData.vEye).Magnitude(); if (fDist > s_CameraData.fFP + m_fRadius * 2.0f) { m_nLOD = -1; return; } - // LOD ... + // LOD 결정... m_nLOD = MAX_CHR_LOD; - float fLOD = fDist * s_CameraData.fFOV / (m_fRadius * m_vScale.x); // ġ ϰ Ѵ.. + float fLOD = fDist * s_CameraData.fFOV / (m_fRadius * m_vScale.x); // 덩치에 비례하게 한다.. for (int i = 0; i < MAX_CHR_LOD; i++) { if (fLOD < CHR_LOD_CALCULATION_VALUES - [0][i]) // ϴ ū ϰ LOD ..... Render Ѵ.... + [0][i]) // 일단 가장 큰값을 기준으로 하고 LOD 값을 정한 다음..... Render 에서 변경한다.... { m_nLOD = i; break; } } if (m_nLOD < 0 && m_nLOD >= MAX_CHR_LOD) { - return; // LOD ̸ . + return; // LOD 밖이면 나간다. } static __Vector3 vPos2; @@ -1403,20 +1403,20 @@ void CN3Chr::Tick(float fFrm) { vPos2.y += 1.8f; float fOffset = m_fRadius * 3.0f + 2.0f; if (s_CameraData.IsOutOfFrustum(m_vPos, fOffset) && - s_CameraData.IsOutOfFrustum(vPos2, fOffset)) // ī޶ ü ٱ̸ .. Ӹ .. + s_CameraData.IsOutOfFrustum(vPos2, fOffset)) // 카메라 사면체 바깥이면 지나간다.. 현 지점과 머리 끝점을 조사.. { m_nLOD = -1; return; } - m_FrmCtrl.fFrmPrev = m_FrmCtrl.fFrmCur; // ϸ̼ .. + m_FrmCtrl.fFrmPrev = m_FrmCtrl.fFrmCur; // 마지막 에니메이션 프레임을 기억해 놓고.. m_FrmCtrlUpper.fFrmPrev = m_FrmCtrlUpper.fFrmCur; if (fFrm == FRAME_SELFPLAY) { this->TickAnimationFrame(); } else { int iJC = m_JointRefs.size(); - for (int i = 0; i < iJC; i++) // ܼ Ʈ Tick ְ .. + for (int i = 0; i < iJC; i++) // 걍 단순히 조인트만 Tick 해주고 나간다.. { m_JointRefs[i]->TickAnimationKey(fFrm); m_JointRefs[i]->ReCalcMatrix(); @@ -1429,25 +1429,25 @@ void CN3Chr::Tick(float fFrm) { } if (!m_Plugs.empty()) { - this->TickPlugs(fLOD); // Tick + this->TickPlugs(fLOD); // 붙은 무기 Tick } ////////////////////////////////////////////////// - // Coded (By Dino On 2002-10-11 11:21:21 ) + // Coded (By Dino On 2002-10-11 오전 11:21:21 ) // FXPlug if (m_pFXPlug) { m_pFXPlug->Tick(this); } - // End Of Code (By Dino On 2002-10-11 11:21:21 ) + // End Of Code (By Dino On 2002-10-11 오전 11:21:21 ) ////////////////////////////////////////////////// } void CN3Chr::TickAnimationFrame() { if (NULL == m_FrmCtrl.pAniData) { - return; // ϸ̼ !! + return; // 에니메이션 데이터 가 없다!! } - // ̰ ð .. + // 루핑중이고 지연시간이 있으면.. if ((m_FrmCtrl.pAniData->iBlendFlags & 1) && m_FrmCtrl.iAniLoop > 0 && m_FrmCtrl.bProcessingDelayNow && m_FrmCtrl.fBlendTime == 0) { m_FrmCtrl.fBlendTime = m_FrmCtrl.pAniData->fTimeBlend; @@ -1457,31 +1457,31 @@ void CN3Chr::TickAnimationFrame() { m_FrmCtrl.iAniLoop = 0; } - float fDelta = s_fSecPerFrm * m_fAniSpeedDelta; // ϸ̼ ӵ 1 ̺, ũ .. + float fDelta = s_fSecPerFrm * m_fAniSpeedDelta; // 에니메이션 속도 조정 변수 1 이보통, 더 크면 빨라진다.. - if (0.0f != m_FrmCtrl.fBlendTime) // Blending ϸ̼ .. + if (0.0f != m_FrmCtrl.fBlendTime) // Blending 할 에니메이션이 있으면.. { m_FrmCtrl.fBlendTimeCur += fDelta; - if (m_FrmCtrl.fBlendTimeCur > m_FrmCtrl.fBlendTime) // Blending . + if (m_FrmCtrl.fBlendTimeCur > m_FrmCtrl.fBlendTime) // Blending 이 끝났다. { m_FrmCtrl.fBlendTime = 0.0f; m_FrmCtrl.fBlendTimeCur = 0.0f; - m_FrmCtrl.bProcessingDelayNow = false; // ó .. + m_FrmCtrl.bProcessingDelayNow = false; // 지연처리 끝.. } - } else { // Ұ .. + } else { // 블렌딩 할게 없으면.. m_FrmCtrl.fFrmCur += m_FrmCtrl.pAniData->fFrmPerSec * fDelta; // Frame Tick if (m_FrmCtrl.fFrmCur < m_FrmCtrl.pAniData->fFrmStart) { m_FrmCtrl.fFrmCur = m_FrmCtrl.pAniData->fFrmStart; } - if (m_FrmCtrl.fFrmCur > m_FrmCtrl.pAniData->fFrmEnd) // ϸ̼ ѹ ȯϸ.. + if (m_FrmCtrl.fFrmCur > m_FrmCtrl.pAniData->fFrmEnd) // 에니메이션이 한번 순환하면.. { - if (m_FrmCtrl.fFreezeTime > 0) // ȴٸ.. + if (m_FrmCtrl.fFreezeTime > 0) // 멈춰야 된다면.. { - m_FrmCtrl.fFrmCur = m_FrmCtrl.pAniData->fFrmEnd; // ϸ̼ ϰ.. - m_FrmCtrl.fFreezeTime -= fDelta; // ð.. + m_FrmCtrl.fFrmCur = m_FrmCtrl.pAniData->fFrmEnd; // 에니메이션 데이터의 마지막 프레임으로 하고.. + m_FrmCtrl.fFreezeTime -= fDelta; // 멈출 시간.. if (m_FrmCtrl.fFreezeTime < 0) { - m_FrmCtrl.fFreezeTime = 0; // ߴ ð ٽ .. - m_FrmCtrl.iAniLoop++; // ϸ̼ ѹ ߴ~ + m_FrmCtrl.fFreezeTime = 0; // 멈추는 시간 다시 세팅.. + m_FrmCtrl.iAniLoop++; // 에니메이션 한번 했다~ } } else { m_FrmCtrl.fFreezeTime = 0; @@ -1489,11 +1489,11 @@ void CN3Chr::TickAnimationFrame() { if (m_FrmCtrl.bOnceAndFreeze) { m_FrmCtrl.fFrmCur = - m_FrmCtrl.pAniData->fFrmEnd; // ѹ ϸ̼ ϰ Ѵٸ.. ִ´.. - } else if (m_FrmCtrl.pAniData->iBlendFlags & 1) // ð .. + m_FrmCtrl.pAniData->fFrmEnd; // 한번 에니메이션 하고 멈춰야 한다면.. 걍 멈춰 있는다.. + } else if (m_FrmCtrl.pAniData->iBlendFlags & 1) // 루핑 지연시간이 있으면.. { m_FrmCtrl.fFrmCur = m_FrmCtrl.pAniData->fFrmEnd; - m_FrmCtrl.bProcessingDelayNow = true; // ó.. .. + m_FrmCtrl.bProcessingDelayNow = true; // 지연 처리.. 시작.. } else { float fFrmDiff = m_FrmCtrl.pAniData->fFrmEnd - m_FrmCtrl.pAniData->fFrmStart; if (fFrmDiff > 0) { @@ -1504,50 +1504,50 @@ void CN3Chr::TickAnimationFrame() { } } } - } // end of else // Ұ .. + } // end of else // 블렌딩 할게 없으면.. - if (m_FrmCtrlUpper.pAniData) // ü иؾ ϸ.. // óؾ Ѵٸ.. + if (m_FrmCtrlUpper.pAniData) // 상하체를 분리해야 하면.. // 따로 처리해야 한다면.. { - if (0.0f != m_FrmCtrlUpper.fBlendTime) // Blending ϸ̼ .. + if (0.0f != m_FrmCtrlUpper.fBlendTime) // Blending 할 에니메이션이 있으면.. { m_FrmCtrlUpper.fBlendTimeCur += fDelta; - if (m_FrmCtrlUpper.fBlendTimeCur > m_FrmCtrlUpper.fBlendTime) // Blending . + if (m_FrmCtrlUpper.fBlendTimeCur > m_FrmCtrlUpper.fBlendTime) // Blending 이 끝났다. { - if (m_FrmCtrlUpper.iAniLoop > 0) { // .. üθ ϸ̼ . - m_FrmCtrlUpper.Init(); // ü ϸ̼ !! + if (m_FrmCtrlUpper.iAniLoop > 0) { // 블렌딩 끝.. 이젠 하체로만 에니메이션 맞춘다. + m_FrmCtrlUpper.Init(); // 상체 에니메이션 끝!! } else { m_FrmCtrlUpper.fBlendTime = 0; } } - } else { // Ұ .. + } else { // 블렌딩 할게 없으면.. m_FrmCtrlUpper.fFrmCur += m_FrmCtrlUpper.pAniData->fFrmPerSec * fDelta; // Frame Tick if (m_FrmCtrlUpper.fFrmCur < m_FrmCtrlUpper.pAniData->fFrmStart) { m_FrmCtrlUpper.fFrmCur = m_FrmCtrlUpper.pAniData->fFrmStart; } - if (m_FrmCtrlUpper.fFrmCur > m_FrmCtrlUpper.pAniData->fFrmEnd) // ϸ̼ ѹ ȯϸ.. + if (m_FrmCtrlUpper.fFrmCur > m_FrmCtrlUpper.pAniData->fFrmEnd) // 에니메이션이 한번 순환하면.. { - if (m_FrmCtrlUpper.fFreezeTime > 0) // ȴٸ.. + if (m_FrmCtrlUpper.fFreezeTime > 0) // 멈춰야 된다면.. { m_FrmCtrlUpper.fFrmCur = - m_FrmCtrlUpper.pAniData->fFrmEnd; // ϸ̼ ϰ.. + m_FrmCtrlUpper.pAniData->fFrmEnd; // 에니메이션 데이터의 마지막 프레임으로 하고.. - m_FrmCtrlUpper.fFreezeTime -= fDelta; // ð.. + m_FrmCtrlUpper.fFreezeTime -= fDelta; // 멈출 시간.. if (m_FrmCtrlUpper.fFreezeTime < 0) { m_FrmCtrlUpper.fFreezeTime = 0; } - } else { // .. ü ϸ̼ Ѵ. - m_FrmCtrlUpper.iAniLoop++; // ̷ ϸ̼ .. ü ϸ̼ ȴ. + } else { // 멈출거 없음.. 하체 에니메이션으로 블렌딩을 한다. + m_FrmCtrlUpper.iAniLoop++; // 이렇게 에니메이션이 끝나면.. 하체 에니메이션으로 블렌딩이 된다. m_FrmCtrlUpper.fBlendFrm = m_FrmCtrlUpper.pAniData->fFrmEnd; m_FrmCtrlUpper.fBlendTime = m_FrmCtrlUpper.pAniData->fTimeBlend; m_FrmCtrlUpper.fBlendTimeCur = 0; } } - } // end of else // Ұ .. + } // end of else // 블렌딩 할게 없으면.. } } void CN3Chr::TickJoints() { - if (NULL == m_FrmCtrlUpper.pAniData) // ü ° ó.. + if (NULL == m_FrmCtrlUpper.pAniData) // 상하체 통째로 처리.. { int iJC = m_JointRefs.size(); for (int i = 0; i < iJC; i++) { @@ -1561,16 +1561,16 @@ void CN3Chr::TickJoints() { } m_MtxJoints[i] = m_JointRefs[i]->m_Matrix; } - } else { // ü óؾ Ѵٸ.. + } else { // 상하체 따로 처리해야 한다면.. __FrmCtrl * pFrmCtrls[2] = {&m_FrmCtrl, &m_FrmCtrlUpper}; for (int i = 0; i < MAX_CHR_ANI_PART; i++) { - // üϰ Ʈ Ʈ ۵... + // 하체일경우 루트 조인트 작동... if (0 == i) { - if (pFrmCtrls[i]->fBlendTime > 0) // Motion Blending ʿϸ... + if (pFrmCtrls[i]->fBlendTime > 0) // Motion Blending 이 필요하면... { float fBlendFactor = pFrmCtrls[i]->fBlendTimeCur / pFrmCtrls[i]->fBlendTime; m_pRootJointRef->ReCalcMatrixBlended(pFrmCtrls[i]->fFrmCur, pFrmCtrls[i]->fBlendFrm, - fBlendFactor); // Joint Animation Blending...// ü ϰ + fBlendFactor); // Joint Animation Blending...// 하체 일경우 } else { m_pRootJointRef->TickAnimationKey(pFrmCtrls[i]->fFrmCur); m_pRootJointRef->ReCalcMatrix(); @@ -1605,7 +1605,7 @@ void CN3Chr::TickPlugs(float fLOD) { float fFrmCur = m_FrmCtrl.fFrmCur; // if (m_FrmCtrlUpper.pAniData) { - // fFrmCur = m_FrmCtrlUpper.fFrmCur; // ü ϸ̼ ... + // fFrmCur = m_FrmCtrlUpper.fFrmCur; // 상체 에니메이션이 있으면... // } int iPC = m_Plugs.size(); @@ -1626,11 +1626,11 @@ void CN3Chr::TickPlugs(float fLOD) { pPlug->m_bRenderTrace = false; if (!(pAniData->fFrmPlugTraceEnd - pAniData->fFrmPlugTraceStart)) { - continue; // ۰ ̰ .. + continue; // 궤적 프레임의 시작과 끝이 차이가 없으면.. } if (pPlug->m_nTraceStep > 0 && fFrmCur >= pAniData->fFrmPlugTraceStart && - fFrmCur <= pAniData->fFrmPlugTraceEnd) // ȿ .. + fFrmCur <= pAniData->fFrmPlugTraceEnd) // 궤적 프레임의 안에 있으면.. { pPlug->m_bRenderTrace = true; @@ -1640,7 +1640,7 @@ void CN3Chr::TickPlugs(float fLOD) { D3DCOLOR crTraceU = pPlug->m_crTrace; D3DCOLOR crTraceL = pPlug->m_crTrace; - for (int j = 0, k = pPlug->m_nTraceStep; j < pPlug->m_nTraceStep; j++, k--) // .. + for (int j = 0, k = pPlug->m_nTraceStep; j < pPlug->m_nTraceStep; j++, k--) // 폴리곤을 만든다.. { fFrmTmp = fFrmCur - (j * 0.2f); iJTmp = 0; @@ -1711,35 +1711,35 @@ void CN3Chr::Render() { CN3Base::s_RenderInfo.nChr++; // Rendering Information Update... #endif - // LOD ... + // LOD 최종 결정... if (s_iLODDelta > 0) { m_nLOD = MAX_CHR_LOD; float fDist = (m_vPos - s_CameraData.vEye).Magnitude(); - float fLOD = fDist * s_CameraData.fFOV / (m_fRadius * m_vScale.x); // ġ ϰ Ѵ.. + float fLOD = fDist * s_CameraData.fFOV / (m_fRadius * m_vScale.x); // 덩치에 비례하게 한다.. for (int i = 0; i < MAX_CHR_LOD; i++) { if (fLOD < CHR_LOD_CALCULATION_VALUES - [s_iLODDelta][i]) // ϴ ū ϰ LOD ..... Render Ѵ.... + [s_iLODDelta][i]) // 일단 가장 큰값을 기준으로 하고 LOD 값을 정한 다음..... Render 에서 변경한다.... { m_nLOD = i; break; } } if (m_nLOD >= MAX_CHR_LOD) { - m_nLOD = MAX_CHR_LOD - 1; // LOD ̸ ... + m_nLOD = MAX_CHR_LOD - 1; // LOD 밖이면 ... } } s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); - this->TickJoints(); // Ʈ ĵ ... - this->BuildMesh(); // Ŀ ġ .. + this->TickJoints(); // 조인트 행렬들 계산... + this->BuildMesh(); // 행렬에 따라 점위치 계산.. int iPC = m_Parts.size(); for (int i = 0; i < iPC; i++) { m_Parts[i]->Render(m_nLOD); } - // Plug - ̴ κ Rendering + // Plug - 붙이는 부분 Rendering CN3CPlug * pPlug = NULL; iPC = m_Plugs.size(); for (int i = 0; i < iPC; i++) { @@ -1752,7 +1752,7 @@ void CN3Chr::Render() { pPlug->Render(m_Matrix, m_MtxJoints[pPlug->m_nJointIndex]); //////////////////////////////////////////////////// - // ˱ ׸... + // 검기 그리기... if (pPlug->m_ePlugType == PLUGTYPE_NORMAL) { if (pPlug->m_nTraceStep <= 1) { continue; @@ -1784,17 +1784,17 @@ void CN3Chr::Render() { } } else if (pPlug->m_ePlugType == PLUGTYPE_CLOAK) { } - // ˱ ׸... + // 검기 그리기... //////////////////////////////////////////////////// } ////////////////////////////////////////////////// - // Coded (By Dino On 2002-10-11 11:20:19 ) + // Coded (By Dino On 2002-10-11 오전 11:20:19 ) // FXPlug if (m_pFXPlug) { m_pFXPlug->Render(); } - // End Of Code (By Dino On 2002-10-11 11:20:19 ) + // End Of Code (By Dino On 2002-10-11 오전 11:20:19 ) ////////////////////////////////////////////////// } @@ -1831,11 +1831,11 @@ void CN3Chr::BuildMesh() { __Vector3 vFinal; int nAffect = 0; float * pfWeights = NULL; - for (int j = 0; j < nVC; j++) // j < m_nBoneVertices .. + for (int j = 0; j < nVC; j++) // j < m_nBoneVertices 와 같다.. { nAffect = pVSrc[j].nAffect; if (1 == nAffect) { - // ... + // 단일 뼈대... int nJIndex = pVSrc[j].pnJoints[0]; pVDest[j] = (pVSrc[j].vOrigin * pMtxJIs[nJIndex]) * pMtxJs[nJIndex]; } else if (nAffect > 1) { @@ -1864,10 +1864,10 @@ void CN3Chr::BuildMesh() { } else { int nAffect = 0; float * pfWeights = NULL; - for (int j = 0; j < nVC; j++) { // j < m_nBoneVertices .. + for (int j = 0; j < nVC; j++) { // j < m_nBoneVertices 와 같다.. nAffect = pVSrc[j].nAffect; if (1 == nAffect) { - // ... + // 단일 뼈대... nJIndex = pVSrc[j].pnJoints[0]; pVDest[j] = (pVSrc[j].vOrigin * pMtxJIs[nJIndex]) * pMtxJs[nJIndex]; } else if (nAffect > 1) { @@ -1921,11 +1921,11 @@ void CN3Chr::BuildMesh(int nLOD) { __Vector3 vFinal; int nAffect = 0; float * pfWeights = NULL; - for (int j = 0; j < nVC; j++) // j < m_nBoneVertices .. + for (int j = 0; j < nVC; j++) // j < m_nBoneVertices 와 같다.. { nAffect = pVSrc[j].nAffect; if (1 == nAffect) { - // ... + // 단일 뼈대... int nJIndex = pVSrc[j].pnJoints[0]; pVDest[j] = (pVSrc[j].vOrigin * pMtxJIs[nJIndex]) * pMtxJs[nJIndex]; } else if (nAffect > 1) { @@ -1946,7 +1946,7 @@ void CN3Chr::Init() { return; } - //  ִ ϰ.. Ҵ.. + // 관절이 몇개 있는지 계산하고.. 포인터 할당.. int iJC = 0; __Matrix44 mtxTmp; @@ -1957,12 +1957,12 @@ void CN3Chr::Init() { m_MtxInverses.assign(iJC, mtxTmp); int nJI = 0; - m_pRootJointRef->Tick(0); // ʱ⿡ ġ .. - for (int i = 0; i < iJC; i++) // ŭ Ϳ ´.. + m_pRootJointRef->Tick(0); // 초기에 관절 위치 계산.. + for (int i = 0; i < iJC; i++) // 관절 갯수 만큼 각 관절의 참조 포인터와 역행렬을 얻어놓는다.. { m_JointRefs[i] = NULL; m_pRootJointRef->FindPointerByID(i, m_JointRefs[i]); - ::D3DXMatrixInverse(&(m_MtxInverses[i]), NULL, &(m_JointRefs[i]->m_Matrix)); // ࿡ Ѵ.. + ::D3DXMatrixInverse(&(m_MtxInverses[i]), NULL, &(m_JointRefs[i]->m_Matrix)); // 로컬 축에 대한 역행렬을 구한다.. m_MtxJoints[i] = m_JointRefs[i]->m_Matrix; } @@ -1970,7 +1970,7 @@ void CN3Chr::Init() { this->FindMinMax(); - // 浹 üũ .. ũ⿡ ° ȯ.. + // 충돌 체크를 위한 폴리곤.. 크기에 맞게 변환.. if (NULL == m_pMeshCollision) { m_pMeshCollision = new CN3VMesh(); } @@ -1982,13 +1982,13 @@ void CN3Chr::JointSet(const std::string & szFN) { if (NULL == m_pRootJointRef) { bNeedInit = true; } else if (m_pRootJointRef && m_pRootJointRef->FileName() != szFN) { - bNeedInit = true; // ̸ ޶ Ѵ.. + bNeedInit = true; // 파일 이름이 달라야 지우고 새로 한다.. } if (bNeedInit) { s_MngJoint.Delete(&m_pRootJointRef); m_pRootJointRef = s_MngJoint.Get(szFN); - this->Init(); // ʱȭ... + this->Init(); // 초기화... } } @@ -2100,70 +2100,70 @@ void CN3Chr::AniCtrlSet(const std::string & szFN) { for (int i = 0; i < MAX_CHR_ANI_PART; i++) { m_FrmCtrl.iAni = -1; - m_FrmCtrl.bOnceAndFreeze = false; // ѹ ϰ Ǵ°?? + m_FrmCtrl.bOnceAndFreeze = false; // 한번만 하고 멈춰야 되는가?? m_FrmCtrl.fFrmCur = 0; - m_FrmCtrl.fFrmPrev = 0; // ֱ + m_FrmCtrl.fFrmPrev = 0; // 최근 프레임 m_FrmCtrl.iAniLoop = 0; m_FrmCtrl.pAniData = NULL; } } -int CN3Chr::AniCurSet(int iAni, // Animation ȣ, - bool bOnceAndFreeze, // ѹ ߾ ϴ°?? - float fBlendTime, // ϴ ð(ʴ), - float fFreezeTime, // ð... - bool bStopUpperAnimation) // ü ϸ̼ .. ߵ +int CN3Chr::AniCurSet(int iAni, // Animation 번호, + bool bOnceAndFreeze, // 한번만 돌고 멈추어야 하는가?? + float fBlendTime, // 블렌딩하는 시간(초단위), + float fFreezeTime, // 멈출시간... + bool bStopUpperAnimation) // 상체 에니메이션이 있으면.. 멈추도록 { if (NULL == m_pAniCtrlRef) { return -1; } if (iAni == m_FrmCtrl.iAni) { - return -1; // ϸ̸̼ ư. + return -1; // 같은 에니메이션이면 돌아간다. } // if (iAni == m_FrmCtrl.iAni) { - // m_FrmCtrl.iAniLoop = 0; // ϸ̸̼ īƮ ʱȭϰ ư. + // m_FrmCtrl.iAniLoop = 0; // 같은 에니메이션이면 루핑 참조 카운트만 초기화하고 돌아간다. // return -1; // } if (iAni < 0 || iAni >= m_pAniCtrlRef->Count()) { return -1; } - int iAniPrev = m_FrmCtrl.iAni; // ϰ.. - float fFrmPrev = m_FrmCtrl.fFrmCur; // ֱ .. + int iAniPrev = m_FrmCtrl.iAni; // 전의 걸 기억하고.. + float fFrmPrev = m_FrmCtrl.fFrmCur; // 최근의 프레임.. if (bStopUpperAnimation) { - m_FrmCtrlUpper.Init(); // ü ϸ̼ !! + m_FrmCtrlUpper.Init(); // 상체 에니메이션 강제 종료 !! } m_FrmCtrl.Init(); m_FrmCtrl.iAni = iAni; - m_FrmCtrl.bOnceAndFreeze = bOnceAndFreeze; // ѹ ϰ ߾ ϴ°.... + m_FrmCtrl.bOnceAndFreeze = bOnceAndFreeze; // 한번만 하고 멈추어야 하는가.... m_FrmCtrl.fFreezeTime = fFreezeTime; m_FrmCtrl.pAniData = m_pAniCtrlRef->DataGet(iAni); - m_FrmCtrl.fFrmCur = m_FrmCtrl.pAniData->fFrmStart; // ó .. + m_FrmCtrl.fFrmCur = m_FrmCtrl.pAniData->fFrmStart; // 프레임을 처음으로 세팅.. m_FrmCtrl.fFrmPrev = m_FrmCtrl.pAniData->fFrmEnd; if (FLT_MIN != fBlendTime) { - m_FrmCtrl.fBlendTime = fBlendTime; // Blending .. + m_FrmCtrl.fBlendTime = fBlendTime; // 모션 Blending 값 설정.. } else { m_FrmCtrl.fBlendTime = m_FrmCtrl.pAniData->fTimeBlend; } if (m_FrmCtrl.fBlendTime > 0) { - m_FrmCtrl.fBlendFrm = fFrmPrev; // Blending ϸ̼ Frame.. + m_FrmCtrl.fBlendFrm = fFrmPrev; // Blending 할 에니메이션 Frame.. } else { - m_FrmCtrl.fBlendFrm = m_FrmCtrl.fFrmCur; // Blending ϸ̼ !! + m_FrmCtrl.fBlendFrm = m_FrmCtrl.fFrmCur; // Blending 할 에니메이션 은 없다!! } return iAniPrev; } -void CN3Chr::AniFixToLastFrame(int iAni) // . +void CN3Chr::AniFixToLastFrame(int iAni) // 마지막 프레임으로 고정 시켜 버린다. { if (NULL == m_pAniCtrlRef) { return; } if (iAni == m_FrmCtrl.iAni) { - return; // ϸ̸̼ ư. + return; // 같은 에니메이션이면 돌아간다. } if (iAni < 0 || iAni >= m_pAniCtrlRef->Count()) { return; @@ -2176,12 +2176,12 @@ void CN3Chr::AniCtrlSet(const std::string & szFN) { m_FrmCtrl.Init(); m_FrmCtrl.iAni = iAni; - m_FrmCtrl.bOnceAndFreeze = true; // ѹ ϰ ߾ ϴ°.... + m_FrmCtrl.bOnceAndFreeze = true; // 한번만 하고 멈추어야 하는가.... m_FrmCtrl.pAniData = m_pAniCtrlRef->DataGet(iAni); - m_FrmCtrl.fBlendTime = 0; // Blending .. - m_FrmCtrl.fBlendFrm = pAniData->fFrmEnd; // Blending ϸ̼ Frame.. - m_FrmCtrl.fFreezeTime = 1000.0f; // ð.. - m_FrmCtrl.fFrmCur = pAniData->fFrmEnd; // ó .. + m_FrmCtrl.fBlendTime = 0; // 모션 Blending 값 설정.. + m_FrmCtrl.fBlendFrm = pAniData->fFrmEnd; // Blending 할 에니메이션 Frame.. + m_FrmCtrl.fFreezeTime = 1000.0f; // 멈출 시간.. + m_FrmCtrl.fFrmCur = pAniData->fFrmEnd; // 프레임을 처음으로 세팅.. m_FrmCtrl.fFrmPrev = pAniData->fFrmEnd; return; @@ -2195,7 +2195,7 @@ void CN3Chr::AniUpperSet(int iAni, float fFreezeTime) { return; } if (iAni == m_FrmCtrlUpper.iAni) { - return; // Ͱ Ѿ.. + return; // 전의 것과 같으면 넘어간다.. } m_FrmCtrlUpper.Init(); @@ -2204,13 +2204,13 @@ void CN3Chr::AniUpperSet(int iAni, float fFreezeTime) { m_FrmCtrlUpper.bOnceAndFreeze = false; m_FrmCtrlUpper.pAniData = m_pAniCtrlRef->DataGet(iAni); - // Blending .. + // 모션 Blending 값 설정.. m_FrmCtrlUpper.fBlendTime = m_FrmCtrlUpper.pAniData->fTimeBlend; m_FrmCtrlUpper.fBlendTimeCur = 0; - m_FrmCtrlUpper.fBlendFrm = m_FrmCtrl.fFrmCur; // ü Ӱ Blending ϸ̼ Frame.. - m_FrmCtrlUpper.fFreezeTime = fFreezeTime; // ð.. + m_FrmCtrlUpper.fBlendFrm = m_FrmCtrl.fFrmCur; // 하체 프레임과 Blending 할 에니메이션 Frame.. + m_FrmCtrlUpper.fFreezeTime = fFreezeTime; // 멈출 시간.. - m_FrmCtrlUpper.fFrmCur = m_FrmCtrlUpper.pAniData->fFrmStart; // ó .. + m_FrmCtrlUpper.fFrmCur = m_FrmCtrlUpper.pAniData->fFrmStart; // 프레임을 처음으로 세팅.. m_FrmCtrlUpper.fFrmPrev = m_FrmCtrlUpper.pAniData->fFrmEnd; } @@ -2219,7 +2219,7 @@ void CN3Chr::AniDefaultSet() { s_MngAniCtrl.Delete(&m_pAniCtrlRef); s_MngAniCtrl.Release(); - // ⺻ Animation Control .. + // 기본적인 Animation Control 만들기.. CN3AnimControl * pAniCtrlDefault = new CN3AnimControl(); pAniCtrlDefault->m_szName = "Default"; pAniCtrlDefault->FileNameSet("Chr\\Default.N3Anim"); @@ -2263,9 +2263,9 @@ void CN3Chr::FindMinMax() { m_vMin.Set(FLT_MAX, FLT_MAX, FLT_MAX); m_vMax.Set(-FLT_MAX, -FLT_MAX, -FLT_MAX); - for (int i = 0; i < iJC; i++) // ŭ Ϳ ´.. + for (int i = 0; i < iJC; i++) // 관절 갯수 만큼 각 관절의 참조 포인터와 역행렬을 얻어놓는다.. { - // Ʈ ġ ִ ּҰ ã´. + // 각 조인트의 관절 위치 값에 대해 최대 최소값을 찾는다. vTmp = m_JointRefs[i]->m_Matrix.Pos(); if (vTmp.x < m_vMin.x) { m_vMin.x = vTmp.x; @@ -2287,7 +2287,7 @@ void CN3Chr::FindMinMax() { } } - // ʹ ÷ش.. + // 너무 작으면 늘려준다.. if (m_vMax.x - m_vMin.x < 0.5f) { m_vMax.x += 0.25f; m_vMin.x -= 0.25f; @@ -2301,7 +2301,7 @@ void CN3Chr::FindMinMax() { m_vMin.z -= 0.25f; } - // ִ ּҰ Ѵ.. + // 최대 최소값을 갖고 반지름 계산한다.. m_fRadius = (m_vMax - m_vMin).Magnitude() * 0.5f; } @@ -2329,7 +2329,7 @@ int CN3Chr::CheckCollisionPrecisely(int ixScreen, int iyScreen, __Vector3 * pvPi return -1; } - // ָ ִ ijʹ ڽθ üũϰ ִ° ϰ 浹üũ Ѵ... + // 멀리 있는 캐릭터는 박스로만 체크하고 가까이 있는건 디테일하게 충돌체크를 한다... if (m_nLOD >= 3) { return 1; } @@ -2338,7 +2338,7 @@ int CN3Chr::CheckCollisionPrecisely(int ixScreen, int iyScreen, __Vector3 * pvPi } int CN3Chr::CheckCollisionPrecisely(const __Vector3 & vPos, const __Vector3 & vDir, __Vector3 * pvPick) { - this->TickJoints(); // Ʈ ĵ ... + this->TickJoints(); // 조인트 행렬들 계산... BuildMesh(m_nLOD); __Vector3 v0, v1, v2; @@ -2364,10 +2364,10 @@ int CN3Chr::CheckCollisionPrecisely(const __Vector3 & vPos, const __Vector3 & vD } ////////////////////////////////////////////////// -// Coded (By Dino On 2002-10-10 2:36:28 ) +// Coded (By Dino On 2002-10-10 오후 2:36:28 ) // FXPlug -// FXPlugSet : FXPlug ִ Լ +// FXPlugSet : FXPlug 파일을 지정해주는 함수 CN3FXPlug * CN3Chr::FXPlugSet(const std::string & strFN) { if (m_pFXPlug) { m_pFXPlug->Release(); @@ -2388,10 +2388,10 @@ CN3FXPlug * CN3Chr::FXPlugCreate() { if (m_szName.size() > 0) { char szFN[_MAX_PATH]; - wsprintf(szFN, "Chr\\%s.N3FXPlug", m_szName.c_str()); // ij ̸ δ. + wsprintf(szFN, "Chr\\%s.N3FXPlug", m_szName.c_str()); // 캐릭터의 이름을 붙인다. m_pFXPlug->FileNameSet(szFN); } else { - m_pFXPlug->FileNameSet("Chr\\Default.N3FXPlug"); // ׳ default̸ δ. + m_pFXPlug->FileNameSet("Chr\\Default.N3FXPlug"); // 그냥 default이름을 붙인다. } } return m_pFXPlug; @@ -2403,5 +2403,5 @@ void CN3Chr::FXPlugDelete() { } m_pFXPlug = NULL; } -// End Of Code (By Dino On 2002-10-10 2:36:28 ) +// End Of Code (By Dino On 2002-10-10 오후 2:36:28 ) ////////////////////////////////////////////////// diff --git a/src/engine/N3Base/N3Chr.h b/src/engine/N3Base/N3Chr.h index 0405cf5a..1a43d1ee 100644 --- a/src/engine/N3Base/N3Chr.h +++ b/src/engine/N3Base/N3Chr.h @@ -17,7 +17,7 @@ #include const int MAX_CHR_JOINT = 256; -const int MAX_CHR_LOD = 4; // 4 ܰ Level Of Detail +const int MAX_CHR_LOD = 4; // 4 단계 Level Of Detail const int MAX_CHR_LOD_DELTA = 4; class CN3CPartSkins : public CN3BaseFileAccess { @@ -50,7 +50,7 @@ class CN3CPart : public CN3BaseFileAccess { protected: CN3Texture * m_pTexRef; - CN3Texture * m_pTexOverlapRef; // ĥ ؽó + CN3Texture * m_pTexOverlapRef; // 위에 덧칠할 텍스처 // std::vector m_AnimatedTextures; CN3CPartSkins * m_pSkinsRef; @@ -69,7 +69,7 @@ class CN3CPart : public CN3BaseFileAccess { m_pTexRef = pTex; } - CN3Texture * TexOverlap() { return m_pTexOverlapRef; } // ĥ ؽó + CN3Texture * TexOverlap() { return m_pTexOverlapRef; } // 위에 덧칠할 텍스처 CN3Texture * TexOverlapSet(const std::string & szFN); void TexOverlapSet(CN3Texture * pTex); @@ -106,17 +106,17 @@ class CN3CPlugBase : public CN3BaseFileAccess { public: e_PlugType m_ePlugType; bool m_bVisible; - int m_nJointIndex; // ٴ Mesh Joint Index.. Ʈ ٴ.. װ δ... - __Vector3 m_vPosition; // ٴ Mesh Offset Vector. - __Vector3 m_vScale; // ٴ Mesh . + int m_nJointIndex; // 붙는 Mesh 의 Joint Index.. 어느 조인트에 붙느냐.. 그것이 문제로다... + __Vector3 m_vPosition; // 붙는 Mesh 의 Offset Vector. + __Vector3 m_vScale; // 붙는 Mesh 의 스케일. __Material m_Mtl; __Matrix44 m_Matrix; protected: CN3PMeshInstance m_PMeshInst; // Progressive Mesh Instance CN3Texture * m_pTexRef; // Texture Reference Pointer - CN3Texture * m_pTexOverlapRef; // ĥ Texture Reference Pointer - // __Vector3 m_vRotation; // ٴ Mesh Rotation. + CN3Texture * m_pTexOverlapRef; // 위에 덧칠할 Texture Reference Pointer + // __Vector3 m_vRotation; // 붙는 Mesh 의 Rotation일. __Matrix44 m_MtxRot; // Rotation Matrix; public: @@ -162,7 +162,7 @@ class CN3CPlugBase : public CN3BaseFileAccess { m_pTexRef = pTex; } - CN3Texture * TexOverlap() { return m_pTexOverlapRef; } // ĥ ؽó + CN3Texture * TexOverlap() { return m_pTexOverlapRef; } // 위에 덧칠할 텍스처 CN3Texture * TexOverlapSet(const std::string & szFN); void TexOverlapSet(CN3Texture * pTex); @@ -183,13 +183,13 @@ enum e_PlugAttr { class CN3CPlug : public CN3CPlugBase { public: bool m_bRenderTrace; - int m_nTraceStep; // .. - D3DCOLOR m_crTrace; // .. ̸ .. - float m_fTrace0; // ġ.. - float m_fTrace1; // ġ.. + int m_nTraceStep; // 궤적의 길이.. + D3DCOLOR m_crTrace; // 궤적 색깔.. 검은색이면 없다.. + float m_fTrace0; // 궤적 위치.. + float m_fTrace1; // 궤적 위치.. //fx....... - CN3PMeshInstance m_PMeshInstFX; // FX PMesh Instance + CN3PMeshInstance m_PMeshInstFX; // FX 에 쓸 PMesh Instance class CN3FXBundle * m_pFXMainBundle; class CN3FXBundle * m_pFXTailBundle[MAX_FXTAIL]; class CN3FXPartBillBoard * m_pFXPart; @@ -201,7 +201,7 @@ class CN3CPlug : public CN3CPlugBase { #ifdef _N3TOOL virtual bool Save(HANDLE hFile); void ImportPMesh(const std::string & szFileName); - void RenderFXLines(const __Matrix44 & mtxParent, const __Matrix44 & mtxJoint); // FX  ׷ش. + void RenderFXLines(const __Matrix44 & mtxParent, const __Matrix44 & mtxJoint); // FX 들어갈 곳에 선을 그려준다. #endif // end of _N3TOOL virtual void Render(const __Matrix44 & mtxParent, const __Matrix44 & mtxJoint); virtual void Release(); @@ -237,9 +237,9 @@ class CN3CPlug_Cloak : public CN3CPlugBase { #endif }; -const int MAX_CHR_ANI_PART = 2; // 0 - ü, 1 - ü :::   ϸ̼ .. -const int MAX_PLUG_TRACE = 2; // ִ ΰ .. -const int MAX_PLUG_TRACE_VERTEX = 64; // .. 8 δ ܻ 3ܰ ´.. +const int MAX_CHR_ANI_PART = 2; // 0 - 상체, 1 - 하체 ::: 관절들을 나누어서 나누어서 에니메이션 설정.. +const int MAX_PLUG_TRACE = 2; // 최대 두개의 무기 궤적을 남긴다.. +const int MAX_PLUG_TRACE_VERTEX = 64; // 무기 궤적 점의 수.. 점 8 개로는 잔상이 3단계로 남는다.. typedef typename std::vector::iterator it_CPart; typedef typename std::vector::iterator it_CPlug; @@ -249,63 +249,63 @@ class CN3Chr : public CN3TransformCollision { friend class CPlayerMySelf; public: - int m_nLOD; // Level Of Detail - Ҽ ֵ Ѵ.. - int m_nLOD_0; // Level Of Detail - 0 LOD Ҽ ֵ Ѵ.. + int m_nLOD; // Level Of Detail - 강제로 세팅할수 있도록 한다.. + int m_nLOD_0; // Level Of Detail - 0가장 디테일한 값으로 계산된 LOD 강제로 세팅할수 있도록 한다.. protected: - static int s_iLODDelta; // LOD 꿡 ʿ ε.. + static int s_iLODDelta; // LOD 계산에 필요한 인덱스.. - CN3Joint * m_pRootJointRef; // Ѱ 븸 .. + CN3Joint * m_pRootJointRef; // 한개의 뼈대만을 쓴다.. - std::vector m_JointRefs; // Ʈ + std::vector m_JointRefs; // 각 조인트에 참조 포인터 std::vector<__Matrix44> - m_MtxJoints; // Ʈ .. ͷ ij͸ ϸ̼ DZ ̴.. - std::vector<__Matrix44> m_MtxInverses; // Ʈ + m_MtxJoints; // 각 조인트의 행렬.. 포인터로 두지 않은 이유는 각 캐릭터마다 따로 에니메이션이 되기 위함이다.. + std::vector<__Matrix44> m_MtxInverses; // 조인트에 대한 역행렬 - std::vector m_Parts; // ij κк Data Pointer List - std::vector m_Plugs; // ijͿ ̴ Data Pointer List + std::vector m_Parts; // 각 캐릭터의 부분별 Data Pointer List + std::vector m_Plugs; // 이 캐릭터에 붙이는 무기등의 Data Pointer List std::vector<__VertexColor *> m_vTraces; // Plug Trace Polygon - class CN3FXPlug * m_pFXPlug; // ijͿ FX ̴ . + class CN3FXPlug * m_pFXPlug; // 캐릭터에 FX를 붙이는 것. - int m_nJointPartStarts[MAX_CHR_ANI_PART]; // Ʈ Ϻκ ϸ̼ Ǿ Ѵٸ.. Ʈ ε ȣ - int m_nJointPartEnds[MAX_CHR_ANI_PART]; // Ʈ Ϻκ ϸ̼ Ǿ Ѵٸ.. Ʈ ε ȣ + int m_nJointPartStarts[MAX_CHR_ANI_PART]; // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 시작 번호 + int m_nJointPartEnds[MAX_CHR_ANI_PART]; // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 끝 번호 // CN3Skin * m_pSkinCollision; CN3AnimControl * m_pAniCtrlRef; // Animation Control Reference Pointer struct __FrmCtrl { - __AnimData * pAniData; // ϸ̼ .. - - int iAni; // ϸ̼ - bool bOnceAndFreeze; // ѹ ϰ ϴ°?? - bool bProcessingDelayNow; // ð óϴ°?? - float fFrmCur; // - float fFrmPrev; // ֱ - int iAniLoop; // ϸ̼ ?? - float fBlendFrm; // ϸ̼ Ӱ - float fBlendTimeCur; // ð.. - float fBlendTime; // ð. (ʴ) - float fFreezeTime; // ð.. + __AnimData * pAniData; // 현재 에니메이션 데이터 포인터.. + + int iAni; // 현재 에니메이션 + bool bOnceAndFreeze; // 한번만 하고 멈춰야 하는가?? + bool bProcessingDelayNow; // 지금 지연시간을 처리하는가?? + float fFrmCur; // 현재 프레임 + float fFrmPrev; // 최근 프레임 + int iAniLoop; // 에니메이션이 끝났나?? + float fBlendFrm; // 현재 에니메이션의 시작프레임과 블렌딩할 프레임 + float fBlendTimeCur; // 현재 블렌딩 시간.. + float fBlendTime; // 블렌딩할 시간. (초단위) + float fFreezeTime; // 멈출 시간.. void Init() { pAniData = NULL; - iAni = -1; // ϸ̼ - bOnceAndFreeze = false; // ư ϸ̼.. - bProcessingDelayNow = false; // ð óϴ°?? + iAni = -1; // 현재 에니메이션 + bOnceAndFreeze = false; // 돌아갈 에니메이션.. + bProcessingDelayNow = false; // 지금 지연시간을 처리하는가?? fFrmCur = 0; - fFrmPrev = 0; // ֱ - iAniLoop = 0; // ϸ̼ °? - fBlendFrm = 0; // ϸ̼ .. - fBlendTimeCur = 0; // ð.. - fBlendTime = 0; // ð. (ʴ) + fFrmPrev = 0; // 최근 프레임 + iAniLoop = 0; // 에니메이션이 끝났는가? + fBlendFrm = 0; // 블렌딩할 에니메이션 데이터 포인터.. + fBlendTimeCur = 0; // 현재 블렌딩 시간.. + fBlendTime = 0; // 블렌딩할 시간. (초단위) } __FrmCtrl() { __FrmCtrl::Init(); } }; __FrmCtrl m_FrmCtrl; - __FrmCtrl m_FrmCtrlUpper; // ü... - float m_fAniSpeedDelta; // ϸ̼ ӵ 1 ̺, ũ .. + __FrmCtrl m_FrmCtrlUpper; // 상체용... + float m_fAniSpeedDelta; // 에니메이션 속도 조정 변수 1 이보통, 더 크면 빨라진다.. public: int CheckCollisionPrecisely(const __Vector3 & vPos, const __Vector3 & vDir, __Vector3 * pvPick = NULL); @@ -317,7 +317,7 @@ class CN3Chr : public CN3TransformCollision { } static int LODDelta() { return s_iLODDelta; } - void FindMinMax(); // ִ ּҰ ã´. + void FindMinMax(); // 최대 최소값을 찾는다. int JointPartStart(int nAniPart) { if (nAniPart < 0 || nAniPart >= MAX_CHR_ANI_PART) { return -1; @@ -380,59 +380,59 @@ class CN3Chr : public CN3TransformCollision { void TickPlugs(float fLOD); void RemakePlugTracePolygons(); - float Height() { return m_vMax.y * m_vScale.y; } // Ű ... - float Radius() { return m_fRadius * m_vScale.y; } // ʺ... + float Height() { return m_vMax.y * m_vScale.y; } // 스케일을 적용한 키 ... + float Radius() { return m_fRadius * m_vScale.y; } // 스케일을 적용한 너비... CN3Joint * Joint() { return m_pRootJointRef; } void JointSet(const std::string & szFN); - // Animation Լ + // Animation 관련 함수 #ifdef _N3TOOL void AniDefaultSet(); #endif // #ifdef _N3TOOL CN3AnimControl * AniCtrl() { return m_pAniCtrlRef; } void AniCtrlSet(const std::string & szFN); int AniIndexCur() { return m_FrmCtrl.iAni; } - int AniCurSet(int iAni, // Animation ȣ, - bool bOnceAndFreeze = false, // ѹ ߾ ϴ°?? - float fBlendTime = FLT_MIN, // ϴ ð(ʴ), - float fFreezeTime = 0, // ð... - bool bStopUpperAnimation = true); // ü ϸ̼ .. ߵ + int AniCurSet(int iAni, // Animation 번호, + bool bOnceAndFreeze = false, // 한번만 돌고 멈추어야 하는가?? + float fBlendTime = FLT_MIN, // 블렌딩하는 시간(초단위), + float fFreezeTime = 0, // 멈출시간... + bool bStopUpperAnimation = true); // 상체 에니메이션이 있으면.. 멈추도록 void AniUpperSet(int nAni, float fFreezeTime = 0); - void AniFixToLastFrame(int iAni); // . + void AniFixToLastFrame(int iAni); // 마지막 프레임으로 고정 시켜 버린다. bool - IsAnimEnd(); // ѹ ϰ ߴ ϸ̼ ϰ .. ?? Ȥ ѹϰ ư ϸ̼ ư? + IsAnimEnd(); // 한번 하고 멈추는 에니메이션 일경우 .. 끝났는지?? 혹은 한번하고 전의 동작으로 돌아가는 에니메이션일 경우 돌아갔는지? float FrmCur() { return m_FrmCtrl.fFrmCur; } float FrmPrev() { return m_FrmCtrl.fFrmPrev; } float AniBlendDelta(); - float AniSpeedDelta() { return m_fAniSpeedDelta; } // ϸ̼ ӵ 1 ̺, ũ .. + float AniSpeedDelta() { return m_fAniSpeedDelta; } // 에니메이션 속도 조정 변수 1 이보통, 더 크면 빨라진다.. void AniSpeedDeltaSet(float fDelta) { if (fDelta > 0.1f && fDelta < 10.0f) { m_fAniSpeedDelta = fDelta; } - } // ϸ̼ ӵ 1 ̺, ũ .. + } // 에니메이션 속도 조정 변수 1 이보통, 더 크면 빨라진다.. - // Sound Player Լ + // Sound Player 관련 함수 bool NeedPlaySound0(); bool NeedPlaySound1(); - // ¥ Ÿ Լ.. + // 가짜 타격을 위한 함수.. bool NeedStrike0(); bool NeedStrike1(); - // ٽ ۵Ǵ Ÿ̹ΰ? + // 루핑이 다시 시작되는 타이밍인가? bool IsLoopingAgain(); ////////////////////////////////////////////////// - // Coded (By Dino On 2002-10-10 2:35:32 ) + // Coded (By Dino On 2002-10-10 오후 2:35:32 ) // FXPlug class CN3FXPlug * FXPlugSet(const std::string & strFN); class CN3FXPlug * FXPlugCreate(); class CN3FXPlug * FXPlugGet() { return m_pFXPlug; } void FXPlugDelete(); - // End Of Code (By Dino On 2002-10-10 2:35:32 ) + // End Of Code (By Dino On 2002-10-10 오후 2:35:32 ) ////////////////////////////////////////////////// void Init(); @@ -454,7 +454,7 @@ class CN3Chr : public CN3TransformCollision { }; inline bool CN3Chr:: - IsAnimEnd() // ѹ ϰ ߴ ϸ̼ ϰ .. ?? Ȥ ѹϰ ư ϸ̼ ư? + IsAnimEnd() // 한번 하고 멈추는 에니메이션 일경우 .. 끝났는지?? 혹은 한번하고 전의 동작으로 돌아가는 에니메이션일 경우 돌아갔는지? { if (m_FrmCtrlUpper.pAniData) { if (m_FrmCtrlUpper.iAniLoop > 0) { @@ -476,7 +476,7 @@ inline float CN3Chr::AniBlendDelta() { return m_FrmCtrl.fBlendTimeCur / m_FrmCtrl.fBlendTime; } -// Sound Player Լ +// Sound Player 관련 함수 inline bool CN3Chr::NeedPlaySound0() { if (NULL == m_FrmCtrl.pAniData) { return false; @@ -503,7 +503,7 @@ inline bool CN3Chr::NeedPlaySound0() { return false; } -inline bool CN3Chr::IsLoopingAgain() // ٽ ۵Ǵ Ÿ̹ΰ? +inline bool CN3Chr::IsLoopingAgain() // 루핑이 다시 시작되는 타이밍인가? { if (NULL == m_FrmCtrl.pAniData) { return false; @@ -519,7 +519,7 @@ inline bool CN3Chr::NeedPlaySound0() { } if (m_FrmCtrl.iAniLoop <= 0) { - return false; // ƴϴ. + return false; // 루핑이 아니다. } if (m_FrmCtrl.fFrmPrev > m_FrmCtrl.fFrmCur) { return true; diff --git a/src/engine/N3Base/N3Cloak.cpp b/src/engine/N3Base/N3Cloak.cpp index a20811fb..cab085ac 100644 --- a/src/engine/N3Base/N3Cloak.cpp +++ b/src/engine/N3Base/N3Cloak.cpp @@ -376,7 +376,7 @@ void CN3Cloak::ApplyOffset(D3DXVECTOR3 & vDif) { m_vOffset[i].z = vDif.z * Weight[i]; } m_fOffsetRecoveryTime = 1.4f; - } else { // offset Ǿ ִ . + } else { // offset 이 적용되어 있는 상태. m_fOffsetRecoveryTime -= s_fSecPerFrm; if (m_fOffsetRecoveryTime < 0.0f) { // Recovery process for (int i = 0; i < m_nGridW; i++) { @@ -399,7 +399,7 @@ void CN3Cloak::TickYaw() { } float fYaw = m_bpPlayerBase->Yaw(); - if (fYaw != m_fPrevYaw) { // ȸ ־. + if (fYaw != m_fPrevYaw) { // 회전이 있었다. if (fYaw - m_fPrevYaw > 0.0f) { if (m_eAnchorPattern == AMP_NONE && m_fAnchorPreserveTime < 0.0f) { MoveAnchorLine(AMP_YAWCCW, 2.0f); diff --git a/src/engine/N3Base/N3Cloak.h b/src/engine/N3Base/N3Cloak.h index 68b39a7b..9d72918c 100644 --- a/src/engine/N3Base/N3Cloak.h +++ b/src/engine/N3Base/N3Cloak.h @@ -8,7 +8,7 @@ #define CLOAK_MAX_WIDTH 7 #define CLOAK_MAX_HEIGHT 7 -#define CLOAK_SKIP_LINE 2 // 信 Ŀ ؽ  ִ μ. ̺κ ̵ . ok? +#define CLOAK_SKIP_LINE 2 // 망토에서 장식용 버텍스가 들어가 있는 라인수. 이부분은 이동이 없다. ok? enum e_Cloak_AnchorMovePattern { AMP_NONE = 0, @@ -74,8 +74,8 @@ class CN3Cloak : public CN3Base { float m_fPrevYaw; __Particle * m_pParticle; - D3DXVECTOR3 m_GravityForce; // ߷(.y) ׻־ Ͼ ʴ´.. - D3DXVECTOR3 m_Force; // ܺο . + D3DXVECTOR3 m_GravityForce; // 중력(.y)가 항상있어야 변형이 일어나지 않는다.. + D3DXVECTOR3 m_Force; // 외부에서 가해지는 힘. void UpdateLocalForce(); void ApplyForce(); diff --git a/src/engine/N3Base/N3Cloud.cpp b/src/engine/N3Base/N3Cloud.cpp index 1846237b..dba26665 100644 --- a/src/engine/N3Base/N3Cloud.cpp +++ b/src/engine/N3Base/N3Cloud.cpp @@ -57,7 +57,7 @@ void CN3Cloud::Tick() { static float fCloudLayer = 0.0f; fCloudLayer += s_fSecPerFrm; - // ̱ + // 구름층 움직이기 if (fCloudLayer >= 0.05) { // float du = 0.001 * fCloudLayer; // float dv = 0.003 * fCloudLayer; @@ -89,22 +89,22 @@ void CN3Cloud::Tick() { } } - // ȭϱ + // 색 변화하기 m_Color1.Tick(); m_Color2.Tick(); - // ü + // 구름 교체 if (CLOUD_NONE != m_eCloud3) { m_Alpha.Tick(); m_fCloudTexTime -= s_fSecPerFrm; - if (m_fCloudTexTime < 0.0f) // ü + if (m_fCloudTexTime < 0.0f) // 구름 교체가 끝났으면 { m_fCloudTexTime = 0.0f; m_eCloud2 = m_eCloud3; m_eCloud3 = CLOUD_NONE; m_Alpha.ChangeColor(0xffffffff); - if (CLOUD_NONE != m_eBackupCloud) // ٲ + if (CLOUD_NONE != m_eBackupCloud) // 구름 바꿔야 할 것이 있으면 { e_CLOUDTEX eTmp = m_eCloud1; m_eCloud1 = m_eCloud2; @@ -116,7 +116,7 @@ void CN3Cloud::Tick() { m_fBackupTime = 0.0f; m_Alpha.ChangeColor(0x00ffffff, m_fCloudTexTime); - // uv ǥ ٲٱ + // uv 좌표도 바꾸기 for (int i = 0; i < NUM_CLOUD_VERTEX; ++i) { float fTempUV = m_pVertices[i].tu; m_pVertices[i].tu = m_pVertices[i].tu2; @@ -182,7 +182,7 @@ void CN3Cloud::Render() { if (Alpha < color2) { color2 = (Alpha & 0xff000000) | (color2 & - 0x00ffffff); // ȭ alpha üalpha ū ü alpha ü + 0x00ffffff); // 기존 색 변화의 alpha값이 구름 교체alpha값보다 큰 경우 구름 교체 alpha값으로 대체 } // render cloud 2 for (int i = 0; i < 4; ++i) { @@ -196,7 +196,7 @@ void CN3Cloud::Render() { sizeof(__VertexXyzColorT2)); // render cloud 3 D3DCOLOR color3 = - ((0xff - (color2 >> 24)) << 24) | (color2 & 0x00ffffff); // color2 alpha 0xff ٲ + ((0xff - (color2 >> 24)) << 24) | (color2 & 0x00ffffff); // color2의 alpha값을 0xff에서 뺀 값으로 바꿈 for (int i = 4; i < NUM_CLOUD_VERTEX; ++i) { m_pVertices[i].color = color3; } @@ -248,7 +248,7 @@ void CN3Cloud::Init(const std::string * pszFNs) { } /* - // 3϶ + // 3단일때 const float fSqrt3 = 1.0f / sqrtf(3.0f); const float fOffset = 3.0f; const float fSmallLength = 5.0f; @@ -265,14 +265,14 @@ void CN3Cloud::Init(const std::string * pszFNs) { float fTmp1, fTmp2; fTmp1 = fBigLenth - fMediumLength; fTmp2 = fMediumHeight - fBigHeight; - const float fBig = sqrtf(fTmp1 * fTmp1 + fTmp2 * fTmp2); // ū 簢 ߰簢 Ÿ + const float fBig = sqrtf(fTmp1 * fTmp1 + fTmp2 * fTmp2); // 젤큰 사각형과 중간사각형간의 거리 fTmp1 = fMediumLength - fSmallLength; fTmp2 = fSmallHeight - fMediumHeight; - const float fMedium = sqrtf(fTmp1 * fTmp1 + fTmp2 * fTmp2); // ߰ 簢 簢 Ÿ - const float fSmall = fSmallLength; // 簢 0 Ÿ + const float fMedium = sqrtf(fTmp1 * fTmp1 + fTmp2 * fTmp2); // 중간 사각형과 작은사각형간의 거리 + const float fSmall = fSmallLength; // 작은 사각형이 0에서 떨어진 거리 const float fTotal = fBig + fMedium + fSmall; - // ؽ ǥ ǥ(ؽ ü ɼ ְ Ϻκ ֱ ) + // 텍스쳐 구름으로 표시할 영역 좌표(텍스쳐의 전체가 될수도 있고 일부분이 될 수도 있기 때문에) float fTexUVLeft = 0.0f, fTexUVTop = 0.0f, fTexUVRight = 3.0f, fTexUVBottom = 3.0f; // const float fTexOffsetU_M = (fBig / fTotal) * (fTexUVRight - fTexUVLeft) / 2; // const float fTexOffsetV_M = (fBig / fTotal) * (fTexUVBottom - fTexUVTop) / 2; @@ -311,20 +311,20 @@ void CN3Cloud::Init(const std::string * pszFNs) { fTexUVBottom - fTexOffsetV_S, fTexUVLeft + fTexOffsetU_S, fTexUVBottom - fTexOffsetV_S); */ - // 2϶ + // 2단일때 const float fSqrt3 = 1.0f / sqrtf(3.0f); - float fBigLenth = 16.0f; // θü Ʒ ū 簢 - const float fSmallLength = 8.0f; // θü 簢 - const float fBigHeight = 5.0f; // 簢θü Ʒ ( 0.0f ) + float fBigLenth = 16.0f; // 구름 절두면체의 아래 큰 사각형 길이 + const float fSmallLength = 8.0f; // 구름 절두면체의 위 작은 사각형 길이 + const float fBigHeight = 5.0f; // 구름 사각절두면체의 아래 높이(지평선 0.0f 기준) const float fSmallHeight = - fBigHeight + (fBigLenth - fSmallLength) * fSqrt3; // θü ( 0.0f ) + fBigHeight + (fBigLenth - fSmallLength) * fSqrt3; // 구름 절두면체의 위 높이(지평선 0.0f 기준) - fBigLenth = 24.0f; // ڵ ȭ , ̰ ū ٽ ø + fBigLenth = 24.0f; //위에 코드는 최적화 각도, 이것은 큰 사격형만 다시 늘림 D3DCOLOR BigColor = 0x00ffffff; D3DCOLOR SmallColor = 0xffffffff; - // ؽ ǥ ǥ(ؽ ü ɼ ְ Ϻκ ֱ ) + // 텍스쳐 구름으로 표시할 영역 좌표(텍스쳐의 전체가 될수도 있고 일부분이 될 수도 있기 때문에) float fTexUVLeft = 0.0f, fTexUVTop = 0.0f, fTexUVRight = 4.0f, fTexUVBottom = 4.0f; float fTmp1 = fBigLenth - fSmallLength; float fTmp2 = fSmallHeight - fBigHeight; @@ -357,14 +357,14 @@ void CN3Cloud::SetCloud(e_CLOUDTEX eCloud1, e_CLOUDTEX eCloud2, float fSec) { return; } - // ʱȭ + // 변수 초기화 m_Alpha.ChangeColor(0xffffffff); m_fCloudTexTime = 0.0f; m_eCloud3 = CLOUD_NONE; m_eBackupCloud = CLOUD_NONE; m_fBackupTime = 0.0f; - // ٲ Ǵ + // 바꿀 구름 판단 int iSameCount = 0; if (eCloud1 == m_eCloud1) { ++iSameCount; @@ -377,12 +377,12 @@ void CN3Cloud::SetCloud(e_CLOUDTEX eCloud1, e_CLOUDTEX eCloud2, float fSec) { ++iSameCount; } - if (2 == iSameCount) // ̹Ƿ ٲ ʿ䰡 + if (2 == iSameCount) // 같은 구름이므로 바꿀 필요가 없다 { return; } - if (1 == iSameCount) // ϳ üϸ ȴ. + if (1 == iSameCount) // 하나만 교체하면 된다. { if (m_eCloud1 == eCloud1) { m_eCloud3 = eCloud2; @@ -407,7 +407,7 @@ void CN3Cloud::SetCloud(e_CLOUDTEX eCloud1, e_CLOUDTEX eCloud2, float fSec) { return; } - // ΰ ü + // 두개 모두 교체 if (0.0f == fSec) { m_eCloud1 = eCloud1; m_eCloud2 = eCloud2; diff --git a/src/engine/N3Base/N3Cloud.h b/src/engine/N3Base/N3Cloud.h index e9d4a684..b8113b15 100644 --- a/src/engine/N3Base/N3Cloud.h +++ b/src/engine/N3Base/N3Cloud.h @@ -30,20 +30,20 @@ class CN3Cloud : public CN3Base { virtual ~CN3Cloud(); protected: - __VertexXyzColorT2 m_pVertices[NUM_CLOUD_VERTEX]; // ؽ - CN3Texture * m_pTextures[NUM_CLOUD]; // ؽĵ.. - std::string m_szTextures[NUM_CLOUD]; // ؽó ̸... - - CN3ColorChange m_Color1; // 1 - CN3ColorChange m_Color2; // 2 - CN3ColorChange m_Alpha; // ٲ alpha - e_CLOUDTEX m_eCloud1; // ؽ1 - e_CLOUDTEX m_eCloud2; // ؽ2 - e_CLOUDTEX m_eCloud3; // ؽ3 - - float m_fCloudTexTime; // ð - e_CLOUDTEX m_eBackupCloud; // 2° ؾ texture - float m_fBackupTime; // 2° ؾ ð + __VertexXyzColorT2 m_pVertices[NUM_CLOUD_VERTEX]; // 구름층의 버텍스 + CN3Texture * m_pTextures[NUM_CLOUD]; // 텍스쳐들.. + std::string m_szTextures[NUM_CLOUD]; // 텍스처 파일 이름들... + + CN3ColorChange m_Color1; // 구름 색1 + CN3ColorChange m_Color2; // 구름 색2 + CN3ColorChange m_Alpha; // 구름 바뀔때 alpha값 + e_CLOUDTEX m_eCloud1; // 구름 텍스쳐1 + e_CLOUDTEX m_eCloud2; // 구름 텍스쳐2 + e_CLOUDTEX m_eCloud3; // 구름 텍스쳐3 + + float m_fCloudTexTime; // 구름 변경 남은 시간 + e_CLOUDTEX m_eBackupCloud; // 2번째 구름 변경해야 할 texture종류 저장 + float m_fBackupTime; // 2번째 구름 변경해야 할 시간 저장 // Operations public: diff --git a/src/engine/N3Base/N3ColorChange.cpp b/src/engine/N3Base/N3ColorChange.cpp index 2c435fb8..e11f1c71 100644 --- a/src/engine/N3Base/N3ColorChange.cpp +++ b/src/engine/N3Base/N3ColorChange.cpp @@ -19,7 +19,7 @@ CN3ColorChange::CN3ColorChange() { CN3ColorChange::~CN3ColorChange() {} void CN3ColorChange::ChangeColor(D3DCOLOR color, float fSec) { - if (color == m_CurColor || 0.0f >= fSec) // ȭ + if (color == m_CurColor || 0.0f >= fSec) // 즉시 변화 { m_CurColor = m_PrevColor = m_NextColor = color; m_fRate = m_fPercentage = m_fTempSec = 0.0f; @@ -66,7 +66,7 @@ void CN3ColorChange::SetPercentage(float fPercentage) { if (0.0f > fPercentage || 1.0f < fPercentage) { return; } - if (1.0f == fPercentage) { // 1.0f̸ ٷ ٲٱ + if (1.0f == fPercentage) { // 1.0f이면 바로 색 바꾸기 m_PrevColor = m_CurColor = m_NextColor; m_fPercentage = m_fRate = 0.0f; return; @@ -85,7 +85,7 @@ CN3DeltaChange::CN3DeltaChange() { CN3DeltaChange::~CN3DeltaChange() {} void CN3DeltaChange::ChangeDelta(float fDelta, float fSec) { - if (fDelta == m_fCurDelta || 0.0f >= fSec) // ȭ + if (fDelta == m_fCurDelta || 0.0f >= fSec) // 즉시 변화 { m_fCurDelta = m_fPrevDelta = m_fNextDelta = fDelta; m_fRate = m_fPercentage = m_fTempSec = 0.0f; @@ -120,7 +120,7 @@ void CN3DeltaChange::SetPercentage(float fPercentage) { if (0.0f > fPercentage || 1.0f < fPercentage) { return; } - if (1.0f == fPercentage) { // 1.0f̸ ٷ ٲٱ + if (1.0f == fPercentage) { // 1.0f이면 바로 색 바꾸기 m_fPrevDelta = m_fCurDelta = m_fNextDelta; m_fPercentage = m_fRate = 0.0f; return; diff --git a/src/engine/N3Base/N3ColorChange.h b/src/engine/N3Base/N3ColorChange.h index 72fe1a6a..3bcf818e 100644 --- a/src/engine/N3Base/N3ColorChange.h +++ b/src/engine/N3Base/N3ColorChange.h @@ -19,12 +19,12 @@ class CN3ColorChange : public CN3Base { void SetPercentage(float fPercentage); protected: - D3DCOLOR m_CurColor; // . - D3DCOLOR m_PrevColor; // ȭϱ . - D3DCOLOR m_NextColor; // ȭ . - float m_fPercentage; // ȭ (0.0 ~ 1.0) - float m_fRate; // ʴ ȭ - float m_fTempSec; // ӽ ð + D3DCOLOR m_CurColor; // 현재 색. + D3DCOLOR m_PrevColor; // 변화하기 전 색. + D3DCOLOR m_NextColor; // 최종적으로 변화할 색. + float m_fPercentage; // 현재 변화된 정도(0.0 ~ 1.0) + float m_fRate; // 초당 변화율 + float m_fTempSec; // 임시 시간 저장 변수 }; class CN3DeltaChange : public CN3Base { @@ -40,11 +40,11 @@ class CN3DeltaChange : public CN3Base { void SetPercentage(float fPercentage); protected: - float m_fCurDelta; // . - float m_fPrevDelta; // ȭϱ . - float m_fNextDelta; // ȭ . + float m_fCurDelta; // 현재 색. + float m_fPrevDelta; // 변화하기 전 색. + float m_fNextDelta; // 최종적으로 변화할 색. - float m_fPercentage; // ȭ (0.0 ~ 1.0) - float m_fRate; // ʴ ȭ - float m_fTempSec; // ӽ ð + float m_fPercentage; // 현재 변화된 정도(0.0 ~ 1.0) + float m_fRate; // 초당 변화율 + float m_fTempSec; // 임시 시간 저장 변수 }; diff --git a/src/engine/N3Base/N3Eng.cpp b/src/engine/N3Base/N3Eng.cpp index 84e2180b..0ecbb6e1 100644 --- a/src/engine/N3Base/N3Eng.cpp +++ b/src/engine/N3Base/N3Eng.cpp @@ -18,17 +18,17 @@ CN3Eng::CN3Eng() { memset(&m_DeviceInfo, 0, sizeof(__D3DDEV_INFO)); m_nModeActive = -1; - m_nAdapterCount = 1; // ׷ ī + m_nAdapterCount = 1; // 그래픽 카드 갯수 delete[] m_DeviceInfo.pModes; memset(&m_DeviceInfo, 0, sizeof(m_DeviceInfo)); - // Direct3D + // Direct3D 생성 m_lpD3D = NULL; m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION); if (NULL == m_lpD3D) { MessageBox(::GetActiveWindow(), "Direct3D9 is not installed or lower version.", "Initialization", MB_OK); - // for (int iii = 0; iii < 1; iii++) { // ~ + // for (int iii = 0; iii < 1; iii++) { // 여러번 삑~ // Beep(2000, 200); // Sleep(300); // } @@ -39,14 +39,14 @@ CN3Eng::CN3Eng() { exit(-1); } - // α׷ .. + // 프로그램이 실행된 경로.. if (s_szPath.empty()) { char szPath[256]; char szDrive[_MAX_DRIVE], szDir[_MAX_DIR]; ::GetModuleFileName(NULL, szPath, 256); _splitpath(szPath, szDrive, szDir, NULL, NULL); sprintf(szPath, "%s%s", szDrive, szDir); - this->PathSet(szPath); // .. + this->PathSet(szPath); // 경로 설정.. } #ifdef _N3GAME @@ -86,7 +86,7 @@ CN3Eng::~CN3Eng() { void CN3Eng::Release() { m_nModeActive = -1; - m_nAdapterCount = 1; // ׷ ī + m_nAdapterCount = 1; // 그래픽 카드 갯수 delete[] m_DeviceInfo.pModes; memset(&m_DeviceInfo, 0, sizeof(m_DeviceInfo)); @@ -109,14 +109,14 @@ void CN3Eng::Release() { } bool CN3Eng::Init(BOOL bWindowed, HWND hWnd, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, BOOL bUseHW) { - memset(&s_ResrcInfo, 0, sizeof(__ResrcInfo)); // Rendering Information ʱȭ.. + memset(&s_ResrcInfo, 0, sizeof(__ResrcInfo)); // Rendering Information 초기화.. s_hWndBase = hWnd; - int nAMC = m_lpD3D->GetAdapterModeCount(0, D3DFMT_X8R8G8B8); // ÷ īƮ + int nAMC = m_lpD3D->GetAdapterModeCount(0, D3DFMT_X8R8G8B8); // 디스플레이 모드 카운트 if (nAMC <= 0) { MessageBox(hWnd, "Can't create D3D - Invalid display mode property.", "initialization", MB_OK); -// { for(int iii = 0; iii < 2; iii++) Beep(2000, 200); Sleep(300); } // ~ +// { for(int iii = 0; iii < 2; iii++) Beep(2000, 200); Sleep(300); } // 여러번 삑~ #ifdef _N3GAME CLogWriter::Write("Can't create D3D - Invalid display mode property."); #endif @@ -131,7 +131,7 @@ bool CN3Eng::Init(BOOL bWindowed, HWND hWnd, DWORD dwWidth, DWORD dwHeight, DWOR delete[] m_DeviceInfo.pModes; m_DeviceInfo.pModes = new D3DDISPLAYMODE[nAMC]; for (int i = 0; i < nAMC; i++) { - m_lpD3D->EnumAdapterModes(0, D3DFMT_X8R8G8B8, i, &m_DeviceInfo.pModes[i]); // ÷ .. + m_lpD3D->EnumAdapterModes(0, D3DFMT_X8R8G8B8, i, &m_DeviceInfo.pModes[i]); // 디스플레이 모드 가져오기.. } D3DDEVTYPE DevType = D3DDEVTYPE_REF; @@ -147,7 +147,7 @@ bool CN3Eng::Init(BOOL bWindowed, HWND hWnd, DWORD dwWidth, DWORD dwHeight, DWOR s_DevParam.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; D3DFORMAT BBFormat = D3DFMT_UNKNOWN; - if (TRUE == bWindowed) // + if (TRUE == bWindowed) // 윈도우 모드일 경우 { D3DDISPLAYMODE dm; m_lpD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dm); @@ -162,7 +162,7 @@ bool CN3Eng::Init(BOOL bWindowed, HWND hWnd, DWORD dwWidth, DWORD dwHeight, DWOR s_DevParam.hDeviceWindow = hWnd; } else { s_DevParam.BackBufferCount = 1; - s_DevParam.AutoDepthStencilFormat = D3DFMT_D16; // ڵ ̸ õȴ. + s_DevParam.AutoDepthStencilFormat = D3DFMT_D16; // 자동 생성이면 무시된다. if (16 == dwBPP) { BBFormat = D3DFMT_R5G6B5; } else if (24 == dwBPP) { @@ -176,7 +176,7 @@ bool CN3Eng::Init(BOOL bWindowed, HWND hWnd, DWORD dwWidth, DWORD dwHeight, DWOR s_DevParam.BackBufferWidth = dwWidth; s_DevParam.BackBufferHeight = dwHeight; s_DevParam.BackBufferFormat = BBFormat; - s_DevParam.MultiSampleType = D3DMULTISAMPLE_NONE; // Swap Effect Discard ° ƴϸ ݵ ̷ ̾ Ѵ. + s_DevParam.MultiSampleType = D3DMULTISAMPLE_NONE; // Swap Effect 가 Discard 형태가 아니면 반드시 이런 식이어야 한다. s_DevParam.Flags = 0; //#ifdef _N3TOOL s_DevParam.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; @@ -185,10 +185,10 @@ bool CN3Eng::Init(BOOL bWindowed, HWND hWnd, DWORD dwWidth, DWORD dwHeight, DWOR int nMC = m_DeviceInfo.nModeCount; for (int i = 0; i < nMC; i++) { // if (m_DeviceInfo.pModes[i].Width == dwWidth && m_DeviceInfo.pModes[i].Height == dwHeight && - if (m_DeviceInfo.pModes[i].Format == BBFormat) // 尡 ġϸ + if (m_DeviceInfo.pModes[i].Format == BBFormat) // 모드가 일치하면 { this->FindDepthStencilFormat(0, m_DeviceInfo.DevType, m_DeviceInfo.pModes[i].Format, - &s_DevParam.AutoDepthStencilFormat); // ̿ ٽ ۸ ã´. + &s_DevParam.AutoDepthStencilFormat); // 깊이와 스텐실 버퍼를 찾는다. m_nModeActive = i; break; } @@ -214,7 +214,7 @@ bool CN3Eng::Init(BOOL bWindowed, HWND hWnd, DWORD dwWidth, DWORD dwHeight, DWOR CLogWriter::Write(errMsg.str().c_str()); #endif LocalFree(pszDebug); - // for (int iii = 0; iii < 3; iii++) { // ~ + // for (int iii = 0; iii < 3; iii++) { // 여러번 삑~ // Beep(2000, 200); // Sleep(300); // } @@ -227,21 +227,21 @@ bool CN3Eng::Init(BOOL bWindowed, HWND hWnd, DWORD dwWidth, DWORD dwHeight, DWOR #endif } - // Device ׸?? - // DXT .. + // Device 지원 항목은?? + // DXT 지원 여부.. s_dwTextureCaps = 0; s_DevCaps.DeviceType = DevType; s_lpD3DDev->GetDeviceCaps(&s_DevCaps); if (s_DevCaps.MaxTextureWidth < 256 || - s_DevCaps.MaxTextureHeight < 256) // ؽó ũⰡ 256 ϸ.. ƿ .. + s_DevCaps.MaxTextureHeight < 256) // 텍스처 지원 크기가 256 이하면.. 아예 포기.. { MessageBox(::GetActiveWindow(), "Can't support this graphic card : Texture size is too small", "Initialization error", MB_OK); #ifdef _N3GAME CLogWriter::Write("Can't support this graphic card : Texture size is too small"); #endif - // for (int iii = 0; iii < 4; iii++) { // ~ + // for (int iii = 0; iii < 4; iii++) { // 여러번 삑~ // Beep(2000, 200); // Sleep(300); // } @@ -275,7 +275,7 @@ bool CN3Eng::Init(BOOL bWindowed, HWND hWnd, DWORD dwWidth, DWORD dwHeight, DWOR s_dwTextureCaps |= TEX_CAPS_POW2; } - // ⺻ Ʈ .. + // 기본 라이트 정보 지정.. for (int i = 0; i < 8; i++) { CN3Light::__Light Lgt; _D3DCOLORVALUE LgtColor = {1.0f, 1.0f, 1.0f, 1.0f}; @@ -283,13 +283,13 @@ bool CN3Eng::Init(BOOL bWindowed, HWND hWnd, DWORD dwWidth, DWORD dwHeight, DWOR s_lpD3DDev->SetLight(i, &Lgt); } - // ⺻ . + // 기본 뷰와 프로젝션 설정. this->LookAt(__Vector3(5, 5, -10), __Vector3(0, 0, 0), __Vector3(0, 1, 0)); this->SetProjection(0.1f, 256.0f, D3DXToRadian(45.0f), (float)dwHeight / dwWidth); RECT rcView = {0, 0, dwWidth, dwHeight}; this->SetViewPort(rcView); - this->SetDefaultEnvironment(); // ⺻ · .. + this->SetDefaultEnvironment(); // 기본 상태로 설정.. if (m_CB.Init) { if (!m_CB.Init()) { @@ -390,7 +390,7 @@ void CN3Eng::Present(HWND hWnd, RECT * pRC) { // } RECT rc; - if (s_DevParam.Windowed) // ... + if (s_DevParam.Windowed) // 윈도우 모드면... { GetClientRect(s_hWndBase, &rc); pRC = &rc; @@ -402,7 +402,7 @@ void CN3Eng::Present(HWND hWnd, RECT * pRC) { HRESULT rval = s_lpD3DDev->Present(pRC, pRC, hWnd, NULL); if (D3D_OK == rval) { - s_hWndPresent = hWnd; // Present window handle ´. + s_hWndPresent = hWnd; // Present window handle 을 저장해 놓는다. } else if (D3DERR_DEVICELOST == rval || D3DERR_DEVICENOTRESET == rval) { rval = s_lpD3DDev->Reset(&s_DevParam); if (D3D_OK != rval) { @@ -426,12 +426,12 @@ void CN3Eng::Present(HWND hWnd, RECT * pRC) { } //////////////////////////////////////////////////////////////////////////////// - // ... + // 프레임 율 측정... // float fTime = CN3Base::TimerProcess(TIMER_GETABSOLUTETIME); // static float fTimePrev = fTime - 0.03333f; // static DWORD dwFrm = 0; // dwFrm++; - // if (fTime - fTimePrev > 1.0f) { // 1 ̻ Ѵ.. ׷ ġ ´.. + // if (fTime - fTimePrev > 1.0f) { // 1 초 이상 지나야 프레임 측정한다.. 그렇지 않으면 들쭉 날쭉 한 수치가 나온다.. // s_fFrmPerSec = (float)dwFrm / (fTime - fTimePrev); // dwFrm = 0; // fTimePrev = fTime; @@ -439,18 +439,18 @@ void CN3Eng::Present(HWND hWnd, RECT * pRC) { s_fSecPerFrm = CN3Base::TimerProcess(TIMER_GETELAPSEDTIME); if (s_fSecPerFrm <= 0.001f || s_fSecPerFrm >= 1.0f) { - s_fSecPerFrm = 0.033333f; // ʹ ȳ ⺻ 30 .. + s_fSecPerFrm = 0.033333f; // 너무 안나오면 기본 값인 30 프레임으로 맞춘다.. } - s_fFrmPerSec = 1.0f / s_fSecPerFrm; // ʴ .. + s_fFrmPerSec = 1.0f / s_fSecPerFrm; // 초당 프레임 수 측정.. // fTimePrev = fTime; - // ... + // 프레임 율 측정... //////////////////////////////////////////////////////////////////////////////// } void CN3Eng::Clear(D3DCOLOR crFill, RECT * pRC) { RECT rc; - if (NULL == pRC && s_DevParam.Windowed) // ... + if (NULL == pRC && s_DevParam.Windowed) // 윈도우 모드면... { GetClientRect(s_hWndBase, &rc); pRC = &rc; @@ -469,9 +469,9 @@ void CN3Eng::Clear(D3DCOLOR crFill, RECT * pRC) { } void CN3Eng::ClearAuto(RECT * pRC) { - DWORD dwFillColor = D3DCOLOR_ARGB(255, 192, 192, 192); // ⺻ + DWORD dwFillColor = D3DCOLOR_ARGB(255, 192, 192, 192); // 기본색 DWORD dwUseFog = FALSE; - s_lpD3DDev->GetRenderState(D3DRS_FOGENABLE, &dwUseFog); // Ȱ Ȱ ش.. + s_lpD3DDev->GetRenderState(D3DRS_FOGENABLE, &dwUseFog); // 안개를 쓰면 바탕색을 안개색을 깔아준다.. if (dwUseFog != 0) { s_lpD3DDev->GetRenderState(D3DRS_FOGCOLOR, &dwFillColor); } else { @@ -491,7 +491,7 @@ void CN3Eng::ClearAuto(RECT * pRC) { void CN3Eng::ClearZBuffer(const RECT * pRC) { RECT rc; - if (NULL == pRC && s_DevParam.Windowed) // ... + if (NULL == pRC && s_DevParam.Windowed) // 윈도우 모드면... { GetClientRect(s_hWndBase, &rc); pRC = &rc; @@ -512,7 +512,7 @@ bool CN3Eng::Reset(BOOL bWindowed, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP) { if (dwWidth <= 0 || dwHeight <= 0) { return false; } - if (dwWidth == s_DevParam.BackBufferWidth && dwHeight == s_DevParam.BackBufferHeight) // ʺ ̰ .. + if (dwWidth == s_DevParam.BackBufferWidth && dwHeight == s_DevParam.BackBufferHeight) // 너비 높이가 같을때.. { if (0 == dwBPP) { return false; @@ -554,10 +554,10 @@ bool CN3Eng::Reset(BOOL bWindowed, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP) { int nMC = m_DeviceInfo.nModeCount; for (int i = 0; i < nMC; i++) { // if (m_DeviceInfo.pModes[i].Width == dwWidth && m_DeviceInfo.pModes[i].Height == dwHeight && - if (m_DeviceInfo.pModes[i].Format == s_DevParam.BackBufferFormat) // 尡 ġϸ + if (m_DeviceInfo.pModes[i].Format == s_DevParam.BackBufferFormat) // 모드가 일치하면 { this->FindDepthStencilFormat(0, m_DeviceInfo.DevType, m_DeviceInfo.pModes[i].Format, - &s_DevParam.AutoDepthStencilFormat); // ̿ ٽ ۸ ã´. + &s_DevParam.AutoDepthStencilFormat); // 깊이와 스텐실 버퍼를 찾는다. m_nModeActive = i; break; } @@ -585,13 +585,13 @@ bool CN3Eng::Reset(BOOL bWindowed, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP) { } void CN3Eng::SetDefaultEnvironment() { - // ⺻ + // 기본 렌더링 상태 지정 __Matrix44 matWorld; matWorld.Identity(); s_lpD3DDev->SetTransform(D3DTS_WORLD, &matWorld); - // s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_USEW); // Z 밡 - s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); // Z 밡 + // s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_USEW); // Z버퍼 사용가능 + s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); // Z버퍼 사용가능 s_lpD3DDev->SetRenderState(D3DRS_LIGHTING, TRUE); s_lpD3DDev->SetRenderState(D3DRS_DITHERENABLE, TRUE); @@ -600,12 +600,12 @@ void CN3Eng::SetDefaultEnvironment() { s_lpD3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); s_lpD3DDev->SetRenderState(D3DRS_ALPHAFUNC, - D3DCMP_GREATER); // ⺻ - ָ ؽó ٳ⵵ Ѵ. + D3DCMP_GREATER); // 기본 알파 펑션 - 안해주면 알파 텍스처들이 빵꾸나기도 한다. s_lpD3DDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); s_lpD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - // ⺻ ؽó . + // 기본 텍스처 필터 지정. float fMipMapLODBias = -1.0f; for (int i = 0; i < 8; i++) { s_lpD3DDev->SetTexture(i, NULL); @@ -615,7 +615,7 @@ void CN3Eng::SetDefaultEnvironment() { s_lpD3DDev->SetSamplerState(i, D3DSAMP_MIPMAPLODBIAS, *((LPDWORD)(&fMipMapLODBias))); } - // Ŭ + // 클리핑 상태 지정 D3DCLIPSTATUS9 cs; cs.ClipUnion = cs.ClipIntersection = D3DCS_ALL; s_lpD3DDev->SetClipStatus(&cs); diff --git a/src/engine/N3Base/N3Eng.h b/src/engine/N3Base/N3Eng.h index 4622fd21..db8f3244 100644 --- a/src/engine/N3Base/N3Eng.h +++ b/src/engine/N3Base/N3Eng.h @@ -20,12 +20,12 @@ class CN3Eng : public CN3Base { typedef struct __D3DDEV_INFO { char szDeviceName[128]; char szDeviceDesc[128]; - int nAdapter; // ° ׷ ī. - int nDevice; // ° ġ. + int nAdapter; // 몇번째 그래픽 카드인지. + int nDevice; // 몇번째 장치인지. - D3DDEVTYPE DevType; // ϵ . - int nModeCount; // ÷ - D3DDISPLAYMODE * pModes; // ÷ + D3DDEVTYPE DevType; // 하드웨어 가속인지. + int nModeCount; // 디스플레이 모드 갯수 + D3DDISPLAYMODE * pModes; // 디스플레이 모드 } __D3DDevInfo; LPDIRECT3D9 m_lpD3D; @@ -34,9 +34,9 @@ class CN3Eng : public CN3Base { static CN3EngCallbacks m_CB; protected: - int m_nModeActive; // õ Mode - int m_nAdapterCount; // ׷ ī - __D3DDEV_INFO m_DeviceInfo; // Device + int m_nModeActive; // 현재 선택된 Mode + int m_nAdapterCount; // 그래픽 카드 갯수 + __D3DDEV_INFO m_DeviceInfo; // Device 정보 public: HKEY RegistryOpen(const std::string & szKey); diff --git a/src/engine/N3Base/N3EngTool.cpp b/src/engine/N3Base/N3EngTool.cpp index 0a20158e..092ec255 100644 --- a/src/engine/N3Base/N3EngTool.cpp +++ b/src/engine/N3Base/N3EngTool.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// CN3EngTool::CN3EngTool() { - // ڼ .. + // 십자선 생성.. for (int i = -10; i < 10; i++) { m_VAxis[0 + i + 10].Set(i * 500.0f, 0, 0, 0xffff0000); // X m_VAxis[20 + i + 10].Set(0, i * 500.0f, 0, 0xff00ff00); // Y @@ -42,7 +42,7 @@ CN3EngTool::~CN3EngTool() { // m_lpD3DDevExtra = NULL; } -// ׸.. +// 월드 축 그리기.. void CN3EngTool::RenderGrid(const __Matrix44 & mtxWorld) { DWORD dwAlpha, dwFog, dwLight; s_lpD3DDev->GetRenderState(D3DRS_FOGENABLE, &dwFog); @@ -73,12 +73,12 @@ void CN3EngTool::RenderGrid(const __Matrix44 & mtxWorld) { s_lpD3DDev->SetFVF(FVF_CV); - if (m_pVGrids) // ׸ ׸.. + if (m_pVGrids) // 그리드 그리기.. { s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINELIST, m_nGridLineCount, m_pVGrids, sizeof(__VertexColor)); // X } - // ׸.. + // 축 그리기.. // s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINESTRIP, 19, &m_VAxis[0], sizeof(__VertexColor)); // X // s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINESTRIP, 19, &m_VAxis[20], sizeof(__VertexColor)); // Y // s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINESTRIP, 19, &m_VAxis[40], sizeof(__VertexColor)); // Z @@ -129,7 +129,7 @@ void CN3EngTool::RenderAxis(bool bShowDir) { s_lpD3DDev->SetFVF(FVF_CV); - // ׸.. + // 축 그리기.. s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINESTRIP, 19, &m_VAxis[0], sizeof(__VertexColor)); // X s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINESTRIP, 19, &m_VAxis[20], sizeof(__VertexColor)); // Y s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINESTRIP, 19, &m_VAxis[40], sizeof(__VertexColor)); // Z @@ -150,7 +150,7 @@ void CN3EngTool::RenderAxis(bool bShowDir) { } // -// pTex==NULL϶ ...by lynus 2001. 12. 7. +// pTex==NULL일때 검정색을 찍기 위해 수정했음...by lynus 2001. 12. 7. // void CN3EngTool::RenderTexturePreview(CN3Texture * pTex, HWND hWndDiffuse, RECT * pRCSrc) { //if(pTex == NULL) return; @@ -171,19 +171,19 @@ void CN3EngTool::RenderTexturePreview(CN3Texture * pTex, HWND hWndDiffuse, RECT RECT rcTex = rcPreview; float fRatioDest = (float)nW / (float)nH; - if (fRatioDest > 1.0f) // ΰ + if (fRatioDest > 1.0f) // 가로가 긴경우 { int nDec = (nW - nH) / 2; rcTex.left += nDec; rcTex.right -= nDec; - } else if (fRatioDest < 1.0f) // ΰ + } else if (fRatioDest < 1.0f) // 세로가 긴경우 { int nDec = (nH - nW) / 2; rcTex.top += nDec; rcTex.bottom -= nDec; } - float fU_Left = 0.0f, fV_Top = 0.0f, fU_Right = 1.0f, fV_Bottom = 1.0f; // ⺻ UV ǥ + float fU_Left = 0.0f, fV_Top = 0.0f, fU_Right = 1.0f, fV_Bottom = 1.0f; // 기본 UV 좌표 s_lpD3DDev->BeginScene(); @@ -212,7 +212,7 @@ void CN3EngTool::RenderTexturePreview(CN3Texture * pTex, HWND hWndDiffuse, RECT // if(hWndDiffuse != NULL) { - // ؽó + // 텍스처 프리뷰 RECT rcPreview; HRESULT hr; ::GetClientRect(hWndDiffuse, &rcPreview); @@ -229,18 +229,18 @@ void CN3EngTool::RenderTexturePreview(CN3Texture * pTex, HWND hWndDiffuse, RECT float fRatioDest = (float)nW / (float)nH; float fRatioSrc = (float)(pTex->Width()) / (float)(pTex->Height()); - if (fRatioDest > 1.0f) { // ΰ + if (fRatioDest > 1.0f) { // 가로가 긴경우 int nDec = (nW - nH) / 2; rcTex.left += nDec; rcTex.right -= nDec; - } else if (fRatioDest < 1.0f) { // ΰ + } else if (fRatioDest < 1.0f) { // 세로가 긴경우 int nDec = (nH - nW) / 2; rcTex.top += nDec; rcTex.bottom -= nDec; } - float fU_Left = 0.0f, fV_Top = 0.0f, fU_Right = 1.0f, fV_Bottom = 1.0f; // ⺻ UV ǥ - // Rect .. + float fU_Left = 0.0f, fV_Top = 0.0f, fU_Right = 1.0f, fV_Bottom = 1.0f; // 기본 UV 좌표 + // 만약 Rect 가 있으면.. if (pRCSrc) { float fW = (float)(pTex->Width()); float fH = (float)(pTex->Height()); @@ -300,7 +300,7 @@ void CN3EngTool::GridCreate(int nWidth, int nHeight) { m_nGridLineCount = (nWidth + 1) + (nHeight + 1); m_pVGrids = new __VertexColor[m_nGridLineCount * 2]; - // ׸ .. + // 그리드 생성.. D3DCOLOR GridColor = 0xff808080; int xx = nWidth / 2, zz = nHeight / 2; int nSeq = 0; diff --git a/src/engine/N3Base/N3EngTool.h b/src/engine/N3Base/N3EngTool.h index b8600638..467421db 100644 --- a/src/engine/N3Base/N3EngTool.h +++ b/src/engine/N3Base/N3EngTool.h @@ -8,51 +8,51 @@ struct __EXPORT_OPTION { char szID[8]; // ID "N3Scene1" - char szRemark[64]; // .. + char szRemark[64]; // 설명.. - int nNodeCount; // ü īƮ + int nNodeCount; // 전체 노드 카운트 BOOL bAnimationKey; - int nFrmStart; // ϸ̼ - int nFrmEnd; // ϸ̼ - float fSamplingRate; // Key Sampling - 30.0f ǥ.. + int nFrmStart; // 에니메이션 시작 프레임 + int nFrmEnd; // 에니메이션 끝 프레임 + float fSamplingRate; // Key Sampling - 30.0f 가 표준.. - D3DCOLORVALUE dcvBackground; // - D3DCOLORVALUE dcvAmbientLight; // ⺻ + D3DCOLORVALUE dcvBackground; // 배경 색 + D3DCOLORVALUE dcvAmbientLight; // 기본 조명 색 - // int nCameraCount; // scene ī޶ - // int nMaterialCount; // scene - // int nTextureCount; // scene ؽó - // int nLightCount; // scene + // int nCameraCount; // scene 내의 카메라 갯수 + // int nMaterialCount; // scene 내의 재질 갯수 + // int nTextureCount; // scene 내의 텍스처 갯수 + // int nLightCount; // scene 내의 조명 갯수 - BOOL bExportCamera; // ī޶ ͸ ִ. - BOOL bExportLight; // Ʈ ͸ ִ. - BOOL bExportGeometry; // Ʈ ͸ ִ. + BOOL bExportCamera; // 카메라 데이터를 갖고 있다. + BOOL bExportLight; // 라이트 데이터를 갖고 있다. + BOOL bExportGeometry; // 지오메트리 데이터를 갖고 있다. BOOL - bExportDummy; // Ʈ(??? - ׿ ʿ ߽ÿ ʿ Ʈ Ѵ)͸ ִ. + bExportDummy; // 도우미 오브젝트(??? - 실제 겜에서는 필요없고 개발시에만 필요한 오브젝트를 말한다)데이터를 갖고 있다. BOOL - bExportCharacter; // Ʈ(??? - ׿ ʿ ߽ÿ ʿ Ʈ Ѵ)͸ ִ. + bExportCharacter; // 도우미 오브젝트(??? - 실제 겜에서는 필요없고 개발시에만 필요한 오브젝트를 말한다)데이터를 갖고 있다. - BOOL bExportSelectedOnly; // õ ͸ ??? + BOOL bExportSelectedOnly; // 선택된 것만 ??? - BOOL bGenerateFileName; // ̸ 0_0000_00_0 ٲ۴..?? - BOOL bGenerateSmoothNormal; // ε巴 ̵ ͵ Ѵ. - // BOOL bGenerateProgressiveMesh; // Progressive Mesh + BOOL bGenerateFileName; // 파일 이름을 0_0000_00_0 포맷으로 바꾼다..?? + BOOL bGenerateSmoothNormal; // 부드럽게 보이도록 법선 벡터들을 재 계산한다. + // BOOL bGenerateProgressiveMesh; // Progressive Mesh 생성 BOOL - bGenerateHalfSizeTexture; // ؽó ڵ ȭ Ѽ Direct3D ˿ ° 2 ߾ "OBM" Ʈ Ϸ . - BOOL bGenerateCompressedTexture; // Texture + bGenerateHalfSizeTexture; // 텍스처 파일을 자동으로 최적화 시켜서 생성 Direct3D 의 포맷에 맞게 2의 제곱수 단위로 맞추어서 "OBM" 비트맵 파일로 저장. + BOOL bGenerateCompressedTexture; // Texture 압축 사용 - char szSubDir[_MAX_DIR]; // export Ҷ ϴ sub ش. + char szSubDir[_MAX_DIR]; // export 할때 저장하는 sub폴더를 지정해준다. }; class CN3EngTool : public CN3Eng { public: - int m_nGridLineCount; // ׸ īƮ.. - __VertexColor * m_pVGrids; // ׸ + int m_nGridLineCount; // 그리드 라인 카운트.. + __VertexColor * m_pVGrids; // 그리드 렌더링 용 - __VertexColor m_VAxis[60]; // - __VertexColor m_VDir[6]; // ǥ - __VertexTransformed m_VPreview[6]; // ؽó + __VertexColor m_VAxis[60]; // 축 렌더링 용 + __VertexColor m_VDir[6]; // 방향 표시 용 + __VertexTransformed m_VPreview[6]; // 텍스처 프리뷰 용 // LPDIRECT3DDEVICE9 m_lpD3DDevExtra; diff --git a/src/engine/N3Base/N3FXBundle.cpp b/src/engine/N3Base/N3FXBundle.cpp index b3aa1600..5d4809d7 100644 --- a/src/engine/N3Base/N3FXBundle.cpp +++ b/src/engine/N3Base/N3FXBundle.cpp @@ -74,7 +74,7 @@ CN3FXBundle::~CN3FXBundle() { // // decode script file.. -// ũƮ а ؼŴ... +// 스크립트 파일 읽고 해석시킴... // #ifdef _N3TOOL bool CN3FXBundle::DecodeScriptFile(const char * lpPathName) { @@ -119,7 +119,7 @@ bool CN3FXBundle::DecodeScriptFile(const char * lpPathName) { } if (lstrcmpi(szCommand, "") == 0) { - char szFullPath[_MAX_PATH]; //full path .. + char szFullPath[_MAX_PATH]; //full path 만들기.. sprintf(szFullPath, "%s%s", CN3Base::PathGet().c_str(), szBuf[0]); FXPARTWITHSTARTTIME * pPart = new FXPARTWITHSTARTTIME; @@ -171,7 +171,7 @@ bool CN3FXBundle::DecodeScriptFile(const char * lpPathName) { // // GetPartType... -// Ʈ ̸ Ÿ ˾Ƴ.. +// 파트의 파일이름으로 타입을 알아내자.. // #ifdef _N3TOOL CN3FXPartBase * CN3FXBundle::SetPart(const char * pFileName) { @@ -214,7 +214,7 @@ CN3FXPartBase * CN3FXBundle::SetPart(const char * pFileName) { } else if (lstrcmpi(szBuf[0], "ground") == 0) { PartType = FX_PART_TYPE_BOTTOMBOARD; } - //^^v ־.. + //^^v 더 넣을꺼 있으면 넣어라.. } } fclose(stream); @@ -570,8 +570,8 @@ void CN3FXBundle::Trigger(int iSourceID, int iTargetID, int iTargetJoint, int iS // // Stop... -// ߴ ܰ踦 Ѵ.. -// ߴ tick Ʈ ׾ٰ Ǵܵɶ tick Ѵ. +// 멈추는 단계를 시작한다.. +// 정말 멈추는 기능은 tick에서 모든 파트가 다 죽었다고 판단될때 tick에서 수행한다. // void CN3FXBundle::Stop(bool immediately) { if (m_dwState == FX_BUNDLE_STATE_DEAD) { diff --git a/src/engine/N3Base/N3FXBundle.h b/src/engine/N3Base/N3FXBundle.h index 039e2511..7f0dd843 100644 --- a/src/engine/N3Base/N3FXBundle.h +++ b/src/engine/N3Base/N3FXBundle.h @@ -10,47 +10,47 @@ class CN3FXBundle : public CN3BaseFileAccess { public: - // ⺻ ... + // 기본 정보들... - int m_iVersion; // - std::string m_strName; //̸ - int m_iMoveType; //̴ .. + int m_iVersion; //번들버전 + std::string m_strName; //번들이름 + int m_iMoveType; //움직이는 형태.. float m_fVelocity; - bool m_bStatic; //ġ ųΰ.... + bool m_bStatic; //위치를 고정시킬것인가.... - float m_fLife0; // .. + float m_fLife0; //번들의 수명.. FXPARTWITHSTARTTIME * m_pPart[MAX_FX_PART]; - // ϴ ... - float m_fLife; // .. - DWORD m_dwState; // + // 변하는 정보들... + float m_fLife; //현재 나이.. + DWORD m_dwState; //현재 번들의 상태 - __Vector3 m_vPos; // ġ. - __Vector3 m_vPrePos; //ε Ǵ Duplicate ϱ ӽ÷ ġ - __Vector3 m_vDestPos; // ǥġ. - __Vector3 m_vDir; // . + __Vector3 m_vPos; //현재 번들의 위치. + __Vector3 m_vPrePos; //로딩 또는 Duplicate 하기전에 임시로 위치 지정 + __Vector3 m_vDestPos; //현재 번들의 목표위치. + __Vector3 m_vDir; //현재 번들의 방향. - int m_iSourceID; // ȿ ü ̵..(ӿ..) - int m_iTargetID; // ȿ ޴ ̵..(ӿ..) - int m_iTargetJoint; // ȿ ޴ ..(ӿ..) + int m_iSourceID; //이 효과를 쓰는 주체의 아이디..(게임에서..) + int m_iTargetID; //이 효과를 받는 대상의 아이디..(게임에서..) + int m_iTargetJoint; //이 효과를 받는 대상의 부위..(게임에서..) int m_iSourceJoint; bool m_bDependScale; //__Vector3 m_vTargetScale; float m_fTargetScale; - // int m_iNumStep; //ܰ質 ϴ...^^ - // int m_iCurrStep; // + // int m_iNumStep; //몇단계나 존재하는지...^^ + // int m_iCurrStep; //현재 진행중인 시퀀스 static float m_fEffectSndDist; class CN3SndObj * m_pSndObj; protected: - bool CheckAllPartsDead(); // Ʈ ׾ ˻.. + bool CheckAllPartsDead(); //모든 파트들이 죽었는지 검사.. public: - //⺻ ʿ Լ... + //기본적으로 필요한 함수들... virtual void Trigger(int iSourceID = 0, int iTargetID = 0, int iTargetJoint = 0, int iSndID = -1); virtual bool Tick(); virtual void Duplicate(CN3FXBundle * pDestBundle); @@ -61,8 +61,8 @@ class CN3FXBundle : public CN3BaseFileAccess { void Render(); DWORD GetState() { return m_dwState; } - virtual bool Load(HANDLE hFile); // ڵ鿡 о.. - bool Save(HANDLE hFile); // ϱ.. + virtual bool Load(HANDLE hFile); // 핸들에서 읽어오기.. + bool Save(HANDLE hFile); // 저장하기.. // int GetPartCount() { return m_pPartList.size(); } CN3FXPartBase * GetPart(int i); @@ -71,11 +71,11 @@ class CN3FXBundle : public CN3BaseFileAccess { static void SetEffectSndDistance(float fDist) { m_fEffectSndDist = fDist; } static float GetEffectSndDistance() { return m_fEffectSndDist; } - // Ҹ.. + //생성자 소멸자.. CN3FXBundle(); virtual ~CN3FXBundle(); -#ifdef _N3TOOL // Լ... +#ifdef _N3TOOL //툴에서만 쓰는 함수들... public: CN3FXPartBase * SetPart(const char * pFileName); bool DecodeScriptFile(const char * lpPathName); diff --git a/src/engine/N3Base/N3FXDef.h b/src/engine/N3Base/N3FXDef.h index 55b6ab08..f740e9a8 100644 --- a/src/engine/N3Base/N3FXDef.h +++ b/src/engine/N3Base/N3FXDef.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////////////// // // N3FXDef.h -// Effect ̴ ̳ ڷ ... +// Effect에서 쓰이는 상수들이나 자료형들 정의... // ////////////////////////////////////////////////////////////////////////////////////// @@ -10,12 +10,12 @@ #include "N3Base.h" #include "My_3DStruct.h" -const int MAX_FX_PART = 16; // νϽ ÿ ǥҼ ִ .. -const int NUM_VERTEX_PARTICLE = 4; //ƼŬ ϳ  .. +const int MAX_FX_PART = 16; //한 인스턴스가 동시에 표현할수 있는 갯수.. +const int NUM_VERTEX_PARTICLE = 4; //파티클 하나에 들어가는 점수.. const int NUM_VERTEX_BOTTOM = 10; // const int NUM_KEY_COLOR = 100; -enum e_FXPartType //Ʈ Ÿ...Ž ̿ , ƼŬ ̿ .... +enum e_FXPartType //이펙트 스타일...매쉬를 이용한 건지, 파티클을 이용한 건지..등등.. { FX_PART_TYPE_NONE = 0, FX_PART_TYPE_PARTICLE = 1, //'particle' @@ -24,7 +24,7 @@ const int NUM_KEY_COLOR = 100; FX_PART_TYPE_BOTTOMBOARD = 4 //'bottomboard' }; -enum e_FXPartState //Ʈ .. +enum e_FXPartState //파트의 상태.. { FX_PART_STATE_DEAD = 0, FX_PART_STATE_DYING = 1, @@ -32,14 +32,14 @@ const int NUM_KEY_COLOR = 100; FX_PART_STATE_READY = 3 }; -enum e_FXBundleState // .. +enum e_FXBundleState //번들의 상태.. { FX_BUNDLE_STATE_DEAD = 0, FX_BUNDLE_STATE_DYING = 1, FX_BUNDLE_STATE_LIVE = 2 }; -enum e_FXBundleAct // ϴ.. +enum e_FXBundleAct //번들이 어케 동작하는지.. { FX_BUNDLE_MOVE_DIR_FIXEDTARGET = 0, FX_BUNDLE_MOVE_DIR_FLEXABLETARGET = 1, @@ -51,7 +51,7 @@ const int NUM_KEY_COLOR = 100; }; // -enum e_FXPartParticleEmitType // Ʈ Ʈ  Ǵ... +enum e_FXPartParticleEmitType // 이펙트 파트가 어떤 모양으로 전개되는지... { FX_PART_PARTICLE_EMIT_TYPE_NORMAL = 0, //'normal' FX_PART_PARTICLE_EMIT_TYPE_SPREAD = 1, //'spread' @@ -63,11 +63,11 @@ const int NUM_KEY_COLOR = 100; //structures..... /* -typedef struct __TABLE_FX // FX ҽ ڵ... +typedef struct __TABLE_FX // FX 리소스 레코드... { - DWORD dwID; // ID + DWORD dwID; // 고유 ID std::string szFN; // file name - DWORD dwSoundID; // ȿ Ƶ. + DWORD dwSoundID; // 효과에 쓰는 사운드 아디. } TABLE_FX; */ @@ -77,13 +77,13 @@ typedef struct Point3D { float z; } POINT3D; -typedef union __ParticleEmitCondition //ƼŬ л ʿ.. +typedef union __ParticleEmitCondition //파티클 분사시 필요정보.. { - POINT3D vGatherPoint; //EmitType gather϶ .. - float fEmitAngle; //EmitType spread϶ ѷ .. + POINT3D vGatherPoint; //EmitType이 gather일때 모아지는 점.. + float fEmitAngle; //EmitType이 spread일때 뿌려지는 각.. } PARTICLEEMITCONDITION; -typedef struct __FXPartWithStartTime // 鿡 Ʈ Ҷ.. +typedef struct __FXPartWithStartTime // 번들에서 파트들 관리할때.. { class CN3FXPartBase * pPart; float fStartTime; diff --git a/src/engine/N3Base/N3FXGroup.cpp b/src/engine/N3Base/N3FXGroup.cpp index b331c85e..e6250f95 100644 --- a/src/engine/N3Base/N3FXGroup.cpp +++ b/src/engine/N3Base/N3FXGroup.cpp @@ -68,7 +68,7 @@ bool CN3FXGroup::Save(HANDLE hFile) { // // decode script file.. -// ũƮ а ؼŴ... +// 스크립트 파일 읽고 해석시킴... // #ifdef _N3TOOL bool CN3FXGroup::DecodeScriptFile(const char * lpPathName) { diff --git a/src/engine/N3Base/N3FXGroup.h b/src/engine/N3Base/N3FXGroup.h index cb258286..04bc19d9 100644 --- a/src/engine/N3Base/N3FXGroup.h +++ b/src/engine/N3Base/N3FXGroup.h @@ -18,13 +18,13 @@ class CN3FXGroup : public CN3BaseFileAccess { int GetCount() { return FXBList.size(); } __FXBInfo * GetFXBInfo(int idx); - virtual bool Load(HANDLE hFile); // ڵ鿡 о.. - bool Save(HANDLE hFile); // ϱ.. + virtual bool Load(HANDLE hFile); // 핸들에서 읽어오기.. + bool Save(HANDLE hFile); // 저장하기.. CN3FXGroup(); virtual ~CN3FXGroup(); -#ifdef _N3TOOL // Լ... +#ifdef _N3TOOL //툴에서만 쓰는 함수들... public: bool DecodeScriptFile(const char * lpPathName); #endif // end of _N3TOOL diff --git a/src/engine/N3Base/N3FXPMesh.cpp b/src/engine/N3Base/N3FXPMesh.cpp index 2784762f..471c47cb 100644 --- a/src/engine/N3Base/N3FXPMesh.cpp +++ b/src/engine/N3Base/N3FXPMesh.cpp @@ -82,7 +82,7 @@ void CN3FXPMesh::operator=(const CN3FXPMesh & fxPMesh) { if (m_iNumCollapses > 0) { m_pCollapses = new __EdgeCollapse [m_iNumCollapses + - 1]; // +1 : PMeshInstance::SplitOne() Լ εϰ Ͱ 輱 Ű ؾ ϴ 찡 ־. + 1]; // +1을 한 이유 : PMeshInstance::SplitOne() 함수에서 부득이하게 포인터가 경계선을 가르키게 해야 하는 경우가 있어서. memcpy(m_pCollapses, fxPMesh.m_pCollapses, sizeof(__EdgeCollapse) * (m_iMaxNumIndices + 1)); } @@ -130,10 +130,10 @@ bool CN3FXPMesh::Load(HANDLE hFile) { if (m_iNumCollapses > 0) { m_pCollapses = new __EdgeCollapse [m_iNumCollapses + - 1]; // +1 : PMeshInstance::SplitOne() Լ εϰ Ͱ 輱 Ű ؾ ϴ 찡 ־. + 1]; // +1을 한 이유 : PMeshInstance::SplitOne() 함수에서 부득이하게 포인터가 경계선을 가르키게 해야 하는 경우가 있어서. ReadFile(hFile, m_pCollapses, m_iNumCollapses * sizeof(__EdgeCollapse), &dwNum, NULL); ZeroMemory(m_pCollapses + m_iNumCollapses, - sizeof(__EdgeCollapse)); // +1 . Ÿ ʱȭ ص + sizeof(__EdgeCollapse)); // 위의 +1을 한이유와 같음. 만약을 대비해 마지막 데이타를 초기화 해둠 bool bFixed = false; for (int i = 0; i < m_iNumCollapses; i++) { @@ -144,7 +144,7 @@ bool CN3FXPMesh::Load(HANDLE hFile) { } #ifdef _DEBUG if (bFixed) { - ::MessageBox(s_hWndBase, "߸ Progressive Mesh ", m_szName.c_str(), MB_OK); + ::MessageBox(s_hWndBase, "잘못된 Progressive Mesh 수정", m_szName.c_str(), MB_OK); } #endif } @@ -214,7 +214,7 @@ void CN3FXPMesh::FindMinMax() { return; } - // ּ, ִ ã´. + // 최소, 최대 점을 찾는다. m_vMin.Set(FLT_MAX, FLT_MAX, FLT_MAX); m_vMax.Set(-FLT_MAX, -FLT_MAX, -FLT_MAX); @@ -240,7 +240,7 @@ void CN3FXPMesh::FindMinMax() { } } - // ִ ּҰ Ѵ.. + // 최대 최소값을 갖고 반지름 계산한다.. m_fRadius = (m_vMax - m_vMin).Magnitude() * 0.5f; } diff --git a/src/engine/N3Base/N3FXPMeshInstance.cpp b/src/engine/N3Base/N3FXPMeshInstance.cpp index f9512b9c..8f0f3dba 100644 --- a/src/engine/N3Base/N3FXPMeshInstance.cpp +++ b/src/engine/N3Base/N3FXPMeshInstance.cpp @@ -50,7 +50,7 @@ CN3FXPMeshInstance::~CN3FXPMeshInstance() { m_pIndices = NULL; } - s_MngFXPMesh.Delete(&m_pFXPMesh); //۷ īƮ ̱ + s_MngFXPMesh.Delete(&m_pFXPMesh); //레퍼런스 카운트를 줄이기 위해 } void CN3FXPMeshInstance::Release() { @@ -63,7 +63,7 @@ void CN3FXPMeshInstance::Release() { m_pIndices = NULL; } - s_MngFXPMesh.Delete(&m_pFXPMesh); //۷ īƮ ̱ + s_MngFXPMesh.Delete(&m_pFXPMesh); //레퍼런스 카운트를 줄이기 위해 m_pCollapseUpTo = NULL; m_iNumVertices = 0; @@ -120,7 +120,7 @@ bool CN3FXPMeshInstance::Create(CN3FXPMesh * pN3FXPMesh) { bool CN3FXPMeshInstance::Create(const std::string & szFN) { if (m_pFXPMesh && m_pFXPMesh->FileName() == szFN) { - return true; // ̸ ʰ + return true; // 파일 이름이 같으면 새로 만들지 않고 리턴하자 } this->Release(); @@ -140,7 +140,7 @@ void CN3FXPMeshInstance::SetLODByNumVertices(int iNumVertices) { } else if (iDiff > 0) { while (iNumVertices > m_iNumVertices) { if (m_pCollapseUpTo->NumVerticesToLose + m_iNumVertices > iNumVertices) { - break; // ڵ.. + break; // 깜박임 방지 코드.. } if (SplitOne() == false) { break; @@ -165,12 +165,12 @@ void CN3FXPMeshInstance::SetLODByNumVertices(int iNumVertices) { void CN3FXPMeshInstance::SetLOD(float value) { #define _USE_LODCONTROL_VALUE #ifdef _USE_LODCONTROL_VALUE - // value distance * FOV̴. + // value는 distance * FOV이다. if (m_pFXPMesh == NULL) { return; } - if (m_pFXPMesh->m_iLODCtrlValueCount == 0) { // LODCtrlValue ׸. + if (m_pFXPMesh->m_iLODCtrlValueCount == 0) { // LODCtrlValue가 없으면 모두 그린다. SetLODByNumVertices(0x7fffffff); return; } @@ -179,11 +179,11 @@ void CN3FXPMeshInstance::SetLOD(float value) { CN3PMesh::__LODCtrlValue * pTmpLODCV = m_pFXPMesh->m_pLODCtrlValues + m_pFXPMesh->m_iLODCtrlValueCount - 1; - if (value < m_pFXPMesh->m_pLODCtrlValues[0].fDist) { // ּ ġ Ƿ ׸. + if (value < m_pFXPMesh->m_pLODCtrlValues[0].fDist) { // 최소 기준치보다 가까우므로 가장 많은 면으로 그린다. SetLODByNumVertices(m_pFXPMesh->m_pLODCtrlValues[0].iNumVertices); - } else if (pTmpLODCV->fDist < value) { // ִ ġ ָ Ƿ ׸. + } else if (pTmpLODCV->fDist < value) { // 최대 기준치보다 멀리 있으므로 가장 적은 면으로 그린다. SetLODByNumVertices(pTmpLODCV->iNumVertices); - } else { // ߰ ° ׸. + } else { // 중간 값에 맞게 조정된 면 수로 그린다. for (int i = 1; i < m_pFXPMesh->m_iLODCtrlValueCount; ++i) { if (value < m_pFXPMesh->m_pLODCtrlValues[i].fDist) { CN3PMesh::__LODCtrlValue * pHiValue = m_pFXPMesh->m_pLODCtrlValues + i; @@ -196,7 +196,7 @@ void CN3FXPMeshInstance::SetLOD(float value) { } } #else - // value distance * FOV̴. + // value는 distance * FOV이다. if (m_pCollapseUpTo == NULL || m_pFXPMesh == NULL) { return; } @@ -246,11 +246,11 @@ bool CN3FXPMeshInstance::CollapseOne() { bool CN3FXPMeshInstance::SplitOne() { if (m_pCollapseUpTo >= m_pFXPMesh->m_pCollapses + m_pFXPMesh->m_iNumCollapses) { - return false; // ̷ ϸ ϳ ȴ.. + return false; // 이렇게 하면 포인터 하나가 삐져 나오게 된다.. } - // ̷ ٽ ϴ Ʒ ڵ ϸ ׷ ʴ´. - // ̷ ص ֵ ڵ带 ־. m_pFXPMesh->m_pCollapses ҴҶ 1 Ҵϰ ͸ ʱⰪ ־. - // if (m_pCollapseUpTo >= m_pFXPMesh->m_pCollapses + m_pFXPMesh->m_iNumCollapses - 1) return false; // ̰ ̴.. + // 하지만 이렇게 다시 하는 이유는 아래 코드로 하면 마지막 폴리곤이 절대 그려지지 않는다. + // 이렇게 해도 괜찮을 수 있도록 방어코드를 넣었다. m_pFXPMesh->m_pCollapses 를 할당할때 1개 더 할당하고 마지막 데이터를 초기값으로 넣었다. + // if (m_pCollapseUpTo >= m_pFXPMesh->m_pCollapses + m_pFXPMesh->m_iNumCollapses - 1) return false; // 이게 정상이다.. m_iNumIndices += m_pCollapseUpTo->NumIndicesToLose; m_iNumVertices += m_pCollapseUpTo->NumVerticesToLose; @@ -298,7 +298,7 @@ void CN3FXPMeshInstance::RenderTwoUV() { return; } if (NULL == m_pFXPMesh->GetVertices2()) { - m_pFXPMesh->GenerateSecondUV(); // ι° UV .. + m_pFXPMesh->GenerateSecondUV(); // 두번째 UV 가 없음 새로 만든다.. } if (NULL == m_pFXPMesh->GetVertices2()) { return; diff --git a/src/engine/N3Base/N3FXPMeshInstance.h b/src/engine/N3Base/N3FXPMeshInstance.h index 693f0688..6955dea2 100644 --- a/src/engine/N3Base/N3FXPMeshInstance.h +++ b/src/engine/N3Base/N3FXPMeshInstance.h @@ -25,7 +25,7 @@ class CN3FXPMeshInstance : public CN3Base { int m_iNumIndices; int m_iNumVertices; - CN3PMesh::__EdgeCollapse * m_pCollapseUpTo; // + CN3PMesh::__EdgeCollapse * m_pCollapseUpTo; // 참조 포인터 // A pointer to the original mesh. This is where you'll find the vertex data (which // is invariant between PMRInstance's) diff --git a/src/engine/N3Base/N3FXPartBase.cpp b/src/engine/N3Base/N3FXPartBase.cpp index b62b6e6c..2515387f 100644 --- a/src/engine/N3Base/N3FXPartBase.cpp +++ b/src/engine/N3Base/N3FXPartBase.cpp @@ -56,16 +56,16 @@ CN3FXPartBase::CN3FXPartBase() { /* const DWORD RF_NOTHING = 0x0; const DWORD RF_ALPHABLENDING = 0x1; // Alpha blending -const DWORD RF_NOTUSEFOG = 0x2; // Ȱ -const DWORD RF_DOUBLESIDED = 0x4; // - D3DCULL_NONE -const DWORD RF_BOARD_Y = 0x8; // Y ؼ.. ī޶ . -const DWORD RF_POINTSAMPLING = 0x10; // MipMap .. PointSampling Ѵ.. -const DWORD RF_WINDY = 0x20; // ٶ .. ٶ CN3Base::s_vWindFactor Ѵ.. +const DWORD RF_NOTUSEFOG = 0x2; // 안개 무시 +const DWORD RF_DOUBLESIDED = 0x4; // 양면 - D3DCULL_NONE +const DWORD RF_BOARD_Y = 0x8; // Y 축으로 해서.. 카메라를 본다. +const DWORD RF_POINTSAMPLING = 0x10; // MipMap 에서.. PointSampling 으로 한다.. +const DWORD RF_WINDY = 0x20; // 바람에 날린다.. 바람의 값은 CN3Base::s_vWindFactor 를 참조 한다.. const DWORD RF_NOTUSELIGHT = 0x40; // Light Off -const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse ϰ Alpha blending -const DWORD RF_NOTZWRITE = 0x100; // ZBuffer Ⱦ. -const DWORD RF_UV_CLAMP = 0x200; // texture UV Clamp Ѵ..default wrap̴.. -const DWORD RF_NOTZBUFFER = 0x400; // ZBuffer . +const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse 값을 갖고 투명하게 Alpha blending +const DWORD RF_NOTZWRITE = 0x100; // ZBuffer 에 안쓴다. +const DWORD RF_UV_CLAMP = 0x200; // texture UV적용을 Clamp로 한다..default는 wrap이다.. +const DWORD RF_NOTZBUFFER = 0x400; // ZBuffer 무시. */ } @@ -81,17 +81,17 @@ CN3FXPartBase::~CN3FXPartBase() { // // parse script... -// ũƮ ؼ & . +// 스크립트 해서 & 셋팅. // #ifdef _N3TOOL bool CN3FXPartBase::ParseScript(char * szCommand, char * szBuff0, char * szBuff1, char * szBuff2, char * szBuff3) { - // ̸. + // 이름. if (lstrcmpi(szCommand, "") == 0) { m_strName = szBuff0; return true; } - // Ÿ.. + // 타입.. if (lstrcmpi(szCommand, "") == 0) { if (lstrcmpi(szBuff0, "particle") == 0) { m_iType = FX_PART_TYPE_PARTICLE; @@ -105,17 +105,17 @@ bool CN3FXPartBase::ParseScript(char * szCommand, char * szBuff0, char * szBuff1 if (lstrcmpi(szBuff0, "ground") == 0) { m_iType = FX_PART_TYPE_BOTTOMBOARD; } - //^^v ־.. + //^^v 더 넣을꺼 있으면 넣어라.. return true; } - // ӽð.(0̸ Ѵ...) + // 지속시간.(0이면 무한대...) if (lstrcmpi(szCommand, "") == 0) { m_fLife = atof(szBuff0); return true; } - // texture ̸ б. + // texture 이름과 개수 읽기. if (lstrcmpi(szCommand, "") == 0) { m_iNumTex = atoi(szBuff1); m_ppRefTex = new CN3Texture *[m_iNumTex]; @@ -141,13 +141,13 @@ bool CN3FXPartBase::ParseScript(char * szCommand, char * szBuff0, char * szBuff1 return true; } - // texture animation speed .. + // texture animation speed 설정.. if (lstrcmpi(szCommand, "") == 0) { m_fTexFPS = atof(szBuff0); return true; } - // ġ... + // 상대위치... if (lstrcmpi(szCommand, "") == 0) { m_vPos.x = atof(szBuff0); m_vPos.y = atof(szBuff1); @@ -155,7 +155,7 @@ bool CN3FXPartBase::ParseScript(char * szCommand, char * szBuff0, char * szBuff1 return true; } - // ӵ.. + // 속도.. if (lstrcmpi(szCommand, "") == 0) { __Vector3 v; m_vVelocity.x = atof(szBuff0); @@ -164,7 +164,7 @@ bool CN3FXPartBase::ParseScript(char * szCommand, char * szBuff0, char * szBuff1 return true; } - // ӵ.. + // 가속도.. if (lstrcmpi(szCommand, "") == 0) { __Vector3 v; m_vAcceleration.x = atof(szBuff0); @@ -173,7 +173,7 @@ bool CN3FXPartBase::ParseScript(char * szCommand, char * szBuff0, char * szBuff1 return true; } - // ȸ ӵ.. + // 회전 각속도.. if (lstrcmpi(szCommand, "") == 0) { __Vector3 v; m_vRotVelocity.x = atof(szBuff0); @@ -302,7 +302,7 @@ bool CN3FXPartBase::ParseScript(char * szCommand, char * szBuff0, char * szBuff1 // // Decode Script File -// ũƮ а ؼ.(call parse script..) +// 스크립트 파일 읽고 해석.(call parse script..) // #ifdef _N3TOOL bool CN3FXPartBase::DecodeScriptFile(const char * lpPathName) { @@ -349,7 +349,7 @@ bool CN3FXPartBase::DecodeScriptFile(const char * lpPathName) { #endif // end of _N3TOOL // -// init... ʱȭ.. +// init...변수 초기화.. // void CN3FXPartBase::Init() { m_fCurrLife = 0.0f; @@ -358,7 +358,7 @@ void CN3FXPartBase::Init() { } // -// start...Ʈ ... +// start...파트 구동 시작... // void CN3FXPartBase::Start() { m_dwState = FX_PART_STATE_LIVE; @@ -366,9 +366,9 @@ void CN3FXPartBase::Start() { // // stop.. -// Ʈ õ... -// Լ ȣѴٰ Ʈ ٷ ° ƴϴ.. ϴ Ŵ.. -// tick Ҳ...^^ +// 파트 멈춤시도... +// 이함수 호출한다고 파트가 바로 끝나는건 아니다..끝내는 과정을 시작하는 거다.. +// 실질적인 끝맺음은 tick에서 할껄...^^ // void CN3FXPartBase::Stop() { m_dwState = FX_PART_STATE_DYING; diff --git a/src/engine/N3Base/N3FXPartBase.h b/src/engine/N3Base/N3FXPartBase.h index 735640c7..81ca1367 100644 --- a/src/engine/N3Base/N3FXPartBase.h +++ b/src/engine/N3Base/N3FXPartBase.h @@ -12,30 +12,30 @@ class CN3FXBundle; class CN3FXPartBase : public CN3BaseFileAccess { public: - // .. - int m_iVersion; // ڷ .. + //멤버 변수들.. + int m_iVersion; // 자료의 버전.. int m_iBaseVersion; - CN3FXBundle * m_pRefBundle; // . - CN3FXPartBase * m_pRefPrevPart; // Ʈ.. + CN3FXBundle * m_pRefBundle; // 내가 속한 번들의 포인터. + CN3FXPartBase * m_pRefPrevPart; // 내 앞의 파트.. - int m_iType; // Ÿ(particle, mesh, board...) - float m_fLife; // ÷̽ð.. + int m_iType; // 형식타입(particle, mesh, board...) + float m_fLife; // 플레이시간.. - std::string m_strName; // Ʈ̸.. + std::string m_strName; // 파트이름.. - __Vector3 m_vVelocity; // ʴ ̴ ӵ..(ʼӵ) - __Vector3 m_vAcceleration; // ӵ...(߷°ӵ ְ y = -9.8..^^ - __Vector3 m_vRotVelocity; // ʴ ȸ ִ ӵ.. + __Vector3 m_vVelocity; // 초당 움직이는 속도..(초속도) + __Vector3 m_vAcceleration; // 가속도...(중력가속도를 넣고 싶으면 y = -9.8..^^ + __Vector3 m_vRotVelocity; // 초당 회전할 수 있는 각속도.. float m_fCurrLife; __Vector3 m_vCurrVelocity; __Vector3 m_vCurrPos; - DWORD m_dwState; // Ʈ .. - __Vector3 m_vPos; // 鿡 Ʈ ġ. + DWORD m_dwState; // 현재 파트의 상태.. + __Vector3 m_vPos; // 번들에서 파트의 위치. - bool m_bOnGround; //ٴڿ پ ΰ... + bool m_bOnGround; //바닥에 붙어서 갈 것인가... //texture.. char m_pTexName[MAX_PATH]; @@ -63,26 +63,26 @@ class CN3FXPartBase : public CN3BaseFileAccess { public: virtual float GetGroundHeight(float x, float z) { return 0.01f; } - virtual void Init(); // ó ε · ʱȭ... - virtual void Start(); // Ʈ . - virtual void Stop(); // Ʈ .. + virtual void Init(); // 각종 변수들을 처음 로딩한 상태로 초기화... + virtual void Start(); // 파트 구동 시작. + virtual void Stop(); // 파트 구동 멈춤.. virtual bool Tick(); // ticktick... - virtual void Render(); // ȭ鿡 Ѹ.. - virtual bool Load(HANDLE hFile); // ҷ. - virtual bool Save(HANDLE hFile); // ϱ. + virtual void Render(); // 화면에 뿌리기.. + virtual bool Load(HANDLE hFile); // 게임파일 불러오기. + virtual bool Save(HANDLE hFile); // 게임파일 저장하기. void Duplicate(CN3FXPartBase * pSrc); #ifdef _N3TOOL protected: virtual bool ParseScript(char * szCommand, char * szBuff0, char * szBuff1, char * szBuff2, - char * szBuff3); // ũƮ ؼ Լ.. + char * szBuff3); //실질적인 스크립트 해석 함수.. public: bool DecodeScriptFile(const char * lpPathName); #endif // end of _N3TOOL public: - // Ҹ.. + //생성자 소멸자.. CN3FXPartBase(); virtual ~CN3FXPartBase(); }; diff --git a/src/engine/N3Base/N3FXPartBillBoard.cpp b/src/engine/N3Base/N3FXPartBillBoard.cpp index 3275c962..d6fc287b 100644 --- a/src/engine/N3Base/N3FXPartBillBoard.cpp +++ b/src/engine/N3Base/N3FXPartBillBoard.cpp @@ -56,7 +56,7 @@ bool CN3FXPartBillBoard::ParseScript(char * szCommand, char * szBuff0, char * sz return true; } - // . + // 보드 갯수. if (lstrcmpi(szCommand, "") == 0) { m_iNum = atoi(szBuff0); if (m_iNum > 0) { @@ -65,7 +65,7 @@ bool CN3FXPartBillBoard::ParseScript(char * szCommand, char * szBuff0, char * sz return true; } - // ũ. + // 보드 크기. if (lstrcmpi(szCommand, "") == 0) { m_fSizeX = atof(szBuff0); m_fSizeY = atof(szBuff1); @@ -283,7 +283,7 @@ bool CN3FXPartBillBoard::Tick() { } } - //ġ ƽƽ...m_vCurrPos + //위치에 관한 틱틱...m_vCurrPos m_vCurrVelocity += m_vAcceleration * CN3Base::s_fSecPerFrm; m_vCurrPos += m_vCurrVelocity * CN3Base::s_fSecPerFrm; @@ -334,21 +334,21 @@ bool CN3FXPartBillBoard::IsDead() { // // render... -// ϴ ƼŬ ϳ ׸.... -// ߿ ؽ ͵鳢  ׸... +// 일단은 파티클 하나씩 그리고.... +// 나중에는 같은 텍스쳐 쓰는 것들끼리 묶어서 그리자... // void CN3FXPartBillBoard::Render() { if (m_iTexIdx >= m_iNumTex) { return; } - //ȸ... + //회전... __Matrix44 mtxRotZ; mtxRotZ.Identity(); mtxRotZ.RotationZ(m_fCurrLife * m_vRotVelocity.x); if (!m_bRoateOnlyY) { - //ġ & ٶ󺸰 .. + //위치지정 & 나를 바라보게 셋팅.. __Matrix44 mtxVI; mtxVI = s_CameraData.mtxViewInverse; __Vector3 vpp; @@ -425,7 +425,7 @@ void CN3FXPartBillBoard::Render() { } } } else { - //ġ & ٶ󺸰 .. + //위치지정 & 나를 바라보게 셋팅.. __Vector3 AbsoluteCurrPos = Rotate2AbsolutePos(m_vCurrPos); __Vector3 vRadiusPos = s_CameraData.vEye - (AbsoluteCurrPos + m_pRefBundle->m_vPos); @@ -512,7 +512,7 @@ void CN3FXPartBillBoard::Render() { } } - if (m_bAlpha) // Alpha + if (m_bAlpha) // Alpha 사용 { __AlphaPrimitive * pAP = s_AlphaMgr.Add(); if (pAP) { @@ -540,7 +540,7 @@ void CN3FXPartBillBoard::Render() { pAP->pwIndices = NULL; } - return; // . + return; // 렌더링 안하지롱. } else { CN3Base::s_lpD3DDev->SetFVF(FVF_XYZCOLORT1); diff --git a/src/engine/N3Base/N3FXPartBillBoard.h b/src/engine/N3Base/N3FXPartBillBoard.h index 6fa23584..f96d5de4 100644 --- a/src/engine/N3Base/N3FXPartBillBoard.h +++ b/src/engine/N3Base/N3FXPartBillBoard.h @@ -8,8 +8,8 @@ class CN3FXPartBillBoard : public CN3FXPartBase { public: - int m_iNum; // . - float m_fSizeX; // ũ + int m_iNum; // 보드의 갯수. + float m_fSizeX; // 보드의 크기 float m_fSizeY; bool m_bTexLoop; @@ -30,7 +30,7 @@ class CN3FXPartBillBoard : public CN3FXPartBase { float m_fCurrScaleVelX; float m_fCurrScaleVelY; - float m_fCurrSizeX; // ũ + float m_fCurrSizeX; // 보드의 크기 float m_fCurrSizeY; __Matrix44 m_mtxRot; @@ -48,13 +48,13 @@ class CN3FXPartBillBoard : public CN3FXPartBase { float CameraDist(); public: - void Init(); // ó ε · ʱȭ... - void Start(); // Ʈ . - void Stop(); // Ʈ .. + void Init(); // 각종 변수들을 처음 로딩한 상태로 초기화... + void Start(); // 파트 구동 시작. + void Stop(); // 파트 구동 멈춤.. bool Tick(); // ticktick... - void Render(); // ȭ鿡 Ѹ.. - bool Load(HANDLE hFile); // ҷ. - bool Save(HANDLE hFile); // . + void Render(); // 화면에 뿌리기.. + bool Load(HANDLE hFile); // 게임파일 불러오기. + bool Save(HANDLE hFile); // 게임파일 저장오기. void Duplicate(CN3FXPartBillBoard * pSrc); void SetScale(float size) { diff --git a/src/engine/N3Base/N3FXPartBottomBoard.cpp b/src/engine/N3Base/N3FXPartBottomBoard.cpp index 4c0d6f0a..2c1043bd 100644 --- a/src/engine/N3Base/N3FXPartBottomBoard.cpp +++ b/src/engine/N3Base/N3FXPartBottomBoard.cpp @@ -57,7 +57,7 @@ bool CN3FXPartBottomBoard::ParseScript(char * szCommand, char * szBuff0, char * return true; } - // ũ. + // 보드 크기. if (lstrcmpi(szCommand, "") == 0) { m_fCurrSizeX = m_fSizeX = atof(szBuff0); m_fCurrSizeZ = m_fSizeZ = atof(szBuff1); @@ -254,16 +254,16 @@ bool CN3FXPartBottomBoard::Tick() { } } - //ġ̵.. + //위치이동.. m_vCurrVelocity += m_vAcceleration * CN3Base::s_fSecPerFrm; m_vCurrPos += m_vCurrVelocity * CN3Base::s_fSecPerFrm; - //ȸ... + //회전... __Matrix44 mtxRot; mtxRot.Identity(); mtxRot.RotationY(m_fCurrLife * m_vRotVelocity.y); - //Ϻȯ.. + //스케일변환.. m_fCurrScaleVelX += m_fScaleAccelX * CN3Base::s_fSecPerFrm; m_fCurrScaleVelZ += m_fScaleAccelZ * CN3Base::s_fSecPerFrm; m_fCurrSizeX += m_fCurrScaleVelX * CN3Base::s_fSecPerFrm; @@ -328,15 +328,15 @@ bool CN3FXPartBottomBoard::IsDead() { // // render... -// ϴ ƼŬ ϳ ׸.... -// ߿ ؽ ͵鳢  ׸... +// 일단은 파티클 하나씩 그리고.... +// 나중에는 같은 텍스쳐 쓰는 것들끼리 묶어서 그리자... // void CN3FXPartBottomBoard::Render() { if (m_iTexIdx >= m_iNumTex) { return; } - if (m_bAlpha) // Alpha + if (m_bAlpha) // Alpha 사용 { __AlphaPrimitive * pAP = s_AlphaMgr.Add(); if (pAP) { @@ -364,7 +364,7 @@ void CN3FXPartBottomBoard::Render() { pAP->pwIndices = NULL; } - return; // . + return; // 렌더링 안하지롱. } else { CN3Base::s_lpD3DDev->SetFVF(FVF_XYZCOLORT1); diff --git a/src/engine/N3Base/N3FXPartBottomBoard.h b/src/engine/N3Base/N3FXPartBottomBoard.h index dea322e7..0eed62c1 100644 --- a/src/engine/N3Base/N3FXPartBottomBoard.h +++ b/src/engine/N3Base/N3FXPartBottomBoard.h @@ -9,13 +9,13 @@ #include "N3FXPartBase.h" // -// ٴڿ ׸ Ƕ.. -// triangle fan ׸ ﰢ ׸.. +// 바닥에 그리는 판때기.. +// triangle fan으로 그리고 삼각형 여덟개로 그린다.. // class CN3FXPartBottomBoard : public CN3FXPartBase { public: - float m_fSizeX; // ũ + float m_fSizeX; // 보드의 크기 float m_fSizeZ; bool m_bTexLoop; @@ -33,7 +33,7 @@ class CN3FXPartBottomBoard : public CN3FXPartBase { float m_fCurrScaleVelX; float m_fCurrScaleVelZ; - float m_fCurrSizeX; // ũ + float m_fCurrSizeX; // 보드의 크기 float m_fCurrSizeZ; float m_fGap; @@ -46,13 +46,13 @@ class CN3FXPartBottomBoard : public CN3FXPartBase { bool IsDead(); public: - void Init(); // ó ε · ʱȭ... - void Start(); // Ʈ . - void Stop(); // Ʈ .. + void Init(); // 각종 변수들을 처음 로딩한 상태로 초기화... + void Start(); // 파트 구동 시작. + void Stop(); // 파트 구동 멈춤.. bool Tick(); // ticktick... - void Render(); // ȭ鿡 Ѹ.. - bool Load(HANDLE hFile); // ҷ. - bool Save(HANDLE hFile); // . + void Render(); // 화면에 뿌리기.. + bool Load(HANDLE hFile); // 게임파일 불러오기. + bool Save(HANDLE hFile); // 게임파일 저장오기. void Duplicate(CN3FXPartBottomBoard * pSrc); public: diff --git a/src/engine/N3Base/N3FXPartMesh.cpp b/src/engine/N3Base/N3FXPartMesh.cpp index 6ff0acf1..fbbc5a3c 100644 --- a/src/engine/N3Base/N3FXPartMesh.cpp +++ b/src/engine/N3Base/N3FXPartMesh.cpp @@ -391,13 +391,13 @@ bool CN3FXPartMesh::Tick() { return true; /* - //ȸ ̵.. + //회전과 이동.. __Matrix44 mtx; mtx.Identity();] mtx.Rotation(m_fCurrLife*m_vRotVelocity); __Quaternion qtLocalRot(mtx); - //mesh bundle ... + //mesh방향과 bundle방향을 맞춰라... __Quaternion qtBundle; __Vector3 vDirAxis; float fDirAng; @@ -442,7 +442,7 @@ bool CN3FXPartMesh::Tick() { //m_pShape->ScaleSet(m_vUnitScale.x+vScale.x, m_vUnitScale.y+vScale.y, m_vUnitScale.z+vScale.z); m_pShape->ScaleSet(vScale.x, vScale.y, vScale.z); - //ؽ ̵.. + //텍스쳐 이동.. if(m_cTextureMoveDir>0) { int cnt = m_pShape->PartCount(); @@ -480,7 +480,7 @@ void CN3FXPartMesh::Rotate() { m_pShape->m_mtxParent.Rotation(m_fCurrLife * m_vRotVelocity); - //mesh bundle ... + //mesh방향과 bundle방향을 맞춰라... __Quaternion qtBundle; __Vector3 vDirAxis; float fDirAng; @@ -637,11 +637,11 @@ bool CN3FXPartMesh::IsDead() { // // render... -// ϴ ƼŬ ϳ ׸.... -// ߿ ؽ ͵鳢  ׸... +// 일단은 파티클 하나씩 그리고.... +// 나중에는 같은 텍스쳐 쓰는 것들끼리 묶어서 그리자... // void CN3FXPartMesh::Render() { - // render state + // render state 세팅 if (!m_pShape) { return; } diff --git a/src/engine/N3Base/N3FXPartMesh.h b/src/engine/N3Base/N3FXPartMesh.h index a56f3352..fc2a2729 100644 --- a/src/engine/N3Base/N3FXPartMesh.h +++ b/src/engine/N3Base/N3FXPartMesh.h @@ -15,9 +15,9 @@ class CN3FXPartMesh : public CN3FXPartBase { DWORD m_dwCurrColor; // - char m_cTextureMoveDir; //ؽ ̵ ..1:up 2:down, 3:left, 4:right - float m_fu; //ؽ ̵ ӵ - float m_fv; //ؽ ̵ ӵ + char m_cTextureMoveDir; //텍스쳐 이동 방향..1:up 2:down, 3:left, 4:right + float m_fu; //텍스쳐 이동 속도 + float m_fv; //텍스쳐 이동 속도 __Vector3 m_vUnitScale; __Vector3 m_vScaleVel; @@ -32,13 +32,13 @@ class CN3FXPartMesh : public CN3FXPartBase { bool IsDead(); public: - void Init(); // ó ε · ʱȭ... - void Start(); // Ʈ . - void Stop(); // Ʈ .. + void Init(); // 각종 변수들을 처음 로딩한 상태로 초기화... + void Start(); // 파트 구동 시작. + void Stop(); // 파트 구동 멈춤.. bool Tick(); // ticktick... - void Render(); // ȭ鿡 Ѹ.. - bool Load(HANDLE hFile); // ҷ. - bool Save(HANDLE hFile); // . + void Render(); // 화면에 뿌리기.. + bool Load(HANDLE hFile); // 게임파일 불러오기. + bool Save(HANDLE hFile); // 게임파일 저장오기. void Duplicate(CN3FXPartMesh * pSrc); public: diff --git a/src/engine/N3Base/N3FXPartParticles.cpp b/src/engine/N3Base/N3FXPartParticles.cpp index 8df94e38..f9b63252 100644 --- a/src/engine/N3Base/N3FXPartParticles.cpp +++ b/src/engine/N3Base/N3FXPartParticles.cpp @@ -14,7 +14,7 @@ ////////////////////////////////////////////////////////////////////// CN3FXPartParticles::CN3FXPartParticles() { - m_iVersion = 5; //3ϴ ع.. + m_iVersion = 5; //3이하는 다 무시해버려.. m_iNumParticle = 0; m_iNumLodParticle = 0; @@ -129,7 +129,7 @@ bool CN3FXPartParticles::ParseScript(char * szCommand, char * szBuff0, char * sz return true; } - // ƼŬ . + // 파티클 수. if (lstrcmpi(szCommand, "") == 0) { m_iNumParticle = atoi(szBuff0); if (m_iNumParticle > 0) { @@ -138,7 +138,7 @@ bool CN3FXPartParticles::ParseScript(char * szCommand, char * szBuff0, char * sz return true; } - // ƼŬ ũ. + // 파티클 크기. if (lstrcmpi(szCommand, "") == 0) { m_pair_fParticleSize.first = m_pair_fParticleSize.second = atof(szBuff0); return true; @@ -149,38 +149,38 @@ bool CN3FXPartParticles::ParseScript(char * szCommand, char * szBuff0, char * sz return true; } - // ƼŬ . + // 파티클 생명. if (lstrcmpi(szCommand, "") == 0) { m_pair_fParticleLife.first = atof(szBuff0); m_pair_fParticleLife.second = atof(szBuff1); return true; } - // ƼŬ ۿ..min + // 파티클 시작오차..min if (lstrcmpi(szCommand, "") == 0) { m_MinCreateRange.Set(atof(szBuff0), atof(szBuff1), atof(szBuff2)); return true; } - // ƼŬ ۿ..max + // 파티클 시작오차..max if (lstrcmpi(szCommand, "") == 0) { m_MaxCreateRange.Set(atof(szBuff0), atof(szBuff1), atof(szBuff2)); return true; } - // ƼŬ ѹ + // 파티클 한번에 생성 갯수 if (lstrcmpi(szCommand, "") == 0) { m_iNumCreate = atoi(szBuff0); return true; } - // ƼŬ ѹ ð + // 파티클 한번에 생성 시간 범위 if (lstrcmpi(szCommand, "") == 0) { m_CurrCreateDelay = m_fCreateDelay = atof(szBuff0); return true; } - // ϴ . + // 시작하는 방법. if (lstrcmpi(szCommand, "") == 0) { if (lstrcmpi(szBuff0, "spread") == 0) { m_dwEmitType = FX_PART_PARTICLE_EMIT_TYPE_SPREAD; @@ -522,7 +522,7 @@ bool CN3FXPartParticles::Tick() { m_CurrCreateDelay += CN3Base::s_fSecPerFrm; if (m_bAnimKey && m_pShape) { - //frm .. + //frm 계산.. float fFrm = m_fCurrLife * m_fMeshFPS; int share = fFrm / m_pShape->GetWholeFrm(); //if(fFrm > m_pShape->GetWholeFrm()-1.0f) fFrm = m_pShape->GetWholeFrm()-1.0f; @@ -553,7 +553,7 @@ bool CN3FXPartParticles::Tick() { } // make particles... - if (m_CurrCreateDelay >= m_fCreateDelay && m_dwState == FX_PART_STATE_LIVE) //ƼŬ ... + if (m_CurrCreateDelay >= m_fCreateDelay && m_dwState == FX_PART_STATE_LIVE) //파티클 생성... { m_CurrCreateDelay = 0.0f; CreateParticles(); @@ -617,15 +617,15 @@ void CN3FXPartParticles::Scaling() { // // render... -// ϴ ƼŬ ϳ ׸.... -// ߿ ؽ ͵鳢  ׸... +// 일단은 파티클 하나씩 그리고.... +// 나중에는 같은 텍스쳐 쓰는 것들끼리 묶어서 그리자... // void CN3FXPartParticles::Render() { if (m_pVBList_Alive.size() == 0) { return; } - if (m_bAlpha) // Alpha + if (m_bAlpha) // Alpha 사용 { std::list::iterator it; it = m_pVBList_Alive.begin(); @@ -664,7 +664,7 @@ void CN3FXPartParticles::Render() { } } - return; // . + return; // 렌더링 안하지롱. } CN3Base::s_lpD3DDev->SetFVF(FVF_XYZCOLORT1); @@ -811,7 +811,7 @@ void CN3FXPartParticles::Render() //////////////////////////////////////////////////////////////////////////////////// //ParticleGreater pg; //m_pVBList_Alive.sort(pg); - // ̰ ȵǼ ȿ ִ ƾ ״ PSort()Լ ....;; + // 이거이 안되서 안에 있는 루틴 그대로 베껴서 PSort()함수 만들었엉...ㅠ.ㅠ;; PSort(); std::list::iterator it; @@ -951,7 +951,7 @@ void CN3FXPartParticles::CreateParticles_Spread() { __Quaternion Qt; - //bundle .. + //bundle의 방향 적용.. if (m_pRefBundle) { if (RotateQuaternion(v, m_pRefBundle->m_vDir, &Qt)) { RotMtx = Qt; @@ -965,7 +965,7 @@ void CN3FXPartParticles::CreateParticles_Spread() { } } - //part(emiiter) + //part(emiiter)의 방향 적용 //if(m_vEmitterDir.Magnitude()!=0) if (vDirPart.Magnitude() != 0) { //if(RotateQuaternion(v, m_vEmitterDir, &Qt)) @@ -981,7 +981,7 @@ void CN3FXPartParticles::CreateParticles_Spread() { } } - //ѷ .. + //뿌려지는 방향 적용.. //if(RotateQuaternion(v, m_vPtEmitDir, &Qt)) if (RotateQuaternion(v, vDirEmit, &Qt)) { RotMtx = Qt; @@ -1104,7 +1104,7 @@ void CN3FXPartParticles::CreateParticles_Gather() { __Quaternion Qt; - //bundle .. + //bundle의 방향 적용.. if (m_pRefBundle) { if (RotateQuaternion(v, m_pRefBundle->m_vDir, &Qt)) { RotMtx = Qt; @@ -1118,7 +1118,7 @@ void CN3FXPartParticles::CreateParticles_Gather() { } } - //part(emiiter) + //part(emiiter)의 방향 적용 if (vDirPart.Magnitude() != 0) { if (RotateQuaternion(v, vDirPart, &Qt)) { RotMtx = Qt; @@ -1131,7 +1131,7 @@ void CN3FXPartParticles::CreateParticles_Gather() { vDirEmit *= -1.0f; } } - //ѷ .. + //뿌려지는 방향 적용.. //if(RotateQuaternion(v, m_vPtEmitDir, &Qt)) if (RotateQuaternion(v, vDirEmit, &Qt)) { RotMtx = Qt; @@ -1338,7 +1338,7 @@ bool CN3FXPartParticles::GetColor(int key, DWORD & color) { } // -// Ͱ ϳ ⺤Ϳ ٸ ϳ ⺤ͷ ȸϴ mtxϱ.. +// 두 방향 벡터가 있을때 하나의 방향벡터에서 다른 하나의 방향벡터로 회전하는 mtx구하기.. // bool CN3FXPartParticles::RotateQuaternion(__Vector3 vSrcDir, __Vector3 vDestDir, __Quaternion * pQt) { vSrcDir.Normalize(); @@ -1363,8 +1363,8 @@ bool CN3FXPartParticles::RotateQuaternion(__Vector3 vSrcDir, __Vector3 vDestDir, // /////////////////////////////////////////////////////////////////////////////////////////////// // related sort list... -// list sortԼ ..-.- -// ϴ... +// list의 sort함수 베꼈당..-.- +// 제대로 동작 안하더라..ㅠ.ㅠ // void CN3FXPartParticles::PSort() { diff --git a/src/engine/N3Base/N3FXPartParticles.h b/src/engine/N3Base/N3FXPartParticles.h index 0b75c2f9..bb11a758 100644 --- a/src/engine/N3Base/N3FXPartParticles.h +++ b/src/engine/N3Base/N3FXPartParticles.h @@ -23,35 +23,35 @@ class CN3FXPartParticles : public CN3FXPartBase { __Matrix44 m_mtxVI; // inverse view mtx.. - int m_iNumParticle; // ƼŬ ..(maximum) - int m_iNumLodParticle; // Ÿ ƼŬ - //float m_fParticleSize; // ƼŬ ũ - std::pair m_pair_fParticleSize; // ƼŬ ũ - std::pair m_pair_fParticleLife; // ƼŬ + int m_iNumParticle; // 파티클의 총 수..(maximum) + int m_iNumLodParticle; // 거리에 따른 파티클 갯수 + //float m_fParticleSize; // 파티클의 크기 + std::pair m_pair_fParticleSize; // 파티클 크기의 범위 + std::pair m_pair_fParticleLife; // 파티클 생명의 범위 - std::list m_pVBList_Alive; // ִ ƼŬ ִ .. - std::list m_pVBList_Dead; // ƼŬ ִ .. + std::list m_pVBList_Alive; // 살아있는 파티클을 담고 있는 버퍼.. + std::list m_pVBList_Dead; // 죽은 파티클을 담고 있는 버퍼.. - float m_fCreateDelay; // ƼŬ ð . - float m_CurrCreateDelay; // create delay time.. - int m_iNumCreate; // ѹ ƼŬ . + float m_fCreateDelay; // 파티클 생성 시간 간격. + float m_CurrCreateDelay; // 현재 까지 create delay time.. + int m_iNumCreate; // 한번 생성시 만들어지는 파티클 수. - __Vector3 m_MinCreateRange; // ƼŬ ..min.. - __Vector3 m_MaxCreateRange; // ƼŬ ..max.. + __Vector3 m_MinCreateRange; // 파티클 생성 자유도 범위..min.. + __Vector3 m_MaxCreateRange; // 파티클 생성 자유도 범위..max.. //emitter... - DWORD m_dwEmitType; // ߻..(spread, gather).. - PARTICLEEMITCONDITION m_uEmitCon; // ߻¿ ʿ Ÿ.. + DWORD m_dwEmitType; // 발사형태..(spread, gather).. + PARTICLEEMITCONDITION m_uEmitCon; // 발사형태에 따른 필요 데이타.. __Vector3 m_vEmitterDir; __Vector3 m_vPrevShapePos; __Vector3 m_vShapePos; //particle.. - __Vector3 m_vPtEmitDir; //emitter ƼŬ л.. - float m_fPtVelocity; //ƼŬ лӵ.. - float m_fPtAccel; //л ӵ.. - float m_fPtRotVelocity; //ƼŬ ȸ ӵ.. - float m_fPtGravity; //߷°ӵ.. + __Vector3 m_vPtEmitDir; //emitter에서 파티클 분사방향.. + float m_fPtVelocity; //파티클 분사속도.. + float m_fPtAccel; //분사 가속도.. + float m_fPtRotVelocity; //파티클 회전 속도.. + float m_fPtGravity; //중력가속도.. //related particle color.... DWORD m_dwChangeColor[NUM_KEY_COLOR]; @@ -64,7 +64,7 @@ class CN3FXPartParticles : public CN3FXPartBase { bool m_bAnimKey; //particle local rotate......2002.10.21. - float m_fTexRotateVelocity; // ƼŬ ؽĸ Z ȸѼ ۺ ó ̰...(ӵ) + float m_fTexRotateVelocity; // 파티클 텍스쳐를 로컬 Z축으로 회전시켜서 빙글빙글 도는 것처럼 보이게...(속도) float m_fScaleVelX; float m_fScaleVelY; @@ -86,7 +86,7 @@ class CN3FXPartParticles : public CN3FXPartBase { float CameraDist(__Vector3 v1, __Vector3 v2, __Vector3 v3); ////////////////////////////////////////////// - //m_pVBList_Alive Ʈϱ̾.. + //m_pVBList_Alive를 소트하기위함이야.. void PSort(); void PMerge(std::list & l1, std::list & l2); bool PComp(CN3FXParticle * pP1, CN3FXParticle * pP2); @@ -94,13 +94,13 @@ class CN3FXPartParticles : public CN3FXPartBase { ////////////////////////////////////////////// public: - void Init(); // ó ε · ʱȭ... - void Start(); // Ʈ . - void Stop(); // Ʈ .. + void Init(); // 각종 변수들을 처음 로딩한 상태로 초기화... + void Start(); // 파트 구동 시작. + void Stop(); // 파트 구동 멈춤.. bool Tick(); // ticktick... - void Render(); // ȭ鿡 Ѹ.. - bool Load(HANDLE hFile); // ҷ. - bool Save(HANDLE hFile); // . + void Render(); // 화면에 뿌리기.. + bool Load(HANDLE hFile); // 게임파일 불러오기. + bool Save(HANDLE hFile); // 게임파일 저장오기. void Duplicate(CN3FXPartParticles * pSrc); bool GetColor(int key, DWORD & color); diff --git a/src/engine/N3Base/N3FXParticle.cpp b/src/engine/N3Base/N3FXParticle.cpp index 0ba74d2d..f381b383 100644 --- a/src/engine/N3Base/N3FXParticle.cpp +++ b/src/engine/N3Base/N3FXParticle.cpp @@ -60,7 +60,7 @@ bool CN3FXParticle::Tick() { } /////////////////////////////////////////////// - //ó.. + //현재처리.. __Quaternion qt; qt.RotationAxis(m_vAxis, m_fRot); @@ -98,7 +98,7 @@ bool CN3FXParticle::Tick() { } /////////////////////////////////////////////// - //غ.. + //다음준비.. m_vLcPos += m_vVelocity * CN3Base::s_fSecPerFrm; if (m_pRefParent->m_bChangeColor) { diff --git a/src/engine/N3Base/N3FXParticle.h b/src/engine/N3Base/N3FXParticle.h index a3de422b..03db9b20 100644 --- a/src/engine/N3Base/N3FXParticle.h +++ b/src/engine/N3Base/N3FXParticle.h @@ -20,24 +20,24 @@ class CN3FXParticle : public CN3Base { int m_iNumTex; int m_iTexIdx; - __Vector3 m_vCreatePoint; //ġ.. - __Vector3 m_vAxis; //ع..(ȸ) - __Vector3 m_vVelocity; //.. + __Vector3 m_vCreatePoint; //생성기준위치.. + __Vector3 m_vAxis; //기준방향..(회전축) + __Vector3 m_vVelocity; //진행방향.. __Vector3 m_vAccel; // float m_fDropVel; // float m_fDropY; // float m_fRot; // - __Vector3 m_vLcPos; //... + __Vector3 m_vLcPos; //로컬... __Vector3 m_vWdPos; // DWORD m_dwColor; // - float m_fSize; //ũ - //float m_fCurrSize; // + float m_fSize; //원래크기 + //float m_fCurrSize; //현재 public: bool Tick(); - // Ҹ.. + //생성자 소멸자.. CN3FXParticle(); virtual ~CN3FXParticle(); }; diff --git a/src/engine/N3Base/N3FXPlug.cpp b/src/engine/N3Base/N3FXPlug.cpp index d78380af..f388281d 100644 --- a/src/engine/N3Base/N3FXPlug.cpp +++ b/src/engine/N3Base/N3FXPlug.cpp @@ -82,10 +82,10 @@ bool CN3FXPlugPart::Save(HANDLE hFile) { void CN3FXPlugPart::Tick(const __Matrix44 & mtxParent) { if (m_pFXB) { - // ġ + // 위치 m_pFXB->m_vPos = m_vOffsetPos * mtxParent; - // ȸ + // 회전 static __Matrix44 mtxRot; mtxRot = mtxParent; mtxRot.PosSet(0, 0, 0); @@ -98,7 +98,7 @@ void CN3FXPlugPart::Tick(const __Matrix44 & mtxParent) { void CN3FXPlugPart::Tick(const CN3Chr * pChr) { __ASSERT(pChr, "no chr"); if (m_pFXB) { - // ġ + // 위치 const __Matrix44 * pMtxJoint = pChr->MatrixGet(m_nRefIndex); if (NULL == pMtxJoint) { return; @@ -109,7 +109,7 @@ void CN3FXPlugPart::Tick(const CN3Chr * pChr) { mtx *= pChr->m_Matrix; m_pFXB->m_vPos = m_vOffsetPos * mtx; - // ȸ + // 회전 mtx.PosSet(0, 0, 0); m_pFXB->m_vDir = m_vOffsetDir * mtx; @@ -131,10 +131,10 @@ void CN3FXPlugPart::SetFXB(const std::string & strFN) { } m_pFXB->LoadFromFile(strFN); - m_vOffsetPos = m_pFXB->m_vPos; //ϴ FXB Ǿ ִ vPos vDir ͼ . + m_vOffsetPos = m_pFXB->m_vPos; //일단 FXB에 설정되어 있는 vPos와 vDir값을 가져와서 적용. m_vOffsetDir = m_pFXB->m_vDir; - m_pFXB->Init(); // FX ϱ + m_pFXB->Init(); // FX 나오게 하기 m_pFXB->Trigger(); } @@ -179,7 +179,7 @@ bool CN3FXPlug::Load(HANDLE hFile) { __ASSERT(0 == m_FXPParts.size(), "must 0"); DWORD dwNum; int nCount; - ReadFile(hFile, &nCount, sizeof(nCount), &dwNum, NULL); // Part + ReadFile(hFile, &nCount, sizeof(nCount), &dwNum, NULL); // Part의 갯수 if (nCount > 0) { m_FXPParts.assign(nCount, NULL); } @@ -223,11 +223,11 @@ bool CN3FXPlug::Save(HANDLE hFile) { return false; } - RemoveFXPParts_HaveNoBundle(); // Ʈ + RemoveFXPParts_HaveNoBundle(); // 번들 없는 파트들 지우기 DWORD dwNum; int nCount = m_FXPParts.size(); - WriteFile(hFile, &nCount, sizeof(nCount), &dwNum, NULL); // Part + WriteFile(hFile, &nCount, sizeof(nCount), &dwNum, NULL); // Part의 갯수 for (int i = 0; i < nCount; ++i) { m_FXPParts[i]->Save(hFile); } @@ -235,16 +235,16 @@ bool CN3FXPlug::Save(HANDLE hFile) { return true; } -void CN3FXPlug::RemoveFXPParts_HaveNoBundle() // Part ϱ +void CN3FXPlug::RemoveFXPParts_HaveNoBundle() // 번들 없는 Part들 제거하기 { for (int i = 0; i < m_FXPParts.size(); ++i) { if (m_FXPParts[i] && NULL == m_FXPParts[i]->GetFXB()) { - delete m_FXPParts[i]; // FXB Ʈ . + delete m_FXPParts[i]; // FXB가 없으면 이 파트는 지운다. m_FXPParts[i] = NULL; } } - // NULL ͵ ش. + // NULL인 포인터들을 없앤다. std::vector::iterator itor; for (itor = m_FXPParts.begin(); itor != m_FXPParts.end();) { if (NULL == (*itor)) { diff --git a/src/engine/N3Base/N3FXPlug.h b/src/engine/N3Base/N3FXPlug.h index da767251..81eb1ce5 100644 --- a/src/engine/N3Base/N3FXPlug.h +++ b/src/engine/N3Base/N3FXPlug.h @@ -22,10 +22,10 @@ class CN3FXPlugPart : public CN3BaseFileAccess { public: protected: class CN3FXBundle * m_pFXB; - int m_nRefIndex; // referance index (ij : joint index) + int m_nRefIndex; // referance index (캐릭터 : joint index) - __Vector3 m_vOffsetPos; // Joint - __Vector3 m_vOffsetDir; // Joint + __Vector3 m_vOffsetPos; // Joint와 떨어진 정도 + __Vector3 m_vOffsetDir; // Joint와 떨어진 방향 // Operations public: @@ -71,11 +71,11 @@ class CN3FXPlug : public CN3BaseFileAccess { virtual bool Load(HANDLE hFile); void StopAll(bool bImmediately = false); // FX Stop - void TriggerAll(); // FX + void TriggerAll(); // FX 시작 #ifdef _N3TOOL virtual bool Save(HANDLE hFile); - void RemoveFXPParts_HaveNoBundle(); // Part ϱ + void RemoveFXPParts_HaveNoBundle(); // 번들 없는 Part들 제거하기 CN3FXPlugPart * FXPPartAdd(); void FXPPartDelete(int nIndex); diff --git a/src/engine/N3Base/N3FXShape.cpp b/src/engine/N3Base/N3FXShape.cpp index bf22f8a7..a83956b2 100644 --- a/src/engine/N3Base/N3FXShape.cpp +++ b/src/engine/N3Base/N3FXShape.cpp @@ -38,12 +38,12 @@ CN3FXSPart::~CN3FXSPart() { } void CN3FXSPart::Release() { - m_vPivot.Set(0, 0, 0); // Local - m_WorldMtx.Identity(); // World Matrix.. Shape Loading ̸ ؾ .. - m_bOutOfCameraRange = TRUE; // Camera ٱ ... + m_vPivot.Set(0, 0, 0); // Local 축 + m_WorldMtx.Identity(); // World Matrix.. Shape Loading 때 미리 계산해야 좋다.. + m_bOutOfCameraRange = TRUE; // Camera 범위 바깥에 있음... m_fTexFPS = 10.0f; // Texture Animation Interval; - m_fTexIndex = 0; // Current Texture Index.. Animation ų ʿ ε̴.. + m_fTexIndex = 0; // Current Texture Index.. Animation 시킬때 필요한 인덱스이다.. int iTC = m_TexRefs.size(); for (int i = 0; i < iTC; i++) { @@ -94,7 +94,7 @@ void CN3FXSPart::TexSet(int iIndex, CN3Texture * pTex) { s_MngTex.Delete(&m_TexRefs[iIndex]); } -// timeGetTime Texture Animation Ʈ Ѵ.. +// timeGetTime 으로 얻은 값을 넣으면 Texture Animation 을 컨트롤 한다.. void CN3FXSPart::Tick(const __Matrix44 & mtxParent) { CN3FXPMesh * pFXPMesh = m_FXPMInst.GetMesh(); if (NULL == pFXPMesh) { @@ -108,10 +108,10 @@ void CN3FXSPart::Tick(const __Matrix44 & mtxParent) { m_WorldMtx *= mtxParent; //////////////////////////////////////////////////////////////////////////// - // ī޶ ָ .. + // 카메라와 멀리 떨어지면 지나간다.. float fDist = (m_WorldMtx.Pos() - s_CameraData.vEye).Magnitude(); float fRadius = Radius(); - if (s_CameraData.IsOutOfFrustum(this->m_WorldMtx.Pos(), fRadius * 3.0f)) // ī޶ ü ٱ̸ .. + if (s_CameraData.IsOutOfFrustum(this->m_WorldMtx.Pos(), fRadius * 3.0f)) // 카메라 사면체 바깥이면 지나간다.. { m_bOutOfCameraRange = TRUE; return; @@ -119,7 +119,7 @@ void CN3FXSPart::Tick(const __Matrix44 & mtxParent) { // ////////////////////////////////////////////////////////////////////////////////// - // ī޶ Ÿ LOD Ѵ. + // 카메라 거리에 따라 LOD 수준을 조절한다. float fLOD = fDist * s_CameraData.fFOV; m_FXPMInst.SetLOD(fLOD); @@ -155,7 +155,7 @@ void CN3FXSPart::Render() { } } - if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) // Alpha + if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) // Alpha 사용 { __AlphaPrimitive * pAP = s_AlphaMgr.Add(); if (pAP) { @@ -175,10 +175,10 @@ void CN3FXSPart::Render() { pAP->pVertices = m_FXPMInst.GetVertices(); pAP->pwIndices = m_FXPMInst.GetIndices(); } - return; // . + return; // 렌더링 안하지롱. } - s_lpD3DDev->SetMaterial(&m_Mtl); // .. + s_lpD3DDev->SetMaterial(&m_Mtl); // 재질 설정.. s_lpD3DDev->SetTexture(0, lpTex); if (NULL != lpTex) { s_lpD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); @@ -243,9 +243,9 @@ bool CN3FXSPart::Load(HANDLE hFile) { ReadFile(hFile, &nL, 4, &dwRWC, NULL); // Mesh FileName ReadFile(hFile, szFN, nL, &dwRWC, NULL); - szFN[nL] = NULL; // ޽ ̸.. + szFN[nL] = NULL; // 메시 파일 이름.. - //m_pRefShape ο о ϸ Ķ... + //m_pRefShape의 경로와 읽어들인 파일명을 합쳐라... char szPath[_MAX_PATH]; char szFName[_MAX_FNAME], szExt[_MAX_EXT]; char szDir[_MAX_DIR]; @@ -257,19 +257,19 @@ bool CN3FXSPart::Load(HANDLE hFile) { return false; } - ReadFile(hFile, &m_Mtl, sizeof(__Material), &dwRWC, NULL); // + ReadFile(hFile, &m_Mtl, sizeof(__Material), &dwRWC, NULL); // 재질 int iTC = 0; ReadFile(hFile, &iTC, 4, &dwRWC, NULL); ReadFile(hFile, &m_fTexFPS, 4, &dwRWC, NULL); m_TexRefs.clear(); - this->TexAlloc(iTC); // Texture Pointer Pointer Ҵ.. - for (int j = 0; j < iTC; j++) // Texture Count ŭ ̸ о ؽó θ.. + this->TexAlloc(iTC); // Texture Pointer Pointer 할당.. + for (int j = 0; j < iTC; j++) // Texture Count 만큼 파일 이름 읽어서 텍스처 부르기.. { ReadFile(hFile, &nL, 4, &dwRWC, NULL); if (nL > 0) { ReadFile(hFile, szFN, nL, &dwRWC, NULL); - szFN[nL] = NULL; // ؽó ̸.. + szFN[nL] = NULL; // 텍스처 파일 이름.. _splitpath(szFN, NULL, NULL, szFName, szExt); _makepath(szPath, NULL, szDir, szFName, szExt); @@ -293,8 +293,8 @@ void CN3FXSPart::Duplicate(CN3FXSPart * pSrc) { m_fTexFPS = m_fTexFPS; m_TexRefs.clear(); - this->TexAlloc(iTC); // Texture Pointer Pointer Ҵ.. - for (int j = 0; j < iTC; j++) // Texture Count ŭ ̸ о ؽó θ.. + this->TexAlloc(iTC); // Texture Pointer Pointer 할당.. + for (int j = 0; j < iTC; j++) // Texture Count 만큼 파일 이름 읽어서 텍스처 부르기.. { if (pSrc->Tex(j)) { m_TexRefs[j] = s_MngTex.Get(pSrc->Tex(j)->FileName()); @@ -364,8 +364,8 @@ void CN3FXShape::Tick(float fFrm) { } } -// ī޶ ġ, ī޶ ( ü ) -> 12 迭 Ǿ ִ. -// [0][1]:ī޶ ġ , [2][3]:ī޶ ġ , [4][5] ~ [10][11]:¿麤 +// 카메라 위치, 카메라 평면(관찰 절두체 평면) -> 12개의 벡터 배열로 되어 있다. +// [0][1]:카메라 위치와 벡터, [2][3]:카메라 범위 위치와 방향 벡터, [4][5] ~ [10][11]:상하좌우평면벡터 void CN3FXShape::Render() { int iPC = m_Parts.size(); for (int i = 0; i < iPC; i++) { @@ -374,7 +374,7 @@ void CN3FXShape::Render() { } bool CN3FXShape::Load(HANDLE hFile) { - CN3TransformCollision::Load(hFile); // ⺻ б... + CN3TransformCollision::Load(hFile); // 기본정보 읽기... DWORD dwRWC = 0; @@ -393,16 +393,16 @@ bool CN3FXShape::Load(HANDLE hFile) { if (!m_Parts[i]->Load(hFile)) { return false; } - //m_Parts[i]->ReCalcMatrix(m_Matrix); // Part Matrix + //m_Parts[i]->ReCalcMatrix(m_Matrix); // Part Matrix 계산 } } DWORD dwTmp; - ReadFile(hFile, &dwTmp, 4, &dwRWC, NULL); // Ҽ - ReadFile(hFile, &dwTmp, 4, &dwRWC, NULL); // Ӽ 0 - ReadFile(hFile, &dwTmp, 4, &dwRWC, NULL); // Ӽ 1 - ReadFile(hFile, &dwTmp, 4, &dwRWC, NULL); // Ӽ 2 - ReadFile(hFile, &dwTmp, 4, &dwRWC, NULL); // Ӽ 3 + ReadFile(hFile, &dwTmp, 4, &dwRWC, NULL); // 소속 + ReadFile(hFile, &dwTmp, 4, &dwRWC, NULL); // 속성 0 + ReadFile(hFile, &dwTmp, 4, &dwRWC, NULL); // 속성 1 + ReadFile(hFile, &dwTmp, 4, &dwRWC, NULL); // 속성 2 + ReadFile(hFile, &dwTmp, 4, &dwRWC, NULL); // 속성 3 this->FindMinMax(); @@ -411,7 +411,7 @@ bool CN3FXShape::Load(HANDLE hFile) { bool CN3FXShape::Save(HANDLE hFile) { /* - CN3TransformCollision::Save(hFile); // ⺻ б... + CN3TransformCollision::Save(hFile); // 기본정보 읽기... DWORD dwRWC = 0; @@ -425,11 +425,11 @@ bool CN3FXShape::Save(HANDLE hFile) { m_Parts[i]->Save(hFile); } - WriteFile(hFile, &m_iBelong, 4, &dwRWC, NULL); // Ҽ - WriteFile(hFile, &m_iAttr0, 4, &dwRWC, NULL); // Ӽ 0 - WriteFile(hFile, &m_iAttr1, 4, &dwRWC, NULL); // Ӽ 1 - WriteFile(hFile, &m_iAttr2, 4, &dwRWC, NULL); // Ӽ 2 - WriteFile(hFile, &m_iAttr3, 4, &dwRWC, NULL); // Ӽ 3 + WriteFile(hFile, &m_iBelong, 4, &dwRWC, NULL); // 소속 + WriteFile(hFile, &m_iAttr0, 4, &dwRWC, NULL); // 속성 0 + WriteFile(hFile, &m_iAttr1, 4, &dwRWC, NULL); // 속성 1 + WriteFile(hFile, &m_iAttr2, 4, &dwRWC, NULL); // 속성 2 + WriteFile(hFile, &m_iAttr3, 4, &dwRWC, NULL); // 속성 3 */ return true; } @@ -458,14 +458,14 @@ void CN3FXShape::FindMinMax() { __Vector3 vMinTmp(0, 0, 0); __Vector3 vMaxTmp(0, 0, 0); - // ū ã.. + // 가장 큰 지점찾기.. static __Matrix44 mtxWI; D3DXMatrixInverse(&mtxWI, NULL, &m_mtxFinalTransform); // World Matrix Inverse int iPC = m_Parts.size(); for (int i = 0; i < iPC; i++) { //m_Parts[i]->ReCalcMatrix(m_mtxFinalTransform); - vMinTmp = m_Parts[i]->Min() * mtxWI; // ּҰ ǥ ٲپش.. - vMaxTmp = m_Parts[i]->Max() * mtxWI; // ִ밪 ǥ ٲپش.. + vMinTmp = m_Parts[i]->Min() * mtxWI; // 월드 상의 최소값을 로컬 좌표로 바꾸어준다.. + vMaxTmp = m_Parts[i]->Max() * mtxWI; // 월드 상의 최대값을 로컬 좌표로 바꾸어준다.. if (vMinTmp.x < vMin.x) { vMin.x = vMinTmp.x; @@ -487,11 +487,11 @@ void CN3FXShape::FindMinMax() { } } - // ִ ּҰ + // 최대 최소값을 저장 m_vMin = vMin * m_mtxFinalTransform; m_vMax = vMax * m_mtxFinalTransform; - // ִ ּҰ Ѵ.. + // 최대 최소값을 갖고 반지름 계산한다.. m_fRadius = (m_vMax - m_vMin).Magnitude() * 0.5f; } @@ -509,7 +509,7 @@ void CN3FXShape::Duplicate(CN3FXShape * pSrc) { m_dwLight = pSrc->m_dwLight; m_dwDoubleSide = pSrc->m_dwDoubleSide; - //CN3TransformCollision::Load(hFile); // ⺻ б... + //CN3TransformCollision::Load(hFile); // 기본정보 읽기... //transform collision... SetRadius(pSrc->Radius()); SetMin(pSrc->Min()); @@ -553,7 +553,7 @@ void CN3FXShape::Duplicate(CN3FXShape * pSrc) { m_Parts[i] = new CN3FXSPart(); m_Parts[i]->m_pRefShape = this; m_Parts[i]->Duplicate(pSrc->m_Parts[i]); - //m_Parts[i]->ReCalcMatrix(m_Matrix); // Part Matrix + //m_Parts[i]->ReCalcMatrix(m_Matrix); // Part Matrix 계산 } } diff --git a/src/engine/N3Base/N3FXShape.h b/src/engine/N3Base/N3FXShape.h index a3f6d8d1..965c1e02 100644 --- a/src/engine/N3Base/N3FXShape.h +++ b/src/engine/N3Base/N3FXShape.h @@ -18,9 +18,9 @@ class CN3FXSPart : public CN3BaseFileAccess { public: __Material m_Mtl; // Material - __Vector3 m_vPivot; // Local - __Matrix44 m_WorldMtx; // World Matrix.. Shape Loading ̸ ؾ .. - BOOL m_bOutOfCameraRange; // Camera ٱ ... + __Vector3 m_vPivot; // Local 축 + __Matrix44 m_WorldMtx; // World Matrix.. Shape Loading 때 미리 계산해야 좋다.. + BOOL m_bOutOfCameraRange; // Camera 범위 바깥에 있음... float m_fTexFPS; // Texture Animation Interval; bool m_bTexLoop; @@ -32,7 +32,7 @@ class CN3FXSPart : public CN3BaseFileAccess { CN3FXPMeshInstance m_FXPMInst; // Progressive Mesh Instance float - m_fTexIndex; // Current Texture Index.. Animation ų ʿ ε̴.. float ؼ ؽó ϸ̼ Ѵ. + m_fTexIndex; // Current Texture Index.. Animation 시킬때 필요한 인덱스이다.. float 로 해서 텍스처 에니메이션 제어한다. public: bool Load(HANDLE hFile); @@ -51,14 +51,14 @@ class CN3FXSPart : public CN3BaseFileAccess { } else { return __Vector3(0, 0, 0); } - } // ּҰ + } // 월드 상의 최소값 __Vector3 Max() { if (m_FXPMInst.GetMesh()) { return m_FXPMInst.GetMesh()->Max() * m_WorldMtx; } else { return __Vector3(0, 0, 0); } - } // ִ밪 + } // 월드 상의 최대값 float Radius() { if (m_FXPMInst.GetMesh()) { return m_FXPMInst.GetMesh()->Radius(); diff --git a/src/engine/N3Base/N3GERain.cpp b/src/engine/N3Base/N3GERain.cpp index 4c636dd1..4eb076da 100644 --- a/src/engine/N3Base/N3GERain.cpp +++ b/src/engine/N3Base/N3GERain.cpp @@ -33,9 +33,9 @@ void CN3GERain::Tick() { int iCount = m_iVC / 2; int iActiveCount = iCount; - if (m_iFadeMode > 0) // Ѵ.. + if (m_iFadeMode > 0) // 차차 많아지게 한다.. { - if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fadeð dzʶٰ .. + if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fade시간땜에 건너뛰고 찍을 양 결정.. { iActiveCount = iCount * m_fFadeTimeCur / m_fFadeTime; if (iActiveCount > iCount) { @@ -45,7 +45,7 @@ void CN3GERain::Tick() { } } } else if (m_iFadeMode < 0) { - if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fadeð dzʶٰ .. + if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fade시간땜에 건너뛰고 찍을 양 결정.. { iActiveCount = iCount * (1.0f - m_fFadeTimeCur / m_fFadeTime); if (iActiveCount > iCount) { @@ -72,7 +72,7 @@ void CN3GERain::Tick() { const float fCurY = s_CameraData.vEye.y; for (int i = 0; i < iActiveCount; ++i) { - // tail ġ ϱ + // tail 위치 결정하기 __VertexXyzColor * pVTail = pVertices + i * 2 + 0; __VertexXyzColor * pVHead = pVertices + i * 2 + 1; pVTail->x += vAdd.x; @@ -80,17 +80,17 @@ void CN3GERain::Tick() { pVTail->z += vAdd.z; float fDiff = pVTail->y - (fCurY - fHalfHeight); - if (fDiff < 0) //  + if (fDiff < 0) // 높이 범위를 벗어났을 경우 { pVTail->y -= (((int)(fDiff / m_fHeight) - 1) * m_fHeight); pVTail->x = m_fWidth * (rand() % 10000 - 5000) / 10000.f; pVTail->z = m_fWidth * (rand() % 10000 - 5000) / 10000.f; } else { fDiff = pVTail->y - (fCurY + fHalfHeight); - if (fDiff > 0) { // ݴ  + if (fDiff > 0) { // 높이 범위를 반대로 벗어났을경우 pVTail->y -= ((int)(fDiff / m_fHeight) + 1) * m_fHeight; } - // x ʺ  + // x 너비 범위를 벗어났을 경우 fDiff = pVTail->x - fHalfWidth; if (fDiff > 0) { pVTail->x -= ((int)(fDiff / m_fWidth) + 1) * m_fWidth; @@ -99,7 +99,7 @@ void CN3GERain::Tick() { if (fDiff < 0) { pVTail->x -= ((int)(fDiff / m_fWidth) - 1) * m_fWidth; } - // z ʺ  + // z 너비 범위를 벗어났을 경우 fDiff = pVTail->z - fHalfWidth; if (fDiff > 0) { pVTail->z -= ((int)(fDiff / m_fWidth) + 1) * m_fWidth; @@ -109,7 +109,7 @@ void CN3GERain::Tick() { pVTail->z -= ((int)(fDiff / m_fWidth) - 1) * m_fWidth; } } - // Head ġ Tail ġκ Ÿ ġŲ. + // Head의 위치를 Tail의 위치로부터 일정 거리에 떨어진 곳에 위치시킨다. pVHead->x = pVTail->x + vAddLength.x; pVHead->y = pVTail->y + vAddLength.y; pVHead->z = pVTail->z + vAddLength.z; @@ -127,9 +127,9 @@ void CN3GERain::Render(__Vector3 & vPos) { int iCount = m_iVC / 2; int iActiveCount = iCount; - if (m_iFadeMode > 0) // Ѵ.. + if (m_iFadeMode > 0) // 차차 많아지게 한다.. { - if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fadeð dzʶٰ .. + if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fade시간땜에 건너뛰고 찍을 양 결정.. { iActiveCount = iCount * m_fFadeTimeCur / m_fFadeTime; if (iActiveCount > iCount) { @@ -139,7 +139,7 @@ void CN3GERain::Render(__Vector3 & vPos) { } } } else if (m_iFadeMode < 0) { - if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fadeð dzʶٰ .. + if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fade시간땜에 건너뛰고 찍을 양 결정.. { iActiveCount = iCount * (1.0f - m_fFadeTimeCur / m_fFadeTime); if (iActiveCount > iCount) { @@ -153,7 +153,7 @@ void CN3GERain::Render(__Vector3 & vPos) { return; } - // render state + // 이전 render state 저장 DWORD dwColorVertex, dwLighting, dwAlphaBlend, dwSrcAlpha, dwDestAlpha; s_lpD3DDev->GetRenderState(D3DRS_COLORVERTEX, &dwColorVertex); s_lpD3DDev->GetRenderState(D3DRS_LIGHTING, &dwLighting); @@ -176,7 +176,7 @@ void CN3GERain::Render(__Vector3 & vPos) { // render s_lpD3DDev->SetFVF(FVF_XYZCOLOR); - s_lpD3DDev->SetStreamSource(0, m_pVB, 0, sizeof(__VertexXyzColor)); // ؽ + s_lpD3DDev->SetStreamSource(0, m_pVB, 0, sizeof(__VertexXyzColor)); // 버텍스 버퍼 지정 s_lpD3DDev->DrawPrimitive(D3DPT_LINELIST, 0, iActiveCount); // restore @@ -189,11 +189,11 @@ void CN3GERain::Render(__Vector3 & vPos) { void CN3GERain::Create(float fDensity, float fWidth, float fHeight, float fRainLength, const __Vector3 & vVelocity, float fTimeToFade) -// fDensity : 1 () -// fWidth : X,Z -// fHeight : -// fRainLength : ٱ -// vVelocity : ٱ ӵ +// fDensity : 1 (세제곱미터) 당 빗방울의 갯수 +// fWidth : 비오는 범위 X,Z 길이 +// fHeight : 비오는 범위의 높이 +// fRainLength : 빗줄기의 길이 +// vVelocity : 빗줄기의 속도 { if (NULL == s_lpD3DDev) { return; @@ -218,7 +218,7 @@ void CN3GERain::Create(float fDensity, float fWidth, float fHeight, float fRainL m_vVelocity = vVelocity; int iRainCount = (int)(fVolume * fDensity); - // m_pVB, m_pIB + // m_pVB, m_pIB 만들기 m_iVC = iRainCount * 2; HRESULT hr = s_lpD3DDev->CreateVertexBuffer(m_iVC * sizeof(__VertexXyzColor), 0, FVF_XYZCOLOR, D3DPOOL_MANAGED, &m_pVB, NULL); @@ -232,8 +232,8 @@ void CN3GERain::Create(float fDensity, float fWidth, float fHeight, float fRainL return; } - const DWORD dwColorA = 0x00bfbfbf, // - dwColorB = 0x80bfbfbf; // Ӹ + const DWORD dwColorA = 0x00bfbfbf, // 꼬리 + dwColorB = 0x80bfbfbf; // 머리 __Vector3 vN = vVelocity; vN.Normalize(); __Vector3 vAdd = vN * fRainLength; diff --git a/src/engine/N3Base/N3GESnow.cpp b/src/engine/N3Base/N3GESnow.cpp index d7ddadda..8f85814f 100644 --- a/src/engine/N3Base/N3GESnow.cpp +++ b/src/engine/N3Base/N3GESnow.cpp @@ -38,9 +38,9 @@ void CN3GESnow::Tick() { int iCount = m_iVC / 3; int iActiveCount = iCount; - if (m_iFadeMode > 0) // Ѵ.. + if (m_iFadeMode > 0) // 차차 많아지게 한다.. { - if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fadeð dzʶٰ .. + if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fade시간땜에 건너뛰고 찍을 양 결정.. { iActiveCount = iCount * m_fFadeTimeCur / m_fFadeTime; if (iActiveCount > iCount) { @@ -50,7 +50,7 @@ void CN3GESnow::Tick() { } } } else if (m_iFadeMode < 0) { - if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fadeð dzʶٰ .. + if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fade시간땜에 건너뛰고 찍을 양 결정.. { iActiveCount = iCount * (1.0f - m_fFadeTimeCur / m_fFadeTime); if (iActiveCount > iCount) { @@ -79,7 +79,7 @@ void CN3GESnow::Tick() { static const float sqrt3 = sqrtf(3.0f); for (int i = 0; i < iActiveCount; ++i) { - // ġ ϱ + // 위치 결정하기 __VertexXyzT1 * pV1 = pVertices + i * 3 + 0; __VertexXyzT1 * pV2 = pVertices + i * 3 + 1; __VertexXyzT1 * pV3 = pVertices + i * 3 + 2; @@ -91,7 +91,7 @@ void CN3GESnow::Tick() { // pV1->x += vAdd.x; pV1->y += vAdd.y; pV1->z += vAdd.z; float fDiff = pParticle->vPos.y - (fCurY - fHalfHeight); - if (fDiff < 0) //  + if (fDiff < 0) // 높이 범위를 벗어났을 경우 { pParticle->vPos.y -= (((int)(fDiff / m_fHeight) - 1) * m_fHeight); pParticle->vPos.x = m_fWidth * (rand() % 10000 - 5000) / 10000.f; @@ -108,10 +108,10 @@ void CN3GESnow::Tick() { -sinf(fRadian) * m_fSnowSize / 2); } else { fDiff = pParticle->vPos.y - (fCurY + fHalfHeight); - if (fDiff > 0) { // ݴ  + if (fDiff > 0) { // 높이 범위를 반대로 벗어났을경우 pParticle->vPos.y -= ((int)(fDiff / m_fHeight) + 1) * m_fHeight; } - // x ʺ  + // x 너비 범위를 벗어났을 경우 fDiff = pParticle->vPos.x - fHalfWidth; if (fDiff > 0) { pParticle->vPos.x -= ((int)(fDiff / m_fWidth) + 1) * m_fWidth; @@ -120,7 +120,7 @@ void CN3GESnow::Tick() { if (fDiff < 0) { pParticle->vPos.x -= ((int)(fDiff / m_fWidth) - 1) * m_fWidth; } - // z ʺ  + // z 너비 범위를 벗어났을 경우 fDiff = pParticle->vPos.z - fHalfWidth; if (fDiff > 0) { pParticle->vPos.z -= ((int)(fDiff / m_fWidth) + 1) * m_fWidth; @@ -130,13 +130,13 @@ void CN3GESnow::Tick() { pParticle->vPos.z -= ((int)(fDiff / m_fWidth) - 1) * m_fWidth; } } - // ߽ ȸ ġ + // 중심축을 주위로 회전한 위치 계산 pParticle->fRadian += fAddRadian; __Vector3 vPos; vPos.Set(cosf(pParticle->fRadian), 0, sinf(pParticle->fRadian)); vPos += pParticle->vPos; - // ؽ ٽ ϱ + // 버텍스 버퍼의 점 다시 세팅하기 pV1->x = vPos.x + pParticle->vOffset1.x; pV1->y = vPos.y + pParticle->vOffset1.y; pV1->z = vPos.z + pParticle->vOffset1.z; @@ -159,9 +159,9 @@ void CN3GESnow::Render(__Vector3 & vPos) { int iCount = m_iVC / 3; int iActiveCount = iCount; - if (m_iFadeMode > 0) // Ѵ.. + if (m_iFadeMode > 0) // 차차 많아지게 한다.. { - if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fadeð dzʶٰ .. + if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fade시간땜에 건너뛰고 찍을 양 결정.. { iActiveCount = iCount * m_fFadeTimeCur / m_fFadeTime; if (iActiveCount > iCount) { @@ -171,7 +171,7 @@ void CN3GESnow::Render(__Vector3 & vPos) { } } } else if (m_iFadeMode < 0) { - if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fadeð dzʶٰ .. + if (m_fFadeTime > 0 && m_fFadeTimeCur < m_fFadeTime) // Fade시간땜에 건너뛰고 찍을 양 결정.. { iActiveCount = iCount * (1.0f - m_fFadeTimeCur / m_fFadeTime); if (iActiveCount > iCount) { @@ -185,7 +185,7 @@ void CN3GESnow::Render(__Vector3 & vPos) { return; } - // render state + // 이전 render state 저장 DWORD dwAlphaBlend, dwSrcAlpha, dwDestAlpha, dwCullMode, dwLight; s_lpD3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &dwAlphaBlend); s_lpD3DDev->GetRenderState(D3DRS_SRCBLEND, &dwSrcAlpha); @@ -216,7 +216,7 @@ void CN3GESnow::Render(__Vector3 & vPos) { // render s_lpD3DDev->SetFVF(FVF_XYZT1); - s_lpD3DDev->SetStreamSource(0, m_pVB, 0, sizeof(__VertexXyzT1)); // ؽ + s_lpD3DDev->SetStreamSource(0, m_pVB, 0, sizeof(__VertexXyzT1)); // 버텍스 버퍼 지정 s_lpD3DDev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, iActiveCount); // restore @@ -247,7 +247,7 @@ void CN3GESnow::Create(float fDensity, float fWidth, float fHeight, float fSnowS __ASSERT(fVolume > 0, "Snow volume is less than 0"); int iSnowCount = (int)(fVolume * fDensity); - // m_pVB, m_pIB + // m_pVB, m_pIB 만들기 __ASSERT(s_lpD3DDev, "D3D Device pointer is NULL!"); m_iVC = iSnowCount * 3; HRESULT hr = s_lpD3DDev->CreateVertexBuffer(m_iVC * sizeof(__VertexXyzT1), D3DUSAGE_DYNAMIC, FVF_XYZT1, @@ -261,7 +261,7 @@ void CN3GESnow::Create(float fDensity, float fWidth, float fHeight, float fSnowS return; } - // __SnowParticle ä ֱ + // __SnowParticle 정보 채워 넣기 m_pSnowParticle = new __SnowParticle[iSnowCount]; const float sqrt3 = sqrtf(3.0f); @@ -273,26 +273,26 @@ void CN3GESnow::Create(float fDensity, float fWidth, float fHeight, float fSnowS m_pSnowParticle[i].fRadian = 2 * D3DX_PI * ((rand() % 10000) / 10000.f); float fRadian = D3DX_PI * ((rand() % 10000) / 10000.f); - // ﰢ(Ѻ ̰ fSnowSize) + // 정삼각형(한변의 길이가 fSnowSize) // m_pSnowParticle[i].vOffset1.Set(0, sqrt3*fSnowSize/3.f, 0); // m_pSnowParticle[i].vOffset2.Set(cosf(fRadian)*fSnowSize/2, -sqrt3*fSnowSize/6.f, sinf(fRadian)*fSnowSize/2); // m_pSnowParticle[i].vOffset3.Set(-cosf(fRadian)*fSnowSize/2, -sqrt3*fSnowSize/6.f, -sinf(fRadian)*fSnowSize/2); - // ̵ ﰢ(غ fSnowSize, fSnowSize) + // 이등변 삼각형(밑변의 길이 fSnowSize, 높이 fSnowSize) m_pSnowParticle[i].vOffset1.Set(0, fSnowSize / 2.f, 0); m_pSnowParticle[i].vOffset2.Set(cosf(fRadian) * fSnowSize / 2.f, -fSnowSize / 2.f, sinf(fRadian) * fSnowSize / 2.f); m_pSnowParticle[i].vOffset3.Set(-cosf(fRadian) * fSnowSize / 2.f, -fSnowSize / 2.f, -sinf(fRadian) * fSnowSize / 2.f); - // uvǥ ֱ + // uv좌표 넣기 __VertexXyzT1 *pV1 = pVertices + i * 3, *pV2 = pVertices + i * 3 + 1, *pV3 = pVertices + i * 3 + 2; - // ﰢ ׶̰ ﰢ UVǥ ġ (geforce2ī忡 border color ʾƼ..) + // 정삼각형에 눈 동그라미가 삼각형에 꽉 차게 UV좌표 배치 (geforce2카드에서 border color가 제대로 되지 않아서..) // pV1->tu = 0.5f; pV1->tv = 0.5f - sqrt3/2.f; // pV2->tu = 0.5f + sqrt3/2.f; pV2->tv = 1.0f; // pV3->tu = 0.5f - sqrt3/2.f; pV3->tv = 1.0f; - // ̵ ﰢ UVǥ ֱ + // 이등변 삼각형에 UV좌표 넣기 pV1->tu = 0.5f; pV1->tv = 0.0f; pV2->tu = 1.0f; @@ -300,7 +300,7 @@ void CN3GESnow::Create(float fDensity, float fWidth, float fHeight, float fSnowS pV3->tu = 0.0f; pV3->tv = 1.0f; - // ؽ 簢 ﰢ ִ ( ؽĸ ﰢ ° ׷) + // 이 방식은 눈텍스쳐 사각형에 삼각형을 넣는 방식(따라서 눈 텍스쳐를 삼각형에 맞게 그려주자) } m_pVB->Unlock(); diff --git a/src/engine/N3Base/N3GESnow.h b/src/engine/N3Base/N3GESnow.h index 48332aea..e58a5fb5 100644 --- a/src/engine/N3Base/N3GESnow.h +++ b/src/engine/N3Base/N3GESnow.h @@ -10,12 +10,12 @@ class CN3GESnow : public CN3GlobalEffect { // Structures protected: struct __SnowParticle { - __Vector3 vPos; // ȸ ݰ ܽ - __Vector3 vOffset1, vOffset2, vOffset3; // 1 2 3 ƼŬ - float fRadius; // ȸ ݰ - float fRadian; // ȸ - // float fRVel; // ȸӵ (켱 ϴٰ ) - // __Vector3 vVelocity; // ӵ(켱 ٰ ) + __Vector3 vPos; // 회전 반경의 줌심 + __Vector3 vOffset1, vOffset2, vOffset3; // 점 1 2 3이 파티클 중점에서 떨어진 정도 + float fRadius; // 회전 반경 + float fRadian; // 현재 회전된 각도 + // float fRVel; // 회전각속도 (우선 일정하다고 가정) + // __Vector3 vVelocity; // 떨어지는 속도(우선 모두 같다고 가정) }; // Attributes @@ -23,12 +23,12 @@ class CN3GESnow : public CN3GlobalEffect { void SetVelocity(__Vector3 & v) { m_vVelocity = v; } protected: - float m_fWidth; // ʺ - float m_fHeight; // - float m_fSnowSize; // ϳ ũ - __Vector3 m_vVelocity; // ü ӵ - CN3Texture * m_pTex; // ؽ - __SnowParticle * m_pSnowParticle; // + float m_fWidth; // 눈이 떨어지는 공간의 너비 + float m_fHeight; // 눈이 떨어지는 공간의 높이 + float m_fSnowSize; // 눈 하나의 크기 + __Vector3 m_vVelocity; // 전체적으로 떨어지는 방향과 속도 + CN3Texture * m_pTex; // 눈 텍스쳐 + __SnowParticle * m_pSnowParticle; // 눈송이 정보 // Operations public: diff --git a/src/engine/N3Base/N3GlobalEffect.cpp b/src/engine/N3Base/N3GlobalEffect.cpp index 81738846..abfeac21 100644 --- a/src/engine/N3Base/N3GlobalEffect.cpp +++ b/src/engine/N3Base/N3GlobalEffect.cpp @@ -15,8 +15,8 @@ CN3GlobalEffect::CN3GlobalEffect() { m_bActive = FALSE; m_iVC = 0; m_iIC = 0; - m_fFadeTime = 0.0f; // ̽ð ǥ 縸ŭ ƼŬ þ.. - m_fFadeTimeCur = 0.0f; // ð.. + m_fFadeTime = 0.0f; // 이시간 동안 차차 목표한 양만큼 파티클의 수가 늘어난다.. + m_fFadeTimeCur = 0.0f; // 지난시간.. m_iFadeMode = 0; } @@ -43,8 +43,8 @@ void CN3GlobalEffect::Release() { m_bActive = FALSE; m_iVC = 0; m_iIC = 0; - m_fFadeTime = 0.0f; // ̽ð ǥ 縸ŭ ƼŬ þ.. - m_fFadeTimeCur = 0.0f; // ð.. + m_fFadeTime = 0.0f; // 이시간 동안 차차 목표한 양만큼 파티클의 수가 늘어난다.. + m_fFadeTimeCur = 0.0f; // 지난시간.. m_iFadeMode = 0; CN3Transform::Release(); @@ -53,7 +53,7 @@ void CN3GlobalEffect::Release() { void CN3GlobalEffect::Tick() { CN3Transform::Tick(-1); - if (m_iFadeMode && m_fFadeTime > 0) // ð Ѵ.. + if (m_iFadeMode && m_fFadeTime > 0) // 시간을 지나게 한다.. { m_fFadeTimeCur += s_fSecPerFrm; if (m_fFadeTimeCur > m_fFadeTime) { diff --git a/src/engine/N3Base/N3GlobalEffect.h b/src/engine/N3Base/N3GlobalEffect.h index 70952e4a..27940090 100644 --- a/src/engine/N3Base/N3GlobalEffect.h +++ b/src/engine/N3Base/N3GlobalEffect.h @@ -24,8 +24,8 @@ class CN3GlobalEffect : public CN3Transform { LPDIRECT3DINDEXBUFFER9 m_pIB; DWORD m_dwEffectType; BOOL m_bActive; - float m_fFadeTime; // ̽ð ǥ 縸ŭ ƼŬ þ.. - float m_fFadeTimeCur; // ð.. + float m_fFadeTime; // 이시간 동안 차차 목표한 양만큼 파티클의 수가 늘어난다.. + float m_fFadeTimeCur; // 지난시간.. int m_iFadeMode; // 1 - FadeIn 0... -1 FadeOut // Operations diff --git a/src/engine/N3Base/N3GlobalEffectMng.cpp b/src/engine/N3Base/N3GlobalEffectMng.cpp index a914f109..aabfef01 100644 --- a/src/engine/N3Base/N3GlobalEffectMng.cpp +++ b/src/engine/N3Base/N3GlobalEffectMng.cpp @@ -143,7 +143,7 @@ void CN3GlobalEffectMng::SetWeather(int iWeather) if (m_pGERain == NULL) m_pGERain = new CN3GERain; m_fCellSize = 20.0f; - m_pGERain->Create(fDensity, m_fCellSize, fHeight, fRainLength, vVelocity); // + m_pGERain->Create(fDensity, m_fCellSize, fHeight, fRainLength, vVelocity); // 비 m_pGERain->SetActive(TRUE); if (m_pGESnow) m_pGESnow->FadeSet(3.0f, false); } @@ -152,7 +152,7 @@ void CN3GlobalEffectMng::SetWeather(int iWeather) if (m_pGESnow == NULL) m_pGESnow = new CN3GESnow; m_fCellSize = 10.0f; - m_pGESnow->Create(fDensity, m_fCellSize, fHeight, fSnowSize, vVelocity); // + m_pGESnow->Create(fDensity, m_fCellSize, fHeight, fSnowSize, vVelocity); // 눈 m_pGESnow->SetActive(TRUE); if (m_pGERain) m_pGERain->FadeSet(3.0f, false); } @@ -182,7 +182,7 @@ void CN3GlobalEffectMng::WeatherSetRainy(int iPercent) { float fRainLength = 0.4f + 0.6f * fPercent; m_fCellSize = 20.0f; - m_pGERain->Create(fDensity, m_fCellSize, fHeight, fRainLength, vVelocity, 10.0f); // + m_pGERain->Create(fDensity, m_fCellSize, fHeight, fRainLength, vVelocity, 10.0f); // 비 m_pGERain->SetActive(TRUE); } @@ -202,6 +202,6 @@ void CN3GlobalEffectMng::WeatherSetSnow(int iPercent) { float fSnowSize = 0.1f + 0.1f * fPercent; m_fCellSize = 20.0f; - m_pGESnow->Create(fDensity, m_fCellSize, fHeight, fSnowSize, vVelocity, 10.0f); // + m_pGESnow->Create(fDensity, m_fCellSize, fHeight, fSnowSize, vVelocity, 10.0f); // 비 m_pGESnow->SetActive(TRUE); } \ No newline at end of file diff --git a/src/engine/N3Base/N3GlobalEffectMng.h b/src/engine/N3Base/N3GlobalEffectMng.h index 0167c9d3..8ee85c8a 100644 --- a/src/engine/N3Base/N3GlobalEffectMng.h +++ b/src/engine/N3Base/N3GlobalEffectMng.h @@ -7,13 +7,13 @@ #include "N3Base.h" enum { - GEW_CLEAR = 0, // - GEW_DRIZZLE_RAIN = 1, // - GEW_RAINY = 2, // 緮 - GEW_HEAVY_RAIN = 3, // - GEW_SNOW1 = 11, // - GEW_SNOW2 = 12, // - GEW_HEAVY_SNOW = 13 // + GEW_CLEAR = 0, // 맑음 + GEW_DRIZZLE_RAIN = 1, // 가랑비 + GEW_RAINY = 2, // 적당량의 비 + GEW_HEAVY_RAIN = 3, // 폭우 + GEW_SNOW1 = 11, // 포근한 눈 + GEW_SNOW2 = 12, // 적당한 눈 + GEW_HEAVY_SNOW = 13 // 폭설 }; class CN3GERain; @@ -26,20 +26,20 @@ class CN3GlobalEffectMng : public CN3Base { // Attributes public: protected: - float m_fCellSize; // ũ - POINT m_CurCellPos; // μ ǥ - __Vector3 m_vPos[9]; // ֺ 9ĭ ߽ǥ + float m_fCellSize; // 내부 셀 크기 + POINT m_CurCellPos; // 현재 내부셀 좌표 + __Vector3 m_vPos[9]; // 주변 셀 9칸의 중심좌표들 - // ȿ.. - CN3GERain * m_pGERain; // - CN3GESnow * m_pGESnow; // + // 효과들.. + CN3GERain * m_pGERain; // 비 + CN3GESnow * m_pGESnow; // 눈 // Operations public: virtual void Release(); void Tick(); void Render(); - // void SetWeather(int iWeather); // ϱ + // void SetWeather(int iWeather); // 날씨 지정하기 void WeatherSetRainy(int iPercent); void WeatherSetSnow(int iPercent); void WeatherSetClean(); diff --git a/src/engine/N3Base/N3IME.cpp b/src/engine/N3Base/N3IME.cpp index a180229b..3ad11cdc 100644 --- a/src/engine/N3Base/N3IME.cpp +++ b/src/engine/N3Base/N3IME.cpp @@ -41,21 +41,21 @@ LRESULT CN3IME::IMEMessageProc(UINT nMsg, WPARAM wParam, LPARAM lParam) { return 0L; } switch (nMsg) { - case WM_IME_STARTCOMPOSITION: // . WM_IME_COMPOSITION ޽ // غ Ѵ. + case WM_IME_STARTCOMPOSITION: // 글자 조합의 시작. WM_IME_COMPOSITION 메시지를 // 받을 준비를 한다. OnIMEStartComposition(wParam, lParam); return TRUE; - case WM_IME_ENDCOMPOSITION: // . յ ڿ ó break; + case WM_IME_ENDCOMPOSITION: // 글자 조합의 끝. 조합된 문자열 처리를 끝낸다 break; OnIMEEndComposition(wParam, lParam); return TRUE; - case WM_IME_COMPOSITION: // ڿ̳ ϼ ڿ  ȭ + case WM_IME_COMPOSITION: // 현재 조합중인 문자열이나 완성된 문자열을 얻어서 화면 출력 return OnIMEComposition(wParam, lParam); - case WM_IME_SETCONTEXT: // ȯ 츦 ǥ ʰ ٲ + case WM_IME_SETCONTEXT: // 글자 조합 윈도우와 한자 변환 윈도우를 표시하지 않게 바꿈 OnIMESetContext(wParam, lParam); return TRUE; case WM_IME_NOTIFY: OnIMENotify(wParam, lParam); return TRUE; - case WM_INPUTLANGCHANGE: // Ű ̾ƿ ٲ IME ʱȭ + case WM_INPUTLANGCHANGE: // 키보드 레이아웃이 바뀌는 경우 IME를 초기화 OnInputLangChange(wParam, lParam); return TRUE; case WM_IME_CONTROL: @@ -203,7 +203,7 @@ BOOL CN3IME::GetResultString() { str = new char[len + 1]; ImmGetCompositionString(m_hIMC, GCS_RESULTSTR, str, len); str[len] = 0; - // ϼ óϱ + // 완성된 글자 처리하기 CN3UIEdit * pFocusedEdit = CN3UIBase::GetFocusedEdit(); if (pFocusedEdit) { pFocusedEdit->OnIMEResultString(str); @@ -238,7 +238,7 @@ BOOL CN3IME::GetCompString(LONG flag) { } } - // óϱ + // 조합중인 글자 처리하기 CN3UIEdit * pFocusedEdit = CN3UIBase::GetFocusedEdit(); if (pFocusedEdit) { pFocusedEdit->OnIMECompString(str); @@ -251,9 +251,9 @@ BOOL CN3IME::GetCompString(LONG flag) { delete[] str; } } else if (0 == len) { - // ѱԷ ٰ ̴. - // (Back Space ) - // (̷ 쿡 ̰ 0̴.) + // 한글입력이 들어오다가 지워진 경우이다. + // (Back Space가 들어 오는 경우) + // (이런 경우에는 길이가 0이다.) CN3UIEdit * pFocusedEdit = CN3UIBase::s_pFocusedEdit; if (pFocusedEdit) { pFocusedEdit->OnIMECompString(""); diff --git a/src/engine/N3Base/N3IMesh.cpp b/src/engine/N3Base/N3IMesh.cpp index 995e8583..debccf08 100644 --- a/src/engine/N3Base/N3IMesh.cpp +++ b/src/engine/N3Base/N3IMesh.cpp @@ -16,8 +16,8 @@ CN3IMesh::CN3IMesh() { m_nFC = 0; - m_pwVtxIndices = NULL; // ε Ʈ. - m_pwUVsIndices = NULL; // ؽó ǥ ε Ʈ. + m_pwVtxIndices = NULL; // 점 인덱스 리스트. + m_pwUVsIndices = NULL; // 텍스처 좌표 인덱스 리스트. m_nVC = m_nUVC = 0; m_pVertices = NULL; @@ -32,9 +32,9 @@ CN3IMesh::~CN3IMesh() { m_pfUVs = NULL; delete[] m_pwVtxIndices; - m_pwVtxIndices = NULL; // ε Ʈ. + m_pwVtxIndices = NULL; // 점 인덱스 리스트. delete[] m_pwUVsIndices; - m_pwUVsIndices = NULL; // ؽó ǥ ε Ʈ. + m_pwUVsIndices = NULL; // 텍스처 좌표 인덱스 리스트. // if(m_lpVB) m_lpVB->Release(); } @@ -52,9 +52,9 @@ void CN3IMesh::Release() { m_pfUVs = NULL; delete[] m_pwVtxIndices; - m_pwVtxIndices = NULL; // ε Ʈ. + m_pwVtxIndices = NULL; // 점 인덱스 리스트. delete[] m_pwUVsIndices; - m_pwUVsIndices = NULL; // ؽó ǥ ε Ʈ. + m_pwUVsIndices = NULL; // 텍스처 좌표 인덱스 리스트. // if(m_lpVB) m_lpVB->Release(); m_lpVB = NULL; @@ -87,7 +87,7 @@ bool CN3IMesh::Create(int nFC, int nVC, int nUVC) { if (nUVC > 0) { m_nUVC = nUVC; m_pfUVs = new float[nUVC * 2]; - memset(m_pfUVs, 0, 8 * nUVC); //  8 float 2 ׷.. + memset(m_pfUVs, 0, 8 * nUVC); // 사이즈가 8 인 이유는 float 2개라 그렇다.. m_pwUVsIndices = new WORD[nFC * 3]; memset(m_pwUVsIndices, 0, 2 * nFC * 3); // unsigned short } @@ -306,7 +306,7 @@ void CN3IMesh::RenderSelected() { vFace[1] = pVs[i * 3 + 1]; vFace[2] = pVs[i * 3 + 2]; vFace[3] = vFace[0]; - CN3Base::RenderLines(vFace, 3, 0xff00ff00); // .. + CN3Base::RenderLines(vFace, 3, 0xff00ff00); // 녹색으로 렌더링.. } } #endif // end of _N3TOOL @@ -334,7 +334,7 @@ bool CN3IMesh::Load(HANDLE hFile) { ReadFile(hFile, m_pwUVsIndices, 2 * nFC * 3, &dwRWC, NULL); // unsigned short } - this->FindMinMax(); // ּ ִ밪 ã´.. + this->FindMinMax(); // 최소 최대값을 찾는다.. return true; } @@ -371,7 +371,7 @@ void CN3IMesh::FindMinMax() { return; } - // ּ, ִ ã´. + // 최소, 최대 점을 찾는다. m_vMin.Set(FLT_MAX, FLT_MAX, FLT_MAX); m_vMax.Set(-FLT_MAX, -FLT_MAX, -FLT_MAX); for (int i = 0; i < m_nVC; i++) { diff --git a/src/engine/N3Base/N3IMesh.h b/src/engine/N3Base/N3IMesh.h index b488ef8f..f2a30ce6 100644 --- a/src/engine/N3Base/N3IMesh.h +++ b/src/engine/N3Base/N3IMesh.h @@ -13,18 +13,18 @@ class CN3IMesh : public CN3BaseFileAccess { static __VertexT1 s_Vertices[MAX_IMESH_BUFFER]; static __VertexT2 s_Vertices2[MAX_IMESH_BUFFER]; - int m_nFC; // ﰢ + int m_nFC; // 삼각형 갯수 int m_nVC; // Vertex Count - WORD * m_pwVtxIndices; // ε Ʈ. - int m_nUVC; // UV ǥ Count - WORD * m_pwUVsIndices; // ؽó ǥ ε Ʈ. + WORD * m_pwVtxIndices; // 점 인덱스 리스트. + int m_nUVC; // UV 좌표 Count + WORD * m_pwUVsIndices; // 텍스처 좌표 인덱스 리스트. - __VertexXyzNormal * m_pVertices; // ǥ Data - float * m_pfUVs; // UV Data - m_nUVC * 2 ŭ ҴѴ. + __VertexXyzNormal * m_pVertices; // 좌표 Data + float * m_pfUVs; // UV Data - m_nUVC * 2 만큼 할당한다. // LPDIRECT3DVERTEXBUFFER9 m_lpVB; - __Vector3 m_vMin, m_vMax; // ּ, ִ.. ϱ 뷫... + __Vector3 m_vMin, m_vMax; // 최소, 최대점.. 변하긴 하지만 대략적으로... public: #ifdef _N3TOOL @@ -36,8 +36,8 @@ class CN3IMesh : public CN3BaseFileAccess { __Vector3 Max() { return m_vMax; } void FindMinMax(); void Render(bool bUseTwoUV = false); - __VertexT1 * BuildVertexList(); // Vertex Buffer ٰ .. ÿ ι ʵ ǰ ʿ - __VertexT2 * BuildVertexListTwoUV(); // Vertex Buffer ٰ .. ÿ ι ʵ ǰ ʿ + __VertexT1 * BuildVertexList(); // Vertex Buffer 에다가 점을 만든다.. 동시에 두번 사용하지 않도록 주의가 필요 + __VertexT2 * BuildVertexListTwoUV(); // Vertex Buffer 에다가 점을 만든다.. 동시에 두번 사용하지 않도록 주의가 필요 int FaceCount() { return m_nFC; } int VertexCount() { return m_nVC; } @@ -63,7 +63,7 @@ class CN3IMesh : public CN3BaseFileAccess { } #endif // end of _N3TOOL - virtual bool Create(int nFC, int nVC, int nUVC); // ʴ Face Count, VertexCount, UV Count + virtual bool Create(int nFC, int nVC, int nUVC); // 차례대로 Face Count, VertexCount, UV Count bool Load(HANDLE hFile); #ifdef _N3TOOL bool Save(HANDLE hFile); @@ -73,7 +73,7 @@ class CN3IMesh : public CN3BaseFileAccess { CN3IMesh(); virtual ~CN3IMesh(); -// By : Ecli666 ( On 2002-07-23 5:31:41 ) +// By : Ecli666 ( On 2002-07-23 오후 5:31:41 ) // #ifdef _N3GAME void TickForShadow(bool bUseTwoUV = false); @@ -84,5 +84,5 @@ class CN3IMesh : public CN3BaseFileAccess { __Vector3 * m_pVertexT1; #endif - // ~(By Ecli666 On 2002-07-23 5:31:41 ) + // ~(By Ecli666 On 2002-07-23 오후 5:31:41 ) }; diff --git a/src/engine/N3Base/N3Joint.cpp b/src/engine/N3Base/N3Joint.cpp index 50c90c2c..55ea8bae 100644 --- a/src/engine/N3Base/N3Joint.cpp +++ b/src/engine/N3Base/N3Joint.cpp @@ -25,7 +25,7 @@ CN3Joint::~CN3Joint() { void CN3Joint::Release() { m_qOrient.Identity(); // Joint Orient Quaternion - m_KeyOrient.Release(); // Joint Orient Ű... NULL ̸ °Ŵ.. + m_KeyOrient.Release(); // Joint Orient 키값... NULL 이면 없는거다.. for (it_Joint it = m_Children.begin(), itEnd = m_Children.end(); it != itEnd; it++) { delete *it; @@ -114,7 +114,7 @@ void CN3Joint::Render(const __Matrix44 * pMtxParent, float fUnitSize) { s_lpD3DDev->SetMaterial(&smtl); s_lpD3DDev->SetTexture(0, NULL); - if (m_pParent) // θ ִ̾ .. + if (m_pParent) // 부모 관절과 이어주는 선.. { static __Vector3 v[2]; static __VertexColor vBone[2]; @@ -130,10 +130,10 @@ void CN3Joint::Render(const __Matrix44 * pMtxParent, float fUnitSize) { vBone[0].Set(v[0], 0xff00ff00); vBone[1].Set(v[1], 0xff0000ff); s_lpD3DDev->SetFVF(FVF_CV); - s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 1, vBone, sizeof(__VertexColor)); // ׸.. + s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 1, vBone, sizeof(__VertexColor)); // 선그리기.. } - // ڽ ׸.. + // 박스 그리기.. static __VertexColor vBoxes[36]; static __VertexColor vAxis[6]; static bool bBoxCreated = false; @@ -169,9 +169,9 @@ void CN3Joint::Render(const __Matrix44 * pMtxParent, float fUnitSize) { s_lpD3DDev->SetFVF(FVF_CV); s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtxBox); - s_lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 12, vBoxes, sizeof(__VertexColor)); // ڽ ׸.. + s_lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 12, vBoxes, sizeof(__VertexColor)); // 박스 그리기.. s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtxAxis); - s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 3, vAxis, sizeof(__VertexColor)); // ׸.. + s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 3, vAxis, sizeof(__VertexColor)); // 축 그리기.. if (dwZ) { s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, dwZ); @@ -259,7 +259,7 @@ void CN3Joint::NodeCount(int & nCount) { #ifdef _N3TOOL BOOL CN3Joint::FindPointerByName(const std::string & szName, - CN3Joint *& pJoint) // ̸ ش ͸ ش.. + CN3Joint *& pJoint) // 이름을 넣으면 해당 노드의 포인터를 돌려준다.. { if (szName.empty()) { pJoint = NULL; @@ -373,42 +373,42 @@ bool CN3Joint::TickAnimationKey(float fFrm) { void CN3Joint::ReCalcMatrix() { static __Matrix44 mtx; static __Quaternion qt; - // ڵ... + // 원래 행렬 계산 코드... // m_Matrix.Identity(); - // mtx.Rotation(m_vRot.x, m_vRot.y, m_vRot.z); m_Matrix *= mtx; // θ ŭ ȸ. - // mtx.Scale(m_vScale); m_Matrix *= mtx; // θ ŭ ȸ. - // mtx.Rotation(m_vOrigin.x, m_vOrigin.y, m_vOrigin.z); m_Matrix *= mtx; // θ ŭ ȸ. - // mtx.Identity(); mtx.PosSet(m_vPos); m_Matrix *= mtx; // ̵ + // mtx.Rotation(m_vRot.x, m_vRot.y, m_vRot.z); m_Matrix *= mtx; // 부모 축 만큼 회전. + // mtx.Scale(m_vScale); m_Matrix *= mtx; // 부모 축 만큼 회전. + // mtx.Rotation(m_vOrigin.x, m_vOrigin.y, m_vOrigin.z); m_Matrix *= mtx; // 부모 로컬 축 만큼 회전. + // mtx.Identity(); mtx.PosSet(m_vPos); m_Matrix *= mtx; // 이동 // if(m_RotSeq == ROT_SEQ_XYZ) // { - // m_Matrix.Rotation(m_vRot.x, m_vRot.y, m_vRot.z); // θ ŭ ȸ. // XYZ ȸ϶.. + // m_Matrix.Rotation(m_vRot.x, m_vRot.y, m_vRot.z); // 부모 축 만큼 회전. // XYZ 회전일때.. // } // else if(ROT_SEQ_YXZ) // { // m_Matrix.Identity(); - // mtx.RotationY(m_vRot.y); m_Matrix *= mtx; // YXZ ȸ϶ + // mtx.RotationY(m_vRot.y); m_Matrix *= mtx; // YXZ 회전일때 // mtx.RotationX(m_vRot.x); m_Matrix *= mtx; // mtx.RotationZ(m_vRot.z); m_Matrix *= mtx; // } - if (m_KeyOrient.Count() > 0) // Orient Ű .. + if (m_KeyOrient.Count() > 0) // Orient 키값이 있으면.. { qt = m_qRot * m_qOrient; - ::D3DXMatrixRotationQuaternion(&m_Matrix, &qt); // ȸ.. ʹϾ .. + ::D3DXMatrixRotationQuaternion(&m_Matrix, &qt); // 회전.. 쿼터니언 계산.. } else { - ::D3DXMatrixRotationQuaternion(&m_Matrix, &m_qRot); // ȸ.. ʹϾ .. + ::D3DXMatrixRotationQuaternion(&m_Matrix, &m_qRot); // 회전.. 쿼터니언 계산.. } - if (1.0f != m_vScale.x || 1.0f != m_vScale.y || 1.0f != m_vScale.z) // .. + if (1.0f != m_vScale.x || 1.0f != m_vScale.y || 1.0f != m_vScale.z) // 스케일 값이 있으면.. { - mtx.Scale(m_vScale); // + mtx.Scale(m_vScale); // 스케일 m_Matrix *= mtx; } m_Matrix.PosSet(m_vPos); if (m_pParent) { - m_Matrix *= m_pParent->m_Matrix; // θ + m_Matrix *= m_pParent->m_Matrix; // 부모 행렬 } } @@ -457,7 +457,7 @@ void CN3Joint::ReCalcMatrixBlended(float fFrm0, float fFrm1, float fWeight0) { m_qOrient.Slerp(qt1, qt2, fWeight1); } - this->ReCalcMatrix(); // Matrix ... + this->ReCalcMatrix(); // Matrix 계산... } #ifdef _N3TOOL @@ -499,11 +499,11 @@ void CN3Joint::KeyDelete(CN3Joint * pJoint, int nKS, int nKE) { } } - // Child ٽ ش. + // Child 를 다시 만들어 준다. int nCC = pJoint->ChildCount(); for (int i = 0; i < nCC; i++) { CN3Joint * pChild = pJoint->Child(i); - pChild->KeyDelete(pChild, nKS, nKE); // Ʈ .. + pChild->KeyDelete(pChild, nKS, nKE); // 하위 조인트를 복사.. } } #endif // end of _N3TOOL @@ -523,12 +523,12 @@ void CN3Joint::AddKey(CN3Joint * pJSrc, int nIndexS, int nIndexE) { CN3Joint * pChildSrc = *it; CN3Joint * pChildDest = *it2; - pChildDest->AddKey(pChildSrc, nIndexS, nIndexE); // ȣ + pChildDest->AddKey(pChildSrc, nIndexS, nIndexE); // 재귀호출 } } #endif // end of _N3TOOL -// ȸ +// 회전값등을 #ifdef _N3TOOL void CN3Joint::CopyExceptAnimationKey(CN3Joint * pJSrc) { this->Release(); @@ -567,10 +567,10 @@ void CN3Joint::CopyExceptAnimationKey(CN3Joint * pJSrc) { itEnd = pJSrc->m_Children.end(); for (; it != itEnd; it++) { CN3Joint * pChildDest = new CN3Joint(); - this->ChildAdd(pChildDest); // ڽ ߰.. + this->ChildAdd(pChildDest); // 자식 추가.. CN3Joint * pChildSrc = *it; - pChildDest->CopyExceptAnimationKey(pChildSrc); // ȣ + pChildDest->CopyExceptAnimationKey(pChildSrc); // 재귀호출 } } #endif // end of _N3TOOL diff --git a/src/engine/N3Base/N3Joint.h b/src/engine/N3Base/N3Joint.h index f4bf3dbf..8c97fc98 100644 --- a/src/engine/N3Base/N3Joint.h +++ b/src/engine/N3Base/N3Joint.h @@ -15,10 +15,10 @@ typedef typename std::list::iterator it_Joint; const int MAX_JOINT_TRANSFORM = 64; class CN3Joint : public CN3Transform { - friend class CN3Joint; // Position, Rotation, Scale Ӱ ٷ ־ Ѵ.. + friend class CN3Joint; // Position, Rotation, Scale 값들을 자유롭게 다룰수 있어야 한다.. public: __Quaternion m_qOrient; // Joint Orient Quaternion - CN3AnimKey m_KeyOrient; // Joint Orient Ű... NULL ̸ °Ŵ.. + CN3AnimKey m_KeyOrient; // Joint Orient 키값... NULL 이면 없는거다.. protected: CN3Joint * m_pParent; @@ -58,7 +58,7 @@ class CN3Joint : public CN3Transform { #ifdef _N3TOOL BOOL FindIndex(const std::string & szName, int & nIndex); BOOL FindPointerByName(const std::string & szName, - CN3Joint *& pJoint); // ̸ ش ͸ ش.. + CN3Joint *& pJoint); // 이름을 넣으면 해당 노드의 포인터를 돌려준다.. void RotSet(const __Quaternion & qtRot) { m_qRot = qtRot; this->ReCalcMatrix(); diff --git a/src/engine/N3Base/N3Light.cpp b/src/engine/N3Base/N3Light.cpp index 87914819..9b1e82ec 100644 --- a/src/engine/N3Base/N3Light.cpp +++ b/src/engine/N3Base/N3Light.cpp @@ -25,9 +25,9 @@ bool CN3Light::Load(HANDLE hFile) { CN3Transform::Load(hFile); DWORD dwRWC; - ReadFile(hFile, &m_Data, sizeof(m_Data), &dwRWC, NULL); // Ʈ . + ReadFile(hFile, &m_Data, sizeof(m_Data), &dwRWC, NULL); // 라이트 세팅. - __ASSERT(m_Data.nNumber >= 0 && m_Data.nNumber < 8, "Light Loading Warning - Light ȣ ϴ."); + __ASSERT(m_Data.nNumber >= 0 && m_Data.nNumber < 8, "Light Loading Warning - Light 번호가 범위를 벗어났습니다."); return true; } @@ -37,7 +37,7 @@ bool CN3Light::Save(HANDLE hFile) { CN3Transform::Save(hFile); DWORD dwRWC; - WriteFile(hFile, &m_Data, sizeof(m_Data), &dwRWC, NULL); // Ʈ . + WriteFile(hFile, &m_Data, sizeof(m_Data), &dwRWC, NULL); // 라이트 세팅. return true; } diff --git a/src/engine/N3Base/N3Light.h b/src/engine/N3Base/N3Light.h index c719f0b0..2bb11635 100644 --- a/src/engine/N3Base/N3Light.h +++ b/src/engine/N3Base/N3Light.h @@ -10,14 +10,14 @@ class CN3Light : public CN3Transform { public: typedef struct __Light : public _D3DLIGHT9 { public: - BOOL bOn; // Ʈ ִ.. + BOOL bOn; // 라이트가 켜져 있는지.. int nNumber; // 0 ~ 8 void Zero() { memset(this, 0, sizeof(__Light)); } void InitPoint(int nLgtNumber, const D3DXVECTOR3 & dvPos, const D3DCOLORVALUE & ltColor, float fRange = 10000.0f, float fAttenuation = 0.5f) { this->Zero(); - nNumber = nLgtNumber; // Ʈ ȣ.. + nNumber = nLgtNumber; // 라이트 번호.. Type = D3DLIGHT_POINT; Position = dvPos; //Specular = @@ -26,12 +26,12 @@ class CN3Light : public CN3Transform { Ambient.g = ltColor.g * 0.7f; Ambient.b = ltColor.b * 0.7f; - Falloff = 1.0f; // ȿ ̹ϰ ϱ ɸ 1.0 . + Falloff = 1.0f; // 효과가 미미하고 부하기 걸리기 때문에 보통 1.0으로 쓴다. if (fRange < 0.0001f) { fRange = 0.0001f; } Attenuation0 = 1.0f - fAttenuation; - Attenuation1 = fAttenuation / fRange; // . Ȯϰ 谡 ǵ Ѵ.. + Attenuation1 = fAttenuation / fRange; // 감쇠 범위계산. 범위의 절반이 정확하게 절반의 감쇠가 되도록 한다.. Attenuation2 = fAttenuation / (fRange * fRange); Range = fRange * 4.0f; bOn = TRUE; @@ -39,7 +39,7 @@ class CN3Light : public CN3Transform { void InitDirection(int nLgtNumber, const D3DXVECTOR3 & dvDir, const D3DCOLORVALUE & ltColor) { this->Zero(); - nNumber = nLgtNumber; // Ʈ ȣ.. + nNumber = nLgtNumber; // 라이트 번호.. bOn = TRUE; Type = D3DLIGHT_DIRECTIONAL; @@ -54,7 +54,7 @@ class CN3Light : public CN3Transform { void InitSpot(int nLgtNumber, const D3DXVECTOR3 & dvPos, const D3DXVECTOR3 & dvDir, const D3DCOLORVALUE & ltColor, float fTheta, float fPhi, float fRange = 10000.0f) { this->Zero(); - nNumber = nLgtNumber; // Ʈ ȣ.. + nNumber = nLgtNumber; // 라이트 번호.. Type = D3DLIGHT_SPOT; Position = dvPos; Direction = dvDir; @@ -68,10 +68,10 @@ class CN3Light : public CN3Transform { fRange = 0.0001f; } Attenuation0 = 1.0f; - Attenuation1 = 1.0f / (fRange / 2.0f); // . Ȯϰ 谡 ǵ Ѵ.. + Attenuation1 = 1.0f / (fRange / 2.0f); // 감쇠 범위계산. 범위의 절반이 정확하게 절반의 감쇠가 되도록 한다.. Range = fRange; - Falloff = 1.0f; // ȿ ̹ϰ ϱ ɸ 1.0 . + Falloff = 1.0f; // 효과가 미미하고 부하기 걸리기 때문에 보통 1.0으로 쓴다. Theta = fTheta; Phi = fPhi; bOn = TRUE; @@ -96,8 +96,8 @@ class CN3Light : public CN3Transform { m_vPos = m_Data.Position; } - void Apply(); // õ Ʈ D3DDevice - void Tick(float fFrm = FRAME_SELFPLAY); // Ʈ Ѵ.. + void Apply(); // 세팅된 라이트값을 실제 D3DDevice 에 적용 + void Tick(float fFrm = FRAME_SELFPLAY); // 라이트값만 세팅한다.. bool Load(HANDLE hFile); #ifdef _N3TOOL diff --git a/src/engine/N3Base/N3Mesh.cpp b/src/engine/N3Base/N3Mesh.cpp index db129161..16e9a0be 100644 --- a/src/engine/N3Base/N3Mesh.cpp +++ b/src/engine/N3Base/N3Mesh.cpp @@ -20,8 +20,8 @@ CN3Mesh::CN3Mesh() { m_nVC = 0; m_nIC = 0; - m_pVertices = NULL; // - m_psnIndices = NULL; // ε + m_pVertices = NULL; // 점 버퍼 + m_psnIndices = NULL; // 인덱스 버퍼 } CN3Mesh::~CN3Mesh() { @@ -61,16 +61,16 @@ bool CN3Mesh::Load(HANDLE hFile) { DWORD dwRWC = 0; - ReadFile(hFile, &m_nVC, 4, &dwRWC, NULL); // б.. + ReadFile(hFile, &m_nVC, 4, &dwRWC, NULL); // 점갯수 읽기.. if (m_nVC > 0) { - this->Create(m_nVC, 0); // Vertex Buffer ä + this->Create(m_nVC, 0); // Vertex Buffer 생성 및 데이터 채우기 ReadFile(hFile, m_pVertices, m_nVC * sizeof(__VertexT1), &dwRWC, NULL); - this->FindMinMax(); // ִ, ּҰ ã´. + this->FindMinMax(); // 최대, 최소값을 찾는다. } - ReadFile(hFile, &m_nIC, 4, &dwRWC, NULL); // ε б.. + ReadFile(hFile, &m_nIC, 4, &dwRWC, NULL); // 인덱스 갯수 읽기.. if (m_nIC > 0) { - this->Create(0, m_nIC); // ε ä + this->Create(0, m_nIC); // 인덱스 버퍼 생성 및 데이터 채우기 ReadFile(hFile, m_psnIndices, m_nIC * 2, &dwRWC, NULL); } @@ -81,12 +81,12 @@ bool CN3Mesh::Load(HANDLE hFile) { bool CN3Mesh::Save(HANDLE hFile) { DWORD dwRWC = 0; - WriteFile(hFile, &m_nVC, 4, &dwRWC, NULL); // б.. + WriteFile(hFile, &m_nVC, 4, &dwRWC, NULL); // 점갯수 읽기.. if (m_nVC > 0) { WriteFile(hFile, m_pVertices, m_nVC * sizeof(__VertexT1), &dwRWC, NULL); } - WriteFile(hFile, &m_nIC, 4, &dwRWC, NULL); // ε б.. + WriteFile(hFile, &m_nIC, 4, &dwRWC, NULL); // 인덱스 갯수 읽기.. if (m_nIC > 0) { WriteFile(hFile, m_psnIndices, m_nIC * 2, &dwRWC, NULL); } @@ -142,7 +142,7 @@ void CN3Mesh::MakeIndexed() { #endif // end of _N3TOOL void CN3Mesh::Create(int nVC, int nIC) { - if (nVC > 0) // ... + if (nVC > 0) // 점이 있으면... { #ifdef _N3GAME if (nVC > 32768) { @@ -153,11 +153,11 @@ void CN3Mesh::Create(int nVC, int nIC) { this->ReleaseVertices(); } m_pVertices = new __VertexT1[nVC]; - memset(m_pVertices, 0, nVC * sizeof(__VertexT1)); // Vertex Buffer + memset(m_pVertices, 0, nVC * sizeof(__VertexT1)); // Vertex Buffer 생성 m_nVC = nVC; } - if (nIC > 0) // Mesh ε ϰ, ε .. + if (nIC > 0) // Mesh 로딩에 성공하고, 인덱스가 있으면.. { #ifdef _N3GAME if (nIC > 32768) { @@ -168,7 +168,7 @@ void CN3Mesh::Create(int nVC, int nIC) { this->ReleaseIndices(); } m_psnIndices = new WORD[nIC]; - memset(m_psnIndices, 0, nIC * 2); // Index Buffer + memset(m_psnIndices, 0, nIC * 2); // Index Buffer 생성 m_nIC = nIC; } } @@ -181,7 +181,7 @@ void CN3Mesh::FindMinMax() { return; } - // ּ, ִ ã´. + // 최소, 최대 점을 찾는다. m_vMin.Set(FLT_MAX, FLT_MAX, FLT_MAX); m_vMax.Set(-FLT_MAX, -FLT_MAX, -FLT_MAX); @@ -215,7 +215,7 @@ void CN3Mesh::Create_Cube(const __Vector3 & vMin, const __Vector3 & vMax) { __Vector3 vN; float fTUVs[6][2] = {0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1}; - // z + // z 축 음의 면 vN.Set(0, 0, -1); vPs[0].Set(vMin.x, vMax.y, vMin.z); vPs[1].Set(vMax.x, vMax.y, vMin.z); @@ -227,7 +227,7 @@ void CN3Mesh::Create_Cube(const __Vector3 & vMin, const __Vector3 & vMax) { m_pVertices[0 + i].Set(vPs[i], vN, fTUVs[i][0], fTUVs[i][1]); } - // x + // x 축 양의 면 vN.Set(1, 0, 0); vPs[0].Set(vMax.x, vMax.y, vMin.z); vPs[1].Set(vMax.x, vMax.y, vMax.z); @@ -239,7 +239,7 @@ void CN3Mesh::Create_Cube(const __Vector3 & vMin, const __Vector3 & vMax) { m_pVertices[6 + i].Set(vPs[i], vN, fTUVs[i][0], fTUVs[i][1]); } - // z + // z 축 양의 면 vN.Set(0, 0, 1); vPs[0].Set(vMax.x, vMax.y, vMax.z); vPs[1].Set(vMin.x, vMax.y, vMax.z); @@ -251,7 +251,7 @@ void CN3Mesh::Create_Cube(const __Vector3 & vMin, const __Vector3 & vMax) { m_pVertices[12 + i].Set(vPs[i], vN, fTUVs[i][0], fTUVs[i][1]); } - // x + // x 축 음의 면 vN.Set(-1, 0, 0); vPs[0].Set(vMin.x, vMax.y, vMax.z); vPs[1].Set(vMin.x, vMax.y, vMin.z); @@ -263,7 +263,7 @@ void CN3Mesh::Create_Cube(const __Vector3 & vMin, const __Vector3 & vMax) { m_pVertices[18 + i].Set(vPs[i], vN, fTUVs[i][0], fTUVs[i][1]); } - // y + // y 축 양의 면 vN.Set(0, 1, 0); vPs[0].Set(vMin.x, vMax.y, vMax.z); vPs[1].Set(vMax.x, vMax.y, vMax.z); @@ -275,7 +275,7 @@ void CN3Mesh::Create_Cube(const __Vector3 & vMin, const __Vector3 & vMax) { m_pVertices[24 + i].Set(vPs[i], vN, fTUVs[i][0], fTUVs[i][1]); } - // y + // y 축 음의 면 vN.Set(0, -1, 0); vPs[0].Set(vMin.x, vMin.y, vMin.z); vPs[1].Set(vMax.x, vMin.y, vMin.z); @@ -296,7 +296,7 @@ void CN3Mesh::Create_Axis(float fLength) { this->FindMinMax(); - // x + // x 축 // m_pVertices[0].Set(-fLength/2.0f, 0, 0, 0, 1, 0, 0, 0); // m_pVertices[1].Set( fLength/2.0f, 0, 0, 0, 1, 0, 0, 0); // m_pVertices[2] = m_pVertices[1]; @@ -313,13 +313,13 @@ void CN3Mesh::Create_Axis(float fLength) { __Matrix44 mtx; - // y + // y 축 mtx.RotationZ(D3DX_PI / -2.0f); for (int i = 0; i < 4; i++) { m_pVertices[4 + i].Set(m_pVertices[i] * mtx, m_pVertices[i].n * mtx, 0, 0); } - // z + // z 축 mtx.RotationY(D3DX_PI / -2.0f); for (int i = 0; i < 4; i++) { m_pVertices[8 + i].Set(m_pVertices[i] * mtx, m_pVertices[i].n * mtx, 0, 0); @@ -335,23 +335,23 @@ bool CN3Mesh::Import(CN3PMesh * pPMesh) { if (0 >= iNumIndices) { return false; } - Release(); // ʱȭ + Release(); // 초기화 - // pmesh instance lod ְ · + // pmesh instance를 만들고 lod를 최고 상태로 조정 CN3PMeshInstance PMeshInstance; PMeshInstance.Create(pPMesh); PMeshInstance.SetLODByNumVertices(pPMesh->GetMaxNumVertices()); - // vertex, index buffer + // vertex, index buffer 만들기 Create(PMeshInstance.GetNumVertices(), PMeshInstance.GetNumIndices()); - // vertex index buffer + // vertex index buffer 복사 __VertexT1 * pVertices = PMeshInstance.GetVertices(); WORD * pIndices = PMeshInstance.GetIndices(); memcpy(m_pVertices, pVertices, sizeof(__VertexT1) * m_nVC); memcpy(m_psnIndices, pIndices, sizeof(WORD) * m_nIC); - m_szName = pPMesh->m_szName; // ̸.. + m_szName = pPMesh->m_szName; // 이름.. return true; } @@ -372,13 +372,13 @@ bool CN3Mesh::Import(CN3IMesh * pIMesh) { memcpy(m_pVertices, pvSrc, sizeof(__VertexT1) * nFC * 3); __Vector3 v0, v1, v2, vN(0, 0, 0); - for (int i = 0; i < nFC; i++) // Normal ٽ .. + for (int i = 0; i < nFC; i++) // Normal 값 다시 세팅.. { v0 = m_pVertices[i * 3 + 0]; v1 = m_pVertices[i * 3 + 1]; v2 = m_pVertices[i * 3 + 2]; - vN.Cross(v1 - v0, v2 - v1); // Normal ϰ... + vN.Cross(v1 - v0, v2 - v1); // Normal 값을 계산하고... vN.Normalize(); m_pVertices[i * 3 + 0].n = vN; @@ -386,7 +386,7 @@ bool CN3Mesh::Import(CN3IMesh * pIMesh) { m_pVertices[i * 3 + 2].n = vN; } - m_szName = pIMesh->m_szName; // ̸.. + m_szName = pIMesh->m_szName; // 이름.. return true; } @@ -421,7 +421,7 @@ void CN3Mesh::ReGenerateSmoothNormal() { } if (m_pVertices[i] == v0 || m_pVertices[i] == v1 || m_pVertices[i] == v2) { - vN.Cross(v1 - v0, v2 - v1); // Normal ϰ... + vN.Cross(v1 - v0, v2 - v1); // Normal 값을 계산하고... vN.Normalize(); pnNs[i]++; diff --git a/src/engine/N3Base/N3Mesh.h b/src/engine/N3Base/N3Mesh.h index 203fe737..efcfd25f 100644 --- a/src/engine/N3Base/N3Mesh.h +++ b/src/engine/N3Base/N3Mesh.h @@ -11,11 +11,11 @@ class CN3PMesh; class CN3Mesh : public CN3BaseFileAccess { protected: - __VertexT1 * m_pVertices; // - WORD * m_psnIndices; // ε + __VertexT1 * m_pVertices; // 점 버퍼 + WORD * m_psnIndices; // 인덱스 버퍼 - int m_nVC; // - int m_nIC; // + int m_nVC; // 점 갯수 + int m_nIC; // 점 갯수 __Vector3 m_vMin, m_vMax; public: @@ -26,7 +26,7 @@ class CN3Mesh : public CN3BaseFileAccess { int VertexCount() { return m_nVC; } __VertexT1 * Vertices() { return m_pVertices; } int IndexCount() { return m_nIC; } - WORD * Indices() { return m_psnIndices; } // ε + WORD * Indices() { return m_psnIndices; } // 인덱스 버퍼 bool Load(HANDLE hFile); diff --git a/src/engine/N3Base/N3Mng.h b/src/engine/N3Base/N3Mng.h index 08adb683..7774f14a 100644 --- a/src/engine/N3Base/N3Mng.h +++ b/src/engine/N3Base/N3Mng.h @@ -54,7 +54,7 @@ template class CN3Mng { #ifdef _N3GAME CLogWriter::Write("CN3Mng::Add - duplicated object's file name."); #endif - m_Refs.erase(pairRef.first); // īƮ .. + m_Refs.erase(pairRef.first); // 참조 카운트 지우고.. return -1; } @@ -91,44 +91,44 @@ template class CN3Mng { T * pData = NULL; it_Data it = m_Datas.find(szFN2); - if (it == m_Datas.end()) // ãҴ.. + if (it == m_Datas.end()) // 못 찾았다.. { pData = new T(); - pData->m_iLOD = iLOD; // ε LOD + pData->m_iLOD = iLOD; // 로딩시 LOD 적용 - if (false == pData->LoadFromFile(szFN2)) // б⿡ ߴ!! + if (false == pData->LoadFromFile(szFN2)) // 파일 읽기에 실패했다!! { delete pData; pData = NULL; } else { - int reChk = Add(pData); // б ϸ ߰.. + int reChk = Add(pData); // 읽기 성공하면 추가.. // asm - if (reChk == -1) // ߰ Ͱ ־ īƮ ϳ Ѵ + if (reChk == -1) // 추가시 전에 데이터가 있어 참조 카운트를 하나 더한다 { - T * pBakData = pData; // Ÿ ޾ (ο ׸ ٲ ִ) + T * pBakData = pData; // 같은 파일중 전 데이타를 받아 리턴(새로운 그림으로 바뀌지 않을수 있다) it_Data it = m_Datas.find(pBakData->FileName()); pData = (*it).second; if (bIncreaseRefCount) { it_Ref it2 = m_Refs.find(pData); - if (it2 != m_Refs.end()) // īƮ ã.. + if (it2 != m_Refs.end()) // 참조 카운트 찾기.. { ((*it2).second)++; } } - delete pBakData; // ̹ Ÿ ʿ䰡 Ƿ + delete pBakData; // 이번에 읽은 데이타는 필요가 없으므로 지움 pBakData = NULL; } // asm } - } else // ãҴ..!! + } else // 찾았다..!! { pData = (*it).second; if (bIncreaseRefCount) { it_Ref it2 = m_Refs.find(pData); - if (it2 != m_Refs.end()) // īƮ ã.. + if (it2 != m_Refs.end()) // 참조 카운트 찾기.. { ((*it2).second)++; } @@ -148,11 +148,11 @@ template class CN3Mng { } else { return false; } - } // ֳ ~ + } // 있나 없나~ void Delete(T ** ppData, bool bReleaseOrg = true) { #ifndef _N3GAME - bReleaseOrg = true; // + bReleaseOrg = true; // 툴에서는 무조건 #endif if (NULL == ppData || NULL == *ppData) { return; @@ -160,11 +160,11 @@ template class CN3Mng { it_Data it = m_Datas.find((*ppData)->FileName()); if (it == m_Datas.end()) { - return; // ãҴ.. - } else // ãҴ..!! + return; // 못 찾았다.. + } else // 찾았다..!! { it_Ref it2 = m_Refs.find(*ppData); - if (bReleaseOrg && it2 != m_Refs.end()) // īƮ ã.. + if (bReleaseOrg && it2 != m_Refs.end()) // 참조 카운트 찾기.. { ((*it2).second)--; if (0 == (*it2).second) { diff --git a/src/engine/N3Base/N3Moon.cpp b/src/engine/N3Base/N3Moon.cpp index 9b06b5da..f3b2340d 100644 --- a/src/engine/N3Base/N3Moon.cpp +++ b/src/engine/N3Base/N3Moon.cpp @@ -46,7 +46,7 @@ void CN3Moon::Init(const std::string & szTexFN) { } void CN3Moon::Render(__Matrix44 & matView, __Matrix44 & matProj) { - // ׷ ȭ ǥ ϱ (2D ׸ ְǾ ̴° ) + // 달이 그려지는 화면 좌표 계산하기 (2D로 그리는 이유는 달이 왜곡되어서 보이는것을 막기 위해) __Matrix44 matWorld; matWorld.RotationZ(m_fCurRadian); __Matrix44 matFinal; @@ -65,7 +65,7 @@ void CN3Moon::Render(__Matrix44 & matView, __Matrix44 & matProj) { float fRHW = 1.0f / vOut.w; vMoon.z = vOut.z * fRHW; if (vMoon.z < 0.0f || vMoon.z > 1.0f) { - return; // ȭ ڿ ׷. + return; // 화면 뒤에 그려진다. } // Mapping Screen Coordinate. vMoon.x = X + int((vOut.x * fRHW + 1.0f) * Width * 0.5f); @@ -76,10 +76,10 @@ void CN3Moon::Render(__Matrix44 & matView, __Matrix44 & matProj) { SetRect(&rcMoon, vMoon.x - iMoonSize, vMoon.y - iMoonSize, vMoon.x + iMoonSize, vMoon.y + iMoonSize); // clipping with screen. if (rcMoon.right < X || rcMoon.bottom < Y || rcMoon.left > X + Width || rcMoon.top > Y + Height) { - return; // ȭ ۿ ׷. + return; // 화면 밖에 그려진다. } - // 2D ׸ + // 2D로 그리기 m_pVertices[0].x = rcMoon.left; m_pVertices[0].y = rcMoon.top; m_pVertices[1].x = rcMoon.right; diff --git a/src/engine/N3Base/N3Moon.h b/src/engine/N3Base/N3Moon.h index fb4cd8aa..88c9f452 100644 --- a/src/engine/N3Base/N3Moon.h +++ b/src/engine/N3Base/N3Moon.h @@ -23,15 +23,15 @@ class CN3Moon : public CN3Base { protected: __VertexTransformed m_pVertices[4]; CN3Texture * m_pTexture; - float m_fCurRadian; // ȸġ - float m_fMoonRatio; // pixel - int m_iMoonPhaseIndex; // ε 0~23; + float m_fCurRadian; // 현재 달의 회전위치 + float m_fMoonRatio; // 달의 pixel싸이즈 + int m_iMoonPhaseIndex; // 달의 모양 인덱스 0~23; // Operations public: void Init(const std::string & szTexFN); - void SetMoonPhase(int iIndex); // - void SetCurAngle(float fAngle) { m_fCurRadian = D3DXToRadian(fAngle); } // + void SetMoonPhase(int iIndex); // 달의 모양 설정 + void SetCurAngle(float fAngle) { m_fCurRadian = D3DXToRadian(fAngle); } // 현재 각도설정 void Render(__Matrix44 & matView, __Matrix44 & matProj); void Release(); diff --git a/src/engine/N3Base/N3PMesh.cpp b/src/engine/N3Base/N3PMesh.cpp index 3c9c3d78..27aaa2e0 100644 --- a/src/engine/N3Base/N3PMesh.cpp +++ b/src/engine/N3Base/N3PMesh.cpp @@ -167,10 +167,10 @@ bool CN3PMesh::Load(HANDLE hFile) { if (m_iNumCollapses > 0) { m_pCollapses = new __EdgeCollapse [m_iNumCollapses + - 1]; // +1 : PMeshInstance::SplitOne() Լ εϰ Ͱ 輱 Ű ؾ ϴ 찡 ־. + 1]; // +1을 한 이유 : PMeshInstance::SplitOne() 함수에서 부득이하게 포인터가 경계선을 가르키게 해야 하는 경우가 있어서. ReadFile(hFile, m_pCollapses, m_iNumCollapses * sizeof(__EdgeCollapse), &dwNum, NULL); ZeroMemory(m_pCollapses + m_iNumCollapses, - sizeof(__EdgeCollapse)); // +1 . Ÿ ʱȭ ص + sizeof(__EdgeCollapse)); // 위의 +1을 한이유와 같음. 만약을 대비해 마지막 데이타를 초기화 해둠 bool bFixed = false; for (int i = 0; i < m_iNumCollapses; i++) { @@ -181,7 +181,7 @@ bool CN3PMesh::Load(HANDLE hFile) { } #ifdef _DEBUG if (bFixed) { - ::MessageBox(s_hWndBase, "߸ Progressive Mesh ", m_szName.c_str(), MB_OK); + ::MessageBox(s_hWndBase, "잘못된 Progressive Mesh 수정", m_szName.c_str(), MB_OK); } #endif } @@ -248,7 +248,7 @@ bool CN3PMesh::Save(HANDLE hFile) { if (m_iNumCollapses > 0) { for (int i = 0; i < m_iNumCollapses; i++) { if (m_pCollapses[i].iIndexChanges < 0) { - m_pCollapses[i].iIndexChanges = 0; // .. + m_pCollapses[i].iIndexChanges = 0; // 저장.. } } WriteFile(hFile, m_pCollapses, m_iNumCollapses * sizeof(__EdgeCollapse), &dwNum, NULL); @@ -274,7 +274,7 @@ void CN3PMesh::FindMinMax() { return; } - // ּ, ִ ã´. + // 최소, 최대 점을 찾는다. m_vMin.Set(FLT_MAX, FLT_MAX, FLT_MAX); m_vMax.Set(-FLT_MAX, -FLT_MAX, -FLT_MAX); @@ -329,7 +329,7 @@ void CN3PMesh::FindMinMax() { } #endif - // ִ ּҰ Ѵ.. + // 최대 최소값을 갖고 반지름 계산한다.. m_fRadius = (m_vMax - m_vMin).Magnitude() * 0.5f; } @@ -361,10 +361,10 @@ void CN3PMesh::CopyMesh(CN3PMesh * pSrcPMesh) { if (m_iNumCollapses > 0) { m_pCollapses = new __EdgeCollapse [m_iNumCollapses + - 1]; // +1 : PMeshInstance::SplitOne() Լ εϰ Ͱ 輱 Ű ؾ ϴ 찡 ־. + 1]; // +1을 한 이유 : PMeshInstance::SplitOne() 함수에서 부득이하게 포인터가 경계선을 가르키게 해야 하는 경우가 있어서. CopyMemory(m_pCollapses, pSrcPMesh->m_pCollapses, sizeof(__EdgeCollapse) * m_iNumCollapses); ZeroMemory(m_pCollapses + m_iNumCollapses, - sizeof(__EdgeCollapse)); // +1 . Ÿ ʱȭ ص + sizeof(__EdgeCollapse)); // 위의 +1을 한이유와 같음. 만약을 대비해 마지막 데이타를 초기화 해둠 } hr = Create(m_iMaxNumVertices, m_iMaxNumIndices); @@ -522,7 +522,7 @@ void CN3PMesh::LODCtrlSet(__LODCtrlValue * pLODCtrls, int nCount) { m_pLODCtrlValues = new __LODCtrlValue[nCount]; memcpy(m_pLODCtrlValues, pLODCtrls, sizeof(__LODCtrlValue) * nCount); - // Ÿ + // 거리에 따라 정렬 qsort(m_pLODCtrlValues, m_iLODCtrlValueCount, sizeof(__LODCtrlValue), SortByDistance); } } @@ -550,7 +550,7 @@ void CN3PMesh::ReGenerateSmoothNormal() { } CN3PMeshInstance PMI(this); - PMI.SetLODByNumVertices(m_iMaxNumVertices); // ִ ϰ.. + PMI.SetLODByNumVertices(m_iMaxNumVertices); // 최대 점으로 세팅하고.. int nIC = PMI.GetNumIndices(); // Index Count... WORD * pwIndices = PMI.GetIndices(); // Index ... @@ -569,7 +569,7 @@ void CN3PMesh::ReGenerateSmoothNormal() { v2 = m_pVertices[pwIndices[j * 3 + 2]]; if (m_pVertices[i] == v0 || m_pVertices[i] == v1 || m_pVertices[i] == v2) { - vN.Cross(v1 - v0, v2 - v1); // Normal ϰ... + vN.Cross(v1 - v0, v2 - v1); // Normal 값을 계산하고... vN.Normalize(); pnNs[i]++; @@ -594,7 +594,7 @@ void CN3PMesh::ReGenerateSharpNormal() { } CN3PMeshInstance PMI(this); - PMI.SetLODByNumVertices(m_iMaxNumVertices); // ִ ϰ.. + PMI.SetLODByNumVertices(m_iMaxNumVertices); // 최대 점으로 세팅하고.. int nIC = PMI.GetNumIndices(); // Index Count... WORD * pwIndices = PMI.GetIndices(); // Index ... @@ -605,7 +605,7 @@ void CN3PMesh::ReGenerateSharpNormal() { v1 = m_pVertices[pwIndices[j * 3 + 1]]; v2 = m_pVertices[pwIndices[j * 3 + 2]]; - vN.Cross(v1 - v0, v2 - v1); // Normal ϰ... + vN.Cross(v1 - v0, v2 - v1); // Normal 값을 계산하고... vN.Normalize(); m_pVertices[pwIndices[j * 3 + 0]].n = vN; diff --git a/src/engine/N3Base/N3PMesh.h b/src/engine/N3Base/N3PMesh.h index 8ec8a960..b3ee846c 100644 --- a/src/engine/N3Base/N3PMesh.h +++ b/src/engine/N3Base/N3PMesh.h @@ -4,7 +4,7 @@ #pragma once -//#define _USE_VERTEXBUFFER // ϸ VertexBuffer IndexBuffer Ѵ. +//#define _USE_VERTEXBUFFER // 선언하면 VertexBuffer와 IndexBuffer를 사용한다. #include "N3BaseFileAccess.h" @@ -12,7 +12,7 @@ class CN3PMesh : public CN3BaseFileAccess { friend class CN3FXPMeshInstance; friend class CN3PMeshInstance; friend class CN3PMeshCreate; - friend class CPMeshEditor; // N3Viewer Ŭ + friend class CPMeshEditor; // N3Viewer의 클래스 public: struct __LODCtrlValue { @@ -25,14 +25,14 @@ class CN3PMesh : public CN3BaseFileAccess { // float Value; int NumIndicesToLose, NumIndicesToChange, NumVerticesToLose; //int *IndexChanges; - int iIndexChanges; // n° (0, 1, 2,...) + int iIndexChanges; // 포인터 대신 n번째 저장 (0, 1, 2,...) int CollapseTo; - bool bShouldCollapse; // ⼭ /⸦ ߸ Ը. ܰ踦 ؾ. + bool bShouldCollapse; // 여기서 병합/나누기를 멈추면 구멍이 뚤린다. 다음단계를 더 진행해야함. }; protected: //int m_iNumMaterials; - int m_iNumCollapses; // ﰢ Ʈ + int m_iNumCollapses; // 삼각형 병합 리스트 int m_iTotalIndexChanges; int * m_pAllIndexChanges; // All the index changes @@ -41,7 +41,7 @@ class CN3PMesh : public CN3BaseFileAccess { __EdgeCollapse * m_pCollapses; - // Mesh + // Mesh 정보 #ifdef _USE_VERTEXBUFFER LPDIRECT3DVERTEXBUFFER9 m_pVB; LPDIRECT3DINDEXBUFFER9 m_pIB; @@ -53,10 +53,10 @@ class CN3PMesh : public CN3BaseFileAccess { int m_iMaxNumVertices, m_iMaxNumIndices; int m_iMinNumVertices, m_iMinNumIndices; - __Vector3 m_vMin, m_vMax; // ִ ּҰ.. - float m_fRadius; // + __Vector3 m_vMin, m_vMax; // 최대 최소값.. + float m_fRadius; // 반지름 - // LOD ..(Ÿ Vertex ִ.) + // LOD 조정 정보..(거리에 따라서 Vertex의 수를 조정할 수 있다.) int m_iLODCtrlValueCount; __LODCtrlValue * m_pLODCtrlValues; @@ -84,8 +84,8 @@ class CN3PMesh : public CN3BaseFileAccess { // __PMLODCtrlValue* GetLODCtrlValue(int iIndex) const {if (iIndex>=0&&m_iLODCtrlValueCount>iIndex)return m_pLODCtrlValues+iIndex; return NULL;} // void SetLODCtrlValues(__PMLODCtrlValue* pValues) {m_pLODCtrlValues = pValues;} - __Vector3 Min() { return m_vMin; } // ּҰ̴. - __Vector3 Max() { return m_vMax; } // ִ밪̴. + __Vector3 Min() { return m_vMin; } // 월드 행렬을 적용하지 않은상태의 최소값이다. + __Vector3 Max() { return m_vMax; } // 월드 행렬을 적용하지 않은상태의 최대값이다. void Release(); HRESULT Create(int iNumVertices, int iNumIndices); @@ -110,8 +110,8 @@ class CN3PMesh : public CN3BaseFileAccess { #else __VertexT1 * GetVertices() const { return m_pVertices; }; __VertexT2 * GetVertices2() const { return m_pVertices2; }; - WORD * GetIndices() const { return m_pIndices; }; // ε Index ƴ - // ( ε N3PMeshInstance LOD ε ȴ.) + WORD * GetIndices() const { return m_pIndices; }; // 제대로된 Index가 아님 + // (제대로 된 인덱스를 얻으려면 N3PMeshInstance로 만든후 LOD조정후 인덱스값을 얻으면 된다.) #endif #ifdef _N3TOOL diff --git a/src/engine/N3Base/N3PMeshCreate.cpp b/src/engine/N3Base/N3PMeshCreate.cpp index 86077698..639a5cc3 100644 --- a/src/engine/N3Base/N3PMeshCreate.cpp +++ b/src/engine/N3Base/N3PMeshCreate.cpp @@ -32,7 +32,7 @@ void CN3PMeshCreate::swap_triangle(WORD * t1, WORD * t2) { swap(t1[2], t2[2]); } -// ﰢ , Ȥ +// 없어질 삼각형의 넓이 계산, 혹은 변의 길이의 합 float CN3PMeshCreate::GetTriCollapsesLoss(WORD * pTriIndex, bool bArea) { // These are the corners of the triangle. D3DXVECTOR3 pts[3] = { @@ -103,9 +103,9 @@ void CN3PMeshCreate::combine_modified(float & sofar, WORD * tri, int which, int float weighted_angle_change = (1.0f - cosangdiff) * (oldarea + newarea); if (weighted_angle_change < 0.0f) { weighted_angle_change = - 0.0f; // cosangdiff 1 Ŭ ־ weighted_angle_change - ö ִ. + 0.0f; // cosangdiff가 1보다 아주 조금 클때가 있어서 weighted_angle_change가 -값이 나올때가 있다. } - //__ASSERT(weighted_angle_change>=0.0f, "weighted_angle_change > 0 ̾ Ѵ."); + //__ASSERT(weighted_angle_change>=0.0f, "weighted_angle_change > 0 이어야 한다."); // These numbers are not in the same "units", one being length^3 and the other length^2 // And let's put some arbitrary weighting on these things. @@ -231,13 +231,13 @@ void CN3PMeshCreate::Collapse(WORD & pt_to, WORD & pt_from, float edge_val) { // So, this triangle became redundant. Try the next triangle, // but don't increment tri_index. - // ̹ ˻ ﰢ . Ʈ ǵڷ - // tri_index ߰Ű ʴ´. + // 이번에 검사한 삼각형은 사라졌다. 리스트 맨뒤로 보냈으니 + // tri_index는 중가시키지 않는다. goto try_same_triangle_location; } } - // ⿡ ﰢ ﰢ ƴϴ. ׷ ٸ Ű. + // 여기에 오면 이 삼각형은 사라지는 삼각형은 아니다. 그러나 한 점이 다른점으로 옮겨진다. // This triangle isn't degenerate if we've got here. But it does // have a reference to the collapsing vertex. This is fine - it can // now just refer to the non-collapsing vertex. @@ -336,7 +336,7 @@ void CN3PMeshCreate::TryEdge(int pt_a, int pt_b, float & be_val, WORD & be_to, W if (tri[0] == pt_a) { if (tri[1] != pt_b && tri[2] != pt_b) { combine_modified(a_loss, tri, 0, pt_b, m_PMCOption.bUseSumOfLoss); - __ASSERT(a_loss >= 0.0f, "loss > 0̾ Ѵ."); + __ASSERT(a_loss >= 0.0f, "loss > 0이어야 한다."); } else { // tri collapses. if (m_PMCOption.bTriangleWeight) { @@ -349,14 +349,14 @@ void CN3PMeshCreate::TryEdge(int pt_a, int pt_b, float & be_val, WORD & be_to, W a_loss = t_loss; } } - __ASSERT(a_loss >= 0.0f && b_loss >= 0.0f, "loss > 0̾ Ѵ."); + __ASSERT(a_loss >= 0.0f && b_loss >= 0.0f, "loss > 0이어야 한다."); } continue; } } else if (tri[1] == pt_a) { if (tri[2] != pt_b && tri[0] != pt_b) { combine_modified(a_loss, tri, 1, pt_b, m_PMCOption.bUseSumOfLoss); - __ASSERT(a_loss >= 0.0f, "loss > 0̾ Ѵ."); + __ASSERT(a_loss >= 0.0f, "loss > 0이어야 한다."); } else { // tri collapses. if (m_PMCOption.bTriangleWeight) { @@ -369,14 +369,14 @@ void CN3PMeshCreate::TryEdge(int pt_a, int pt_b, float & be_val, WORD & be_to, W a_loss = t_loss; } } - __ASSERT(a_loss >= 0.0f && b_loss >= 0.0f, "loss > 0̾ Ѵ."); + __ASSERT(a_loss >= 0.0f && b_loss >= 0.0f, "loss > 0이어야 한다."); } continue; } } else if (tri[2] == pt_a) { if (tri[0] != pt_b && tri[1] != pt_b) { combine_modified(a_loss, tri, 2, pt_b, m_PMCOption.bUseSumOfLoss); - __ASSERT(a_loss >= 0.0f, "loss > 0̾ Ѵ."); + __ASSERT(a_loss >= 0.0f, "loss > 0이어야 한다."); } else { // tri collapses. if (m_PMCOption.bTriangleWeight) { @@ -389,7 +389,7 @@ void CN3PMeshCreate::TryEdge(int pt_a, int pt_b, float & be_val, WORD & be_to, W a_loss = t_loss; } } - __ASSERT(a_loss >= 0.0f && b_loss >= 0.0f, "loss > 0̾ Ѵ."); + __ASSERT(a_loss >= 0.0f && b_loss >= 0.0f, "loss > 0이어야 한다."); } continue; } @@ -397,22 +397,22 @@ void CN3PMeshCreate::TryEdge(int pt_a, int pt_b, float & be_val, WORD & be_to, W // no points are a's if (tri[0] == pt_b) { combine_modified(b_loss, tri, 0, pt_a, m_PMCOption.bUseSumOfLoss); - __ASSERT(b_loss >= 0.0f, "loss > 0̾ Ѵ."); + __ASSERT(b_loss >= 0.0f, "loss > 0이어야 한다."); } else if (tri[1] == pt_b) { combine_modified(b_loss, tri, 1, pt_a, m_PMCOption.bUseSumOfLoss); - __ASSERT(b_loss >= 0.0f, "loss > 0̾ Ѵ."); + __ASSERT(b_loss >= 0.0f, "loss > 0이어야 한다."); } else if (tri[2] == pt_b) { combine_modified(b_loss, tri, 2, pt_a, m_PMCOption.bUseSumOfLoss); - __ASSERT(b_loss >= 0.0f, "loss > 0̾ Ѵ."); + __ASSERT(b_loss >= 0.0f, "loss > 0이어야 한다."); } } } - __ASSERT(a_loss >= 0.0f && b_loss >= 0.0f, "loss > 0̾ Ѵ."); + __ASSERT(a_loss >= 0.0f && b_loss >= 0.0f, "loss > 0이어야 한다."); #ifdef _SAME_VERTEXPOS float temp_a_loss = GetLossOfSamePosVertex(pt_b, pt_a); float temp_b_loss = GetLossOfSamePosVertex(pt_a, pt_b); - __ASSERT(temp_a_loss >= 0.0f && temp_b_loss >= 0.0f, "loss > 0̾ Ѵ."); + __ASSERT(temp_a_loss >= 0.0f && temp_b_loss >= 0.0f, "loss > 0이어야 한다."); if (m_PMCOption.bUseSumOfLoss) { a_loss += temp_a_loss; b_loss += temp_b_loss; @@ -433,7 +433,7 @@ void CN3PMeshCreate::TryEdge(int pt_a, int pt_b, float & be_val, WORD & be_to, W // We want to lose the point that costs the least. // Make sure it's point B that is the least cost by swapping if necessary. - __ASSERT(a_loss >= 0.0f && b_loss >= 0.0f, "loss > 0̾ Ѵ."); + __ASSERT(a_loss >= 0.0f && b_loss >= 0.0f, "loss > 0이어야 한다."); if (b_loss > a_loss) { swap(pt_a, pt_b); b_loss = a_loss; @@ -484,7 +484,7 @@ bool CN3PMeshCreate::FindACollapse(float & val_so_far) { Collapse(be_index_a, be_index_b, val_so_far); #ifdef _SAME_VERTEXPOS - // ã + // 같은 점 찾기 for (int i = 0; i < m_iNumVertices; ++i) { if (m_pVertices[be_index_b].x == m_pVertices[i].x && m_pVertices[be_index_b].y == m_pVertices[i].y && m_pVertices[be_index_b].z == m_pVertices[i].z) { @@ -557,7 +557,7 @@ CN3PMesh * CN3PMeshCreate::CreateRendererMesh() { fTempValue = src.Value; } - // mesh + // mesh 정보 pPMesh->m_iMaxNumIndices = m_iOriginalNumIndices; pPMesh->m_iMaxNumVertices = m_iOriginalNumVertices; pPMesh->m_iMinNumIndices = m_iNumIndices; @@ -600,8 +600,8 @@ int CN3PMeshCreate::ReGenerate(CN3PMesh * pPMesh) { } this->Release(); - this->ConvertFromN3PMesh(pPMesh); // Mesh .. - this->CreateCollapseList(); // Progressive Mesh ó.. + this->ConvertFromN3PMesh(pPMesh); // Mesh 로 부터 만들기.. + this->CreateCollapseList(); // Progressive Mesh 처리.. pPMesh->m_iTotalIndexChanges = m_iTotalIndexChanges; if (m_iTotalIndexChanges > 0) { @@ -639,7 +639,7 @@ int CN3PMeshCreate::ReGenerate(CN3PMesh * pPMesh) { fTempValue = src.Value; } - // mesh + // mesh 정보 pPMesh->m_iMinNumIndices = m_iNumIndices; pPMesh->m_iMinNumVertices = m_iNumVertices; @@ -670,9 +670,9 @@ int CN3PMeshCreate::ReGenerate(CN3PMesh * pPMesh) { return 0; } // swap "swapper" to the end of the material, updating all references to the vertices being swapped -// swapper° ؽ ؽ m_iNumVertices-1 ° -// ( m_iNumVertices collapse Ʈ 鶧 ϳ ) m_iNumVertices-1° swapper° ű. -// ε , collapseƮ ε, pt_to, pt_end ο ε ° swap ϴ Լ +// swapper번째 버텍스를 버텍스버퍼의 m_iNumVertices-1 번째로 보내고 +// ( m_iNumVertices는 collapse 리스트를 만들때마다 하나씩 감소) m_iNumVertices-1번째는 swapper번째로 옮긴다. +// 인덱스 버퍼, collapse리스트 안의 참조 인덱스, pt_to, pt_end도 새로운 인덱스에 맞게 swap 하는 함수 void CN3PMeshCreate::SwapToEnd(WORD swapper, __PMCEdgeCollapse * collapses, __PMCEdgeCollapse * collapses_end, WORD & pt_to, WORD & pt_from) { // NOTE: Here you may want to call back into your animation system (for example), so that it knows that @@ -723,7 +723,7 @@ void CN3PMeshCreate::SwapToEnd(WORD swapper, __PMCEdgeCollapse * collapses, __PM } } -bool CN3PMeshCreate::ConvertFromN3Mesh(CN3Mesh * pN3Mesh) // N3Mesh -> CN3PMeshCreate .. +bool CN3PMeshCreate::ConvertFromN3Mesh(CN3Mesh * pN3Mesh) // N3Mesh -> CN3PMeshCreate 로 컨버팅.. { if (pN3Mesh == NULL) { return false; @@ -766,7 +766,7 @@ bool CN3PMeshCreate::ConvertFromN3PMesh(CN3PMesh * pN3PMesh) { Release(); CN3PMesh * pPMeshTmp = - CN3Base::s_MngPMesh.Get(pN3PMesh->FileName()); // ̷ īƮ ϳ þ Ͱ Ⱦ. + CN3Base::s_MngPMesh.Get(pN3PMesh->FileName()); // 이래야 참조 카운트가 하나 늘어서 포인터가 안없어진다. CN3PMeshInstance PMeshInst(pN3PMesh); PMeshInst.SetLODByNumVertices(pN3PMesh->GetMaxNumVertices()); @@ -839,9 +839,9 @@ float CN3PMeshCreate::GetLossOfSamePosVertex(WORD pt_to, WORD pt_from) { float y = m_pVertices[pt_from].y; float z = m_pVertices[pt_from].z; for (int i = 0; i < m_iNumVertices; ++i) { - // from ġ Vertexã + // from 과 같은 위치의 Vertex찾기 if (i != pt_to && i != pt_from && m_pVertices[i].x == x && m_pVertices[i].y == y && m_pVertices[i].z == z) { - // i ġ ؽ ε + // i는 같은 위치를 가진 버텍스의 인덱스 WORD * tri; for (tri = m_pIndices; tri < m_pIndices + m_iNumIndices; tri += 3) { if (tri[0] == i) { diff --git a/src/engine/N3Base/N3PMeshCreate.h b/src/engine/N3Base/N3PMeshCreate.h index e623a371..2efbc60d 100644 --- a/src/engine/N3Base/N3PMeshCreate.h +++ b/src/engine/N3Base/N3PMeshCreate.h @@ -17,10 +17,10 @@ class CN3PMeshCreate { public: struct __PMCreateOption { - bool bUseSumOfLoss; // Loss ΰ ƴϸ .. - bool bTriangleWeight; // ﰢ ġ ΰ? - bool bArea; // false = sum of side ġ ̷ ΰ? ΰ? - float fWeight; // ġ + bool bUseSumOfLoss; // Loss의 합을 사용할 것인가 아니면 .. + bool bTriangleWeight; // 사라질 삼각형 가중치 계산 할 것인가? + bool bArea; // false = sum of side 가중치를 넓이로 할 것인가? 세 변의 합으로 할 것인가? + float fWeight; // 가중치 }; protected: @@ -38,7 +38,7 @@ class CN3PMeshCreate { void combine_modified(float & sofar, WORD * tri, int which, int what_to, bool bSumOfLoss); public: - int ReGenerate(CN3PMesh * pPMesh); // ٽ Ѵ.. + int ReGenerate(CN3PMesh * pPMesh); // 다시 생성한다.. // Do the calculation void CreateCollapseList(); @@ -47,7 +47,7 @@ class CN3PMeshCreate { __PMCreateOption m_PMCOption; - // N3Mesh -> CN3PMeshCreate .. + // N3Mesh -> CN3PMeshCreate 로 컨버팅.. bool ConvertFromN3Mesh(CN3Mesh * pN3Mesh); bool ConvertFromN3PMesh(CN3PMesh * pN3PMesh); @@ -67,7 +67,7 @@ class CN3PMeshCreate { void TryEdge(int pt_a, int pt_b, float & be_val, WORD & be_a, WORD & be_b, bool & IsOver); void Collapse(WORD & pt_to, WORD & pt_from, float edge_val); - // mesh + // mesh 정보 protected: // A material is an array of vertices and an array of triangles (which is an array of 3x as many indices) // Fill these in with your raw mesh data. diff --git a/src/engine/N3Base/N3PMeshInstance.cpp b/src/engine/N3Base/N3PMeshInstance.cpp index 0f39b752..49679ef9 100644 --- a/src/engine/N3Base/N3PMeshInstance.cpp +++ b/src/engine/N3Base/N3PMeshInstance.cpp @@ -134,7 +134,7 @@ bool CN3PMeshInstance::Create(CN3PMesh * pN3PMesh) { bool CN3PMeshInstance::Create(const std::string & szFN) { if (m_pPMesh && m_pPMesh->FileName() == szFN) { - return true; // ̸ ʰ + return true; // 파일 이름이 같으면 새로 만들지 않고 리턴하자 } this->Release(); @@ -154,7 +154,7 @@ void CN3PMeshInstance::SetLODByNumVertices(int iNumVertices) { } else if (iDiff > 0) { while (iNumVertices > m_iNumVertices) { if (m_pCollapseUpTo->NumVerticesToLose + m_iNumVertices > iNumVertices) { - break; // ڵ.. + break; // 깜박임 방지 코드.. } if (SplitOne() == false) { break; @@ -179,12 +179,12 @@ void CN3PMeshInstance::SetLODByNumVertices(int iNumVertices) { void CN3PMeshInstance::SetLOD(float value) { #define _USE_LODCONTROL_VALUE #ifdef _USE_LODCONTROL_VALUE - // value distance * FOV̴. + // value는 distance * FOV이다. if (m_pPMesh == NULL) { return; } - if (m_pPMesh->m_iLODCtrlValueCount == 0) { // LODCtrlValue ׸. + if (m_pPMesh->m_iLODCtrlValueCount == 0) { // LODCtrlValue가 없으면 모두 그린다. SetLODByNumVertices(0x7fffffff); return; } @@ -193,11 +193,11 @@ void CN3PMeshInstance::SetLOD(float value) { CN3PMesh::__LODCtrlValue * pTmpLODCV = m_pPMesh->m_pLODCtrlValues + m_pPMesh->m_iLODCtrlValueCount - 1; - if (value < m_pPMesh->m_pLODCtrlValues[0].fDist) { // ּ ġ Ƿ ׸. + if (value < m_pPMesh->m_pLODCtrlValues[0].fDist) { // 최소 기준치보다 가까우므로 가장 많은 면으로 그린다. SetLODByNumVertices(m_pPMesh->m_pLODCtrlValues[0].iNumVertices); - } else if (pTmpLODCV->fDist < value) { // ִ ġ ָ Ƿ ׸. + } else if (pTmpLODCV->fDist < value) { // 최대 기준치보다 멀리 있으므로 가장 적은 면으로 그린다. SetLODByNumVertices(pTmpLODCV->iNumVertices); - } else { // ߰ ° ׸. + } else { // 중간 값에 맞게 조정된 면 수로 그린다. for (int i = 1; i < m_pPMesh->m_iLODCtrlValueCount; ++i) { if (value < m_pPMesh->m_pLODCtrlValues[i].fDist) { CN3PMesh::__LODCtrlValue * pHiValue = m_pPMesh->m_pLODCtrlValues + i; @@ -210,7 +210,7 @@ void CN3PMeshInstance::SetLOD(float value) { } } #else - // value distance * FOV̴. + // value는 distance * FOV이다. if (m_pCollapseUpTo == NULL || m_pPMesh == NULL) { return; } @@ -272,11 +272,11 @@ bool CN3PMeshInstance::CollapseOne() { bool CN3PMeshInstance::SplitOne() { if (m_pCollapseUpTo >= m_pPMesh->m_pCollapses + m_pPMesh->m_iNumCollapses) { - return false; // ̷ ϸ ϳ ȴ.. + return false; // 이렇게 하면 포인터 하나가 삐져 나오게 된다.. } - // ̷ ٽ ϴ Ʒ ڵ ϸ ׷ ʴ´. - // ̷ ص ֵ ڵ带 ־. m_pPMesh->m_pCollapses ҴҶ 1 Ҵϰ ͸ ʱⰪ ־. - // if (m_pCollapseUpTo >= m_pPMesh->m_pCollapses + m_pPMesh->m_iNumCollapses - 1) return false; // ̰ ̴.. + // 하지만 이렇게 다시 하는 이유는 아래 코드로 하면 마지막 폴리곤이 절대 그려지지 않는다. + // 이렇게 해도 괜찮을 수 있도록 방어코드를 넣었다. m_pPMesh->m_pCollapses 를 할당할때 1개 더 할당하고 마지막 데이터를 초기값으로 넣었다. + // if (m_pCollapseUpTo >= m_pPMesh->m_pCollapses + m_pPMesh->m_iNumCollapses - 1) return false; // 이게 정상이다.. m_iNumIndices += m_pCollapseUpTo->NumIndicesToLose; m_iNumVertices += m_pCollapseUpTo->NumVerticesToLose; @@ -362,7 +362,7 @@ void CN3PMeshInstance::RenderTwoUV() { return; } if (NULL == m_pPMesh->GetVertices2()) { - m_pPMesh->GenerateSecondUV(); // ι° UV .. + m_pPMesh->GenerateSecondUV(); // 두번째 UV 가 없음 새로 만든다.. } if (NULL == m_pPMesh->GetVertices2()) { return; @@ -430,7 +430,7 @@ __VertexT1 * CN3PMeshInstance::GetVertices() const { } #endif -// By : Ecli666 ( On 2002-08-06 4:33:04 ) +// By : Ecli666 ( On 2002-08-06 오후 4:33:04 ) // #ifdef _USE_VERTEXBUFFER void CN3PMeshInstance::PartialRender(int iCount, LPDIRECT3DINDEXBUFFER9 pIB) { @@ -542,4 +542,4 @@ void CN3PMeshInstance::PartialRender(int iCount, WORD * pIndices) { #endif } - // ~(By Ecli666 On 2002-08-06 4:33:04 ) + // ~(By Ecli666 On 2002-08-06 오후 4:33:04 ) diff --git a/src/engine/N3Base/N3PMeshInstance.h b/src/engine/N3Base/N3PMeshInstance.h index 4c8207ee..0ac5b71c 100644 --- a/src/engine/N3Base/N3PMeshInstance.h +++ b/src/engine/N3Base/N3PMeshInstance.h @@ -27,11 +27,11 @@ class CN3PMeshInstance : public CN3Base { int m_iNumIndices, m_iNumVertices; // number of triangles/vertices to use at this moment. - CN3PMesh::__EdgeCollapse * m_pCollapseUpTo; // + CN3PMesh::__EdgeCollapse * m_pCollapseUpTo; // 참조 포인터 // A pointer to the original mesh. This is where you'll find the vertex data (which // is invariant between PMRInstance's) - CN3PMesh * m_pPMesh; // + CN3PMesh * m_pPMesh; // 참조 포인터 public: BOOL IsLOD() { @@ -66,7 +66,7 @@ class CN3PMeshInstance : public CN3Base { WORD * GetIndices() const { return m_pIndices; }; #endif -// By : Ecli666 ( On 2002-08-06 4:33:04 ) +// By : Ecli666 ( On 2002-08-06 오후 4:33:04 ) // #ifdef _USE_VERTEXBUFFER void PartialRender(int iCount, LPDIRECT3DINDEXBUFFER9 pIB); @@ -75,5 +75,5 @@ class CN3PMeshInstance : public CN3Base { #endif int GetIndexByiOrder(int iOrder); __Vector3 GetVertexByIndex(int iIndex); - // ~(By Ecli666 On 2002-08-06 4:33:04 ) + // ~(By Ecli666 On 2002-08-06 오후 4:33:04 ) }; diff --git a/src/engine/N3Base/N3Pond.cpp b/src/engine/N3Base/N3Pond.cpp index cbf6333f..be33a821 100644 --- a/src/engine/N3Base/N3Pond.cpp +++ b/src/engine/N3Base/N3Pond.cpp @@ -12,7 +12,7 @@ #define ATISQRT 4.94974747f -// .. Ʈ Ҵ.. +// 생성자.. 변수 디폴트값 할당.. CN3Pond::CN3Pond() { m_iPondMeshNum = 0; m_pCPondMesh = NULL; @@ -68,7 +68,7 @@ bool CN3Pond::Load(HANDLE hFile) { ptmpPondMesh = &m_pCPondMesh[i]; int iVC; - ReadFile(hFile, &iVC, sizeof(iVC), &dwNum, NULL); // + ReadFile(hFile, &iVC, sizeof(iVC), &dwNum, NULL); // 점 갯수 ptmpPondMesh->m_iVC = iVC; /// ptmpPondMesh->m_bTick2Rand = FALSE; /// if (iVC <= 0) { @@ -77,7 +77,7 @@ bool CN3Pond::Load(HANDLE hFile) { } int iWidthVertex; - ReadFile(hFile, &iWidthVertex, sizeof(iWidthVertex), &dwNum, NULL); // δ + ReadFile(hFile, &iWidthVertex, sizeof(iWidthVertex), &dwNum, NULL); // 한 라인당 점 갯수 ptmpPondMesh->m_iWidthVtx = iWidthVertex; /// ptmpPondMesh->m_iHeightVtx = iVC / iWidthVertex; /// @@ -96,9 +96,9 @@ bool CN3Pond::Load(HANDLE hFile) { // XyxT2 -> XyzColorT2 Converting. ptmpPondMesh->m_pVertices = new __VertexPond[iVC]; /// ReadFile(hFile, ptmpPondMesh->m_pVertices, iVC * sizeof(__VertexPond), &dwNum, NULL); - ptmpPondMesh->m_pVertices[0].y += 0.2f; // ġ ũ 䵿ģ - ptmpPondMesh->m_pVertices[iWidthVertex].y += 0.2f; // ġ ũ 䵿ģ - ptmpPondMesh->m_pfMaxHeight = ptmpPondMesh->m_pVertices[0].y += 0.3f; // ִġ + ptmpPondMesh->m_pVertices[0].y += 0.2f; // 수치가 높으면 물결이 크게 요동친다 + ptmpPondMesh->m_pVertices[iWidthVertex].y += 0.2f; // 수치가 높으면 물결이 크게 요동친다 + ptmpPondMesh->m_pfMaxHeight = ptmpPondMesh->m_pVertices[0].y += 0.3f; // 물결의 최대치 ptmpPondMesh->m_pfVelocityArray = new float[iVC]; /// memset(ptmpPondMesh->m_pfVelocityArray, 0, sizeof(float) * iVC); @@ -110,7 +110,7 @@ bool CN3Pond::Load(HANDLE hFile) { int iWidth = iWidthVertex, iHeight = iVC / iWidthVertex; int x = 0, y = iWidth; - WORD * indexPtr = ptmpPondMesh->m_wpIndex; // ﰢ θ ġ + WORD * indexPtr = ptmpPondMesh->m_wpIndex; // 삼각형을 부를 위치 설정 iWidth--; __VertexPond * ptVtx = ptmpPondMesh->m_pVertices; @@ -119,7 +119,7 @@ bool CN3Pond::Load(HANDLE hFile) { StZ = ptVtx[0].z, EnZ = ptVtx[iHeight].z; for (int j = 0; j < iHeight; j++) { for (int k = 0; k < iWidth; k++) { - // ﰢ θ ġ + // 삼각형을 부를 위치 설정 indexPtr[0] = x; indexPtr[1] = x + 1; indexPtr[2] = y; @@ -131,7 +131,7 @@ bool CN3Pond::Load(HANDLE hFile) { x++; y++; - // ִּ ġ + // 연못의 최소최대 위치 구함 if (StX > ptVtx->x) { StX = ptVtx->x; } @@ -184,7 +184,7 @@ bool CN3Pond::Load(HANDLE hFile) { ptmpPondMesh->m_bTick2Rand = TRUE; /// if (m_iMaxVtxNum < iVC) { - m_iMaxVtxNum = iVC; // ū + m_iMaxVtxNum = iVC; // 가장큰 계산범위 구함 } } @@ -223,12 +223,12 @@ void CN3Pond::Tick() { m_fTexIndex -= 32.0f; } - // Ӱ谪 .. + // 프레임이 임계값보다 작으면 버린다.. if (CN3Base::s_fFrmPerSec < 0.1f) { return; } - // Desire Frame Rate Frame .. + // Desire Frame Rate보다 Frame이 잘 나오는 경우.. if (30.0f <= CN3Base::s_fFrmPerSec) { static float ftemp = 0.0f; frame = (30.0f / CN3Base::s_fFrmPerSec) * 1.2f; @@ -238,7 +238,7 @@ void CN3Pond::Tick() { ftemp -= 1.0f; } } - // Desire Frame Frame ȳ .. + // Desire Frame보다 Frame이 잘 안나오는 경우.. else { static float ftemp = 0.0f; frame = (30.0f / CN3Base::s_fFrmPerSec) * 1.2f; @@ -287,7 +287,7 @@ void CN3Pond::Render() { // Set s_lpD3DDev->SetTransform(D3DTS_WORLD, &matWorld); - // texture state (alpha) + // texture state 세팅 (alpha) s_lpD3DDev->SetTexture(0, m_pTexPond[iTex]->Get()); s_lpD3DDev->SetTexture(2, NULL); @@ -340,19 +340,19 @@ void CN3Pond::Render() { void CN3Pond::UpdateWaterPositions() { CPongMesh * pPondMesh; - // Ÿ + // 기초 데이타 int x, y, n, m; float d; __VertexPond *pVtx, *ptmpVtx, *ptmpVtxSub, *ptmpVtxPlus; float * pForceArray, *ptmpForceArray, *ptmpFArrSub, *ptmpFArrPlus; - // + // 계산 변수 float max, min, mincal, maxcal; for (int i = 0; i < m_iPondMeshNum; i++) { pPondMesh = &m_pCPondMesh[i]; - // ̹ Ѿ + // 이번에 쓰이지 않을 경우 넘어감 if (CN3Base::s_CameraData.IsOutOfFrustum(pPondMesh->m_vCenterPo, pPondMesh->m_fRadius) == TRUE) { pPondMesh->m_bTick2Rand = FALSE; continue; @@ -361,7 +361,7 @@ void CN3Pond::UpdateWaterPositions() { } // TRACE("Pond Is Chk ---------- %d \n",i); - // ʵŸ ۼ + // 기초데이타 작성 m = pPondMesh->m_iWidthVtx; n = pPondMesh->m_iHeightVtx; max = pPondMesh->m_fmax; @@ -374,7 +374,7 @@ void CN3Pond::UpdateWaterPositions() { pVtx = pPondMesh->m_pVertices; pForceArray = m_pfMaxVtx; - // + // 계산 for (x = 1; x < n - 1; x++) { ptmpFArrSub = pForceArray; pForceArray += m; @@ -480,7 +480,7 @@ void CN3Pond::UpdateWaterPositions() { } } - ptmpForceArray = pPondMesh->m_pfVelocityArray; // ̶ + ptmpForceArray = pPondMesh->m_pfVelocityArray; // 같은형이라 빌려씀 pForceArray = m_pfMaxVtx; pVtx = pPondMesh->m_pVertices; for (x = 0; x < pPondMesh->m_iVC; x++) { diff --git a/src/engine/N3Base/N3Pond.h b/src/engine/N3Base/N3Pond.h index c50f5427..59930fcb 100644 --- a/src/engine/N3Base/N3Pond.h +++ b/src/engine/N3Base/N3Pond.h @@ -34,19 +34,19 @@ class CN3Pond : public CN3BaseFileAccess { class CPongMesh { public: CN3Texture * m_pTexWave; - BOOL m_bTick2Rand; // þ߿ tickrend + BOOL m_bTick2Rand; // 시야에 들어와 tick과rend를 실행결정 __VertexPond * m_pVertices; // Vertices - float * m_pfVelocityArray; // - float m_pfMaxHeight; // ̻ ö ϰ - WORD * m_wpIndex; // ׸ ׸ + float * m_pfVelocityArray; // 계산 저장 + float m_pfMaxHeight; // 물결이 어느정도 이상 올라가지 못하게 함 + WORD * m_wpIndex; // 그림을 그릴 순서 int m_iIC; // Index Buffer Count. int m_iVC; // Vertex Count. - int m_iWidthVtx, m_iHeightVtx; // 꿡 ʿ + int m_iWidthVtx, m_iHeightVtx; // 계산에 필요 float m_fmin, m_fmax, m_fmaxcal, m_fmincal; - __Vector3 m_vCenterPo; // ߰ - float m_fRadius; // + __Vector3 m_vCenterPo; // 연못의 중간지점 + float m_fRadius; // 연못의 지름 CPongMesh() { m_bTick2Rand = FALSE; @@ -75,14 +75,14 @@ class CN3Pond : public CN3BaseFileAccess { }; public: - int m_iPondMeshNum; // ü - CPongMesh * m_pCPondMesh; // + int m_iPondMeshNum; // 전체 연못의 갯수 + CPongMesh * m_pCPondMesh; // 연못의 정보 CN3Texture * m_pTexPond[MAX_POND_TEX]; float m_fTexIndex; - int m_iMaxVtxNum; // vertices - float * m_pfMaxVtx; // ӽ + int m_iMaxVtxNum; // 가장 많은 vertices수 + float * m_pfMaxVtx; // 물결높이 계산을 위한 임시 public: void Release(); diff --git a/src/engine/N3Base/N3River.h b/src/engine/N3Base/N3River.h index 326d16c5..17b5f137 100644 --- a/src/engine/N3Base/N3River.h +++ b/src/engine/N3Base/N3River.h @@ -8,7 +8,7 @@ #define MAX_RIVER_TEX 32 -class CN3River : public CN3Base // CN3RiverPatch ϴ Ŭ +class CN3River : public CN3Base // CN3RiverPatch를 관리하는 클래스 { public: CN3River(); @@ -43,8 +43,8 @@ _RIVER_DIFF * pDiff; BOOL m_bTick2Rand; - __Vector3 m_vCenterPo; // ߰ - float m_fRadius; // + __Vector3 m_vCenterPo; // 강의 중간지점 + float m_fRadius; // 강의 지름 CN3Texture * m_pTexWave; diff --git a/src/engine/N3Base/N3River2.h b/src/engine/N3Base/N3River2.h index cd7c567b..1e62176b 100644 --- a/src/engine/N3Base/N3River2.h +++ b/src/engine/N3Base/N3River2.h @@ -42,8 +42,8 @@ class CN3River2 : public CN3Base { _RIVER_DIFF * pDiff; BOOL m_bTick2Rand; - __Vector3 m_vCenterPo; // ߰ - float m_fRadius; // + __Vector3 m_vCenterPo; // 강의 중간지점 + float m_fRadius; // 강의 지름 _RIVER_INFO() { pVertices = NULL; diff --git a/src/engine/N3Base/N3RiverPatch.h b/src/engine/N3Base/N3RiverPatch.h index 89fe6c8f..b2a1f542 100644 --- a/src/engine/N3Base/N3RiverPatch.h +++ b/src/engine/N3Base/N3RiverPatch.h @@ -7,10 +7,10 @@ #include "N3Base.h" struct __VertexRiver : public __VertexXyzT2 { - WORD index; // Index + WORD index; // 점의 Index }; -struct __River // ( ..) +struct __River // 강의 점정보(정렬을 위한..) { short iRiverID; int iVertexCount; @@ -25,7 +25,7 @@ struct __VertexRiver : public __VertexXyzT2 { } }; -struct __RiverEx // (vertex buffer ..) +struct __RiverEx // 강의 점정보(vertex buffer를 위한..) { short iRiverID; int iVertexCount; @@ -50,7 +50,7 @@ struct __VertexRiver : public __VertexXyzT2 { } }; -class CN3RiverPatch : public CN3Base // patch . +class CN3RiverPatch : public CN3Base // 각 patch에 속한 강들의 정보. { public: CN3RiverPatch(); diff --git a/src/engine/N3Base/N3Scene.cpp b/src/engine/N3Base/N3Scene.cpp index f6f0e558..78a7a585 100644 --- a/src/engine/N3Base/N3Scene.cpp +++ b/src/engine/N3Base/N3Scene.cpp @@ -17,8 +17,8 @@ CN3Scene::CN3Scene() { m_nCameraActive = 0; m_fFrmCur = 0.0f; // Animation Frame; - m_fFrmStart = 0.0f; // ü . - m_fFrmEnd = 1000.0f; // ⺻ . + m_fFrmStart = 0.0f; // 전체 프레임. + m_fFrmEnd = 1000.0f; // 기본값 프레임. m_nCameraCount = 0; m_nLightCount = 0; @@ -50,8 +50,8 @@ void CN3Scene::Release() { m_nCameraActive = 0; m_fFrmCur = 0.0f; // Animation Frame; - m_fFrmStart = 0.0f; // ü . - m_fFrmEnd = 1000.0f; // ⺻ . + m_fFrmStart = 0.0f; // 전체 프레임. + m_fFrmEnd = 1000.0f; // 기본값 프레임. for (int i = 0; i < MAX_SCENE_CAMERA; i++) { if (m_pCameras[i]) { @@ -79,14 +79,14 @@ bool CN3Scene::Load(HANDLE hFile) { ReadFile(hFile, &m_nCameraActive, 4, &dwRWC, NULL); ReadFile(hFile, &m_fFrmCur, 4, &dwRWC, NULL); // Animation Frame; - ReadFile(hFile, &m_fFrmStart, 4, &dwRWC, NULL); // ü . - ReadFile(hFile, &m_fFrmEnd, 4, &dwRWC, NULL); // ü . + ReadFile(hFile, &m_fFrmStart, 4, &dwRWC, NULL); // 전체 프레임. + ReadFile(hFile, &m_fFrmEnd, 4, &dwRWC, NULL); // 전체 프레임. int nL = 0; char szName[512] = ""; int nCC = 0; - ReadFile(hFile, &nCC, 4, &dwRWC, NULL); // ī޶.. + ReadFile(hFile, &nCC, 4, &dwRWC, NULL); // 카메라.. for (int i = 0; i < nCC; i++) { ReadFile(hFile, &nL, 4, &dwRWC, NULL); if (nL <= 0) { @@ -106,7 +106,7 @@ bool CN3Scene::Load(HANDLE hFile) { } int nLC = 0; - ReadFile(hFile, &nLC, 4, &dwRWC, NULL); // ī޶.. + ReadFile(hFile, &nLC, 4, &dwRWC, NULL); // 카메라.. for (int i = 0; i < nLC; i++) { ReadFile(hFile, &nL, 4, &dwRWC, NULL); if (nL <= 0) { @@ -146,7 +146,7 @@ bool CN3Scene::Load(HANDLE hFile) { } int nChrC = 0; - ReadFile(hFile, &nChrC, 4, &dwRWC, NULL); // ij + ReadFile(hFile, &nChrC, 4, &dwRWC, NULL); // 캐릭터 for (int i = 0; i < nChrC; i++) { ReadFile(hFile, &nL, 4, &dwRWC, NULL); if (nL <= 0) { @@ -185,10 +185,10 @@ bool CN3Scene::Save(HANDLE hFile) { WriteFile(hFile, &m_nCameraActive, 4, &dwRWC, NULL); WriteFile(hFile, &m_fFrmCur, 4, &dwRWC, NULL); // Animation Frame; - WriteFile(hFile, &m_fFrmStart, 4, &dwRWC, NULL); // ü . - WriteFile(hFile, &m_fFrmEnd, 4, &dwRWC, NULL); // ü . + WriteFile(hFile, &m_fFrmStart, 4, &dwRWC, NULL); // 전체 프레임. + WriteFile(hFile, &m_fFrmEnd, 4, &dwRWC, NULL); // 전체 프레임. - WriteFile(hFile, &m_nCameraCount, 4, &dwRWC, NULL); // ī޶.. + WriteFile(hFile, &m_nCameraCount, 4, &dwRWC, NULL); // 카메라.. for (int i = 0; i < m_nCameraCount; i++) { int nL = m_pCameras[i]->FileName().size(); WriteFile(hFile, &nL, 4, &dwRWC, NULL); @@ -196,7 +196,7 @@ bool CN3Scene::Save(HANDLE hFile) { m_pCameras[i]->SaveToFile(); } - WriteFile(hFile, &m_nLightCount, 4, &dwRWC, NULL); // ī޶.. + WriteFile(hFile, &m_nLightCount, 4, &dwRWC, NULL); // 카메라.. for (int i = 0; i < m_nLightCount; i++) { int nL = m_pLights[i]->FileName().size(); WriteFile(hFile, &nL, 4, &dwRWC, NULL); @@ -218,7 +218,7 @@ bool CN3Scene::Save(HANDLE hFile) { } int iCC = m_Chrs.size(); - WriteFile(hFile, &iCC, 4, &dwRWC, NULL); // ij + WriteFile(hFile, &iCC, 4, &dwRWC, NULL); // 캐릭터 for (int i = 0; i < iCC; i++) { int nL = m_Chrs[i]->FileName().size(); WriteFile(hFile, &nL, 4, &dwRWC, NULL); @@ -230,7 +230,7 @@ bool CN3Scene::Save(HANDLE hFile) { m_Chrs[i]->SaveToFile(); } - CN3Base::SaveResrc(); // Resource Ϸ Ѵ.. + CN3Base::SaveResrc(); // Resource 를 파일로 저장한다.. return true; } @@ -262,7 +262,7 @@ void CN3Scene::Render() { void CN3Scene::Tick(float fFrm) { if (FRAME_SELFPLAY == fFrm || fFrm < m_fFrmStart || fFrm > m_fFrmEnd) { - m_fFrmCur += 30.0f / CN3Base::s_fFrmPerSec; // ϰ ̵ ð ̴ .. + m_fFrmCur += 30.0f / CN3Base::s_fFrmPerSec; // 일정하게 움직이도록 시간에 따라 움직이는 양을 조절.. if (m_fFrmCur > m_fFrmEnd) { m_fFrmCur = m_fFrmStart; } @@ -280,22 +280,22 @@ void CN3Scene::TickCameras(float fFrm) { for (int i = 0; i < m_nCameraCount; i++) { m_pCameras[i]->Tick(m_fFrmCur); if (m_nCameraActive == i) { - m_pCameras[i]->Apply(); // ī޶ Ѵ.. + m_pCameras[i]->Apply(); // 카메라 데이터 값을 적용한다.. } } } void CN3Scene::TickLights(float fFrm) { for (int i = 0; i < 8; i++) { - s_lpD3DDev->LightEnable(i, FALSE); // ϴ Ʈ .. + s_lpD3DDev->LightEnable(i, FALSE); // 일단 라이트 다 끄고.. } for (int i = 0; i < m_nLightCount; i++) { m_pLights[i]->Tick(m_fFrmCur); - m_pLights[i]->Apply(); // Ʈ + m_pLights[i]->Apply(); // 라이트 적용 } - // Ʈ ׻ ī޶ .. + // 라이트가 항상 카메라를 따라오게 만든다.. if (false == m_bDisableDefaultLight) { __Vector3 vDir = s_CameraData.vAt - s_CameraData.vEye; vDir.Normalize(); @@ -308,7 +308,7 @@ void CN3Scene::TickLights(float fFrm) { s_lpD3DDev->SetLight(7, &lgt); } - // Ambient Light ٲٱ.. + // Ambient Light 바꾸기.. // DWORD dwAmbient = 0xff000000 | // (((DWORD)(m_pLights[i]->m_Data.Diffuse.r * 255 * 0.5f)) << 16) | // (((DWORD)(m_pLights[i]->m_Data.Diffuse.g * 255 * 0.5f)) << 8) | @@ -511,7 +511,7 @@ void CN3Scene::ChrRelease() { /* bool CN3Scene::CheckOverlappedShapesAndReport() { - // ̸ ߺ ˻.. + // 이름 중복 검사.. CN3Transform* pShapes[8192]; memset(pShapes, 0, 8192*4); @@ -535,14 +535,14 @@ bool CN3Scene::CheckOverlappedShapesAndReport() { vPos2 = pShapes[j]->Pos(); if( vPos1 == vPos2 || - pShapes[i]->FileName() == pShapes[j]->FileName() ) // ġ ̸ Ʈ ִ ãƺ. + pShapes[i]->FileName() == pShapes[j]->FileName() ) // 위치나 이름이 같은 오브젝트가 있는지 찾아본다. { char szErr[512]; __Vector3 vPos = pShapes[j]->Pos(); - sprintf(szErr, " ̸ ų ġ Ʈ ֽϴ\nù° Ʈ : \"%s\" - ġ(%f, %f, %f)\nι° Ʈ : \"%s\" - ġ(%f, %f, %f)", + sprintf(szErr, "파일 이름이 같거나 위치가 같은 오브젝트가 있습니다\n첫번째 오브젝트 : \"%s\" - 위치(%f, %f, %f)\n두번째 오브젝트 : \"%s\" - 위치(%f, %f, %f)", pShapes[i]->FileName().c_str(), vPos1.x, vPos1.y, vPos1.z, pShapes[j]->FileName().c_str(), vPos2.x, vPos2.y, vPos2.z); - MessageBox(::GetActiveWindow(), szErr, "Scene Ʈ ߺ ", MB_OK); + MessageBox(::GetActiveWindow(), szErr, "Scene 오브젝트 중복 점검", MB_OK); bOverlapped = true; } } @@ -553,7 +553,7 @@ bool CN3Scene::CheckOverlappedShapesAndReport() void CN3Scene::DeleteOverlappedShapes() { - // ̸ ߺ ˻.. + // 이름 중복 검사.. BOOL bNeedDeletes[8192]; it_Shape itShapes[8192]; CN3Shape* pShapes[8192]; @@ -581,7 +581,7 @@ void CN3Scene::DeleteOverlappedShapes() { vPos2 = pShapes[j]->Pos(); if( vPos1 == vPos2 || - pShapes[i]->FileName() == pShapes[j]->FileName() ) // ġ ̸ Ʈ ִ ãƺ. + pShapes[i]->FileName() == pShapes[j]->FileName() ) // 위치나 이름이 같은 오브젝트가 있는지 찾아본다. { bNeedDeletes[j] = true; } @@ -633,7 +633,7 @@ void CN3Scene::DefaultCameraAdd() { this->CameraAdd(pCamera); } void CN3Scene::DefaultLightAdd() { - // Light ʱȭ.. + // Light 초기화.. CN3Light * pLight = new CN3Light(); pLight->m_szName = "DefaultLight"; pLight->FileNameSet("Data\\DefaultLight.N3Light"); diff --git a/src/engine/N3Base/N3Scene.h b/src/engine/N3Base/N3Scene.h index 2d03a1c7..6d3ecc7f 100644 --- a/src/engine/N3Base/N3Scene.h +++ b/src/engine/N3Base/N3Scene.h @@ -22,12 +22,12 @@ typedef typename std::vector::iterator it_Chr; class CN3Scene : public CN3BaseFileAccess { public: - float m_fFrmCur, m_fFrmStart, m_fFrmEnd; // , , .. - bool m_bDisableDefaultLight; // ̸ ⺻Ʈ .. + float m_fFrmCur, m_fFrmStart, m_fFrmEnd; // 현재, 시작, 끝 프레임.. + bool m_bDisableDefaultLight; // 참이면 기본라이트를 끈다.. D3DCOLOR m_AmbientLightColor; protected: - int m_nCameraActive; // õ ī޶.. + int m_nCameraActive; // 현재 선택된 카메라.. int m_nCameraCount; int m_nLightCount; diff --git a/src/engine/N3Base/N3Shape.cpp b/src/engine/N3Base/N3Shape.cpp index 9bebcca2..1c6eb6ee 100644 --- a/src/engine/N3Base/N3Shape.cpp +++ b/src/engine/N3Base/N3Shape.cpp @@ -9,18 +9,18 @@ CN3SPart::CN3SPart() { m_dwType |= OBJ_SHAPE_PART; - m_vPivot.Set(0, 0, 0); // Local - m_Matrix.Identity(); // World Matrix.. Shape Loading ̸ ؾ .. - m_bOutOfCameraRange = TRUE; // Camera ٱ ... + m_vPivot.Set(0, 0, 0); // Local 축 + m_Matrix.Identity(); // World Matrix.. Shape Loading 때 미리 계산해야 좋다.. + m_bOutOfCameraRange = TRUE; // Camera 범위 바깥에 있음... m_Mtl.Init(); // Material m_fTexFPS = 10.0f; // Texture Animation Interval; - m_fTexIndex = 0; // Current Texture Index.. Animation ų ʿ ε̴.. + m_fTexIndex = 0; // Current Texture Index.. Animation 시킬때 필요한 인덱스이다.. - // m_vWindFactorCur.Zero(); // ٶ δ .. ̰ ȸ Ų.. - // m_vWindFactorToReach.Zero(); // ٶ δ .. - m_fTimeToSetWind = 0; // ٶ δ ٲٱ ð.. - m_fWindFactorCur = 0; // ٶ δ .. ̰ ȸ Ų.. - m_fWindFactorToReach = 0; // ٶ δ .. + // m_vWindFactorCur.Zero(); // 현재 바람 부는 값.. 이값으로 회전을 시킨다.. + // m_vWindFactorToReach.Zero(); // 바람 부는 값.. + m_fTimeToSetWind = 0; // 바람 부는 값을 바꾸기 위한 시간.. + m_fWindFactorCur = 0; // 현재 바람 부는 값.. 이값으로 회전을 시킨다.. + m_fWindFactorToReach = 0; // 바람 부는 값.. } CN3SPart::~CN3SPart() { @@ -31,18 +31,18 @@ CN3SPart::~CN3SPart() { } void CN3SPart::Release() { - m_vPivot.Set(0, 0, 0); // Local - m_Matrix.Identity(); // World Matrix.. Shape Loading ̸ ؾ .. - m_bOutOfCameraRange = TRUE; // Camera ٱ ... + m_vPivot.Set(0, 0, 0); // Local 축 + m_Matrix.Identity(); // World Matrix.. Shape Loading 때 미리 계산해야 좋다.. + m_bOutOfCameraRange = TRUE; // Camera 범위 바깥에 있음... m_Mtl.Init(); // Material m_fTexFPS = 10.0f; // Texture Animation Interval; - m_fTexIndex = 0; // Current Texture Index.. Animation ų ʿ ε̴.. + m_fTexIndex = 0; // Current Texture Index.. Animation 시킬때 필요한 인덱스이다.. - // m_vWindFactorCur.Zero(); // ٶ δ .. ̰ ȸ Ų.. - // m_vWindFactorToReach.Zero(); // ٶ δ .. - m_fTimeToSetWind = 0; // ٶ δ ٲٱ ð.. - m_fWindFactorCur = 0; // ٶ δ .. ̰ ȸ Ų.. - m_fWindFactorToReach = 0; // ٶ δ .. + // m_vWindFactorCur.Zero(); // 현재 바람 부는 값.. 이값으로 회전을 시킨다.. + // m_vWindFactorToReach.Zero(); // 바람 부는 값.. + m_fTimeToSetWind = 0; // 바람 부는 값을 바꾸기 위한 시간.. + m_fWindFactorCur = 0; // 현재 바람 부는 값.. 이값으로 회전을 시킨다.. + m_fWindFactorToReach = 0; // 바람 부는 값.. int iTC = m_TexRefs.size(); for (int i = 0; i < iTC; i++) { @@ -71,7 +71,7 @@ void CN3SPart::TexAlloc(int nCount) { } void CN3SPart::Tick(const __Matrix44 & mtxParent, const __Quaternion & qRot, - float fScale) // timeGetTime Texture Animation Ʈ Ѵ.. + float fScale) // timeGetTime 으로 얻은 값을 넣으면 Texture Animation 을 컨트롤 한다.. { CN3PMesh * pPMesh = m_PMInst.GetMesh(); if (NULL == pPMesh) { @@ -80,9 +80,9 @@ void CN3SPart::Tick(const __Matrix44 & mtxParent, const __Quaternion & qRot, m_bOutOfCameraRange = FALSE; - // ī޶ ָ .. + // 카메라와 멀리 떨어지면 지나간다.. __Vector3 vCenter = (this->Min() + this->Max()) * 0.5f; - if (s_CameraData.IsOutOfFrustum(vCenter, this->Radius() * fScale)) // ī޶ ü ٱ̸ .. + if (s_CameraData.IsOutOfFrustum(vCenter, this->Radius() * fScale)) // 카메라 사면체 바깥이면 지나간다.. { m_bOutOfCameraRange = TRUE; return; @@ -93,20 +93,20 @@ void CN3SPart::Tick(const __Matrix44 & mtxParent, const __Quaternion & qRot, // float fLOD = fDist + fDist * (s_CameraData.fFOV - 1.0f) / 3.0f; // float fLOD = fDist * s_CameraData.fFOV * (512.0f / s_CameraData.fFP); - // ī޶ Ÿ LOD Ѵ. + // 카메라 거리에 따라 LOD 수준을 조절한다. // fLOD *= 256.0f / s_CameraData.fFP; m_PMInst.SetLOD(fLOD); int iTC = m_TexRefs.size(); - if (iTC > 1) // ؽó ϸ̼ + if (iTC > 1) // 텍스처 에니메이션 { m_fTexIndex += CN3Base::s_fSecPerFrm * m_fTexFPS; if (m_fTexIndex >= iTC) { - m_fTexIndex -= (iTC * m_fTexIndex) / iTC; // Ҽ ȴ??(Ͽư ~) + m_fTexIndex -= (iTC * m_fTexIndex) / iTC; // 정수로 나누면 소숫점만 남기게 된다??(하여튼 비슷해~) } } - if (m_Mtl.nRenderFlags & RF_BOARD_Y) // ī޶ ٶϴ Ÿ.. + if (m_Mtl.nRenderFlags & RF_BOARD_Y) // 카메라를 바라봐야하는 거면.. { __Vector3 vPos = m_vPivot * mtxParent; __Vector3 vDir = s_CameraData.vEye - vPos; @@ -116,7 +116,7 @@ void CN3SPart::Tick(const __Matrix44 & mtxParent, const __Quaternion & qRot, m_Matrix.RotationY(-atanf(vDir.z / vDir.x) + (D3DX_PI * 0.5f)); } - // θ ȸ ݴ ȸ Ų.. + // 부모 회전과 반대로 회전을 시킨다.. float fAngle; qRot.AxisAngle(vDir, fAngle); if (fAngle != 0) { @@ -129,17 +129,17 @@ void CN3SPart::Tick(const __Matrix44 & mtxParent, const __Quaternion & qRot, m_Matrix.PosSet(vPos); } - if (m_Mtl.nRenderFlags & RF_WINDY) // ٶ ¦ ϸ.. + if (m_Mtl.nRenderFlags & RF_WINDY) // 바람에 살짝 날려야 하면.. { m_fTimeToSetWind -= CN3Base::s_fSecPerFrm; if (m_fTimeToSetWind <= 0) { // m_vWindFactorToReach.x = 0.05f - (0.1f * (rand()%100) / 100.0f); - // m_vWindFactorToReach.y = 0.05f - (0.1f * (rand()%100) / 100.0f); // Ʒδ ݸ Ұ Ѵ. + // m_vWindFactorToReach.y = 0.05f - (0.1f * (rand()%100) / 100.0f); // 위아래로는 조금만 불게 한다. // m_vWindFactorToReach.z = 0.05f - (0.1f * (rand()%100) / 100.0f); m_fWindFactorToReach = (rand() % 100) / 100.0f; - m_fTimeToSetWind = 3.0f * ((rand() % 100) / 100.0f); // ٶ ӵ .. + m_fTimeToSetWind = 3.0f * ((rand() % 100) / 100.0f); // 바람이 지속될 값.. } else if (m_fWindFactorToReach != m_fWindFactorCur) // else if(m_vWindFactorToReach != m_vWindFactorCur) { @@ -193,7 +193,7 @@ void CN3SPart::Render() { } } - if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) // Alpha + if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) // Alpha 사용 { __AlphaPrimitive * pAP = s_AlphaMgr.Add(); if (pAP) { @@ -213,7 +213,7 @@ void CN3SPart::Render() { pAP->pwIndices = m_PMInst.GetIndices(); } - return; // . + return; // 렌더링 안하지롱. } // static DWORD dwAlpha, dwFog, dwCull; @@ -227,7 +227,7 @@ void CN3SPart::Render() { CN3Base::s_RenderInfo.nShape_Polygon += m_PMInst.GetNumIndices() / 3; // Rendering Information Update... #endif - if (m_Mtl.nRenderFlags & RF_NOTUSEFOG) // Fog .. + if (m_Mtl.nRenderFlags & RF_NOTUSEFOG) // Fog 무시.. { s_lpD3DDev->GetRenderState(D3DRS_FOGENABLE, &dwFog); if (TRUE == dwFog) { @@ -240,7 +240,7 @@ void CN3SPart::Render() { s_lpD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); } - s_lpD3DDev->SetMaterial(&m_Mtl); // .. + s_lpD3DDev->SetMaterial(&m_Mtl); // 재질 설정.. s_lpD3DDev->SetTexture(0, lpTex); if (NULL != lpTex) { s_lpD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, m_Mtl.dwColorOp); @@ -251,14 +251,14 @@ void CN3SPart::Render() { s_lpD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); } - // εҶ ̸ .. + // 로딩할때 미리 계산해 놓은 월드 행렬 적용.. s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); m_PMInst.Render(); // if((m_Mtl.nRenderFlags & RF_ALPHABLENDING) && FALSE == dwAlpha) s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); if ((m_Mtl.nRenderFlags & RF_NOTUSEFOG) && TRUE == dwFog) { - s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); // Ȱ ʴ´.. + s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); // 안개 사용하지 않는다.. } if ((m_Mtl.nRenderFlags & RF_DOUBLESIDED) && D3DCULL_NONE != dwCull) { s_lpD3DDev->SetRenderState(D3DRS_CULLMODE, dwCull); @@ -316,7 +316,7 @@ void CN3SPart::RenderSelected(bool bWireFrame) { #ifdef _N3TOOL void CN3SPart::RenderAxis() { - // ׸.. + // 축그리기.. float fRadius = 1.0f; if (m_PMInst.GetMesh()) { fRadius = m_PMInst.GetMesh()->Radius(); @@ -336,22 +336,22 @@ bool CN3SPart::Load(HANDLE hFile) { ReadFile(hFile, &nL, 4, &dwRWC, NULL); // Mesh FileName ReadFile(hFile, szFN, nL, &dwRWC, NULL); - szFN[nL] = NULL; // ޽ ̸.. + szFN[nL] = NULL; // 메시 파일 이름.. this->MeshSet(szFN); - ReadFile(hFile, &m_Mtl, sizeof(__Material), &dwRWC, NULL); // + ReadFile(hFile, &m_Mtl, sizeof(__Material), &dwRWC, NULL); // 재질 int iTC = 0; ReadFile(hFile, &iTC, 4, &dwRWC, NULL); ReadFile(hFile, &m_fTexFPS, 4, &dwRWC, NULL); m_TexRefs.clear(); - this->TexAlloc(iTC); // Texture Pointer Pointer Ҵ.. - for (int j = 0; j < iTC; j++) // Texture Count ŭ ̸ о ؽó θ.. + this->TexAlloc(iTC); // Texture Pointer Pointer 할당.. + for (int j = 0; j < iTC; j++) // Texture Count 만큼 파일 이름 읽어서 텍스처 부르기.. { ReadFile(hFile, &nL, 4, &dwRWC, NULL); if (nL > 0) { ReadFile(hFile, szFN, nL, &dwRWC, NULL); - szFN[nL] = NULL; // ؽó ̸.. + szFN[nL] = NULL; // 텍스처 파일 이름.. m_TexRefs[j] = s_MngTex.Get(szFN, true, s_Options.iTexLOD_Shape); } } @@ -372,14 +372,14 @@ bool CN3SPart::Save(HANDLE hFile) { nL = pPMesh->FileName().size(); } else { MessageBox(GetActiveWindow(), - "Progressive mesh pointer is NULL! : object ֽϴ.(ҽ " - "Load ʾ ɼ ŭ)", + "Progressive mesh pointer is NULL! : object가 제대로 보이지 않을 수 있습니다.(리소스 파일이 " + "Load되지 않았을 가능성이 큼)", "warning", MB_OK); } WriteFile(hFile, &nL, 4, &dwRWC, NULL); // Mesh FileName if (nL > 0) { - // if(-1 == pPMesh->FileName().find("object\\")) // ӽ÷ θ ٲٷ ־.. ߿ ʿ .. + // if(-1 == pPMesh->FileName().find("object\\")) // 임시로 경로를 바꾸려고 넣었다.. 나중에 필요없음 지운다.. // { // char szFNTmp[256]; // wsprintf(szFNTmp, "Object\\%s.N3PMesh", pPMesh->Name()); @@ -390,15 +390,15 @@ bool CN3SPart::Save(HANDLE hFile) { // WriteFile(hFile, &nL, 4, &dwRWC, NULL); // Mesh FileName // } - WriteFile(hFile, pPMesh->FileName().c_str(), nL, &dwRWC, NULL); // ޽ ̸.. + WriteFile(hFile, pPMesh->FileName().c_str(), nL, &dwRWC, NULL); // 메시 파일 이름.. } - WriteFile(hFile, &m_Mtl, sizeof(__Material), &dwRWC, NULL); // + WriteFile(hFile, &m_Mtl, sizeof(__Material), &dwRWC, NULL); // 재질 int iTC = m_TexRefs.size(); WriteFile(hFile, &iTC, 4, &dwRWC, NULL); WriteFile(hFile, &m_fTexFPS, 4, &dwRWC, NULL); - for (int j = 0; j < iTC; j++) // Texture File ̸ ... + for (int j = 0; j < iTC; j++) // Texture File 이름 쓰기... { if (m_TexRefs[j]) { nL = m_TexRefs[j]->FileName().size(); @@ -408,9 +408,9 @@ bool CN3SPart::Save(HANDLE hFile) { WriteFile(hFile, &nL, 4, &dwRWC, NULL); if (nL > 0) { - // if(-1 == m_TexRefs[j]->FileName().find("object\\")) // ӽ÷ θ ٲٷ ־.. ߿ ʿ .. + // if(-1 == m_TexRefs[j]->FileName().find("object\\")) // 임시로 경로를 바꾸려고 넣었다.. 나중에 필요없음 지운다.. // { - // // ̸ иϰ.. + // // 폴더 이름을 분리하고.. // char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; // _splitpath(m_TexRefs[j]->FileName(), szDrive, szDir, szFName, szExt); // @@ -423,7 +423,7 @@ bool CN3SPart::Save(HANDLE hFile) { // WriteFile(hFile, &nL, 4, &dwRWC, NULL); // Mesh FileName // } - WriteFile(hFile, m_TexRefs[j]->FileName().c_str(), nL, &dwRWC, NULL); // ýó ̸.. + WriteFile(hFile, m_TexRefs[j]->FileName().c_str(), nL, &dwRWC, NULL); // 택스처 파일 이름.. } } @@ -450,7 +450,7 @@ void CN3SPart::PartialRender(int iCount, LPDIRECT3DINDEXBUFFER9 pIB) { } } - if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) // Alpha + if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) // Alpha 사용 { __AlphaPrimitive * pAP = s_AlphaMgr.Add(); if (pAP) { @@ -470,7 +470,7 @@ void CN3SPart::PartialRender(int iCount, LPDIRECT3DINDEXBUFFER9 pIB) { pAP->pwIndices = m_PMInst.GetIndices(); } - return; // . + return; // 렌더링 안하지롱. } static DWORD dwFog, dwCull; @@ -479,7 +479,7 @@ void CN3SPart::PartialRender(int iCount, LPDIRECT3DINDEXBUFFER9 pIB) { CN3Base::s_RenderInfo.nShape_Polygon += m_PMInst.GetNumIndices() / 3; // Rendering Information Update... #endif - if (m_Mtl.nRenderFlags & RF_NOTUSEFOG) // Fog .. + if (m_Mtl.nRenderFlags & RF_NOTUSEFOG) // Fog 무시.. { s_lpD3DDev->GetRenderState(D3DRS_FOGENABLE, &dwFog); if (TRUE == dwFog) { @@ -492,7 +492,7 @@ void CN3SPart::PartialRender(int iCount, LPDIRECT3DINDEXBUFFER9 pIB) { s_lpD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); } - s_lpD3DDev->SetMaterial(&m_Mtl); // .. + s_lpD3DDev->SetMaterial(&m_Mtl); // 재질 설정.. s_lpD3DDev->SetTexture(0, lpTex); if (NULL != lpTex) { s_lpD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, m_Mtl.dwColorOp); @@ -503,13 +503,13 @@ void CN3SPart::PartialRender(int iCount, LPDIRECT3DINDEXBUFFER9 pIB) { s_lpD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); } - // εҶ ̸ .. + // 로딩할때 미리 계산해 놓은 월드 행렬 적용.. s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); m_PMInst.PartialRender(iCount, pIB); if ((m_Mtl.nRenderFlags & RF_NOTUSEFOG) && TRUE == dwFog) { - s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); // Ȱ ʴ´.. + s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); // 안개 사용하지 않는다.. } if ((m_Mtl.nRenderFlags & RF_DOUBLESIDED) && D3DCULL_NONE != dwCull) { s_lpD3DDev->SetRenderState(D3DRS_CULLMODE, dwCull); @@ -534,7 +534,7 @@ void CN3SPart::PartialRender(int iCount, WORD * pIndices) { } } - if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) // Alpha + if (m_Mtl.nRenderFlags & RF_ALPHABLENDING) // Alpha 사용 { __AlphaPrimitive * pAP = s_AlphaMgr.Add(); if (pAP) { @@ -554,7 +554,7 @@ void CN3SPart::PartialRender(int iCount, WORD * pIndices) { pAP->pwIndices = m_PMInst.GetIndices(); } - return; // . + return; // 렌더링 안하지롱. } static DWORD dwFog, dwCull; @@ -563,7 +563,7 @@ void CN3SPart::PartialRender(int iCount, WORD * pIndices) { CN3Base::s_RenderInfo.nShape_Polygon += m_PMInst.GetNumIndices() / 3; // Rendering Information Update... #endif - if (m_Mtl.nRenderFlags & RF_NOTUSEFOG) // Fog .. + if (m_Mtl.nRenderFlags & RF_NOTUSEFOG) // Fog 무시.. { s_lpD3DDev->GetRenderState(D3DRS_FOGENABLE, &dwFog); if (TRUE == dwFog) { @@ -576,7 +576,7 @@ void CN3SPart::PartialRender(int iCount, WORD * pIndices) { s_lpD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); } - s_lpD3DDev->SetMaterial(&m_Mtl); // .. + s_lpD3DDev->SetMaterial(&m_Mtl); // 재질 설정.. s_lpD3DDev->SetTexture(0, lpTex); if (NULL != lpTex) { s_lpD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, m_Mtl.dwColorOp); @@ -587,13 +587,13 @@ void CN3SPart::PartialRender(int iCount, WORD * pIndices) { s_lpD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); } - // εҶ ̸ .. + // 로딩할때 미리 계산해 놓은 월드 행렬 적용.. s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); m_PMInst.PartialRender(iCount, pIndices); if ((m_Mtl.nRenderFlags & RF_NOTUSEFOG) && TRUE == dwFog) { - s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); // Ȱ ʴ´.. + s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, TRUE); // 안개 사용하지 않는다.. } if ((m_Mtl.nRenderFlags & RF_DOUBLESIDED) && D3DCULL_NONE != dwCull) { s_lpD3DDev->SetRenderState(D3DRS_CULLMODE, dwCull); @@ -615,8 +615,8 @@ CN3Shape::CN3Shape() { m_iBelong = 0; m_iEventID = 0; // Event ID m_iEventType = 0; // Event Type - m_iNPC_ID = 0; // NPC Ʈ NPC ID - m_iNPC_Status = 0; // NPC Ʈ NPC Status + m_iNPC_ID = 0; // NPC 로 쓰는 오브젝트일 경우 NPC ID + m_iNPC_Status = 0; // NPC 로 쓰는 오브젝트일 경우 NPC Status } CN3Shape::~CN3Shape() { @@ -639,9 +639,9 @@ void CN3Shape::Release() { m_iBelong = 0; m_iEventID = 0; // Event ID - m_iEventType = 0; // Event Type - εƮ,, ... - m_iNPC_ID = 0; // NPC Ʈ NPC ID - m_iNPC_Status = 0; // NPC Ʈ NPC Status + m_iEventType = 0; // Event Type - 바인드포인트,성문,레버 등등... + m_iNPC_ID = 0; // NPC 로 쓰는 오브젝트일 경우 NPC ID + m_iNPC_Status = 0; // NPC 로 쓰는 오브젝트일 경우 NPC Status CN3TransformCollision::Release(); } @@ -651,8 +651,8 @@ void CN3Shape::Tick(float fFrm) { return; } - // Ÿ.. ø ϰ Ѵ.. - // ū ãƼ.. + // 만약 가까운 거리면.. 좀더 컬링을 느슨하게 한다.. + // 가장 큰 스케일 값을 찾아서.. float fScale = m_vScale.x; if (fScale < m_vScale.y) { fScale = m_vScale.y; @@ -661,7 +661,7 @@ void CN3Shape::Tick(float fFrm) { fScale = m_vScale.z; } - // ī޶ ָ .. + // 카메라와 멀리 떨어지면 지나간다.. float fDist = (m_vPos - s_CameraData.vEye).Magnitude(); if (fDist > s_CameraData.fFP + m_fRadius * fScale * 2.0f) { m_bDontRender = true; @@ -692,8 +692,8 @@ void CN3Shape::Tick(float fFrm) { } } -// ī޶ ġ, ī޶ ( ü ) -> 12 迭 Ǿ ִ. -// [0][1]:ī޶ ġ , [2][3]:ī޶ ġ , [4][5] ~ [10][11]:¿麤 +// 카메라 위치, 카메라 평면(관찰 절두체 평면) -> 12개의 벡터 배열로 되어 있다. +// [0][1]:카메라 위치와 벡터, [2][3]:카메라 범위 위치와 방향 벡터, [4][5] ~ [10][11]:상하좌우평면벡터 void CN3Shape::Render() { if (false == m_bVisible) { return; @@ -718,7 +718,7 @@ void CN3Shape::Render() { #ifdef _N3TOOL void CN3Shape::RenderSelected(bool bWireFrame) { - // ׸.. + // 축그리기.. CN3Transform::Render(NULL, m_fRadius * 3.0f); CN3SPart * pPD = NULL; @@ -730,7 +730,7 @@ void CN3Shape::RenderSelected(bool bWireFrame) { #endif // end of _N3TOOL bool CN3Shape::Load(HANDLE hFile) { - CN3TransformCollision::Load(hFile); // ⺻ б... + CN3TransformCollision::Load(hFile); // 기본정보 읽기... DWORD dwRWC = 0; @@ -746,15 +746,15 @@ bool CN3Shape::Load(HANDLE hFile) { for (int i = 0; i < iPC; i++) { m_Parts[i] = new CN3SPart(); m_Parts[i]->Load(hFile); - m_Parts[i]->ReCalcMatrix(m_Matrix); // Part Matrix + m_Parts[i]->ReCalcMatrix(m_Matrix); // Part Matrix 계산 } } - ReadFile(hFile, &m_iBelong, 4, &dwRWC, NULL); // Ҽ + ReadFile(hFile, &m_iBelong, 4, &dwRWC, NULL); // 소속 ReadFile(hFile, &m_iEventID, 4, &dwRWC, NULL); // Event ID - ReadFile(hFile, &m_iEventType, 4, &dwRWC, NULL); // Event Type - ε Ʈ, , ... - ReadFile(hFile, &m_iNPC_ID, 4, &dwRWC, NULL); // NPC Ʈ NPC ID - ReadFile(hFile, &m_iNPC_Status, 4, &dwRWC, NULL); // NPC Ʈ NPC Status + ReadFile(hFile, &m_iEventType, 4, &dwRWC, NULL); // Event Type - 바인드 포인트, 성문, 레버 등등... + ReadFile(hFile, &m_iNPC_ID, 4, &dwRWC, NULL); // NPC 로 쓰는 오브젝트일 경우 NPC ID + ReadFile(hFile, &m_iNPC_Status, 4, &dwRWC, NULL); // NPC 로 쓰는 오브젝트일 경우 NPC Status this->FindMinMax(); @@ -762,12 +762,12 @@ bool CN3Shape::Load(HANDLE hFile) { } bool CN3Shape::LoadTransformOnly(HANDLE hFile) { - return CN3Transform::Load(hFile); // ⺻ б... + return CN3Transform::Load(hFile); // 기본정보 읽기... } #ifdef _N3TOOL bool CN3Shape::Save(HANDLE hFile) { - CN3TransformCollision::Save(hFile); // ⺻ б... + CN3TransformCollision::Save(hFile); // 기본정보 읽기... DWORD dwRWC = 0; @@ -780,11 +780,11 @@ bool CN3Shape::Save(HANDLE hFile) { m_Parts[i]->Save(hFile); } - WriteFile(hFile, &m_iBelong, 4, &dwRWC, NULL); // Ҽ + WriteFile(hFile, &m_iBelong, 4, &dwRWC, NULL); // 소속 WriteFile(hFile, &m_iEventID, 4, &dwRWC, NULL); // Event ID - WriteFile(hFile, &m_iEventType, 4, &dwRWC, NULL); // Event Type - ε Ʈ, , ... - WriteFile(hFile, &m_iNPC_ID, 4, &dwRWC, NULL); // NPC Ʈ NPC ID - WriteFile(hFile, &m_iNPC_Status, 4, &dwRWC, NULL); // NPC Ʈ NPC Status + WriteFile(hFile, &m_iEventType, 4, &dwRWC, NULL); // Event Type - 바인드 포인트, 성문, 레버 등등... + WriteFile(hFile, &m_iNPC_ID, 4, &dwRWC, NULL); // NPC 로 쓰는 오브젝트일 경우 NPC ID + WriteFile(hFile, &m_iNPC_Status, 4, &dwRWC, NULL); // NPC 로 쓰는 오브젝트일 경우 NPC Status return true; } @@ -835,14 +835,14 @@ bool CN3Shape::IsPMeshProcessed() { #endif // end of _N3TOOL void CN3Shape::ReCalcMatrix() { - CN3Transform::ReCalcMatrix(); // Transfomr Matrix ְ.. + CN3Transform::ReCalcMatrix(); // Transfomr Matrix 를 계산 해주고.. - // Ʈ Ʈ ٽ ش.. + // 각 파트의 매트릭스를 다시 계산해 준다.. ReCalcPartMatrix(); } void CN3Shape::ReCalcPartMatrix() { - // Ʈ Ʈ ٽ ش.. + // 각 파트의 매트릭스를 다시 계산해 준다.. int iPC = m_Parts.size(); for (int i = 0; i < iPC; i++) { m_Parts[i]->ReCalcMatrix(m_Matrix); @@ -864,12 +864,12 @@ void CN3Shape::FindMinMax() { __Vector3 vMinTmp(0, 0, 0); __Vector3 vMaxTmp(0, 0, 0); - // ū ã.. + // 가장 큰 지점찾기.. static __Matrix44 mtxWI; D3DXMatrixInverse(&mtxWI, NULL, &m_Matrix); // World Matrix Inverse for (int i = 0; i < iPC; i++) { - vMinTmp = m_Parts[i]->Min() * mtxWI; // ּҰ ǥ ٲپش.. - vMaxTmp = m_Parts[i]->Max() * mtxWI; // ִ밪 ǥ ٲپش.. + vMinTmp = m_Parts[i]->Min() * mtxWI; // 월드 상의 최소값을 로컬 좌표로 바꾸어준다.. + vMaxTmp = m_Parts[i]->Max() * mtxWI; // 월드 상의 최대값을 로컬 좌표로 바꾸어준다.. if (vMinTmp.x < m_vMin.x) { m_vMin.x = vMinTmp.x; @@ -891,7 +891,7 @@ void CN3Shape::FindMinMax() { } } - // ִ ּҰ Ѵ.. + // 최대 최소값을 갖고 반지름 계산한다.. m_fRadius = (m_vMax - m_vMin).Magnitude() * 0.5f; } @@ -918,7 +918,7 @@ int CN3Shape::CheckCollisionPrecisely(bool bIgnoreBoxCheck, int ixScreen, int iy int CN3Shape::CheckCollisionPrecisely(bool bIgnoreBoxCheck, const __Vector3 & vPos, const __Vector3 & vDir, __Vector3 * pVCol, __Vector3 * pVNormal) { if (false == bIgnoreBoxCheck && false == ::_CheckCollisionByBox(vPos, vDir, m_vMin * m_Matrix, m_vMax * m_Matrix)) { - return -1; // ڽ üũ Ѵ.. + return -1; // 박스 체크 먼저한다.. } __Vector3 vPos2 = vPos, vDir2 = vDir; @@ -935,7 +935,7 @@ int CN3Shape::CheckCollisionPrecisely(bool bIgnoreBoxCheck, const __Vector3 & vP int nFC = nIndexCount / 3; // Face Count if (nFC > 64 && false == ::_CheckCollisionByBox(vPos, vDir, m_Parts[i]->Min(), m_Parts[i]->Max())) { - continue; // Face 24 ϴ ڽüũ Ѵ.. + continue; // Face 수가 24 개보다 많은 경우 일단 박스체크를 한다.. } static __Matrix44 mtxWI; @@ -943,11 +943,11 @@ int CN3Shape::CheckCollisionPrecisely(bool bIgnoreBoxCheck, const __Vector3 & vP vPos2 = vPos * mtxWI; mtxWI.PosSet(0, 0, 0); - vDir2 = vDir * mtxWI; // ķ ȸ.. + vDir2 = vDir * mtxWI; // 역행렬로 회전.. int nCI0, nCI1, nCI2; __Vector3 v0, v1, v2; - for (int j = 0; j < nFC; j++) // Face 浹üũ.. + for (int j = 0; j < nFC; j++) // 각각의 Face 마다 충돌체크.. { nCI0 = pwIs[j * 3 + 0]; nCI1 = pwIs[j * 3 + 1]; @@ -967,8 +967,8 @@ int CN3Shape::CheckCollisionPrecisely(bool bIgnoreBoxCheck, const __Vector3 & vP (*pVNormal).Normalize(); D3DXMatrixInverse(&mtxWI, NULL, &(m_Parts[i]->m_Matrix)); // World Matrix Inverse - mtxWI.PosSet(0, 0, 0); // ķ ȸ.. - (*pVNormal) *= mtxWI; // ķ ȸ.. + mtxWI.PosSet(0, 0, 0); // 역행렬로 회전.. + (*pVNormal) *= mtxWI; // 역행렬로 회전.. } return i; } @@ -977,7 +977,7 @@ int CN3Shape::CheckCollisionPrecisely(bool bIgnoreBoxCheck, const __Vector3 & vP return -1; } -bool CN3Shape::MakeCollisionMeshByParts() // 浹 ޽ø ڽ ... +bool CN3Shape::MakeCollisionMeshByParts() // 충돌 메시를 박스로 만든다... { int iPC = m_Parts.size(); int iVC = 0, iIC = 0; @@ -1040,10 +1040,10 @@ int CN3Shape::CheckCollisionPrecisely(bool bIgnoreBoxCheck, const __Vector3 & vP int iCount = CN3Base::s_MngVMesh.Count(); char szBuff[256]; - sprintf(szBuff, "%s_collision_%d.n3vmesh", m_szFileName.c_str(), iCount); // ӽ÷ ̸ .. + sprintf(szBuff, "%s_collision_%d.n3vmesh", m_szFileName.c_str(), iCount); // 임시로 이름일 짓고.. pVMesh->FileNameSet(szBuff); - CN3Base::s_MngVMesh.Delete(&m_pMeshCollision); // .. + CN3Base::s_MngVMesh.Delete(&m_pMeshCollision); // 전의 거 지우고.. CN3Base::s_MngVMesh.Add(pVMesh); m_pMeshCollision = s_MngVMesh.Get(pVMesh->FileName()); @@ -1052,7 +1052,7 @@ int CN3Shape::CheckCollisionPrecisely(bool bIgnoreBoxCheck, const __Vector3 & vP return true; } -bool CN3Shape::MakeCollisionMeshByPartsDetail() // ״... 浹 ޽ø ... +bool CN3Shape::MakeCollisionMeshByPartsDetail() // 현재 모습 그대로... 충돌 메시를 만든다... { int iPC = m_Parts.size(); int iMaxNumVertices = 0, iMaxNumIndices = 0; @@ -1127,10 +1127,10 @@ int CN3Shape::CheckCollisionPrecisely(bool bIgnoreBoxCheck, const __Vector3 & vP int iCount = CN3Base::s_MngVMesh.Count(); char szBuff[256]; - sprintf(szBuff, "%s_collision_%d.n3vmesh", m_szFileName.c_str(), iCount); // ӽ÷ ̸ .. + sprintf(szBuff, "%s_collision_%d.n3vmesh", m_szFileName.c_str(), iCount); // 임시로 이름일 짓고.. pVMesh->FileNameSet(szBuff); - CN3Base::s_MngVMesh.Delete(&m_pMeshCollision); // .. + CN3Base::s_MngVMesh.Delete(&m_pMeshCollision); // 전의 거 지우고.. CN3Base::s_MngVMesh.Add(pVMesh); m_pMeshCollision = s_MngVMesh.Get(pVMesh->FileName()); @@ -1141,7 +1141,7 @@ int CN3Shape::CheckCollisionPrecisely(bool bIgnoreBoxCheck, const __Vector3 & vP #ifdef _N3TOOL void CN3Shape::MakeDefaultMaterial() { - // Ʈ ⺻ ش.. + // 각 파트의 재질을 기본적인 흰색으로 해준다.. __Material mtlBasic; mtlBasic.Init(); @@ -1154,11 +1154,11 @@ void CN3Shape::MakeDefaultMaterial() { #ifdef _N3TOOL void CN3Shape::RemoveRenderFlags(int nFlags) { - // Ʈ Ʈ ٽ ش.. + // 각 파트의 매트릭스를 다시 계산해 준다.. int iPC = m_Parts.size(); for (int i = 0; i < iPC; i++) { m_Parts[i]->m_Mtl.nRenderFlags &= (~nFlags); - ; // ⺻ .. + ; // 기본 흰색.. } } #endif // end of _N3TOOL @@ -1185,7 +1185,7 @@ bool CN3Shape::SaveToSameFolder(const std::string & szFullPath) { std::vector OldTexFNs; for (int i = 0; i < iPC; i++) { szOldFN = m_Parts[i]->Mesh()->FileName(); - OldPartFNs.push_back(szOldFN); // ̸ .. + OldPartFNs.push_back(szOldFN); // 파일 이름 보관.. _splitpath(szOldFN.c_str(), szDrive, szDir, szFName, szExt); szNameTmp = szPath + szFName + szExt; @@ -1196,7 +1196,7 @@ bool CN3Shape::SaveToSameFolder(const std::string & szFullPath) { CN3Texture * pTex = m_Parts[i]->Tex(j); szOldFN = pTex->FileName(); - OldTexFNs.push_back(szOldFN); // ̸ .. + OldTexFNs.push_back(szOldFN); // 파일 이름 보관.. _splitpath(szOldFN.c_str(), szDrive, szDir, szFName, szExt); szNameTmp = szPath + szFName + szExt; @@ -1210,7 +1210,7 @@ bool CN3Shape::SaveToSameFolder(const std::string & szFullPath) { this->SaveToFile(szNameTmp); m_szFileName = szOldFN; - // ̸ .. + // 원래대로 파일 이름 돌려놓기.. iPC = m_Parts.size(); int iSeq = 0; for (int i = 0; i < iPC; i++) { @@ -1223,7 +1223,7 @@ bool CN3Shape::SaveToSameFolder(const std::string & szFullPath) { } } - // By : Ecli666 ( On 2002-10-16 11:44:19 ) + // By : Ecli666 ( On 2002-10-16 오전 11:44:19 ) // szOldFN = CollisionMesh()->FileName(); _splitpath(CollisionMesh()->FileName().c_str(), szDrive, szDir, szFName, szExt); @@ -1231,7 +1231,7 @@ bool CN3Shape::SaveToSameFolder(const std::string & szFullPath) { CollisionMesh()->SaveToFile(szNameTmp); CollisionMesh()->FileNameSet(szOldFN); - // ~(By Ecli666 On 2002-10-16 11:44:19 ) + // ~(By Ecli666 On 2002-10-16 오전 11:44:19 ) return true; } @@ -1279,7 +1279,7 @@ bool CN3Shape::SaveToSameFolderAndMore(const std::string & szFullPath, const std this->SaveToFile(szNameTmp); m_szFileName = szRelativePath + szFName + szExt; - // By : Ecli666 ( On 2002-10-16 11:44:19 ) + // By : Ecli666 ( On 2002-10-16 오전 11:44:19 ) // if (CollisionMesh()) { _splitpath(CollisionMesh()->FileName().c_str(), szDrive, szDir, szFName, szExt); @@ -1289,14 +1289,14 @@ bool CN3Shape::SaveToSameFolderAndMore(const std::string & szFullPath, const std szOldFN += szExt; CollisionMesh()->FileNameSet(szRelativePath + szFName + szExt); } - // ~(By Ecli666 On 2002-10-16 11:44:19 ) + // ~(By Ecli666 On 2002-10-16 오전 11:44:19 ) return true; } #endif // end of _N3TOOL -// By : Ecli666 ( On 2002-08-06 4:33:32 ) +// By : Ecli666 ( On 2002-08-06 오후 4:33:32 ) // void CN3Shape::SetMaxLOD() { m_bDontRender = false; @@ -1374,4 +1374,4 @@ void CN3Shape::PartialGetCollision(int iIndex, __Vector3 & vec) { CollisionMesh()->PartialGetCollision(iIndex, vec); } -// ~(By Ecli666 On 2002-08-06 4:33:32 ) +// ~(By Ecli666 On 2002-08-06 오후 4:33:32 ) diff --git a/src/engine/N3Base/N3Shape.h b/src/engine/N3Base/N3Shape.h index f2b0f150..9eb8c587 100644 --- a/src/engine/N3Base/N3Shape.h +++ b/src/engine/N3Base/N3Shape.h @@ -18,25 +18,25 @@ class CN3SPart : public CN3BaseFileAccess { friend class CN3Shape; public: - __Vector3 m_vPivot; // Local - __Matrix44 m_Matrix; // World Matrix.. Shape Loading ̸ ؾ .. - BOOL m_bOutOfCameraRange; // Camera ٱ ... + __Vector3 m_vPivot; // Local 축 + __Matrix44 m_Matrix; // World Matrix.. Shape Loading 때 미리 계산해야 좋다.. + BOOL m_bOutOfCameraRange; // Camera 범위 바깥에 있음... __Material m_Mtl; // Material float m_fTexFPS; // Texture Animation Interval; - // __Vector3 m_vWindFactorCur; // ٶ δ .. ̰ ȸ Ų.. - // __Vector3 m_vWindFactorToReach; // ٶ δ .. - float m_fTimeToSetWind; // ٶ δ ٲٱ ð.. - float m_fWindFactorToReach; // ٶ δ .. ̰ ȸ Ų.. - float m_fWindFactorCur; // ٶ δ .. + // __Vector3 m_vWindFactorCur; // 현재 바람 부는 값.. 이값으로 회전을 시킨다.. + // __Vector3 m_vWindFactorToReach; // 바람 부는 값.. + float m_fTimeToSetWind; // 바람 부는 값을 바꾸기 위한 시간.. + float m_fWindFactorToReach; // 현재 바람 부는 값.. 이값으로 회전을 시킨다.. + float m_fWindFactorCur; // 바람 부는 값.. protected: std::vector m_TexRefs; // Texture Reference Pointers CN3PMeshInstance m_PMInst; // Progressive Mesh Instance float - m_fTexIndex; // Current Texture Index.. Animation ų ʿ ε̴.. float ؼ ؽó ϸ̼ Ѵ. + m_fTexIndex; // Current Texture Index.. Animation 시킬때 필요한 인덱스이다.. float 로 해서 텍스처 에니메이션 제어한다. public: virtual bool Load(HANDLE hFile); @@ -79,7 +79,7 @@ class CN3SPart : public CN3BaseFileAccess { } void Tick(const __Matrix44 & mtxParent, const __Quaternion & qRot, - float fScale); // θ Shape , ȸʹϾ ִ´. + float fScale); // 부모 행렬 즉 Shape 행렬, 회전쿼터니언 을 넣는다. void Render(); #ifdef _N3TOOL void RenderSelected(bool bWireFrame); @@ -92,14 +92,14 @@ class CN3SPart : public CN3BaseFileAccess { } else { return __Vector3(0, 0, 0); } - } // ּҰ + } // 월드 상의 최소값 __Vector3 Max() { if (m_PMInst.GetMesh()) { return m_PMInst.GetMesh()->Max() * m_Matrix; } else { return __Vector3(0, 0, 0); } - } // ִ밪 + } // 월드 상의 최대값 float Radius() { if (m_PMInst.GetMesh()) { return m_PMInst.GetMesh()->Radius(); @@ -124,13 +124,13 @@ typedef typename std::vector::iterator it_SPart; class CN3Shape : public CN3TransformCollision { public: - int m_iBelong; // Ҽ - 0:Ҽ 1: 2:ī罺 3:?? .... + int m_iBelong; // 소속 - 0:소속 없음 1:엘모라드 2:카루스 3:?? .... int m_iEventID; // Event ID int m_iEventType; // Event Type - int m_iNPC_ID; // NPC Ʈ NPC ID - int m_iNPC_Status; // NPC Ʈ Default Status + int m_iNPC_ID; // NPC 로 쓰는 오브젝트일 경우 NPC ID + int m_iNPC_Status; // NPC 로 쓰는 오브젝트일 경우 Default Status - bool m_bDontRender; // ī޶ Ÿ ÷װ Ǹ ʴ´.. + bool m_bDontRender; // 카메라 거리에 따라 이플래그가 설정되면 렌더링하지 않는다.. bool m_bVisible; // .. std::vector m_Parts; // Part Data Pointer Linked List @@ -144,12 +144,12 @@ class CN3Shape : public CN3TransformCollision { #endif // end of _N3TOOL int CheckCollisionPrecisely( bool bIgnoreBoxCheck, int ixScreen, int iyScreen, __Vector3 * pVCol = NULL, - __Vector3 * pVNormal = NULL); // ϰ üũ - ڽ üũ ٽ üũ.. + __Vector3 * pVNormal = NULL); // 정밀하게 폴리곤 단위로 체크 - 먼저 박스 체크후 다시 정밀 체크.. int CheckCollisionPrecisely( bool bIgnoreBoxCheck, const __Vector3 & vPos, const __Vector3 & vDir, __Vector3 * pVCol = NULL, - __Vector3 * pVNormal = NULL); // ϰ üũ - ڽ üũ ٽ üũ.. - bool MakeCollisionMeshByParts(); // 浹 ޽ø ڽ · ٽ ... - bool MakeCollisionMeshByPartsDetail(); // ״... 浹 ޽ø ... + __Vector3 * pVNormal = NULL); // 정밀하게 폴리곤 단위로 체크 - 먼저 박스 체크후 다시 정밀 체크.. + bool MakeCollisionMeshByParts(); // 충돌 메시를 박스 형태로 다시 만든다... + bool MakeCollisionMeshByPartsDetail(); // 현재 모습 그대로... 충돌 메시를 만든다... void FindMinMax(); virtual void ReCalcMatrix(); @@ -183,7 +183,7 @@ class CN3Shape : public CN3TransformCollision { CN3Shape(); virtual ~CN3Shape(); - // By : Ecli666 ( On 2002-08-06 4:33:04 ) + // By : Ecli666 ( On 2002-08-06 오후 4:33:04 ) // void SetMaxLOD(); __Matrix44 GetPartMatrix(int iPartIndex); @@ -201,5 +201,5 @@ class CN3Shape : public CN3TransformCollision { void PartialColRender(int iCount, int * piIndices); void PartialGetCollision(int iIndex, __Vector3 & vec); bool LoadTransformOnly(HANDLE hFile); - // ~(By Ecli666 On 2002-08-06 4:33:04 ) + // ~(By Ecli666 On 2002-08-06 오후 4:33:04 ) }; diff --git a/src/engine/N3Base/N3ShapeEx.cpp b/src/engine/N3Base/N3ShapeEx.cpp index d2c1a8d7..328169c4 100644 --- a/src/engine/N3Base/N3ShapeEx.cpp +++ b/src/engine/N3Base/N3ShapeEx.cpp @@ -23,27 +23,27 @@ bool CN3SPartEx::Load(HANDLE hFile) { ReadFile(hFile, &(m_ActionInfo.dwActionFlag), sizeof(m_ActionInfo.dwActionFlag), &dwRWC, NULL); int iStateCount = 0; if (m_ActionInfo.dwActionFlag) { - ReadFile(hFile, &iStateCount, sizeof(iStateCount), &dwRWC, NULL); // + ReadFile(hFile, &iStateCount, sizeof(iStateCount), &dwRWC, NULL); // 상태 정보의 갯수 } if (AF_POS & m_ActionInfo.dwActionFlag) { m_ActionInfo.ActionStateInfos_Pos.assign(iStateCount); for (int i = 0; i < iStateCount; ++i) { ReadFile(hFile, &(m_ActionInfo.ActionStateInfos_Pos[i]), sizeof(__Vector3), &dwRWC, - NULL); // + NULL); // 상태 정보의 갯수 } } if (AF_SCALE & m_ActionInfo.dwActionFlag) { m_ActionInfo.ActionStateInfos_Scale.assign(iStateCount); for (int i = 0; i < iStateCount; ++i) { ReadFile(hFile, &(m_ActionInfo.ActionStateInfos_Scale[i]), sizeof(__Vector3), &dwRWC, - NULL); // + NULL); // 상태 정보의 갯수 } } if (AF_ROTATION & m_ActionInfo.dwActionFlag) { m_ActionInfo.ActionStateInfos_Rot.assign(iStateCount); for (int i = 0; i < iStateCount; ++i) { ReadFile(hFile, &(m_ActionInfo.ActionStateInfos_Rot[i]), sizeof(__Quaternion), &dwRWC, - NULL); // + NULL); // 상태 정보의 갯수 } } @@ -110,32 +110,32 @@ bool CN3ShapeEx::Load(HANDLE hFile) { } DWORD dwRWC; - ReadFile(hFile, &m_iActionStateCount, sizeof(m_iActionStateCount), &dwRWC, NULL); // + ReadFile(hFile, &m_iActionStateCount, sizeof(m_iActionStateCount), &dwRWC, NULL); // 상태 정보의 갯수 ReadFile(hFile, &(m_ActionInfo.dwActionFlag), sizeof(m_ActionInfo.dwActionFlag), &dwRWC, NULL); int iStateCount = 0; if (m_ActionInfo.dwActionFlag) { - ReadFile(hFile, &iStateCount, sizeof(iStateCount), &dwRWC, NULL); // + ReadFile(hFile, &iStateCount, sizeof(iStateCount), &dwRWC, NULL); // 상태 정보의 갯수 } if (AF_POS & m_ActionInfo.dwActionFlag) { m_ActionInfo.ActionStateInfos_Pos.assign(iStateCount); for (int i = 0; i < iStateCount; ++i) { ReadFile(hFile, &(m_ActionInfo.ActionStateInfos_Pos[i]), sizeof(__Vector3), &dwRWC, - NULL); // + NULL); // 상태 정보의 갯수 } } if (AF_SCALE & m_ActionInfo.dwActionFlag) { m_ActionInfo.ActionStateInfos_Scale.assign(iStateCount); for (int i = 0; i < iStateCount; ++i) { ReadFile(hFile, &(m_ActionInfo.ActionStateInfos_Scale[i]), sizeof(__Vector3), &dwRWC, - NULL); // + NULL); // 상태 정보의 갯수 } } if (AF_ROTATION & m_ActionInfo.dwActionFlag) { m_ActionInfo.ActionStateInfos_Rot.assign(iStateCount); for (int i = 0; i < iStateCount; ++i) { ReadFile(hFile, &(m_ActionInfo.ActionStateInfos_Rot[i]), sizeof(__Quaternion), &dwRWC, - NULL); // + NULL); // 상태 정보의 갯수 } } @@ -144,10 +144,10 @@ bool CN3ShapeEx::Load(HANDLE hFile) { void CN3ShapeEx::ReCalcMatrix() { /* - // m_Matrix ٽ .. - CN3Transform::ReCalcMatrix(); // Transform Matrix ְ.. + // m_Matrix 다시 계산.. + CN3Transform::ReCalcMatrix(); // Transform Matrix 를 계산 해주고.. - // Ʈ Ʈ ٽ . + // 각 파트의 매트릭스를 다시 계산. int iPC = m_Parts.size(); for(int i = 0; i < iPC; i++) { @@ -156,12 +156,12 @@ void CN3ShapeEx::ReCalcMatrix() { __ActionPart* pModPart = m_pMatchPart2ActionPart[i]; // Scale m_Parts[i]->m_Matrix.Scale(pModPart->CurStateInfo.vScale); - // ȸ + // 회전 static __Matrix44 mtxRot; D3DXMatrixRotationQuaternion(&mtxRot, &(pModPart->CurStateInfo.qRot)); m_Parts[i]->m_Matrix *= mtxRot; - // ġ + // 위치 m_Parts[i]->m_Matrix.PosSet(m_Parts[i]->m_vPivot + pModPart->CurStateInfo.vPos); m_Parts[i]->m_Matrix *= m_Matrix; } diff --git a/src/engine/N3Base/N3ShapeEx.h b/src/engine/N3Base/N3ShapeEx.h index d33fac5c..af93701c 100644 --- a/src/engine/N3Base/N3ShapeEx.h +++ b/src/engine/N3Base/N3ShapeEx.h @@ -1,28 +1,28 @@ // N3ShapeEx.h: interface for the CN3ShapeEx class. -// : dino -// n3shape Ϻκ ְ Ŭ -// (0 , 1, 2) ִ. -// (ð ־ָ ° pos rot scale linearϰ ȭŲ. +// 만든이 : dino +// n3shape의 한 일부분을 움직일 수 있게 한 클래스 +// 상태(0번 상태, 1번상태, 2번상태)를 변경할 수 있다. +// 상태 변경시 (시간을 넣어주면 상태간의 pos rot scale 정보를 linear하게 변화시킨다. -// : Shape ü ̴ ¸ ߰ -// ߰Ϸ ʹ Ͽ . ũ κ ׿ õ . ߰ ؾ. +// 개선점 : Shape 전체가 움직이는 상태를 추가하자 +// 설계시 추가하려다 너무 복잡하여 보류함. 리마크 된 부분이 그에 관련된 것임. 추가 보강해야함. ////////////////////////////////////////////////////////////////////// #pragma once #include "N3Shape.h" -const DWORD AF_POS = 0x00000001; // Pos ȭ ִ. -const DWORD AF_SCALE = 0x00000002; // Scale ȭ ִ. -const DWORD AF_ROTATION = 0x00000004; // Rotation ȭ ִ. +const DWORD AF_POS = 0x00000001; // Pos 변화가 있다. +const DWORD AF_SCALE = 0x00000002; // Scale 변화가 있다. +const DWORD AF_ROTATION = 0x00000004; // Rotation 변화가 있다. struct __ActionInfo { - DWORD dwActionFlag; // Pos, Scale, Rot ȭ ִ°? - std::vector<__Vector3> ActionStateInfos_Pos; // (̵ ִٸ m_iActionStateCount) - std::vector<__Vector3> ActionStateInfos_Scale; // Ȯ - std::vector<__Quaternion> ActionStateInfos_Rot; // ȸ - // __Vector3 vCurAction_Pos; // (tick ȭѴ) - // __Vector3 vCurAction_Scale; // (tick ȭѴ) - // __Quaternion qtCurAction_Rot; // (tick ȭѴ) + DWORD dwActionFlag; // Pos, Scale, Rot 변화가 있는가? + std::vector<__Vector3> ActionStateInfos_Pos; // 움직일 상태 정보들(이동 정보 있다면 m_iActionStateCount개) + std::vector<__Vector3> ActionStateInfos_Scale; // 확대축소 + std::vector<__Quaternion> ActionStateInfos_Rot; // 회전 + // __Vector3 vCurAction_Pos; // 현재 움직인 상태 정보(tick에 따라 변화한다) + // __Vector3 vCurAction_Scale; // 현재 움직인 상태 정보(tick에 따라 변화한다) + // __Quaternion qtCurAction_Rot; // 현재 움직인 상태 정보(tick에 따라 변화한다) }; class CN3SPartEx : public CN3SPart { @@ -34,7 +34,7 @@ class CN3SPartEx : public CN3SPart { // Attributes public: protected: - __ActionInfo m_ActionInfo; // ӿ + __ActionInfo m_ActionInfo; // 움직임에 관한 정보 // Operations public: @@ -58,17 +58,17 @@ class CN3ShapeEx : public CN3Shape { // Attributes public: protected: - int m_iActionStateCount; // °  ִ Ÿ. - int m_iCurActionState; // - int m_iPrevActionState; // (ο ¸ ָ AnimationǴ ¸ صд. - float m_fActionTimeChanged; // ° ٲ ð - float m_fActionTimeChanging; // ° ٲ ۽ð ݱ ð + int m_iActionStateCount; // 상태가 몇개가 있는지 나타낸다. + int m_iCurActionState; // 현재 상태 + int m_iPrevActionState; // 이전 상태(새로운 상태를 설정해주면 Animation되는 동안 이전상태를 저장해둔다. + float m_fActionTimeChanged; // 상태가 완전히 바뀌는 시간 + float m_fActionTimeChanging; // 상태가 바뀌는 시작시간부터 지금까지의 경과 시간 - __ActionInfo m_ActionInfo; // ӿ + __ActionInfo m_ActionInfo; // 움직임에 관한 정보 // Operations public: - BOOL SetState(int iState, float fSec); // fSecð ¸ ٲ۴. (fSec 0ϰ ٲ.) + BOOL SetState(int iState, float fSec); // fSec시간동안 상태를 바꾼다. (fSec이 0일경우 즉시 바뀐다.) virtual void Release(); virtual void ReCalcMatrix(); virtual void Tick(float fFrm = FRAME_SELFPLAY); diff --git a/src/engine/N3Base/N3ShapeExtra.cpp b/src/engine/N3Base/N3ShapeExtra.cpp index 656d7811..f6d974b0 100644 --- a/src/engine/N3Base/N3ShapeExtra.cpp +++ b/src/engine/N3Base/N3ShapeExtra.cpp @@ -36,7 +36,7 @@ bool CN3ShapeExtra::Load(HANDLE hFile) { void CN3ShapeExtra::Tick(float fFrm) { if (false == m_bVisible) { m_bDontRender = true; - return; // ʴ´. + return; // 강제로 렌더링 하지 않는다. } CN3Shape::Tick(); @@ -63,11 +63,11 @@ void CN3ShapeExtra::Tick(float fFrm) { if (pRot->fRadianPerSec == 0 || pRot->fRadianCur == pRot->fRadianToReach) { continue; } - (pRot->fRadianCur < pRot->fRadianToReach) ? fDir = 1.0f : fDir = -1.0f; // .. + (pRot->fRadianCur < pRot->fRadianToReach) ? fDir = 1.0f : fDir = -1.0f; // 도는 방향.. fRotDelta = pRot->fRadianPerSec * fDir * CN3Base::s_fSecPerFrm; pRot->fRadianCur += fRotDelta; - if (T_Abs(pRot->fRadianToReach - pRot->fRadianCur) <= fRotDelta) /// ϴ ȴ!! + if (T_Abs(pRot->fRadianToReach - pRot->fRadianCur) <= fRotDelta) /// 원하는 곳까지 다 열렸다!! { bNeedRemakeCollisionMeshes = true; pRot->fRadianPerSec = 0; @@ -81,7 +81,7 @@ void CN3ShapeExtra::Tick(float fFrm) { } if (bNeedRemakeCollisionMeshes) { - this->MakeCollisionMeshByParts(); // 浹޽ø ٽ .. + this->MakeCollisionMeshByParts(); // 충돌메시를 다시 만든다.. } } @@ -98,6 +98,6 @@ void CN3ShapeExtra::RotateTo(int iPart, const __Vector3 & vAxis, float fRadianTo pRot->vAxis = vAxis; if (bImmediately) { pRot->fRadianCur = pRot->fRadianToReach - - 0.01f; // ̷ .. ణ ִ ѹ ƽ ϱ ؼ̴. + 0.01f; // 이러면 직빵으로 열린다.. 약간 값을 빼주는 이유는 한번은 틱을 돌게 하기 위해서이다. } } \ No newline at end of file diff --git a/src/engine/N3Base/N3ShapeExtra.h b/src/engine/N3Base/N3ShapeExtra.h index 579ed6e8..28b66264 100644 --- a/src/engine/N3Base/N3ShapeExtra.h +++ b/src/engine/N3Base/N3ShapeExtra.h @@ -14,10 +14,10 @@ class CN3ShapeExtra : public CN3Shape { protected: struct __Rotation { - float fRadianPerSec; // ʴ ȸ.. Radian... - __Vector3 vAxis; // ȸ.. - float fRadianCur; // ȸ.. - float fRadianToReach; // ȸų.. + float fRadianPerSec; // 초당 회전.. Radian... + __Vector3 vAxis; // 회전축.. + float fRadianCur; // 현재 회전값.. + float fRadianToReach; // 회전시킬값.. __Rotation() { memset(this, 0, sizeof(__Rotation)); @@ -29,7 +29,7 @@ class CN3ShapeExtra : public CN3Shape { public: void RotateTo(int iPart, const __Vector3 & vAxis, float fRadianToReach, float fRadianPerSec, - bool bImmediately = false); // ϴ Ʈ ࿡ ӵ ȸŲ.. + bool bImmediately = false); // 원하는 파트를 축에 따라 지정한 각도까지 지정한 속도로 회전시킨다.. bool Load(HANDLE hFile); void Tick(float fFrm); diff --git a/src/engine/N3Base/N3ShapeMgr.cpp b/src/engine/N3Base/N3ShapeMgr.cpp index fd19144b..ca935da2 100644 --- a/src/engine/N3Base/N3ShapeMgr.cpp +++ b/src/engine/N3Base/N3ShapeMgr.cpp @@ -70,7 +70,7 @@ void CN3ShapeMgr::Release() { #endif // end of #ifndef _3DSERVER #ifdef _N3TOOL - m_CollisionExtras.clear(); // ߰ 浹üũ + m_CollisionExtras.clear(); // 추가로 넣을 충돌체크 데이터 #endif // end of #ifedef _N3TOOL } @@ -97,7 +97,7 @@ bool CN3ShapeMgr::Load(HANDLE hFile) { #ifdef _N3GAME #ifndef _REPENT - CUILoading * pUILoading = CGameProcedure::s_pUILoading; // ε.. + CUILoading * pUILoading = CGameProcedure::s_pUILoading; // 로딩바.. #endif #endif // end of #ifndef _N3GAME @@ -115,29 +115,29 @@ bool CN3ShapeMgr::Load(HANDLE hFile) { for (int i = 0; i < iSC; i++) { ReadFile(hFile, &dwType, 4, &dwRWC, NULL); // Shape Type if (dwType & OBJ_SHAPE_EXTRA) { - pShape = new CN3ShapeExtra(); // Ȯ Object .. + pShape = new CN3ShapeExtra(); // 성문등 확장된 Object 로 쓸경우.. } else { pShape = new CN3Shape(); } m_Shapes.push_back(pShape); - // pShape->m_iEventID; ε Ʈ 100~, 200~ 1100~, 1200~ 2100~, 2200~ - // pShape->m_iEventType; 0-εƮ 1-(¿쿭) 2-(Ͽ) 3-(ϴ) 4-(, Ⱥ) - // pShape->m_iNPC_ID; Object ID + // pShape->m_iEventID; 바인드 포인트 100~, 200~ 성문 1100~, 1200~ 레버 2100~, 2200~ + // pShape->m_iEventType; 0-바인드포인트 1-성문(좌우열림) 2-성문(상하열림) 3-레버(상하당김) 4-깃발(보임, 안보임) + // pShape->m_iNPC_ID; 조종할 Object ID // pShape->m_iNPC_Status; toggle 0, 1 pShape->Load(hFile); - if (pShape->m_iEventID) // ID ִ Ʈ ... NPC ִ.. + if (pShape->m_iEventID) // ID 가 있는 오브젝트 ... NPC 로 쓸수 있다.. { m_ShapesHaveID.push_back(pShape); - pShape->MakeCollisionMeshByParts(); // ״... 浹 ޽ø ... + pShape->MakeCollisionMeshByParts(); // 현재 모습 그대로... 충돌 메시를 만든다... TRACE(" Load OBject Event : ID(%d) Type(%d) CtrlID(%d) Status(%d)\n", pShape->m_iEventID, pShape->m_iEventType, pShape->m_iNPC_ID, pShape->m_iNPC_Status); - if (1 == pShape->m_iEventType || // ¿쿭, - 2 == pShape->m_iEventType || // Ͽ - 3 == pShape->m_iEventType) // + if (1 == pShape->m_iEventType || // 좌우열림성문, + 2 == pShape->m_iEventType || // 상하열림성문 + 3 == pShape->m_iEventType) // 상하 레버 { pShape->m_bVisible = false; } else { @@ -146,12 +146,12 @@ bool CN3ShapeMgr::Load(HANDLE hFile) { } #ifdef _N3GAME - // ڵ... .. + // 강제 코딩... 각종 성문 열기.. // if(dwType & OBJ_SHAPE_EXTRA) // { - // CN3ShapeExtra* pSE = (CN3ShapeExtra*)pShape; // Ȯ Object .. - // pSE->RotateTo(0, __Vector3(0,1,0), 80, 1, true); // ٷ . - // pSE->RotateTo(1, __Vector3(0,1,0), -80, 1, true); // ٷ . + // CN3ShapeExtra* pSE = (CN3ShapeExtra*)pShape; // 성문등 확장된 Object 로 쓸경우.. + // pSE->RotateTo(0, __Vector3(0,1,0), 80, 1, true); // 바로 열기. + // pSE->RotateTo(1, __Vector3(0,1,0), -80, 1, true); // 바로 열기. // } if (!(i % 64)) { @@ -179,7 +179,7 @@ bool CN3ShapeMgr::LoadCollisionData(HANDLE hFile) { ReadFile(hFile, &m_fMapLength, 4, &dwRWC, NULL); // Shape Count this->Create(m_fMapWidth, m_fMapLength); - // 浹 üũ б.. + // 충돌 체크 폴리곤 데이터 읽기.. ReadFile(hFile, &m_nCollisionFaceCount, 4, &dwRWC, NULL); delete[] m_pvCollisions; m_pvCollisions = NULL; @@ -188,7 +188,7 @@ bool CN3ShapeMgr::LoadCollisionData(HANDLE hFile) { ReadFile(hFile, m_pvCollisions, sizeof(__Vector3) * m_nCollisionFaceCount * 3, &dwRWC, NULL); } - // Cell Data . + // Cell Data 쓰기. BOOL bExist = FALSE; int z = 0; for (float fZ = 0.0f; fZ < m_fMapLength; fZ += CELL_MAIN_SIZE, z++) { @@ -197,7 +197,7 @@ bool CN3ShapeMgr::LoadCollisionData(HANDLE hFile) { delete m_pCells[x][z]; m_pCells[x][z] = NULL; - ReadFile(hFile, &bExist, 4, &dwRWC, NULL); // Ͱ ִ .. + ReadFile(hFile, &bExist, 4, &dwRWC, NULL); // 데이터가 있는 셀인지 쓰고.. if (FALSE == bExist) { continue; } @@ -226,12 +226,12 @@ bool CN3ShapeMgr::Save(HANDLE hFile) { dwType = m_Shapes[i]->Type(); if (m_Shapes[i]->m_iEventID || m_Shapes[i]->m_iEventType || m_Shapes[i]->m_iNPC_ID || m_Shapes[i]->m_iNPC_Status) { - dwType |= OBJ_SHAPE_EXTRA; // NPC ID .. Ȯ Shape ... + dwType |= OBJ_SHAPE_EXTRA; // NPC ID 가 있으면.. 확장 Shape 로 ... } WriteFile(hFile, &dwType, 4, &dwRWC, NULL); // Shape Type - m_Shapes[i]->CollisionMeshSet(""); // 浹 ޽ô ش.. - m_Shapes[i]->ClimbMeshSet(""); // 浹 ޽ô ش.. + m_Shapes[i]->CollisionMeshSet(""); // 충돌 메시는 지워준다.. + m_Shapes[i]->ClimbMeshSet(""); // 충돌 메시는 지워준다.. m_Shapes[i]->Save(hFile); } #endif // end of #ifndef _3DSERVER @@ -243,16 +243,16 @@ bool CN3ShapeMgr::Save(HANDLE hFile) { bool CN3ShapeMgr::SaveCollisionData(HANDLE hFile) { DWORD dwRWC; - WriteFile(hFile, &m_fMapWidth, 4, &dwRWC, NULL); // ʺ - WriteFile(hFile, &m_fMapLength, 4, &dwRWC, NULL); // + WriteFile(hFile, &m_fMapWidth, 4, &dwRWC, NULL); // 맵 실제 미터 단위 너비 + WriteFile(hFile, &m_fMapLength, 4, &dwRWC, NULL); // 맵 실제 미터 단위 길이 - // 浹 üũ .. + // 충돌 체크 폴리곤 데이터 쓰기.. WriteFile(hFile, &m_nCollisionFaceCount, 4, &dwRWC, NULL); if (m_nCollisionFaceCount > 0) { WriteFile(hFile, m_pvCollisions, sizeof(__Vector3) * m_nCollisionFaceCount * 3, &dwRWC, NULL); } - // Cell Data . + // Cell Data 쓰기. int z = 0; for (float fZ = 0.0f; fZ < m_fMapLength; fZ += CELL_MAIN_SIZE, z++) { int x = 0; @@ -261,7 +261,7 @@ bool CN3ShapeMgr::SaveCollisionData(HANDLE hFile) { if (m_pCells[x][z]) { bExist = TRUE; } - WriteFile(hFile, &bExist, 4, &dwRWC, NULL); // Ͱ ִ .. + WriteFile(hFile, &bExist, 4, &dwRWC, NULL); // 데이터가 있는 셀인지 쓰고.. if (NULL == m_pCells[x][z]) { continue; @@ -275,7 +275,7 @@ bool CN3ShapeMgr::SaveCollisionData(HANDLE hFile) { } #endif // end of _N3TOOL -bool CN3ShapeMgr::Create(float fMapWidth, float fMapLength) // ʺ ̸ ִ´.. +bool CN3ShapeMgr::Create(float fMapWidth, float fMapLength) // 맵의 너비와 높이를 미터 단위로 넣는다.. { if (fMapWidth <= 0.0f || fMapWidth > MAX_CELL_MAIN * CELL_MAIN_SIZE || fMapLength <= 0.0f || fMapLength > MAX_CELL_MAIN * CELL_MAIN_SIZE) { @@ -291,7 +291,7 @@ bool CN3ShapeMgr::SaveCollisionData(HANDLE hFile) { #ifdef _N3TOOL void CN3ShapeMgr::GenerateCollisionData() { int nFC = 0, iSC = m_Shapes.size(); - for (int i = 0; i < iSC; i++) // Shape ִ 浹 ޽ ŭ . + for (int i = 0; i < iSC; i++) // Shape 에 있는 충돌 메시 만큼 생성. { CN3VMesh * pVM = m_Shapes[i]->CollisionMesh(); if (NULL == pVM) { @@ -306,7 +306,7 @@ void CN3ShapeMgr::GenerateCollisionData() { } } - nFC += m_CollisionExtras.size() / 3; // ߰ 浹 .. + nFC += m_CollisionExtras.size() / 3; // 추가 충돌 데이터.. if (nFC <= 0) { return; @@ -315,11 +315,11 @@ void CN3ShapeMgr::GenerateCollisionData() { m_nCollisionFaceCount = nFC; delete[] m_pvCollisions; m_pvCollisions = NULL; - m_pvCollisions = new __Vector3[nFC * 3]; // 浹 + m_pvCollisions = new __Vector3[nFC * 3]; // 충돌 폴리곤 생성 memset(m_pvCollisions, 0, sizeof(__Vector3) * nFC * 3); int nCPC = 0; // Collision Polygon Count - for (int i = 0; i < iSC; i++) // Shape ִ 浹 ޽ ŭ .. + for (int i = 0; i < iSC; i++) // Shape 에 있는 충돌 메시 만큼 데이터 복사.. { CN3VMesh * pVMesh = m_Shapes[i]->CollisionMesh(); if (NULL == pVMesh) { @@ -330,29 +330,29 @@ void CN3ShapeMgr::GenerateCollisionData() { if (nIC > 0) { WORD * pwIs = pVMesh->Indices(); for (int j = 0; j < nIC; j++) { - m_pvCollisions[nCPC++] = pVSrc[pwIs[j]] * m_Shapes[i]->m_Matrix; // ġ̴. + m_pvCollisions[nCPC++] = pVSrc[pwIs[j]] * m_Shapes[i]->m_Matrix; // 월드 위치이다. } } else { int nVC = pVMesh->VertexCount(); for (int j = 0; j < nVC; j++) { - m_pvCollisions[nCPC++] = pVSrc[j] * m_Shapes[i]->m_Matrix; // ġ̴. + m_pvCollisions[nCPC++] = pVSrc[j] * m_Shapes[i]->m_Matrix; // 월드 위치이다. } } } - // ߰ 浹 ֱ.. + // 추가 충돌 데이터 넣기.. it_Vector3 it = m_CollisionExtras.begin(), itEnd = m_CollisionExtras.end(); for (; it != itEnd; it++) { m_pvCollisions[nCPC++] = *it; } if (nCPC != (nFC * 3)) { - __ASSERT(0, "浹 üũ ٸϴ."); + __ASSERT(0, "충돌 체크 폴리곤의 점갯수와 면 갯수가 다릅니다."); this->Release(); return; } - // ִ Ȥ ԵǾ ִ Ǵؼ ε Ѵ. + // 각 선분이 셀에 걸쳐 있는지 혹은 포함되어 있는지 등등 판단해서 인덱스 생성을 한다. int xSMax = (int)(m_fMapWidth / CELL_SUB_SIZE); int zSMax = (int)(m_fMapLength / CELL_SUB_SIZE); for (int i = 0; i < nFC; i++) { @@ -365,9 +365,9 @@ void CN3ShapeMgr::GenerateCollisionData() { vEdge[2][0] = m_pvCollisions[i * 3 + 2]; vEdge[2][1] = m_pvCollisions[i * 3]; - for (int j = 0; j < 3; j++) // ִ ޽ ŭ ... + for (int j = 0; j < 3; j++) // 걸쳐 있는 메시 만큼 생성... { - // ϰ.. + // 범위를 정하고.. int xx1 = 0, xx2 = 0, zz1 = 0, zz2 = 0; if (vEdge[j][0].x < vEdge[j][1].x) { @@ -412,7 +412,7 @@ void CN3ShapeMgr::GenerateCollisionData() { zz2 = zSMax - 1; } - for (int z = zz1; z <= zz2; z++) // ŭ ó.. + for (int z = zz1; z <= zz2; z++) // 범위만큼 처리.. { float fZMin = (float)(z * CELL_SUB_SIZE); float fZMax = (float)((z + 1) * CELL_SUB_SIZE); @@ -449,24 +449,24 @@ void CN3ShapeMgr::GenerateCollisionData() { bool bWriteID = false; if (dwOC0 & dwOC1) { - bWriteID = false; // ܺο ִ. + bWriteID = false; // 두 끝점이 같은 변의 외부에 있다. } else if (dwOC0 == 0 && dwOC1 == 0) { - bWriteID = true; // 簢 ο + bWriteID = true; // 선분이 사각형 내부에 있음 } else if ((dwOC0 == 0 && dwOC1 != 0) || (dwOC0 != 0 && dwOC1 == 0)) { - bWriteID = true; // ο ܺο . - } else if ((dwOC0 & dwOC1) == 0) // L ܺο Ǵ ٽ ؾ Ѵ. + bWriteID = true; // 선분 한점은 셀의 내부에 한점은 외부에 있음. + } else if ((dwOC0 & dwOC1) == 0) // 두 꿑점 모두 셀 외부에 있지만 판단을 다시 해야 한다. { float fXCross = vEdge[j][0].x + (fZMax - vEdge[j][0].z) * (vEdge[j][1].x - vEdge[j][0].x) / - (vEdge[j][1].z - vEdge[j][0].z); // ϰ.. + (vEdge[j][1].z - vEdge[j][0].z); // 위의 변과의 교차점을 계산하고.. if (fXCross < fXMin) { - bWriteID = false; // ܰ ִ. + bWriteID = false; // 완전히 외곽에 있다. } else { - bWriteID = true; // óִ. + bWriteID = true; // 걸처있다. } } - if (false == bWriteID) // ɸ ٸ... Ƽ 浹 üũѴ. + if (false == bWriteID) // 만약 걸린게 없다면... 위에서 직선을 쏘아서 충돌인지 체크한다. { __Vector3 vPos, vDir; vDir.Set(0, -1.0f, 0); @@ -476,19 +476,19 @@ void CN3ShapeMgr::GenerateCollisionData() { for (float fX = xx3; fX <= xx4 && false == bWriteID; fX += 0.25f) { vPos.Set(fX, 10000.0f, fZ); if (::_IntersectTriangle(vPos, vDir, m_pvCollisions[i * 3], m_pvCollisions[i * 3 + 1], - m_pvCollisions[i * 3 + 2])) // 浹 üũ.. + m_pvCollisions[i * 3 + 2])) // 폴리곤 충돌 체크.. { - bWriteID = true; // 浹 ε .. + bWriteID = true; // 충돌 폴리곤 인덱스를 쓰게 만든다.. } } } } if (false == bWriteID) { - continue; // 浹 .. + continue; // 충돌 폴리곤 쓸일 없소.. } - // 浹 Ѵ.. + // 충돌 정보를 써야 한다.. int nX = x / CELL_MAIN_DEVIDE; int nZ = z / CELL_MAIN_DEVIDE; if (nX < 0 || nX >= MAX_CELL_MAIN || nZ < 0 && nZ >= MAX_CELL_MAIN) { @@ -506,7 +506,7 @@ void CN3ShapeMgr::GenerateCollisionData() { int nCCPC = pSubCell->nCCPolyCount; // Collision Check Polygon Count bool bOverlapped = false; - for (int k = 0; k < nCCPC; k++) // ߺ Ǵ üũ + for (int k = 0; k < nCCPC; k++) // 중복 되는지 체크 { if (i * 3 == pSubCell->pdwCCVertIndices[k * 3]) { bOverlapped = true; @@ -515,34 +515,34 @@ void CN3ShapeMgr::GenerateCollisionData() { } if (true == bOverlapped) { - continue; // ģ ִ üũ + continue; // 겹친게 있는지 체크 } - // ߺȰ .. - if (0 == nCCPC) // ÷ Ǿ.. + // 중복된게 없으면.. + if (0 == nCCPC) // 첨 생성 되었으면.. { pSubCell->pdwCCVertIndices = new DWORD[768]; memset(pSubCell->pdwCCVertIndices, 0, 768 * 4); } - // else // ̹ .. + // else // 이미 있으면.. // { // DWORD* pwBack = pSubCell->pdwCCVertIndices; // pSubCell->pdwCCVertIndices = new DWORD[(nCCPC+1)*3]; - // memcpy(pSubCell->pdwCCVertIndices, pwBack, nCCPC * 3 * 4); // ϳ ̰ ε̹Ƿ.. + // memcpy(pSubCell->pdwCCVertIndices, pwBack, nCCPC * 3 * 4); // 점세개가 하나의 폴리곤이고 워드 인덱스이므로.. // delete [] pwBack; // } if (nCCPC >= 256) { - __ASSERT(0, "浹 üũ ʹ ϴ"); + __ASSERT(0, "충돌 체크 폴리곤 수가 너무 많습니다"); continue; } - pSubCell->pdwCCVertIndices[nCCPC * 3 + 0] = i * 3 + 0; // ε .. - pSubCell->pdwCCVertIndices[nCCPC * 3 + 1] = i * 3 + 1; // ε .. - pSubCell->pdwCCVertIndices[nCCPC * 3 + 2] = i * 3 + 2; // ε .. - pSubCell->nCCPolyCount++; // Collision Check Polygon Count ø. + pSubCell->pdwCCVertIndices[nCCPC * 3 + 0] = i * 3 + 0; // 인덱스 저장.. + pSubCell->pdwCCVertIndices[nCCPC * 3 + 1] = i * 3 + 1; // 인덱스 저장.. + pSubCell->pdwCCVertIndices[nCCPC * 3 + 2] = i * 3 + 2; // 인덱스 저장.. + pSubCell->nCCPolyCount++; // Collision Check Polygon Count 를 늘린다. } // end of for(int x = xx1; x <= xx2; x++) - } // end of for(int z = zz1; z <= zz2; z++) // ŭ ó.. - } // end of for(int j = 0; j < 3; j++) // ִ ޽ ŭ ... + } // end of for(int z = zz1; z <= zz2; z++) // 범위만큼 처리.. + } // end of for(int j = 0; j < 3; j++) // 걸쳐 있는 메시 만큼 생성... } } #endif // end of _N3TOOL @@ -560,9 +560,9 @@ int CN3ShapeMgr::Add(CN3Shape * pShape) { return -1; } - pShape->SaveToFile(); // Ϸ ϰ.. + pShape->SaveToFile(); // 파일로 저장하고.. CN3Shape * pShapeAdd = new CN3Shape(); - if (false == pShapeAdd->LoadFromFile(pShape->FileName())) // + if (false == pShapeAdd->LoadFromFile(pShape->FileName())) // 이 파일을 열은 다음 { delete pShapeAdd; return -1; @@ -573,10 +573,10 @@ int CN3ShapeMgr::Add(CN3Shape * pShape) { } int iSC = m_pCells[nX][nZ]->nShapeCount; - if (0 == iSC) // ÷ Ǿ.. + if (0 == iSC) // 첨 생성 되었으면.. { m_pCells[nX][nZ]->pwShapeIndices = new WORD[iSC + 1]; - } else // ̹ .. + } else // 이미 있으면.. { WORD * pwBack = m_pCells[nX][nZ]->pwShapeIndices; m_pCells[nX][nZ]->pwShapeIndices = new WORD[iSC + 1]; @@ -584,10 +584,10 @@ int CN3ShapeMgr::Add(CN3Shape * pShape) { delete[] pwBack; } - m_pCells[nX][nZ]->pwShapeIndices[iSC] = m_Shapes.size(); // ε .. + m_pCells[nX][nZ]->pwShapeIndices[iSC] = m_Shapes.size(); // 인덱스 저장.. - m_Shapes.push_back(pShapeAdd); // ߰ Ѵ.. - m_pCells[nX][nZ]->nShapeCount++; // Shape Count ø. + m_Shapes.push_back(pShapeAdd); // 추가 한다.. + m_pCells[nX][nZ]->nShapeCount++; // Shape Count 를 늘린다. return m_Shapes.size() - 1; } @@ -596,9 +596,9 @@ int CN3ShapeMgr::Add(CN3Shape * pShape) { #ifdef _N3TOOL bool CN3ShapeMgr::AddCollisionTriangle(const __Vector3 & v1, const __Vector3 & v2, const __Vector3 & v3) { int count = m_CollisionExtras.size(); - m_CollisionExtras.push_back(v1); // ߰ 浹üũ - m_CollisionExtras.push_back(v2); // ߰ 浹üũ - m_CollisionExtras.push_back(v3); // ߰ 浹üũ + m_CollisionExtras.push_back(v1); // 추가로 넣을 충돌체크 데이터 + m_CollisionExtras.push_back(v2); // 추가로 넣을 충돌체크 데이터 + m_CollisionExtras.push_back(v3); // 추가로 넣을 충돌체크 데이터 if ((count + 3) == m_CollisionExtras.size()) { return true; @@ -651,7 +651,7 @@ void CN3ShapeMgr::Tick() { } m_ShapesToRender.clear(); - // Ʈ .. + // 렌더링 리스트 비우고.. for (int zM = zMainS; zM < zMainE; zM++) { for (int xM = xMainS; xM < xMainE; xM++) { @@ -693,28 +693,28 @@ void CN3ShapeMgr::Render() { } #endif // end of #ifndef _3DSERVER -bool CN3ShapeMgr::CheckCollision(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol, // 浹 - __Vector3 * pvNormal, // 浹Ѹ - __Vector3 * pVec) // 浹 __Vector3[3] +bool CN3ShapeMgr::CheckCollision(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol, // 충돌 지점 + __Vector3 * pvNormal, // 충돌한면의 법선벡터 + __Vector3 * pVec) // 충돌한 면 의 폴리곤 __Vector3[3] { if (fSpeedPerSec <= 0) { - return false; // ̴ ӵ ų ݴ ̸ Ѿ.. + return false; // 움직이는 속도가 없거나 반대로 움직이면 넘어간다.. } static __CellSub * ppCells[128]; - __Vector3 vPosNext = vPos + (vDir * fSpeedPerSec); // ġ + __Vector3 vPosNext = vPos + (vDir * fSpeedPerSec); // 다음 위치 int iSubCellCount = 0; if (fSpeedPerSec < 4.0f) { __Vector3 vPos2 = vPos + (vDir * 4.0f); - iSubCellCount = this->SubCellPathThru(vPos, vPos2, 128, ppCells); // ϴ 꼿 ´.. + iSubCellCount = this->SubCellPathThru(vPos, vPos2, 128, ppCells); // 통과하는 서브셀을 가져온다.. } else { - iSubCellCount = this->SubCellPathThru(vPos, vPosNext, 128, ppCells); // ϴ 꼿 ´.. + iSubCellCount = this->SubCellPathThru(vPos, vPosNext, 128, ppCells); // 통과하는 서브셀을 가져온다.. } if (iSubCellCount <= 0) { - return false; // . + return false; // 없음 말자. } __Vector3 vColTmp(0, 0, 0); @@ -738,10 +738,10 @@ void CN3ShapeMgr::Render() { } if (false == ::_IntersectTriangle(vPosNext, vDir, m_pvCollisions[nIndex0], m_pvCollisions[nIndex1], m_pvCollisions[nIndex2])) { - fDistTmp = (vPos - vColTmp).Magnitude(); // Ÿ 纸.. + fDistTmp = (vPos - vColTmp).Magnitude(); // 거리를 재보고.. if (fDistTmp < fDistClosest) { fDistClosest = fDistTmp; - // 浹̴.. + // 충돌이다.. if (pvCol) { *pvCol = vColTmp; } @@ -765,9 +765,9 @@ void CN3ShapeMgr::Render() { } #ifndef _3DSERVER else { - it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // ̴°͸ ؼ... + it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... if (m_ShapesToRender.size() > 0) { - // Ÿ .. + // 거리순으로 정렬.. CN3Shape * pShape = NULL; std::vector Shapes; for (int i = 0; it != itEnd; it++, i++) { @@ -776,7 +776,7 @@ void CN3ShapeMgr::Render() { continue; } if ((pShape->Pos() - vPos).Magnitude() > pShape->Radius() * 2) { - continue; // ָ Ÿ .. + continue; // 멀리 떨어진거면 지나간다.. } Shapes.push_back(pShape); @@ -788,7 +788,7 @@ void CN3ShapeMgr::Render() { int iSC = Shapes.size(); if (iSC > 1) { - qsort(&(Shapes[0]), iSC, 4, SortByCameraDistance); // ī޶ Ÿ ϰ.. + qsort(&(Shapes[0]), iSC, 4, SortByCameraDistance); // 카메라 거리에 따라 정렬하고.. } CN3VMesh * pVMesh = NULL; @@ -819,9 +819,9 @@ bool CN3ShapeMgr::CheckCollisionCamera(__Vector3 & vEyeResult, const __Vector3 & return false; } - float fDelta = (vEyeResult - vCol).Magnitude(); // 浹 óٺ Ÿ 纸.. + float fDelta = (vEyeResult - vCol).Magnitude(); // 충돌점과 처다보는 거리를 재보고.. if (fDelta < fNP * 2.0f) { - return false; // ʹ ư.. + return false; // 너무 가까이 붙으면 돌아간다.. } vEyeResult -= vDir * fDelta; @@ -903,10 +903,10 @@ CN3Shape * CN3ShapeMgr::Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __ ::_Convert2D_To_3DCoordinate(iXScreen, iYScreen, s_CameraData.mtxView, s_CameraData.mtxProjection, s_CameraData.vp, vPos, vDir); - it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // ̴°͸ ؼ... + it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... int iSC = m_ShapesToRender.size(); - // Ÿ .. + // 거리순으로 정렬.. std::vector Shapes(iSC, NULL); for (int i = 0; it != itEnd; it++, i++) { Shapes[i] = *it; @@ -915,7 +915,7 @@ CN3Shape * CN3ShapeMgr::Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __ for (int i = 0; i < iSC; i++) { if (bMustHaveEvent && Shapes[i]->m_iEventID <= 0) { - continue; // ̺Ʈ ־ Ѵٸ... + continue; // 이벤트가 있어야 한다면... } if (Shapes[i]->CheckCollisionPrecisely(false, vPos, vDir, pvPick) >= 0) { return Shapes[i]; @@ -936,10 +936,10 @@ CN3Shape * CN3ShapeMgr::PickMovable(int iXScreen, int iYScreen, __Vector3 * pvPi ::_Convert2D_To_3DCoordinate(iXScreen, iYScreen, s_CameraData.mtxView, s_CameraData.mtxProjection, s_CameraData.vp, vPos, vDir); - it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // ̴°͸ ؼ... + it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... int iSC = m_ShapesToRender.size(); - // Ÿ .. + // 거리순으로 정렬.. std::vector Shapes(iSC, NULL); for (int i = 0; it != itEnd; it++, i++) { Shapes[i] = *it; @@ -980,7 +980,7 @@ int CN3ShapeMgr::SortByCameraDistance(const void * pArg1, const void * pArg2) { float fDist2 = (CN3Base::s_CameraData.vEye - pShape2->Pos()).Magnitude(); if (fDist1 < fDist2) { - return -1; // true; + return -1; // 가까우면 true; } else if (fDist1 > fDist2) { return 1; } else { @@ -990,13 +990,13 @@ int CN3ShapeMgr::SortByCameraDistance(const void * pArg1, const void * pArg2) { #endif // end of #ifndef _3DSERVER int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, int iMaxSubCell, - __CellSub ** ppSubCells) // ̿ ģ ش.. + __CellSub ** ppSubCells) // 벡터 사이에 걸친 셀포인터 돌려준다.. { if (NULL == ppSubCells) { return 0; } - // ϰ.. + // 범위를 정하고.. int xx1 = 0, xx2 = 0, zz1 = 0, zz2 = 0; if (vFrom.x < vAt.x) { @@ -1018,7 +1018,7 @@ int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, bool bPathThru; float fZMin, fZMax, fXMin, fXMax; int iSubCellCount = 0; - for (int z = zz1; z <= zz2; z++) // ŭ ó.. + for (int z = zz1; z <= zz2; z++) // 범위만큼 처리.. { fZMin = (float)(z * CELL_SUB_SIZE); fZMax = (float)((z + 1) * CELL_SUB_SIZE); @@ -1055,19 +1055,19 @@ int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, bPathThru = false; if (dwOC0 & dwOC1) { - bPathThru = false; // ܺο ִ. + bPathThru = false; // 두 끝점이 같은 변의 외부에 있다. } else if (dwOC0 == 0 && dwOC1 == 0) { - bPathThru = true; // 簢 ο + bPathThru = true; // 선분이 사각형 내부에 있음 } else if ((dwOC0 == 0 && dwOC1 != 0) || (dwOC0 != 0 && dwOC1 == 0)) { - bPathThru = true; // ο ܺο . - } else if ((dwOC0 & dwOC1) == 0) // L ܺο Ǵ ٽ ؾ Ѵ. + bPathThru = true; // 선분 한점은 셀의 내부에 한점은 외부에 있음. + } else if ((dwOC0 & dwOC1) == 0) // 두 꿑점 모두 셀 외부에 있지만 판단을 다시 해야 한다. { float fXCross = vFrom.x + (fZMax - vFrom.z) * (vAt.x - vFrom.x) / - (vAt.z - vFrom.z); // ϰ.. + (vAt.z - vFrom.z); // 위의 변과의 교차점을 계산하고.. if (fXCross < fXMin) { - bPathThru = false; // ܰ ִ. + bPathThru = false; // 완전히 외곽에 있다. } else { - bPathThru = true; // óִ. + bPathThru = true; // 걸처있다. } } @@ -1075,14 +1075,14 @@ int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, continue; } - // 浹 Ѵ.. + // 충돌 정보를 써야 한다.. int nX = x / CELL_MAIN_DEVIDE; int nZ = z / CELL_MAIN_DEVIDE; if (nX < 0 || nX >= MAX_CELL_MAIN || nZ < 0 && nZ >= MAX_CELL_MAIN) { - continue; // μٱ . + continue; // 메인셀바깥에 있음 지나간다. } if (NULL == m_pCells[nX][nZ]) { - continue; // μ ̸ .. + continue; // 메인셀이 널이면 지나간다.. } int nXSub = x % CELL_MAIN_DEVIDE; @@ -1095,42 +1095,42 @@ int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, return iMaxSubCell; } } // end of for(int x = xx1; x <= xx2; x++) - } // end of for(int z = zz1; z <= zz2; z++) // ŭ ó.. + } // end of for(int z = zz1; z <= zz2; z++) // 범위만큼 처리.. - return iSubCellCount; // ģ ֱ.. + return iSubCellCount; // 걸친 셀 포인터 돌려주기.. } float CN3ShapeMgr::GetHeightNearstPos( const __Vector3 & vPos, float fDist, - __Vector3 * pvNormal) // ̰ ش. -FLT_MAX ش. + __Vector3 * pvNormal) // 가장 가까운 높이값을 돌려준다. 없으면 -FLT_MAX 을 돌려준다. { - __CellSub * pCell = this->SubCell(vPos.x, vPos.z); // 꼿 ´.. + __CellSub * pCell = this->SubCell(vPos.x, vPos.z); // 서브셀을 가져온다.. if (NULL == pCell || pCell->nCCPolyCount <= 0) { - return -FLT_MAX; // . + return -FLT_MAX; // 없음 말자. } __Vector3 vPosV = vPos; - vPosV.y = 5000.0f; // ⿡ ġ ϰ.. - __Vector3 vDir(0, -1, 0); // - __Vector3 vColTmp(0, 0, 0); // 浹 ġ.. + vPosV.y = 5000.0f; // 꼭대기에 위치를 하고.. + __Vector3 vDir(0, -1, 0); // 수직 방향 벡터 + __Vector3 vColTmp(0, 0, 0); // 최종적으로 가장 가까운 충돌 위치.. int nIndex0, nIndex1, nIndex2; float fT, fU, fV; - float fNearst = FLT_MAX, fMinTmp = 0, fHeight = -FLT_MAX; // ϴ ּҰ ū .. + float fNearst = FLT_MAX, fMinTmp = 0, fHeight = -FLT_MAX; // 일단 최소값을 큰값으로 잡고.. for (int i = 0; i < pCell->nCCPolyCount; i++) { nIndex0 = pCell->pdwCCVertIndices[i * 3]; nIndex1 = pCell->pdwCCVertIndices[i * 3 + 1]; nIndex2 = pCell->pdwCCVertIndices[i * 3 + 2]; - // 浹 .. + // 충돌된 점이 있으면.. if (true == ::_IntersectTriangle(vPosV, vDir, m_pvCollisions[nIndex0], m_pvCollisions[nIndex1], m_pvCollisions[nIndex2], fT, fU, fV, &vColTmp)) { fMinTmp = (vColTmp - vPos).Magnitude(); - if (fMinTmp < fNearst) // 浹 ġ ã ڵ.. + if (fMinTmp < fNearst) // 가장 가까운 충돌 위치를 찾기 위한 코드.. { fNearst = fMinTmp; - fHeight = vColTmp.y; // ̰. + fHeight = vColTmp.y; // 높이값. if (pvNormal) { pvNormal->Cross(m_pvCollisions[nIndex1] - m_pvCollisions[nIndex0], @@ -1145,16 +1145,16 @@ float CN3ShapeMgr::GetHeightNearstPos( } float CN3ShapeMgr::GetHeight(float fX, float fZ, - __Vector3 * pvNormal) // ش.. -FLT_MAX ش. + __Vector3 * pvNormal) // 가장 높은 곳을 돌려준다.. 없으면 -FLT_MAX값을 돌려준다. { - __CellSub * pCell = this->SubCell(fX, fZ); // 꼿 ´.. + __CellSub * pCell = this->SubCell(fX, fZ); // 서브셀을 가져온다.. if (NULL == pCell || pCell->nCCPolyCount <= 0) { - return -FLT_MAX; // . + return -FLT_MAX; // 없음 말자. } - __Vector3 vPosV(fX, 5000.0f, fZ); // ⿡ ġ ϰ.. - __Vector3 vDir(0, -1, 0); // - __Vector3 vColTmp(0, 0, 0); // 浹 ġ.. + __Vector3 vPosV(fX, 5000.0f, fZ); // 꼭대기에 위치를 하고.. + __Vector3 vDir(0, -1, 0); // 수직 방향 벡터 + __Vector3 vColTmp(0, 0, 0); // 최종적으로 가장 가까운 충돌 위치.. int nIndex0, nIndex1, nIndex2; float fT, fU, fV; @@ -1166,7 +1166,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, nIndex1 = pCell->pdwCCVertIndices[i * 3 + 1]; nIndex2 = pCell->pdwCCVertIndices[i * 3 + 2]; - // 浹 .. + // 충돌된 점이 있으면.. if (true == ::_IntersectTriangle(vPosV, vDir, m_pvCollisions[nIndex0], m_pvCollisions[nIndex1], m_pvCollisions[nIndex2], fT, fU, fV, &vColTmp)) { if (vColTmp.y > fMaxTmp) { @@ -1183,7 +1183,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, return fMaxTmp; } -void CN3ShapeMgr::SubCell(const __Vector3 & vPos, __CellSub ** ppSubCell) // ش ġ ͸ ش. +void CN3ShapeMgr::SubCell(const __Vector3 & vPos, __CellSub ** ppSubCell) // 해당 위치의 셀 포인터를 돌려준다. { int x = (int)(vPos.x / CELL_MAIN_SIZE); int z = (int)(vPos.z / CELL_MAIN_SIZE); @@ -1239,7 +1239,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, break; } - if ((x != 0) && (xx == 0)) // x , z . + if ((x != 0) && (xx == 0)) // x 감소, z 증가. { if ((z != (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) { if (m_pCells[x - 1][z + 1] != NULL) { @@ -1255,7 +1255,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, break; } - if ((z != (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) // x , z . + if ((z != (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) // x 감소, z 증가. { if ((x != 0) && (xx == 0)) { if (m_pCells[x - 1][z + 1] != NULL) { @@ -1279,7 +1279,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, break; case 3: - if ((z == (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) // z . + if ((z == (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) // z 증가. { ppSubCell[i] = NULL; break; @@ -1302,7 +1302,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, break; case 4: - if ((x == (MAX_CELL_MAIN - 1)) && (xx == (CELL_MAIN_DEVIDE - 1))) // x , z . + if ((x == (MAX_CELL_MAIN - 1)) && (xx == (CELL_MAIN_DEVIDE - 1))) // x 증가, z 증가. { ppSubCell[i] = NULL; break; @@ -1350,7 +1350,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, } break; - case 5: // x . + case 5: // x 증가. if ((x == (MAX_CELL_MAIN - 1)) && (xx == (CELL_MAIN_DEVIDE - 1))) { ppSubCell[i] = NULL; break; @@ -1372,7 +1372,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, } break; - case 6: // x . z . + case 6: // x 증가. z 감소. if ((x == (MAX_CELL_MAIN - 1)) && (xx == (CELL_MAIN_DEVIDE - 1))) { ppSubCell[i] = NULL; break; @@ -1420,7 +1420,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, } break; - case 7: // z . + case 7: // z 감소. if ((z == 0) && (zz == 0)) { ppSubCell[i] = NULL; break; @@ -1442,7 +1442,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, } break; - case 8: // x , z . + case 8: // x 감소, z 감소. if ((x == 0) && (xx == 0)) { ppSubCell[i] = NULL; break; diff --git a/src/engine/N3Base/N3ShapeMgr.h b/src/engine/N3Base/N3ShapeMgr.h index 5f13e5d0..e009b0c0 100644 --- a/src/engine/N3Base/N3ShapeMgr.h +++ b/src/engine/N3Base/N3ShapeMgr.h @@ -12,11 +12,11 @@ #include "N3BaseFileAccess.h" #endif // end of #ifndef _3DSERVER -const int CELL_MAIN_DEVIDE = 4; // μ 4 X 4 꼿 .. -const int CELL_SUB_SIZE = 4; // 4 Meter 꼿 ̴.. -const int CELL_MAIN_SIZE = CELL_MAIN_DEVIDE * CELL_SUB_SIZE; // μ ũ 꼿 X 꼿 ũ̴. -const int MAX_CELL_MAIN = 4096 / CELL_MAIN_SIZE; // μ ִ ũ / μũ ̴. -const int MAX_CELL_SUB = MAX_CELL_MAIN * CELL_MAIN_DEVIDE; // 꼿 ִ μ * μ ̴. +const int CELL_MAIN_DEVIDE = 4; // 메인셀은 4 X 4 의 서브셀로 나뉜다.. +const int CELL_SUB_SIZE = 4; // 4 Meter 가 서브셀의 사이즈이다.. +const int CELL_MAIN_SIZE = CELL_MAIN_DEVIDE * CELL_SUB_SIZE; // 메인셀 크기는 서브셀갯수 X 서브셀 크기이다. +const int MAX_CELL_MAIN = 4096 / CELL_MAIN_SIZE; // 메인셀의 최대 갯수는 지형크기 / 메인셀크기 이다. +const int MAX_CELL_SUB = MAX_CELL_MAIN * CELL_MAIN_DEVIDE; // 서브셀 최대 갯수는 메인셀 * 메인셀나눔수 이다. #ifdef _3DSERVER class CN3ShapeMgr @@ -29,10 +29,10 @@ class CN3ShapeMgr : public CN3BaseFileAccess #endif // end of #ifndef _3DSERVER { public: - struct __CellSub // + struct __CellSub // 하위 셀 데이터 { int nCCPolyCount; // Collision Check Polygon Count - DWORD * pdwCCVertIndices; // Collision Check Polygon Vertex Indices - wCCPolyCount * 3 ŭ ȴ. + DWORD * pdwCCVertIndices; // Collision Check Polygon Vertex Indices - wCCPolyCount * 3 만큼 생성된다. void Load(HANDLE hFile) { DWORD dwRWC = 0; @@ -65,7 +65,7 @@ class CN3ShapeMgr : public CN3BaseFileAccess ~__CellSub() { delete[] pdwCCVertIndices; } }; - struct __CellMain // ⺻ + struct __CellMain // 기본 셀 데이터 { int nShapeCount; // Shape Count; WORD * pwShapeIndices; // Shape Indices @@ -114,28 +114,28 @@ class CN3ShapeMgr : public CN3BaseFileAccess protected: #ifndef _3DSERVER - std::vector m_Shapes; // Ʈ ... 迭 ξ ȿ̱ ̴. - std::list m_ShapesToRender; // Tick ȣϸ ͸ ߸.. - std::list m_ShapesHaveID; // ID ־ NPC ɼ ִ Shapes.... + std::vector m_Shapes; // 리스트로 안 만든 이유는... 배열이 훨씬 효율적이기 때문이다. + std::list m_ShapesToRender; // Tick 을 호출하면 렌더링할 것만 추린다.. + std::list m_ShapesHaveID; // ID 를 갖고 있어 NPC 가 될수 있는 Shapes.... #endif // end of #ifndef _3DSERVER - float m_fMapWidth; // ʺ.. - float m_fMapLength; // .. + float m_fMapWidth; // 맵 너비.. 미터 단위 + float m_fMapLength; // 맵 길이.. 미터 단위 int m_nCollisionFaceCount; __CellMain * m_pCells[MAX_CELL_MAIN][MAX_CELL_MAIN]; #ifdef _N3TOOL - std::list<__Vector3> m_CollisionExtras; // ߰ 浹üũ + std::list<__Vector3> m_CollisionExtras; // 추가로 넣을 충돌체크 데이터 #endif // end of #ifedef _N3TOOL public: #ifndef _3DSERVER - CN3Shape * ShapeGetByID(int iID); // ID Ʈ... NPC ִ Ʈ ˻ؼ ش.. - CN3Shape * Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __Vector3 * pvPick = NULL); // ġ ش.. + CN3Shape * ShapeGetByID(int iID); // 고유 ID 를 가진 오브젝트... NPC 로 쓸수 있는 오브젝트를 검색해서 돌려준다.. + CN3Shape * Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __Vector3 * pvPick = NULL); // 위치를 돌려준다.. CN3Shape * PickMovable(int iXScreen, int iYScreen, __Vector3 * pvPick); #endif // end of #ifndef _3DSERVER void SubCell(const __Vector3 & vPos, __CellSub ** ppSubCell); - __CellSub * SubCell(float fX, float fZ) // ش ġ ͸ ش. + __CellSub * SubCell(float fX, float fZ) // 해당 위치의 셀 포인터를 돌려준다. { int x = (int)(fX / CELL_MAIN_SIZE); int z = (int)(fZ / CELL_MAIN_SIZE); @@ -154,17 +154,17 @@ class CN3ShapeMgr : public CN3BaseFileAccess return &(m_pCells[x][z]->SubCells[xx][zz]); } float GetHeightNearstPos(const __Vector3 & vPos, float fDist, - __Vector3 * pvNormal = NULL); // ش. -FLT_MAX ش. + __Vector3 * pvNormal = NULL); // 가장 가까운 높이을 돌려준다. 없으면 -FLT_MAX 을 돌려준다. float GetHeight(float fX, float fZ, - __Vector3 * pvNormal = NULL); // ش. -FLT_MAX ش. + __Vector3 * pvNormal = NULL); // 현재 지점에서 제일 높은 값을 돌려준다. 없으면 -FLT_MAX 을 돌려준다. int SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, int iMaxSubCell, - __CellSub ** ppSubCells); // ̿ ģ ش.. - float Width() { return m_fMapWidth; } // ʺ. ̴. - float Height() { return m_fMapWidth; } // ʺ. ̴. + __CellSub ** ppSubCells); // 벡터 사이에 걸친 셀포인터 돌려준다.. + float Width() { return m_fMapWidth; } // 맵의 너비. 단위는 미터이다. + float Height() { return m_fMapWidth; } // 맵의 너비. 단위는 미터이다. #ifndef _3DSERVER void ReleaseShapes(); - void RenderCollision(const __Vector3 & vPos); // ġ ִ 浹 ޽ø ׷ش.. ... + void RenderCollision(const __Vector3 & vPos); // 넣은 위치에 있는 충돌 메시를 그려준다.. 디버깅용... void Tick(); void Render(); bool Load(HANDLE hFile); @@ -172,18 +172,18 @@ class CN3ShapeMgr : public CN3BaseFileAccess static int SortByCameraDistance(const void * pArg1, const void * pArg2); #endif // end of #ifndef _3DSERVER - bool CheckCollision(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol = NULL, // 浹 - __Vector3 * pvNormal = NULL, // 浹Ѹ - __Vector3 * pVec = NULL); // 浹 __Vector3[3] + bool CheckCollision(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol = NULL, // 충돌 지점 + __Vector3 * pvNormal = NULL, // 충돌한면의 법선벡터 + __Vector3 * pVec = NULL); // 충돌한 면 의 폴리곤 __Vector3[3] - bool Create(float fMapWidth, float fMapLength); // ʺ ̸ ִ´.. + bool Create(float fMapWidth, float fMapLength); // 맵의 너비와 높이를 미터 단위로 넣는다.. bool LoadCollisionData(HANDLE hFile); #ifdef _N3TOOL - void MakeMoveTable(short ** pMoveArray); // shape ִ Ÿ 1, Ÿ 0 ̺ . + void MakeMoveTable(short ** pMoveArray); //지형에서 shape가 있는 타일은 1, 없는 타일은 0으로 셋팅한 테이블을 만든다. int Add(CN3Shape * pShape); bool AddCollisionTriangle(const __Vector3 & v1, const __Vector3 & v2, const __Vector3 & v3); void GenerateCollisionData(); diff --git a/src/engine/N3Base/N3ShapeMod.cpp b/src/engine/N3Base/N3ShapeMod.cpp index 4d5c3560..46ee6821 100644 --- a/src/engine/N3Base/N3ShapeMod.cpp +++ b/src/engine/N3Base/N3ShapeMod.cpp @@ -64,28 +64,28 @@ bool CN3ShapeMod::Load(HANDLE hFile) { return ret; } -BOOL CN3ShapeMod::LoadStateInfo(FILE * stream) // о´.(textκ) +BOOL CN3ShapeMod::LoadStateInfo(FILE * stream) // 상태 정보를 읽어온다.(text로부터) { - __ASSERT(m_Parts.size() > 0, " shape loadؾ Ѵ."); + __ASSERT(m_Parts.size() > 0, "먼저 shape를 load해야 한다."); if (NULL == stream) { return FALSE; } // Release(); int result; - // char szSrcName[_MAX_PATH]; // shape source ̸ - // result = fscanf(stream, "Shape_FName=%s\n", szSrcName); __ASSERT(result != EOF, "߸ N3ShapeMod "); + // char szSrcName[_MAX_PATH]; // shape source파일 이름 + // result = fscanf(stream, "Shape_FName=%s\n", szSrcName); __ASSERT(result != EOF, "잘못된 N3ShapeMod 세팅 파일"); - // shape loadϱ + // shape load하기 // if (!this->Load(szSrcName)) return FALSE; - // ȭϴ PMesh State + // 변화하는 PMesh의 갯수 및 State의 수 result = fscanf(stream, "PMesh_Count=%d\n", &m_iModPartCount); - __ASSERT(result != EOF, "߸ N3ShapeMod "); + __ASSERT(result != EOF, "잘못된 N3ShapeMod 세팅 파일"); result = fscanf(stream, "State_Count=%d\n", &m_iStateCount); - __ASSERT(result != EOF, "߸ N3ShapeMod "); + __ASSERT(result != EOF, "잘못된 N3ShapeMod 세팅 파일"); - // Shape о + // Shape 상태 정보 읽어오기 __Vector3 vPos, vScale; __Vector3 vAxis; float fDegree; @@ -93,37 +93,37 @@ bool CN3ShapeMod::Load(HANDLE hFile) { // m_ModShape.pShapeStateInfos = new __ModPosRotScale[m_iStateCount]; // for (int i=0; i 0, "m_iModPartCount 1̻̾ մϴ."); - __ASSERT(m_iStateCount > 0, "m_iStateCount 1̻̾ մϴ."); + // Part 상태 정보 읽어오기 + __ASSERT(m_iModPartCount > 0, "m_iModPartCount가 1이상이어야 합니다."); + __ASSERT(m_iStateCount > 0, "m_iStateCount 1이상이어야 합니다."); m_pModParts = new __ModPart[m_iModPartCount]; char szPMeshName[_MAX_PATH] = ""; for (int i = 0; i < m_iModPartCount; ++i) { result = fscanf(stream, "PMesh_FName=%s\n", szPMeshName); - __ASSERT(result != EOF, "߸ N3ShapeMod "); + __ASSERT(result != EOF, "잘못된 N3ShapeMod 세팅 파일"); m_pModParts[i].pPart = GetPartByPMeshFileName(szPMeshName); m_pModParts[i].pStateInfos = new __ModPosRotScale[m_iStateCount]; for (int j = 0; j < m_iStateCount; ++j) { result = fscanf(stream, "Pos(%f, %f, %f)\n", &vPos.x, &vPos.y, &vPos.z); - __ASSERT(result != EOF, "߸ N3ShapeMod "); + __ASSERT(result != EOF, "잘못된 N3ShapeMod 세팅 파일"); result = fscanf(stream, "Rot(%f, %f, %f, %f)\n", &vAxis.x, &vAxis.y, &vAxis.z, &fDegree); - __ASSERT(result != EOF, "߸ N3ShapeMod "); + __ASSERT(result != EOF, "잘못된 N3ShapeMod 세팅 파일"); if (vAxis.x == 0.0f && vAxis.y == 0.0f && vAxis.z == 0.0f) { qRot.Identity(); } else { qRot.RotationAxis(vAxis, D3DXToRadian(fDegree)); } result = fscanf(stream, "Scale(%f, %f, %f)\n", &vScale.x, &vScale.y, &vScale.z); - __ASSERT(result != EOF, "߸ N3ShapeMod "); + __ASSERT(result != EOF, "잘못된 N3ShapeMod 세팅 파일"); m_pModParts[i].pStateInfos[j].vPos = vPos; m_pModParts[i].pStateInfos[j].qRot = qRot; m_pModParts[i].pStateInfos[j].vScale = vScale; @@ -144,14 +144,14 @@ bool CN3ShapeMod::Load(HANDLE hFile) { } } - // m_pMatchPart2ModPart CN3SPartŭ ʱȭ(ĪŰ) - __ASSERT(m_pMatchPart2ModPart == NULL, "Machine ޸ ɼ"); + // m_pMatchPart2ModPart CN3SPart갯수만큼 생성 및 초기화(매칭시키기) + __ASSERT(m_pMatchPart2ModPart == NULL, "Machine에서 메모리 릭 가능성"); int iPartCount = PartCount(); if (iPartCount > 0) { m_pMatchPart2ModPart = new __ModPart *[iPartCount]; } ZeroMemory(m_pMatchPart2ModPart, sizeof(m_pMatchPart2ModPart[0]) * iPartCount); - // (ĪŰ) + // (매칭시키기) for (int i = 0; i < m_iModPartCount; ++i) { it_SPart it = m_Parts.begin(); int iPC = m_Parts.size(); @@ -167,22 +167,22 @@ bool CN3ShapeMod::Load(HANDLE hFile) { } void CN3ShapeMod::ReCalcMatrix() { - // m_Matrix ٽ .. - CN3Transform::ReCalcMatrix(); // Transfomr Matrix ְ.. + // m_Matrix 다시 계산.. + CN3Transform::ReCalcMatrix(); // Transfomr Matrix 를 계산 해주고.. - // Ʈ Ʈ ٽ . + // 각 파트의 매트릭스를 다시 계산. int iPC = m_Parts.size(); for (int i = 0; i < iPC; i++) { if (m_pMatchPart2ModPart[i]) { __ModPart * pModPart = m_pMatchPart2ModPart[i]; // Scale m_Parts[i]->m_Matrix.Scale(pModPart->CurStateInfo.vScale); - // ȸ + // 회전 static __Matrix44 mtxRot; D3DXMatrixRotationQuaternion(&mtxRot, &(pModPart->CurStateInfo.qRot)); m_Parts[i]->m_Matrix *= mtxRot; - // ġ + // 위치 m_Parts[i]->m_Matrix.PosSet(m_Parts[i]->m_vPivot + pModPart->CurStateInfo.vPos); m_Parts[i]->m_Matrix *= m_Matrix; } else { diff --git a/src/engine/N3Base/N3ShapeMod.h b/src/engine/N3Base/N3ShapeMod.h index b82cf19d..a9bb8f7a 100644 --- a/src/engine/N3Base/N3ShapeMod.h +++ b/src/engine/N3Base/N3ShapeMod.h @@ -1,11 +1,11 @@ // N3ShapeMod.h: interface for the CN3ShapeMod class. -// : dino -// n3shape Ϻκ ְ Ŭ -// (0 , 1, 2) ִ. -// (ð ־ָ ° pos rot scale linearϰ ȭŲ. +// 만든이 : dino +// n3shape의 한 일부분을 움직일 수 있게 한 클래스 +// 상태(0번 상태, 1번상태, 2번상태)를 변경할 수 있다. +// 상태 변경시 (시간을 넣어주면 상태간의 pos rot scale 정보를 linear하게 변화시킨다. -// : Shape ü ̴ ¸ ߰ -// ߰Ϸ ʹ Ͽ . ũ κ ׿ õ . ߰ ؾ. +// 개선점 : Shape 전체가 움직이는 상태를 추가하자 +// 설계시 추가하려다 너무 복잡하여 보류함. 리마크 된 부분이 그에 관련된 것임. 추가 보강해야함. ////////////////////////////////////////////////////////////////////// #pragma once @@ -31,12 +31,12 @@ class CN3ShapeMod : public CN3Shape { } }; struct __ModPart { - CN3SPart * pPart; // Part - bool bPos; // Pos ȭ ִ°? - bool bRot; // Rot ȭ ִ°? - bool bScale; // Scale ȭ ִ°? - __ModPosRotScale * pStateInfos; // (̵,ȸ,Ȯ m_iStateCount) - __ModPosRotScale CurStateInfo; // (tick ȭѴ) + CN3SPart * pPart; // 움직일 Part + bool bPos; // Pos 변화가 있는가? + bool bRot; // Rot 변화가 있는가? + bool bScale; // Scale 변화가 있는가? + __ModPosRotScale * pStateInfos; // 움직일 상태 정보들(이동,회전,확대축소 정보 m_iStateCount개) + __ModPosRotScale CurStateInfo; // 현재 움직인 상태 정보(tick에 따라 변화한다) __ModPart() { pPart = NULL; @@ -57,9 +57,9 @@ class CN3ShapeMod : public CN3Shape { struct __ModShape { bool bShapePos; bool bShapeRot; - bool bShapeScale; // Shape ġ, ȸ, ȭ ִ°? - __ModPosRotScale * pShapeStateInfos; // Shape ü ȭ - __ModPosRotScale CurShapeStateInfo; // (tick ȭѴ) + bool bShapeScale; // Shape가 위치, 회전, 스케일 변화가 있는가? + __ModPosRotScale * pShapeStateInfos; // Shape 전체의 변화 정보 + __ModPosRotScale CurShapeStateInfo; // 현재 움직인 상태 정보(tick에 따라 변화한다) __ModShape() { pShapeStateInfos = NULL; bShapePos = false; @@ -78,34 +78,34 @@ class CN3ShapeMod : public CN3Shape { public: protected: // enum { - // N3SHAPEMOD_TYPE_NOT_MOD = 0, // ƹ ȭ ʴ - // N3SHAPEMOD_TYPE_ONLY_SHAPE = 1, // Shape ȭϴ - // N3SHAPEMOD_TYPE_ONLY_PART = 2, // Part ȭϴ - // N3SHAPEMOD_TYPE_NORMAL = 4 // ȭϴ + // N3SHAPEMOD_TYPE_NOT_MOD = 0, // 아무 정보도 변화하지 않는 것 + // N3SHAPEMOD_TYPE_ONLY_SHAPE = 1, // Shape정보만 변화하는 것 + // N3SHAPEMOD_TYPE_ONLY_PART = 2, // Part 정보만 변화하는 것 + // N3SHAPEMOD_TYPE_NORMAL = 4 // 둘 다 변화하는 것 // }; // int m_iModType; // type.. - int m_iStateCount; // °  ִ Ÿ. - int m_iCurState; // - int m_iPrevState; // (ο ¸ ָ AnimationǴ ¸ صд. - float m_fTimeChanged; // ° ٲ ð - float m_fTimeChanging; // ° ٲ ۽ð ݱ ð + int m_iStateCount; // 상태가 몇개가 있는지 나타낸다. + int m_iCurState; // 현재 상태 + int m_iPrevState; // 이전 상태(새로운 상태를 설정해주면 Animation되는 동안 이전상태를 저장해둔다. + float m_fTimeChanged; // 상태가 완전히 바뀌는 시간 + float m_fTimeChanging; // 상태가 바뀌는 시작시간부터 지금까지의 경과 시간 - __ModShape m_ModShape; // shape ȭ - int m_iModPartCount; // ȭϴ Ʈ - __ModPart * m_pModParts; // ȭϴ Ʈ + __ModShape m_ModShape; // shape의 상태 변화 정보 + int m_iModPartCount; // 변화하는 파트의 갯수 + __ModPart * m_pModParts; // 변화하는 파트들 정보 __ModPart ** - m_pMatchPart2ModPart; // CPartƮ 迭 __ModPart* ġŲ 迭 (load CPart ŭ 迭 ִ´) + m_pMatchPart2ModPart; // CPart리스트 배열순으로 __ModPart*와 매치시킨 배열 (load시 CPart 갯수만큼 배열로 잡고 정보를 넣는다) // Operations public: - BOOL SetState(int iState, float fSec); // fSecð ¸ ٲ۴. (fSec 0ϰ ٲ.) - BOOL LoadStateInfo(FILE * stream); // о´.(textκ) + BOOL SetState(int iState, float fSec); // fSec시간동안 상태를 바꾼다. (fSec이 0일경우 즉시 바뀐다.) + BOOL LoadStateInfo(FILE * stream); // 상태 정보를 읽어온다.(text로부터) virtual void Release(); virtual void ReCalcMatrix(); virtual void Tick(float fFrm = FRAME_SELFPLAY); virtual bool Load(HANDLE hFile); protected: - CN3SPart * GetPartByPMeshFileName(const std::string & szFN); // ̸ PMesh ϱ + CN3SPart * GetPartByPMeshFileName(const std::string & szFN); // 이름으로 PMesh포인터 구하기 }; diff --git a/src/engine/N3Base/N3Skin.cpp b/src/engine/N3Base/N3Skin.cpp index 66405087..1f21958c 100644 --- a/src/engine/N3Base/N3Skin.cpp +++ b/src/engine/N3Base/N3Skin.cpp @@ -129,7 +129,7 @@ bool CN3Skin::CheckCollisionPrecisely(const __Vector3 & vPos, const __Vector3 & } nFC = FaceCount(); - for (int j = 0; j < nFC; j++) // Face 浹üũ.. + for (int j = 0; j < nFC; j++) // 각각의 Face 마다 충돌체크.. { nCI0 = pwIs[j * 3 + 0]; nCI1 = pwIs[j * 3 + 1]; diff --git a/src/engine/N3Base/N3Skin.h b/src/engine/N3Base/N3Skin.h index ef4698ad..182fc59b 100644 --- a/src/engine/N3Base/N3Skin.h +++ b/src/engine/N3Base/N3Skin.h @@ -7,10 +7,10 @@ #include "N3IMesh.h" struct __VertexSkinned { - __Vector3 vOrigin; // ġ.. - int nAffect; //  ִ.. - int * pnJoints; // ε - float * pfWeights; // ġ + __Vector3 vOrigin; // 원래 점 위치.. + int nAffect; // 관절 몇개가 영향을 주는지.. + int * pnJoints; // 관절 인덱스 + float * pfWeights; // 가중치 __VertexSkinned() { memset(this, 0, sizeof(__VertexSkinned)); } ~__VertexSkinned() { @@ -40,7 +40,7 @@ class CN3Skin : public CN3IMesh { #ifdef _N3TOOL bool Save(HANDLE hFile); - void RecalcWeight(); // Ʈ ٽ ϱ + void RecalcWeight(); // 웨이트값 다시 계산하기 #endif // end of _N3TOOL void Release(); diff --git a/src/engine/N3Base/N3Sky.cpp b/src/engine/N3Base/N3Sky.cpp index 58e62bc6..21945a61 100644 --- a/src/engine/N3Base/N3Sky.cpp +++ b/src/engine/N3Base/N3Sky.cpp @@ -14,8 +14,8 @@ CN3Sky::CN3Sky() { // m_pTex = NULL; - m_SkyColor.ChangeColor(0xff081021); // - m_FogColor.ChangeColor(0xff102942); // + m_SkyColor.ChangeColor(0xff081021); //밤 + m_FogColor.ChangeColor(0xff102942); //밤 } CN3Sky::~CN3Sky() { @@ -24,10 +24,10 @@ CN3Sky::~CN3Sky() { void CN3Sky::Release() { CN3Base::Release(); - // m_SkyColor.ChangeColor(0xFF5284DE); // - // m_FogColor.ChangeColor(0xFFB5C6DE); // - m_SkyColor.ChangeColor(0xff081021); // - m_FogColor.ChangeColor(0xff102942); // + // m_SkyColor.ChangeColor(0xFF5284DE); //낮 + // m_FogColor.ChangeColor(0xFFB5C6DE); //낮 + m_SkyColor.ChangeColor(0xff081021); //밤 + m_FogColor.ChangeColor(0xff102942); //밤 // if (m_pTex) {s_MngTex.Delete(m_pTex); m_pTex = NULL;} } @@ -44,7 +44,7 @@ void CN3Sky::Tick() { void CN3Sky::Render() { // Set up a rotation matrix to orient the billboard towards the camera. __Matrix44 matWorld; - __Vector3 vDir = s_CameraData.vEye - s_CameraData.vAt; // ī޶ + __Vector3 vDir = s_CameraData.vEye - s_CameraData.vAt; // 카메라의 방향 if (0.0f == vDir.x) { matWorld.Identity(); } else if (vDir.x > 0.0f) { @@ -61,28 +61,28 @@ void CN3Sky::Render() { // Render the skybox s_lpD3DDev->SetFVF(FVF_XYZCOLOR); - // ׸ + // 밑판 그리기 s_lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, m_Bottom, sizeof(m_Bottom[0])); - // ׸ + // 옆판 그리기 s_lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, m_vFronts, sizeof(m_vFronts[0])); } void CN3Sky::Init() { Release(); - // 츦 .... - const float fWidth = 3.5f; // - const float fTopY = 0.5f; // .. ϰ κ - ʹ ϴ̴.. + // 노을 진 경우를 예로 든다.... + const float fWidth = 3.5f; // 전면 판의 폭 + const float fTopY = 0.5f; // 전면 판의 높이.. 노을져서 붉으스름하게 된 부분의 위 높이 - 이 위부터는 하늘이다.. const float fBottomY = - 0.1f; // ٴ .. ϰ κ Ʒ - Ʒ Ȱ̴.. - const float fDistance = 1.5f; // ٴ .. + 0.1f; // 전면 판의 바닥 높이.. 노을져서 붉으스름하게 된 부분의 아래 - 이 아래는 순수한 안개색이다.. + const float fDistance = 1.5f; // 전면 판의 바닥 길이.. const D3DCOLOR color = m_FogColor.GetCurColor(); m_vFronts[0].Set(fWidth, fTopY, fDistance, 0x00ffffff & color); m_vFronts[1].Set(fWidth, fBottomY, fDistance, color); m_vFronts[2].Set(-fWidth, fBottomY, fDistance, color); m_vFronts[3].Set(-fWidth, fTopY, fDistance, 0x00ffffff & color); - const float fBottomOffset = -5.0f; // ظ ٴ + const float fBottomOffset = -5.0f; // 밑면 판의 바닥 높이 m_Bottom[0].Set(fWidth, fBottomY, fDistance, color); m_Bottom[1].Set(fWidth, fBottomOffset, fDistance, color); m_Bottom[2].Set(-fWidth, fBottomOffset, fDistance, color); diff --git a/src/engine/N3Base/N3SkyMng.cpp b/src/engine/N3Base/N3SkyMng.cpp index 2f3041e7..ee08f970 100644 --- a/src/engine/N3Base/N3SkyMng.cpp +++ b/src/engine/N3Base/N3SkyMng.cpp @@ -15,7 +15,7 @@ #include "N3GERain.h" #include "N3GESnow.h" -#ifdef _N3GAME // ƴ ʿ... +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... #include "N3SndObj.h" #include "N3SndMgr.h" #endif // #ifdef _N3GAME @@ -50,7 +50,7 @@ CN3SkyMng::CN3SkyMng() { m_iHourFix = 0; -#ifdef _N3GAME // ƴ ʿ... +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... m_pSnd_Weather_Snow = NULL; m_pSnd_Weather_Rain = NULL; #endif // #ifdef _N3GAME @@ -95,13 +95,13 @@ CN3SkyMng::~CN3SkyMng() { m_pGESnow = NULL; } -#ifdef _N3GAME // ƴ ʿ... +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Weather_Snow); CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Weather_Rain); #endif // #ifdef _N3GAME } -#ifdef _N3GAME // ƴ ʿ... +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... void CN3SkyMng::ReleaseSound() { CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Weather_Snow); CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Weather_Rain); @@ -154,7 +154,7 @@ void CN3SkyMng::Release() { m_pGESnow = NULL; } -#ifdef _N3GAME // ƴ ʿ... +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Weather_Snow); CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Weather_Rain); #endif // #ifdef _N3GAME @@ -195,23 +195,23 @@ void CN3SkyMng::Render() { if (FALSE != dwLighting) { s_lpD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE); } - s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); // default ġ ̴. - s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); // default ġ ̴. + s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); // default 수치 이다. + s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); // default 수치 이다. if (m_pSky) { - m_pSky->Render(); // ϴ + m_pSky->Render(); // 하늘 } if (m_pStar) { - m_pStar->Render(); // + m_pStar->Render(); // 별 } if (m_pMoon) { - m_pMoon->Render(matView, s_CameraData.mtxProjection); // + m_pMoon->Render(matView, s_CameraData.mtxProjection); // 달 } if (m_pSun) { - m_pSun->Render(matView, s_CameraData.mtxProjection); // + m_pSun->Render(matView, s_CameraData.mtxProjection); // 해 } if (m_pCloud) { - m_pCloud->Render(); // + m_pCloud->Render(); // 구름 } // Restore the modified renderstates @@ -251,20 +251,20 @@ void CN3SkyMng::RenderWeather() { void CN3SkyMng::Tick() { DWORD dwCurTickCount = timeGetTime(); - __ASSERT(dwCurTickCount >= m_dwCheckTick, "̴."); + __ASSERT(dwCurTickCount >= m_dwCheckTick, "음수이다."); DWORD dwCurGameTime = m_dwCheckGameTime + (DWORD)((dwCurTickCount - m_dwCheckTick) * TIME_REAL_PER_GAME * 0.001f); if (!m_DayChanges.empty()) { - // dwCurGameTime 24*60*60 Ѿ + // dwCurGameTime 가 24*60*60을 넘었을 경우 if (dwCurGameTime > 86400) { m_iDayChangeCurPos = 0; - __ASSERT(m_dwCheckGameTime < 86400, "ð ̻ؿ"); + __ASSERT(m_dwCheckGameTime < 86400, "시간이 이상해요"); m_dwCheckTick += - (int)((86400 - m_dwCheckGameTime) * TIME_GAME_PER_REAL); // CheckTick 0ÿ ° ٽ + (int)((86400 - m_dwCheckGameTime) * TIME_GAME_PER_REAL); // CheckTick을 게임 0시에 맞게 다시 설정 dwCurGameTime -= 86400; - m_dwCheckGameTime = 0; // ӽð 0÷.. + m_dwCheckGameTime = 0; // 기준 게임시간을 0시로.. - m_iDay++; // ¥ .. - m_pMoon->SetMoonPhase(m_iMonth * 30 + m_iDay); // ޸ ȭŰ.. + m_iDay++; // 날짜 증가.. + m_pMoon->SetMoonPhase(m_iMonth * 30 + m_iDay); // 달모양을 변화시키고.. if (m_iDay > 30) { m_iDay = 0; m_iMonth++; @@ -275,10 +275,10 @@ void CN3SkyMng::Tick() { } } - // ġ + // 해의 위치 계산 float fAngleTime = 0; if (m_iHourFix > 0) { - fAngleTime = (m_iHourFix * 3600.0f / 86400.0f) * 360.0f; // ؿ ġ ž Ѵٸ.. + fAngleTime = (m_iHourFix * 3600.0f / 86400.0f) * 360.0f; // 해와 달의 위치가 고정돼야 한다면.. } else { fAngleTime = (dwCurGameTime / 86400.0f) * 360.0f; } @@ -292,46 +292,46 @@ void CN3SkyMng::Tick() { while (m_iDayChangeCurPos < m_DayChanges.size() && m_DayChanges[m_iDayChangeCurPos].dwWhen < dwCurGameTime) { __SKY_DAYCHANGE * pSDC = &(m_DayChanges[m_iDayChangeCurPos]); - // ð ð + // 실행할 명령의 시간과 현재 시간 차이 DWORD dwDiffTime = dwCurGameTime - pSDC->dwWhen; - // ȭ ɸ ð - float fTakeTime = pSDC->fHowLong - dwDiffTime * TIME_GAME_PER_REAL; // ɸ ð + // 변화에 걸리는 시간 조정 + float fTakeTime = pSDC->fHowLong - dwDiffTime * TIME_GAME_PER_REAL; // 걸리는 시간 if (fTakeTime < 0.0f) { - TRACE("!!!!! ϴ ȭ !!!!!\n"); - fTakeTime = 0.0f; // 0 ȭϰ + TRACE("!!!!! 하늘이 즉시 변화됨 !!!!!\n"); + fTakeTime = 0.0f; // 0보다 작으면 즉시 변화하게 하자 } - // ϴ ȭ ϱ - if (SW_CLEAR == m_eWeather || // ̰ų + // 하늘 변화명령 실행하기 + if (SW_CLEAR == m_eWeather || // 맑은 날씨이거나 (SDC_SKYCOLOR != pSDC->eSkyDayChange && SDC_FOGCOLOR != pSDC->eSkyDayChange && SDC_SUNCOLOR != pSDC->eSkyDayChange && SDC_FLARECOLOR != pSDC->eSkyDayChange && SDC_GLOWCOLOR != pSDC->eSkyDayChange && SDC_CLOUD1COLOR != pSDC->eSkyDayChange && SDC_CLOUD2COLOR != pSDC->eSkyDayChange && - SDC_CLOUDTEX != pSDC->eSkyDayChange)) // ȭҰ ƴҰ + SDC_CLOUDTEX != pSDC->eSkyDayChange)) // 날씨 변화요소가 아닐경우 { ChangeSky(pSDC, fTakeTime); } m_iDayChangeCurPos++; } - // ȭ ϴ ȭ ϱ + // 날씨 변화에 따른 하늘 변화명령 실행하기 if (!m_WeatherChanges.empty()) { while (m_iWeatherChangeCurPos < m_WeatherChanges.size() && m_WeatherChanges[m_iWeatherChangeCurPos].dwWhen < dwCurGameTime) { __SKY_DAYCHANGE * pSDC = &(m_WeatherChanges[m_iWeatherChangeCurPos]); - // ð ð + // 실행할 명령의 시간과 현재 시간 차이 DWORD dwDiffTime = dwCurGameTime - pSDC->dwWhen; - // ȭ ɸ ð - float fTakeTime = pSDC->fHowLong - dwDiffTime * TIME_GAME_PER_REAL; // ɸ ð + // 변화에 걸리는 시간 조정 + float fTakeTime = pSDC->fHowLong - dwDiffTime * TIME_GAME_PER_REAL; // 걸리는 시간 if (fTakeTime < 0.0f) { - fTakeTime = 0.0f; // 0 ȭϰ + fTakeTime = 0.0f; // 0보다 작으면 즉시 변화하게 하자 } - ChangeSky(pSDC, fTakeTime); // ȭŰ + ChangeSky(pSDC, fTakeTime); // 변화시키기 m_iWeatherChangeCurPos++; } - // ȭ queue ϱ + // 날씨 변화 queue 삭제하기 if (m_iWeatherChangeCurPos >= m_WeatherChanges.size()) { m_WeatherChanges.clear(); m_iWeatherChangeCurPos = 0; @@ -400,7 +400,7 @@ bool CN3SkyMng::DayChangeParse(FILE * fp, __SKY_DAYCHANGE * pDayChange) { return false; } - pDayChange->Init(); // ʱȭ ְ.. + pDayChange->Init(); // 초기화 해주고.. pDayChange->szName = szLine0; if (pDayChange->szName.size() >= 2) { @@ -479,7 +479,7 @@ bool CN3SkyMng::LoadFromTextFile(const char * szIniFN) { if (false == this->DayChangeParse(fp, &(m_DayChanges[i]))) { char szErrLine[128]; sprintf(szErrLine, "From \"DayChage Count : \" -> Line : %d", i); - MessageBox(CN3Base::s_hWndBase, szErrLine, "ϴ ȯ漳 Parsing ", MB_OK); + MessageBox(CN3Base::s_hWndBase, szErrLine, "하늘 환경설정 데이터 Parsing 실패", MB_OK); this->Release(); return false; } @@ -487,7 +487,7 @@ bool CN3SkyMng::LoadFromTextFile(const char * szIniFN) { } } - fclose(fp); // ݱ.. + fclose(fp); // 파일 닫기.. if (NULL == m_pSky) { m_pSky = new CN3Sky(); @@ -523,7 +523,7 @@ bool CN3SkyMng::LoadFromTextFile(const char * szIniFN) { } } - std::vector<__SKY_DAYCHANGE>(m_DayChanges).swap(m_DayChanges); // 뷮 ߱.. + std::vector<__SKY_DAYCHANGE>(m_DayChanges).swap(m_DayChanges); // 용량을 딱 맞추기.. qsort(&(m_DayChanges[0]), m_DayChanges.size(), sizeof(__SKY_DAYCHANGE), CompareTime); SetCheckGameTime(CONVERT_SEC(10, 0, 0)); @@ -573,7 +573,7 @@ bool CN3SkyMng::SaveToTextFile(const char * szIniFN) { this->DayChangeWrite(fp, &(m_DayChanges[i])); } - fclose(fp); // ݱ.. + fclose(fp); // 파일 닫기.. return true; } @@ -606,13 +606,13 @@ void CN3SkyMng::InitToDefaultHardCoding() { m_pLightColorAmbients[i] = new CN3ColorChange(); } - // ӽ hard coding + // 임시 hard coding __SKY_DAYCHANGE tmpDayChange; m_DayChanges.reserve(64); DWORD dwTime = 0; - // ض߱.. - dwTime = CONVERT_SEC(5, 0, 0); // 5ÿ ذ .. + // 해뜨기.. + dwTime = CONVERT_SEC(5, 0, 0); // 5시에 해가 뜬다.. tmpDayChange.Init("SunRise - SkyColor", SDC_SKYCOLOR, dwTime, D3DCOLOR_ARGB(255, 165, 115, 85), 0, 180.0f); m_DayChanges.push_back(tmpDayChange); @@ -644,8 +644,8 @@ void CN3SkyMng::InitToDefaultHardCoding() { tmpDayChange.Init("SunRise - Light2", SDC_LIGHT2COLOR, dwTime, D3DCOLOR_ARGB(255, 165, 115, 85), 0, 150.0f); m_DayChanges.push_back(tmpDayChange); - // ѳ.. - dwTime = CONVERT_SEC(6, 0, 0); // 6ú ̴.. + // 한낮.. + dwTime = CONVERT_SEC(6, 0, 0); // 6시부터 낮이다.. tmpDayChange.Init("Noon - StarCount", SDC_STARCOUNT, dwTime, 0, 0, 300.0f); m_DayChanges.push_back(tmpDayChange); @@ -680,11 +680,11 @@ void CN3SkyMng::InitToDefaultHardCoding() { tmpDayChange.Init("Noon - Light2", SDC_LIGHT2COLOR, dwTime, D3DCOLOR_ARGB(255, 255, 255, 255), 0, 150.0f); m_DayChanges.push_back(tmpDayChange); - tmpDayChange.Init("Noon - MoonPhase", SDC_MOONPHASE, CONVERT_SEC(12, 0, 0), 0, 0, 0); // 12ÿ ȭ + tmpDayChange.Init("Noon - MoonPhase", SDC_MOONPHASE, CONVERT_SEC(12, 0, 0), 0, 0, 0); // 낮 12시에 달 모양 변화 m_DayChanges.push_back(tmpDayChange); - // .. - dwTime = CONVERT_SEC(20, 0, 0); // 8ÿ ذ Ѵ.. + // 해질때.. + dwTime = CONVERT_SEC(20, 0, 0); // 저녁 8시에 해가 지기 시작한다.. tmpDayChange.Init("SunSet - SkyColor", SDC_SKYCOLOR, dwTime, D3DCOLOR_ARGB(255, 98, 115, 125), 0, 180.0f); m_DayChanges.push_back(tmpDayChange); @@ -716,8 +716,8 @@ void CN3SkyMng::InitToDefaultHardCoding() { tmpDayChange.Init("SunSet - Light2", SDC_LIGHT2COLOR, dwTime, D3DCOLOR_ARGB(255, 135, 162, 159), 0, 150.0f); m_DayChanges.push_back(tmpDayChange); - // ذ .. - dwTime = CONVERT_SEC(21, 0, 0); // 9ÿ ذ . + // 완전히 해가 짐.. + dwTime = CONVERT_SEC(21, 0, 0); // 저녁 9시에 완전히 해가 진다. tmpDayChange.Init("MidNight - SkyColor", SDC_SKYCOLOR, dwTime, D3DCOLOR_ARGB(255, 15, 18, 49), 0, 180.0f); m_DayChanges.push_back(tmpDayChange); @@ -729,15 +729,15 @@ void CN3SkyMng::InitToDefaultHardCoding() { m_DayChanges.push_back(tmpDayChange); tmpDayChange.Init("MidNight - SunColor", SDC_SUNCOLOR, dwTime, D3DCOLOR_ARGB(255, 30, 36, 85), 0, - 150.0f); // Ǫ + 150.0f); // 푸르스름 m_DayChanges.push_back(tmpDayChange); tmpDayChange.Init("MidNight - GlowColor", SDC_GLOWCOLOR, dwTime, D3DCOLOR_ARGB(255, 15, 18, 49), 0, - 150.0f); // ϴð + 150.0f); // 하늘과 동 m_DayChanges.push_back(tmpDayChange); tmpDayChange.Init("MidNight - FlareColor", SDC_FLARECOLOR, dwTime, D3DCOLOR_ARGB(255, 15, 18, 49), 0, - 150.0f); // ϴð + 150.0f); // 하늘과 동 m_DayChanges.push_back(tmpDayChange); tmpDayChange.Init("MidNight - Cloud1Color", SDC_CLOUD1COLOR, dwTime, D3DCOLOR_ARGB(255, 151, 144, 160), 0, 150.0f); @@ -755,21 +755,21 @@ void CN3SkyMng::InitToDefaultHardCoding() { tmpDayChange.Init("MidNight - Light2", SDC_LIGHT2COLOR, dwTime, D3DCOLOR_ARGB(255, 15, 18, 49), 0, 150.0f); m_DayChanges.push_back(tmpDayChange); - std::vector<__SKY_DAYCHANGE>(m_DayChanges).swap(m_DayChanges); // 뷮 ߱.. + std::vector<__SKY_DAYCHANGE>(m_DayChanges).swap(m_DayChanges); // 용량을 딱 맞추기.. qsort(&(m_DayChanges[0]), m_DayChanges.size(), sizeof(__SKY_DAYCHANGE), CompareTime); SetCheckGameTime(CONVERT_SEC(10, 0, 0)); } #endif // #ifdef _N3TOOL -// CheckGameTime ְ ð ٽ Ѵ.(Ư ð 鶧 ȣѴ.) +// CheckGameTime을 정해주고 현재시간을 다시 세팅한다.(특정 시간으로 강제적으로 만들때 호출한다.) void CN3SkyMng::SetCheckGameTime(DWORD dwCheckGameTime) { dwCheckGameTime %= 86400; DWORD dwCheckTick = timeGetTime(); m_dwCheckGameTime = dwCheckGameTime; m_dwCheckTick = dwCheckTick; - // ؿ . + // 해와 달의 각도 계산. m_pSun->SetCurAngle(dwCheckGameTime / 86400.0f * 360.0f + 270.0f); m_pMoon->SetCurAngle(dwCheckGameTime / 86400.0f * 360.0f + 90.0f); @@ -777,7 +777,7 @@ void CN3SkyMng::SetCheckGameTime(DWORD dwCheckGameTime) { return; } - // ť ӽð ´ ã´. + // 큐에서 현재 게임시간에 맞는 순서를 찾는다. m_iDayChangeCurPos = 0; int iDCC = m_DayChanges.size(); while (m_iDayChangeCurPos < iDCC && m_DayChanges[m_iDayChangeCurPos].dwWhen < dwCheckGameTime) { @@ -787,7 +787,7 @@ void CN3SkyMng::SetCheckGameTime(DWORD dwCheckGameTime) { m_iDayChangeCurPos = iDCC - 1; } - // ӽð skyº ֱٿ ãƼ ش. + // 현재 게임시간에서 각 sky상태별로 가장 최근에 변경된 값을 찾아서 값을 지정해준다. for (int i = 0; i < NUM_SKYDAYCHANGE; ++i) { if (i == SDC_MOONPHASE) { continue; @@ -795,35 +795,35 @@ void CN3SkyMng::SetCheckGameTime(DWORD dwCheckGameTime) { int iPos = GetLatestChange((eSKY_DAYCHANGE)i, m_iDayChangeCurPos); if (iPos < 0) { - continue; // ѹ Ҵµ ȭ ã . + continue; // 한바퀴를 다 돌았는데도 변화값을 찾을 수 없다. } __SKY_DAYCHANGE * pSDC = &(m_DayChanges[iPos]); - DWORD dwEnd = pSDC->dwWhen + (DWORD)(TIME_REAL_PER_GAME * pSDC->fHowLong); // ȭ ð + DWORD dwEnd = pSDC->dwWhen + (DWORD)(TIME_REAL_PER_GAME * pSDC->fHowLong); // 변화가 끝나는 시간 if (dwEnd > 86400) { - dwEnd -= 86400; // 24ð Ѿ 24ð ش. + dwEnd -= 86400; // 24시간이 넘었을경우 24시간을 빼준다. } - if (dwEnd < dwCheckGameTime) { // ׽ð ȭ ̹ + if (dwEnd < dwCheckGameTime) { // 현재 겜시간에서 변화가 이미 끝났을 경우 ChangeSky(pSDC, 0.0f); - } else { // ׽ð ȭ + } else { // 현재 겜시간에서 변화가 진행중인 경우 int iPrevPos = GetLatestChange((eSKY_DAYCHANGE)i, iPos); - __ASSERT(iPrevPos >= 0, "⿡ ø "); + __ASSERT(iPrevPos >= 0, "여기에 올리가 없다"); __SKY_DAYCHANGE * pPrevSDC = &(m_DayChanges[iPrevPos]); - ChangeSky(pPrevSDC, 0.0f); // · + ChangeSky(pPrevSDC, 0.0f); // 이전 상태로 만들기 - // ȭ· - // ð ð + // 변화상태로 만들기 + // 실행할 명령의 시간과 현재 시간 차이 DWORD dwDiffTime = dwCheckGameTime - pSDC->dwWhen; - // ȭ ɸ ð - float fTakeTime = pSDC->fHowLong - dwDiffTime * TIME_GAME_PER_REAL; // ɸ ð + // 변화에 걸리는 시간 조정 + float fTakeTime = pSDC->fHowLong - dwDiffTime * TIME_GAME_PER_REAL; // 걸리는 시간 if (fTakeTime < 0.0f) { - fTakeTime = 0.0f; // 0 ȭϰ + fTakeTime = 0.0f; // 0보다 작으면 즉시 변화하게 하자 } ChangeSky(pSDC, fTakeTime); } } } -// m_DayChanges ġ(iPos) ֱٿ ȭϴ ġ +// m_DayChanges에서 지정된 위치(iPos) 이전의 가장 최근에 변화하는 위치 얻어오기 int CN3SkyMng::GetLatestChange(eSKY_DAYCHANGE eSDC, int iPos) { int iFind = iPos - 1; if (iFind < 0 || iFind >= m_DayChanges.size()) { @@ -831,36 +831,36 @@ int CN3SkyMng::GetLatestChange(eSKY_DAYCHANGE eSDC, int iPos) { } while (iFind >= 0) { if (m_DayChanges[iFind].eSkyDayChange == eSDC) { - break; // ֱ ȭ ãҴ. + break; // 가장 최근의 변화를 찾았다. } --iFind; } if (iFind < 0) { - // ڿ ٽ ˻ + // 맨 뒤에서부터 다시 검색 iFind = m_DayChanges.size() - 1; while (iFind >= 0) { if (m_DayChanges[iFind].eSkyDayChange == eSDC) { - break; // ֱ ȭ ãҴ. + break; // 가장 최근의 변화를 찾았다. } if (iPos > iFind) { iFind = -1; break; - } // ѹ Ҵµ ȭ ã . + } // 한바퀴를 다 돌았는데도 변화값을 찾을 수 없다. --iFind; } } return iFind; } -// ϴ ¸ ٲٱ (pSDC->fHowLong fTakeTime Ͽ Ȯ ȭ Ͽ ش.) +// 하늘의 상태를 바꾸기 (pSDC->fHowLong 값과 fTakeTime값을 비교하여 정확한 변화율을 계산하여 준다.) void CN3SkyMng::ChangeSky(__SKY_DAYCHANGE * pSDC, float fTakeTime) { if (NULL == pSDC) { return; } float fPercentage = 1.0f - fTakeTime / pSDC->fHowLong; - // ϴ ȭ ϱ + // 하늘 변화명령 실행하기 switch (pSDC->eSkyDayChange) { case SDC_SKYCOLOR: m_pSky->m_SkyColor.ChangeColor(pSDC->dwParam1, pSDC->fHowLong); @@ -874,24 +874,24 @@ void CN3SkyMng::ChangeSky(__SKY_DAYCHANGE * pSDC, float fTakeTime) { m_pStar->SetStar(pSDC->dwParam1, fTakeTime); break; case SDC_MOONPHASE: - m_pMoon->SetMoonPhase(m_pMoon->GetMoonPhaseIndex() + 1); // phase index ϳ Ų. + m_pMoon->SetMoonPhase(m_pMoon->GetMoonPhaseIndex() + 1); // phase index를 하나 증가시킨다. break; case SDC_SUNCOLOR: - m_pSun->m_Parts[SUNPART_SUN].Color.ChangeColor(pSDC->dwParam1, pSDC->fHowLong); // + m_pSun->m_Parts[SUNPART_SUN].Color.ChangeColor(pSDC->dwParam1, pSDC->fHowLong); // 색 m_pSun->m_Parts[SUNPART_SUN].Color.SetPercentage(fPercentage); - m_pSun->m_Parts[SUNPART_SUN].Delta.ChangeDelta(pSDC->dwParam2 / 1000.0f, pSDC->fHowLong); // ũ.. + m_pSun->m_Parts[SUNPART_SUN].Delta.ChangeDelta(pSDC->dwParam2 / 1000.0f, pSDC->fHowLong); // 크기.. m_pSun->m_Parts[SUNPART_SUN].Delta.SetPercentage(fPercentage); break; case SDC_GLOWCOLOR: - m_pSun->m_Parts[SUNPART_GLOW].Color.ChangeColor(pSDC->dwParam1, pSDC->fHowLong); // + m_pSun->m_Parts[SUNPART_GLOW].Color.ChangeColor(pSDC->dwParam1, pSDC->fHowLong); // 색 m_pSun->m_Parts[SUNPART_GLOW].Color.SetPercentage(fPercentage); - m_pSun->m_Parts[SUNPART_GLOW].Delta.ChangeDelta(pSDC->dwParam2 / 1000.0f, pSDC->fHowLong); // ũ.. + m_pSun->m_Parts[SUNPART_GLOW].Delta.ChangeDelta(pSDC->dwParam2 / 1000.0f, pSDC->fHowLong); // 크기.. m_pSun->m_Parts[SUNPART_GLOW].Delta.SetPercentage(fPercentage); break; case SDC_FLARECOLOR: - m_pSun->m_Parts[SUNPART_FLARE].Color.ChangeColor(pSDC->dwParam1, pSDC->fHowLong); // + m_pSun->m_Parts[SUNPART_FLARE].Color.ChangeColor(pSDC->dwParam1, pSDC->fHowLong); // 색 m_pSun->m_Parts[SUNPART_FLARE].Color.SetPercentage(fPercentage); - m_pSun->m_Parts[SUNPART_FLARE].Delta.ChangeDelta(pSDC->dwParam2 / 1000.0f, pSDC->fHowLong); // ũ.. + m_pSun->m_Parts[SUNPART_FLARE].Delta.ChangeDelta(pSDC->dwParam2 / 1000.0f, pSDC->fHowLong); // 크기.. m_pSun->m_Parts[SUNPART_FLARE].Delta.SetPercentage(fPercentage); break; case SDC_CLOUD1COLOR: @@ -941,35 +941,35 @@ int CN3SkyMng::CompareTime(const void * pArg1, const void * pArg2) { } void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { - // ϴ ͵ : SDC_SKYCOLOR, SDC_FOGCOLOR, SDC_CLOUD1COLOR, SDC_CLOUD2COLOR, SDC_CLOUDTEX - eSKY_WEATHER ePrevWeather = m_eWeather; // + // 날씨에 변하는 것들 : SDC_SKYCOLOR, SDC_FOGCOLOR, SDC_CLOUD1COLOR, SDC_CLOUD2COLOR, SDC_CLOUDTEX + eSKY_WEATHER ePrevWeather = m_eWeather; // 이전 날씨 m_eWeather = eWeather; - // ð ϱ + // 현재 게임 시간 구하기 DWORD dwCurTickCount = timeGetTime(); - __ASSERT(dwCurTickCount >= m_dwCheckTick, "̴."); + __ASSERT(dwCurTickCount >= m_dwCheckTick, "음수이다."); DWORD dwCurGameTime = m_dwCheckGameTime + (DWORD)((dwCurTickCount - m_dwCheckTick) * TIME_REAL_PER_GAME * 0.001f); BOOL IsNight = (dwCurGameTime < CONVERT_SEC(6, 0, 0) || dwCurGameTime > CONVERT_SEC(19, 0, 0)); - if (SW_CLEAR == m_eWeather) // . ۼƮ Ȱ... + if (SW_CLEAR == m_eWeather) // 맑은 날씨. 퍼센트는 안개... { if (SW_CLEAR == ePrevWeather) { - return; // ȭŰ ʴ´. + return; // 이전 날씨가 맑았으면 변화시키지 않는다. } - int iAfterNSecPos = GetDayChangePos_AfterNSec(dwCurGameTime, 10); // 60 Ŀ DayChangePosϱ + int iAfterNSecPos = GetDayChangePos_AfterNSec(dwCurGameTime, 10); // 60초 후에 DayChangePos구하기 float fHowLong = 10.0f; DWORD dwWhen = dwCurGameTime + CONVERT_SEC(0, 0, 0); DWORD dwParam1 = 0, dwParam2 = 0; - // ȭ ť + // 날씨 변화 큐 만들기 m_WeatherChanges.clear(); m_iWeatherChangeCurPos = 0; m_WeatherChanges.reserve(16); __SKY_DAYCHANGE tmpWeatherChange; int iPos = 0; - // - iPos = GetLatestChange(SDC_SUNCOLOR, iAfterNSecPos); // N Ŀ ֱٿ ϴ ȭ ġ ϱ + // 해 + iPos = GetLatestChange(SDC_SUNCOLOR, iAfterNSecPos); // N초 후에 가장 최근에 변한 하늘 변화 위치 구하기 if (iPos >= 0) { dwParam1 = m_DayChanges[iPos].dwParam1; dwParam2 = m_DayChanges[iPos].dwParam2; @@ -980,8 +980,8 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Sun", SDC_SUNCOLOR, dwWhen, dwParam1, dwParam2, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // flare - iPos = GetLatestChange(SDC_FLARECOLOR, iAfterNSecPos); // N Ŀ ֱٿ ϴ ȭ ġ ϱ + // 해의 flare + iPos = GetLatestChange(SDC_FLARECOLOR, iAfterNSecPos); // N초 후에 가장 최근에 변한 하늘 변화 위치 구하기 if (iPos >= 0) { dwParam1 = m_DayChanges[iPos].dwParam1; dwParam2 = m_DayChanges[iPos].dwParam2; @@ -992,8 +992,8 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Flare", SDC_FLARECOLOR, dwWhen, dwParam1, dwParam2, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // glow - iPos = GetLatestChange(SDC_GLOWCOLOR, iAfterNSecPos); // N Ŀ ֱٿ ϴ ȭ ġ ϱ + // 해의 glow + iPos = GetLatestChange(SDC_GLOWCOLOR, iAfterNSecPos); // N초 후에 가장 최근에 변한 하늘 변화 위치 구하기 if (iPos >= 0) { dwParam1 = m_DayChanges[iPos].dwParam1; dwParam2 = m_DayChanges[iPos].dwParam2; @@ -1004,8 +1004,8 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Glow", SDC_GLOWCOLOR, dwWhen, dwParam1, dwParam2, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // ϴû - iPos = GetLatestChange(SDC_SKYCOLOR, iAfterNSecPos); // N Ŀ ֱٿ ϴ ȭ ġ ϱ + // 하늘색 + iPos = GetLatestChange(SDC_SKYCOLOR, iAfterNSecPos); // N초 후에 가장 최근에 변한 하늘 변화 위치 구하기 if (iPos >= 0) { dwParam1 = m_DayChanges[iPos].dwParam1; dwParam2 = m_DayChanges[iPos].dwParam2; @@ -1016,8 +1016,8 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Sky", SDC_SKYCOLOR, dwWhen, dwParam1, dwParam2, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // Ȱ - iPos = GetLatestChange(SDC_FOGCOLOR, iAfterNSecPos); // N Ŀ ֱٿ ϴ ȭ ġ ϱ + // 안개색 + iPos = GetLatestChange(SDC_FOGCOLOR, iAfterNSecPos); // N초 후에 가장 최근에 변한 하늘 변화 위치 구하기 if (iPos >= 0) { dwParam1 = m_DayChanges[iPos].dwParam1; dwParam2 = m_DayChanges[iPos].dwParam2; @@ -1028,8 +1028,8 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Fog", SDC_FOGCOLOR, dwWhen, dwParam1, dwParam2, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // 1 - iPos = GetLatestChange(SDC_CLOUD1COLOR, iAfterNSecPos); // N Ŀ ֱٿ ϴ ȭ ġ ϱ + // 구름 1 색 + iPos = GetLatestChange(SDC_CLOUD1COLOR, iAfterNSecPos); // N초 후에 가장 최근에 변한 하늘 변화 위치 구하기 if (iPos >= 0) { dwParam1 = m_DayChanges[iPos].dwParam1; dwParam2 = m_DayChanges[iPos].dwParam2; @@ -1040,8 +1040,8 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Cloud1", SDC_CLOUD1COLOR, dwWhen, dwParam1, dwParam2, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // 2 - iPos = GetLatestChange(SDC_CLOUD2COLOR, iAfterNSecPos); // N Ŀ ֱٿ ϴ ȭ ġ ϱ + // 구름 2색 + iPos = GetLatestChange(SDC_CLOUD2COLOR, iAfterNSecPos); // N초 후에 가장 최근에 변한 하늘 변화 위치 구하기 if (iPos >= 0) { dwParam1 = m_DayChanges[iPos].dwParam1; dwParam2 = m_DayChanges[iPos].dwParam2; @@ -1052,8 +1052,8 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Cloud2", SDC_CLOUD2COLOR, dwWhen, dwParam1, dwParam2, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // ؽ - ̸ ٲ Ѵ.. - iPos = GetLatestChange(SDC_CLOUDTEX, iAfterNSecPos); // N Ŀ ֱٿ ϴ ȭ ġ ϱ + // 구름 텍스쳐 - 미리 바뀌게 한다.. + iPos = GetLatestChange(SDC_CLOUDTEX, iAfterNSecPos); // N초 후에 가장 최근에 변한 하늘 변화 위치 구하기 if (iPos >= 0) { dwParam1 = m_DayChanges[iPos].dwParam1; dwParam2 = m_DayChanges[iPos].dwParam2; @@ -1064,8 +1064,8 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("CloudTex", SDC_CLOUDTEX, dwCurGameTime, dwParam1, dwParam2, 10.0f); m_WeatherChanges.push_back(tmpWeatherChange); - // Ʈ 0 - iPos = GetLatestChange(SDC_LIGHT0COLOR, iAfterNSecPos); // N Ŀ ֱٿ ϴ ȭ ġ ϱ + // 라이트 0 + iPos = GetLatestChange(SDC_LIGHT0COLOR, iAfterNSecPos); // N초 후에 가장 최근에 변한 하늘 변화 위치 구하기 if (iPos >= 0) { dwParam1 = m_DayChanges[iPos].dwParam1; dwParam2 = m_DayChanges[iPos].dwParam2; @@ -1076,8 +1076,8 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Light0", SDC_LIGHT0COLOR, dwWhen, dwParam1, dwParam2, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // Ʈ 1 - iPos = GetLatestChange(SDC_LIGHT1COLOR, iAfterNSecPos); // N Ŀ ֱٿ ϴ ȭ ġ ϱ + // 라이트 1 + iPos = GetLatestChange(SDC_LIGHT1COLOR, iAfterNSecPos); // N초 후에 가장 최근에 변한 하늘 변화 위치 구하기 if (iPos >= 0) { dwParam1 = m_DayChanges[iPos].dwParam1; dwParam2 = m_DayChanges[iPos].dwParam2; @@ -1088,8 +1088,8 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Light1", SDC_LIGHT1COLOR, dwWhen, dwParam1, dwParam2, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // Ʈ 2 - iPos = GetLatestChange(SDC_LIGHT2COLOR, iAfterNSecPos); // N Ŀ ֱٿ ϴ ȭ ġ ϱ + // 라이트 2 + iPos = GetLatestChange(SDC_LIGHT2COLOR, iAfterNSecPos); // N초 후에 가장 최근에 변한 하늘 변화 위치 구하기 if (iPos >= 0) { dwParam1 = m_DayChanges[iPos].dwParam1; dwParam2 = m_DayChanges[iPos].dwParam2; @@ -1100,20 +1100,20 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Light2", SDC_LIGHT2COLOR, dwWhen, dwParam1, dwParam2, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // .. - iAfterNSecPos = GetDayChangePos_AfterNSec(dwCurGameTime, 10); // 10 Ŀ DayChangePosϱ + // 원래대로 날씨 돌리기.. + iAfterNSecPos = GetDayChangePos_AfterNSec(dwCurGameTime, 10); // 10초 후에 DayChangePos구하기 - std::vector<__SKY_DAYCHANGE>(m_WeatherChanges).swap(m_WeatherChanges); // 뷮 ߱.. + std::vector<__SKY_DAYCHANGE>(m_WeatherChanges).swap(m_WeatherChanges); // 용량을 딱 맞추기.. qsort(&(m_WeatherChanges[0]), m_WeatherChanges.size(), sizeof(__SKY_DAYCHANGE), CompareTime); - // ~ + // 날씨 좋다~ if (m_pGESnow) { m_pGESnow->FadeSet(3.0f, false); } if (m_pGERain) { m_pGERain->FadeSet(3.0f, false); } -#ifdef _N3GAME // ƴ ʿ... +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... if (m_pSnd_Weather_Rain) { m_pSnd_Weather_Rain->Stop(5.0f); } @@ -1121,14 +1121,14 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { m_pSnd_Weather_Snow->Stop(5.0f); } #endif // #ifdef _N3GAME - } else if (SW_RAINY == m_eWeather || SW_SNOW == m_eWeather) // , + } else if (SW_RAINY == m_eWeather || SW_SNOW == m_eWeather) // 비, 눈 옴 { if (SW_CLEAR != ePrevWeather) { - return; // ƴϸ ȭŰ ʴ´. + return; // 이전 날씨가 맑은날이 아니면 변화시키지 않는다. } float fHowLong = 10.0f; - // ȭ ť + // 날씨 변화 큐 만들기 m_WeatherChanges.clear(); m_iWeatherChangeCurPos = 0; m_WeatherChanges.reserve(16); @@ -1137,57 +1137,57 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { float fDelta = (0.5f + 0.3f * (100 - iPercentage) / 100.0f); DWORD dwWhen = dwCurGameTime + CONVERT_SEC(0, 0, 10); - // Ʈ ϱ.. + // 라이트 세팅 변수 구하기.. __ColorValue crLgt(1, 1, 1, 1); - int iAfterNSecPos = GetDayChangePos_AfterNSec(dwCurGameTime, 10); // 60 Ŀ DayChangePosϱ - int iPos = GetLatestChange(SDC_LIGHT1COLOR, iAfterNSecPos); // ش + int iAfterNSecPos = GetDayChangePos_AfterNSec(dwCurGameTime, 10); // 60초 후에 DayChangePos구하기 + int iPos = GetLatestChange(SDC_LIGHT1COLOR, iAfterNSecPos); // 지형에 내리쬐는 빛 if (iPos >= 0) { crLgt = m_DayChanges[iPos].dwParam1; } float fDelta2 = (crLgt.r + crLgt.g + crLgt.b) / 3.0f; fDelta2 = 1.0f - fDelta2 * 0.8f * (iPercentage / 100.0f); - // + // 해 tmpWeatherChange.Init("Sun", SDC_SUNCOLOR, dwWhen, 0xff000000, this->GetSunRatio() * 1000, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // flare + // 해의 flare tmpWeatherChange.Init("Flare", SDC_FLARECOLOR, dwWhen, 0xff000000, this->GetFlareRatio() * 1000, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // glow + // 해의 glow tmpWeatherChange.Init("Glow", SDC_GLOWCOLOR, dwWhen, 0xff000000, this->GetGlowRatio() * 1000, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // ϴû + // 하늘색 crTmp1 = this->GetSkyColor(); crTmp1 *= fDelta; crTmp1.a = 1.0f; tmpWeatherChange.Init("Sky", SDC_SKYCOLOR, dwWhen, crTmp1.ToD3DCOLOR(), 0, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // Ȱ + // 안개색 crTmp1 = this->GetFogColor(); crTmp1 *= fDelta2; crTmp1.a = 1.0f; tmpWeatherChange.Init("Fog", SDC_FOGCOLOR, dwWhen, crTmp1.ToD3DCOLOR(), 0, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // 1 + // 구름색1 crTmp1 = this->GetCloud1Color(); crTmp1 *= fDelta * 0.75f; crTmp1.a = 1.0f; tmpWeatherChange.Init("Cloud1Color", SDC_CLOUD1COLOR, dwWhen, crTmp1.ToD3DCOLOR(), 0, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // 2 - Ӱ Ѵ.. + // 구름색2 - 좀더 어둡게 한다.. crTmp1 = this->GetCloud2Color(); crTmp1 *= fDelta * 0.5f; crTmp1.a = 1.0f; tmpWeatherChange.Init("Cloud2Color", SDC_CLOUD2COLOR, dwWhen, crTmp1.ToD3DCOLOR(), 0, fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // ؽ + // 구름 텍스쳐 DWORD dwTex1, dwTex2; if (iPercentage > 80) { dwTex1 = CLOUD_OVERCAST; @@ -1205,7 +1205,7 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("CloudTex", SDC_CLOUDTEX, dwCurGameTime, dwTex1, dwTex2, 10.0f); m_WeatherChanges.push_back(tmpWeatherChange); - // Ʈ 0 + // 라이트 0 crTmp1 = this->GetLightDiffuseColor(0); crTmp1 *= fDelta2; crTmp1.a = 1.0f; @@ -1215,7 +1215,7 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Light0", SDC_LIGHT0COLOR, dwWhen, crTmp1.ToD3DCOLOR(), crTmp2.ToD3DCOLOR(), fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // Ʈ 1 + // 라이트 1 crTmp1 = this->GetLightDiffuseColor(1); crTmp1 *= fDelta2; crTmp1.a = 1.0f; @@ -1225,7 +1225,7 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Light1", SDC_LIGHT1COLOR, dwWhen, crTmp1.ToD3DCOLOR(), crTmp2.ToD3DCOLOR(), fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - // Ʈ 2 + // 라이트 2 crTmp1 = this->GetLightDiffuseColor(2); crTmp1 *= fDelta2; crTmp1.a = 1.0f; @@ -1235,7 +1235,7 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { tmpWeatherChange.Init("Light2", SDC_LIGHT2COLOR, dwWhen, crTmp1.ToD3DCOLOR(), crTmp2.ToD3DCOLOR(), fHowLong); m_WeatherChanges.push_back(tmpWeatherChange); - std::vector<__SKY_DAYCHANGE>(m_WeatherChanges).swap(m_WeatherChanges); // 뷮 ߱.. + std::vector<__SKY_DAYCHANGE>(m_WeatherChanges).swap(m_WeatherChanges); // 용량을 딱 맞추기.. qsort(&(m_WeatherChanges[0]), m_WeatherChanges.size(), sizeof(m_WeatherChanges[0]), CompareTime); float fHeight = 20.0f; @@ -1254,15 +1254,15 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { float fRainLength = 0.4f + 0.6f * fPercent; m_fCellSize = 20.0f; - m_pGERain->Create(fDensity, m_fCellSize, fHeight, fRainLength, vVelocity, 10.0f); // + m_pGERain->Create(fDensity, m_fCellSize, fHeight, fRainLength, vVelocity, 10.0f); // 비 m_pGERain->SetActive(TRUE); -#ifdef _N3GAME // ƴ ʿ... +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... if (m_pSnd_Weather_Snow) { m_pSnd_Weather_Snow->Stop(5.0f); } CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Weather_Rain); - m_pSnd_Weather_Rain = CN3Base::s_SndMgr.CreateObj(201); // Ҹ.. + m_pSnd_Weather_Rain = CN3Base::s_SndMgr.CreateObj(201); // 비오는 소리.. if (m_pSnd_Weather_Rain) { int iMaxVol = (int)(70 * fPercent); m_pSnd_Weather_Rain->SetMaxVolume(iMaxVol); @@ -1283,15 +1283,15 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { float fSnowSize = 0.1f + 0.1f * fPercent; m_fCellSize = 20.0f; - m_pGESnow->Create(fDensity, m_fCellSize, fHeight, fSnowSize, vVelocity, 10.0f); // + m_pGESnow->Create(fDensity, m_fCellSize, fHeight, fSnowSize, vVelocity, 10.0f); // 비 m_pGESnow->SetActive(TRUE); -#ifdef _N3GAME // ƴ ʿ... +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... if (m_pSnd_Weather_Rain) { m_pSnd_Weather_Rain->Stop(5.0f); } CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Weather_Snow); - m_pSnd_Weather_Snow = CN3Base::s_SndMgr.CreateObj(200); // ٶҸ.. + m_pSnd_Weather_Snow = CN3Base::s_SndMgr.CreateObj(200); // 바람소리.. if (m_pSnd_Weather_Snow) { int iMaxVol = (int)(70 * fPercent); m_pSnd_Weather_Snow->SetMaxVolume(iMaxVol); @@ -1303,17 +1303,17 @@ void CN3SkyMng::SetWeather(eSKY_WEATHER eWeather, int iPercentage) { } } -void CN3SkyMng::SunAndMoonDirectionFixByHour(int iHour) // ؿ +void CN3SkyMng::SunAndMoonDirectionFixByHour(int iHour) // 해와 달 각도 관리 { m_iHourFix = iHour; } void CN3SkyMng::GetGameTime(int * piYear, int * piMonth, int * piDay, int * piHour, int * piMin) { DWORD dwCurTickCount = timeGetTime(); - __ASSERT(dwCurTickCount >= m_dwCheckTick, "̴."); + __ASSERT(dwCurTickCount >= m_dwCheckTick, "음수이다."); DWORD dwCurGameTime = m_dwCheckGameTime + (DWORD)((dwCurTickCount - m_dwCheckTick) * TIME_REAL_PER_GAME * 0.001f); - // dwCurGameTime - + // dwCurGameTime - 초 int iSecond = dwCurGameTime % 3600; if (piYear) { @@ -1344,16 +1344,16 @@ void CN3SkyMng::SetGameTime(int iYear, int iMonth, int iDay, int iHour, int iMin } int CN3SkyMng::GetDayChangePos_AfterNSec(DWORD dwCurGameTime, float fSec) { - // n üũ ð - DWORD dwCheckGameTime = dwCurGameTime + (DWORD)(fSec * TIME_REAL_PER_GAME); // 150 ӽð + // n초 후의 체크할 게임 시간을 계산 + DWORD dwCheckGameTime = dwCurGameTime + (DWORD)(fSec * TIME_REAL_PER_GAME); // 150초 후 게임시간 int iCheckDayChangeCurPos = m_iDayChangeCurPos; - if (dwCheckGameTime > 86400) // üũ ð ӽð 24ø + if (dwCheckGameTime > 86400) // 체크 시간이 게임시간의 24시를 넘으면 { iCheckDayChangeCurPos = 0; dwCheckGameTime %= 86400; } - // n queue ġ ã + // n초후의 queue의 위치 찾기 while (iCheckDayChangeCurPos < m_DayChanges.size() && m_DayChanges[m_iDayChangeCurPos].dwWhen < dwCheckGameTime) { ++iCheckDayChangeCurPos; } @@ -1540,7 +1540,7 @@ bool CN3SkyMng::Load(HANDLE hFile) { m_DayChanges[i].Load(hFile); } - qsort(&(m_DayChanges[0]), m_DayChanges.size(), sizeof(__SKY_DAYCHANGE), CompareTime); // ð + qsort(&(m_DayChanges[0]), m_DayChanges.size(), sizeof(__SKY_DAYCHANGE), CompareTime); // 시간순으로 정렬 } SetCheckGameTime(CONVERT_SEC(10, 0, 0)); @@ -1712,7 +1712,7 @@ const char * CN3SkyMng::CloudTextureFileName(int iIndex) { #endif /* -void CN3SkyMng::ColorDeltaSet(int iPercentage, float fHowLong) // ϴ, Ȱ ۼƮ ȭŲ.. , ö .. +void CN3SkyMng::ColorDeltaSet(int iPercentage, float fHowLong) // 현재 하늘, 안개 색을 퍼센트 단위로 변화시킨다.. 비, 눈 올때 쓴다.. { if(iPercentage < 0) iPercentage = 0; if(iPercentage > 100) iPercentage = 100; @@ -1731,7 +1731,7 @@ const char * CN3SkyMng::CloudTextureFileName(int iIndex) { m_pSky->m_FogColor.ChangeColor(crFinalFog, fHowLong); m_pSky->m_SkyColor.ChangeColor(crFinalSky, fHowLong); -#ifdef _N3GAME // ƴ ʿ... +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... if(m_pSnd_Weather_Snow) m_pSnd_Weather_Snow->Stop(5.0f); if(m_pSnd_Weather_Rain) m_pSnd_Weather_Rain->Stop(5.0f); #endif // #ifdef _N3GAME diff --git a/src/engine/N3Base/N3SkyMng.h b/src/engine/N3Base/N3SkyMng.h index 2793b06b..d097ffb1 100644 --- a/src/engine/N3Base/N3SkyMng.h +++ b/src/engine/N3Base/N3SkyMng.h @@ -7,26 +7,26 @@ #include "N3BaseFileAccess.h" #include -const float TIME_REAL_PER_GAME = 10.0f; // ð gameð ( ð ư..) -const float TIME_GAME_PER_REAL = 1.0f / TIME_REAL_PER_GAME; // gameð ð +const float TIME_REAL_PER_GAME = 10.0f; // 실제 시간과 game시간의 비율(현재 게임은 실제 시간보다 열배 빨리 돌아간다..) +const float TIME_GAME_PER_REAL = 1.0f / TIME_REAL_PER_GAME; // game시간과 실제 시간의 비율 #define CONVERT_SEC(h, m, s) ((h)*3600 + (m)*60 + (s)) -// ð +// 시간 관리 enum eSKY_DAYCHANGE { - SDC_SKYCOLOR = 0, // ϴû - SDC_FOGCOLOR, // Ȱ - SDC_STARCOUNT, // - SDC_MOONPHASE, // - SDC_SUNCOLOR, // , ũ - 1000 Ʈ ũ. - SDC_GLOWCOLOR, // glow, ũ - 1000 Ʈ ũ. - SDC_FLARECOLOR, // flare, ũ - 1000 Ʈ ũ. - SDC_CLOUD1COLOR, // 1 - SDC_CLOUD2COLOR, // 2 - SDC_CLOUDTEX, // ؽ ٲٱ + SDC_SKYCOLOR = 0, // 하늘색 + SDC_FOGCOLOR, // 안개색 + SDC_STARCOUNT, // 별 수 + SDC_MOONPHASE, // 달 모양 + SDC_SUNCOLOR, // 해 색, 크기 - 1000 이 뷰포트에서 꽉차는 크기. + SDC_GLOWCOLOR, // 해의 glow색, 크기 - 1000 이 뷰포트에서 꽉차는 크기. + SDC_FLARECOLOR, // 해의 flare색, 크기 - 1000 이 뷰포트에서 꽉차는 크기. + SDC_CLOUD1COLOR, // 구름층 1의 색 + SDC_CLOUD2COLOR, // 구름층 2의 색 + SDC_CLOUDTEX, // 구름 텍스쳐 바꾸기 SDC_LIGHT0COLOR, // Direction Light 0 SDC_LIGHT1COLOR, // Direction Light 1 - SDC_LIGHT2COLOR, // ÷̾ Light + SDC_LIGHT2COLOR, // 플레이어 주위의 Light NUM_SKYDAYCHANGE, @@ -34,12 +34,12 @@ enum eSKY_DAYCHANGE { }; struct __SKY_DAYCHANGE { - std::string szName; // ̸ ̱.. - eSKY_DAYCHANGE eSkyDayChange; //  ȭΰ? - DWORD dwWhen; // ȭΰ?(0ú ʴ Ÿ ð) + std::string szName; // 이름 붙이기.. + eSKY_DAYCHANGE eSkyDayChange; // 어떤 변화인가? + DWORD dwWhen; // 언제 변화시작인가?(0시부터 초단위로 나타낸 시간) DWORD dwParam1; // parameter 1 DWORD dwParam2; // parameter 2 - float fHowLong; // 󸶳 ɸΰ?(ǽð ) + float fHowLong; // 얼마나 걸릴것인가?(실시간 초) void Init() { szName = ""; @@ -109,10 +109,10 @@ class CN3SkyMng : public CN3BaseFileAccess { // Attributes public: enum eSKY_WEATHER { - SW_CLEAR = 1, // - SW_RAINY, // + SW_CLEAR = 1, // 맑음 + SW_RAINY, // 비 SW_SNOW - }; // + }; // 눈 protected: class CN3Sky * m_pSky; class CN3Moon * m_pMoon; @@ -122,30 +122,30 @@ class CN3SkyMng : public CN3BaseFileAccess { class CN3ColorChange * m_pLightColorDiffuses[MAX_GAME_LIGHT]; class CN3ColorChange * m_pLightColorAmbients[MAX_GAME_LIGHT]; - std::vector<__SKY_DAYCHANGE> m_DayChanges; // ԷĿ qsort + std::vector<__SKY_DAYCHANGE> m_DayChanges; // 정보입력후에 qsort하자 int m_iDayChangeCurPos; - std::vector<__SKY_DAYCHANGE> m_WeatherChanges; // ԷĿ qsort + std::vector<__SKY_DAYCHANGE> m_WeatherChanges; // 정보입력후에 qsort하자 int m_iWeatherChangeCurPos; - DWORD m_dwCheckTick; // ð TickCount(ǽð) (ӽð 24ÿ ٽ ϱ⵵ Ѵ.) - DWORD m_dwCheckGameTime; // ð( ð ʴ) 0 ~ (24*60*60) + DWORD m_dwCheckTick; // 서버에서 시간을 받을때의 윈도우TickCount(실시간) (게임시간으로 24시에 다시 설정하기도 한다.) + DWORD m_dwCheckGameTime; // 서버에서 내려받은 시간(게임 시간 초단위) 0 ~ (24*60*60) eSKY_WEATHER m_eWeather; int m_iYear; int m_iMonth; int m_iDay; - int m_iHourFix; // , ð Ÿ . + int m_iHourFix; // 해,달 방향 고정시 시간으로 나타내는 방향. - float m_fCellSize; // ũ - POINT m_CurCellPos; // μ ǥ - __Vector3 m_vPos[9]; // ֺ 9ĭ ߽ǥ + float m_fCellSize; // 내부 셀 크기 + POINT m_CurCellPos; // 현재 내부셀 좌표 + __Vector3 m_vPos[9]; // 주변 셀 9칸의 중심좌표들 - // ȿ.. - class CN3GERain * m_pGERain; // - class CN3GESnow * m_pGESnow; // -#ifdef _N3GAME // ƴ ʿ... + // 효과들.. + class CN3GERain * m_pGERain; // 비 + class CN3GESnow * m_pGESnow; // 눈 +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... class CN3SndObj * m_pSnd_Weather_Rain; class CN3SndObj * m_pSnd_Weather_Snow; #endif // #ifdef _N3GAME @@ -177,7 +177,7 @@ class CN3SkyMng : public CN3BaseFileAccess { bool Load(HANDLE hFile); -#ifdef _N3GAME // ƴ ʿ... +#ifdef _N3GAME // 게임이 아닌 툴에서는 필요없다... void ReleaseSound(); #endif // #ifdef _N3GAME @@ -203,29 +203,29 @@ class CN3SkyMng : public CN3BaseFileAccess { D3DCOLOR GetLightAmbientColor(int iIndex); void Release(); - void Render(); // ϴø .. - void RenderWeather(); // .. + void Render(); // 하늘만 렌더링.. + void RenderWeather(); // 비나 눈등의 날씨 렌더링.. void Tick(); - // ð + // 시간 관리 void GetGameTime(int * piYear, int * piMonth, int * piDay, int * piHour, int * piMin); void SetGameTime(int iYear, int iMonth, int iDay, int iHour, int iMin); - void SetWeather(eSKY_WEATHER eWeather, int iPercentage); // + void SetWeather(eSKY_WEATHER eWeather, int iPercentage); // 날씨 세팅 - void SunAndMoonDirectionFixByHour(int iHour); // ؿ + void SunAndMoonDirectionFixByHour(int iHour); // 해와 달 각도 관리 - // By : Ecli666 ( On 2002-04-04 10:53:58 ) + // By : Ecli666 ( On 2002-04-04 오전 10:53:58 ) // CN3Sun * GetSunPointer() { return m_pSun; } - // ~(By Ecli666 On 2002-04-04 10:53:58 ) + // ~(By Ecli666 On 2002-04-04 오전 10:53:58 ) protected: void SetCheckGameTime( DWORD - dwCheckGameTime); // CheckGameTime ְ ð ٽ Ѵ.(Ư ð 鶧 ȣѴ.) + dwCheckGameTime); // CheckGameTime을 정해주고 현재시간을 다시 세팅한다.(특정 시간으로 강제적으로 만들때 호출한다.) int GetLatestChange(eSKY_DAYCHANGE eSDC, - int iPos); // m_pDayChangeQueues ġ(iPos) ֱٿ ȭϴ ġ + int iPos); // m_pDayChangeQueues에서 지정된 위치(iPos) 이전의 가장 최근에 변화하는 위치 얻어오기 void ChangeSky(__SKY_DAYCHANGE * pSDC, float fTakeTime); - int GetDayChangePos_AfterNSec(DWORD dwCurGameTime, float fSec); // ǽð N Ŀ DayChangeQueue ġ ϱ + int GetDayChangePos_AfterNSec(DWORD dwCurGameTime, float fSec); // 실시간 N초 후에 DayChangeQueue의 위치 구하기 static int CompareTime(const void * pArg1, const void * pArg2); }; diff --git a/src/engine/N3Base/N3SndDef.h b/src/engine/N3Base/N3SndDef.h index 70f75d07..ae8eaa8e 100644 --- a/src/engine/N3Base/N3SndDef.h +++ b/src/engine/N3Base/N3SndDef.h @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////////////////////// // // N3SndDef.h -// - ̰ Sound õ ڷ, ... +// - 이것저것 Sound에 관련된 자료형정의, 상수정의... // // By Donghoon.. // @@ -37,15 +37,15 @@ typedef struct __SoundSource { } } SOUNDSOURCE, *LPSOUNDSOURCE; -typedef struct __TABLE_SOUND // Sound ҽ ڵ... +typedef struct __TABLE_SOUND // Sound 리소스 레코드... { - DWORD dwID; // ID + DWORD dwID; // 고유 ID std::string szFN; // wave file name - int iType; // Ÿ... - int iNumInst; // ִ ִ νϽ .. + int iType; // 사운드 타입... + int iNumInst; // 최대 사용할 수 있는 인스턴스의 갯수.. } TABLE_SOUND; -// Ʈ Ÿ .. +// 사운드 오브젝트 타입 정의.. enum e_SndType { SNDTYPE_2D = 0, SNDTYPE_3D, diff --git a/src/engine/N3Base/N3SndEng.cpp b/src/engine/N3Base/N3SndEng.cpp index 2f4e980a..01709e82 100644 --- a/src/engine/N3Base/N3SndEng.cpp +++ b/src/engine/N3Base/N3SndEng.cpp @@ -26,7 +26,7 @@ CN3SndEng::~CN3SndEng() { // // Init -// ʱȭ... +// 엔진 초기화... // bool CN3SndEng::Init(HWND hWnd, DWORD dwCoopLevel, DWORD dwPrimaryChannels, DWORD dwPrimaryFreq, DWORD dwPrimaryBitRate) { @@ -148,7 +148,7 @@ bool CN3SndEng::LoadSource(LPSOUNDSOURCE pSrc) { dsbd.lpwfxFormat = WaveFile.m_pwfx; dsbd.dwFlags = DSBCAPS_CTRLVOLUME | DSBCAPS_STATIC; - if (pSrc->Type == SNDTYPE_3D) //3D .. + if (pSrc->Type == SNDTYPE_3D) //3D 음원.. { dsbd.dwFlags = DSBCAPS_CTRL3D | DSBCAPS_MUTE3DATMAXDISTANCE | DSBCAPS_STATIC; dsbd.guid3DAlgorithm = DS3DALG_HRTF_FULL; diff --git a/src/engine/N3Base/N3SndMgr.cpp b/src/engine/N3Base/N3SndMgr.cpp index e0d59924..2d8e37da 100644 --- a/src/engine/N3Base/N3SndMgr.cpp +++ b/src/engine/N3Base/N3SndMgr.cpp @@ -21,7 +21,7 @@ CN3SndMgr::~CN3SndMgr() { } // -// ʱȭ.. +// 엔진 초기화.. // void CN3SndMgr::Init(HWND hWnd) { Release(); @@ -45,16 +45,16 @@ CN3SndObj * CN3SndMgr::CreateObj(const std::string & szFN, e_SndType eType) { CN3SndObj * pObjSrc = NULL; itm_Snd it = m_SndObjSrcs.find(szFN); - if (it == m_SndObjSrcs.end()) // ãҴ... .. + if (it == m_SndObjSrcs.end()) // 못 찾았다... 새로 만들자.. { pObjSrc = new CN3SndObj(); - if (false == pObjSrc->Create(szFN, eType)) // ε.. + if (false == pObjSrc->Create(szFN, eType)) // 새로 로딩.. { delete pObjSrc; pObjSrc = NULL; return NULL; } - m_SndObjSrcs.insert(val_Snd(szFN, pObjSrc)); // ʿ ߰Ѵ.. + m_SndObjSrcs.insert(val_Snd(szFN, pObjSrc)); // 맵에 추가한다.. } else { pObjSrc = it->second; } @@ -68,7 +68,7 @@ CN3SndObj * CN3SndMgr::CreateObj(const std::string & szFN, e_SndType eType) { } CN3SndObj * pObjNew = new CN3SndObj(); - if (false == pObjNew->Duplicate(pObjSrc, eType)) // Duplicate ó.. + if (false == pObjNew->Duplicate(pObjSrc, eType)) // Duplicate 처리.. { delete pObjNew; pObjNew = NULL; @@ -76,7 +76,7 @@ CN3SndObj * CN3SndMgr::CreateObj(const std::string & szFN, e_SndType eType) { } if (pObjNew) { - m_SndObjs_Duplicated.push_back(pObjNew); // Ʈ ִ´... + m_SndObjs_Duplicated.push_back(pObjNew); // 리스트에 넣는다... } return pObjNew; } @@ -89,7 +89,7 @@ CN3SndObjStream * CN3SndMgr::CreateStreamObj(const std::string & szFN) { return NULL; } - m_SndObjStreams.push_back(pObj); // Ʈ ֱ.. + m_SndObjStreams.push_back(pObj); // 리스트에 넣기.. return pObj; } @@ -196,19 +196,19 @@ void CN3SndMgr::Tick() { } // -// Objϳ ȿȭ.. +// Obj하나 무효화.. void CN3SndMgr::ReleaseObj(CN3SndObj ** ppObj) { if (NULL == ppObj || NULL == *ppObj) { return; } - std::string szFN = (*ppObj)->m_szFileName; // ̸ ϰ.. + std::string szFN = (*ppObj)->m_szFileName; // 파일 이름을 기억하고.. itl_Snd it = m_SndObjs_Duplicated.begin(), itEnd = m_SndObjs_Duplicated.end(); for (; it != itEnd; it++) { if (*ppObj == *it) { m_SndObjs_Duplicated.erase(it); delete *ppObj; - *ppObj = NULL; // ü .. + *ppObj = NULL; // 객체 지우기.. return; } } @@ -219,15 +219,15 @@ void CN3SndMgr::ReleaseObj(CN3SndObj ** ppObj) { if (*ppObj == *it) { m_SndObjs_PlayOnceAndRelease.erase(it); delete *ppObj; - *ppObj = NULL; // ü .. + *ppObj = NULL; // 객체 지우기.. return; } } - *ppObj = NULL; // ͸ η ش.. + *ppObj = NULL; // 포인터만 널로 만들어 준다.. /* itm_Snd it = m_SndObjSrcs.find(szFN); - if(it != m_SndObjSrcs.end()) // ãҴ.. + if(it != m_SndObjSrcs.end()) // 찾았다.. { CN3SndObj* pObj = it->second; delete pObj; @@ -300,8 +300,8 @@ void CN3SndMgr::Release() { CN3SndObj::StaticRelease(); } -// Լ ѹ ÷ ϰ ͸ ٽ ְ ReleaseObj ȣѴ. -// ġ ó ѹۿ . +// 이 함수는 한번 플레이 하고 그 포인터를 다시 쓸수있게 ReleaseObj를 호출한다. +// 대신 위치는 처음 한번밖에 지정할 수 없다. bool CN3SndMgr::PlayOnceAndRelease(int iSndID, const _D3DVECTOR * pPos) { if (!m_bSndEnable) { return false; @@ -314,16 +314,16 @@ bool CN3SndMgr::PlayOnceAndRelease(int iSndID, const _D3DVECTOR * pPos) { CN3SndObj * pObjSrc = NULL; itm_Snd it = m_SndObjSrcs.find(pTbl->szFN); - if (it == m_SndObjSrcs.end()) // ãҴ... .. + if (it == m_SndObjSrcs.end()) // 못 찾았다... 새로 만들자.. { pObjSrc = new CN3SndObj(); - if (false == pObjSrc->Create(pTbl->szFN, (e_SndType)pTbl->iType)) // ε.. + if (false == pObjSrc->Create(pTbl->szFN, (e_SndType)pTbl->iType)) // 새로 로딩.. { delete pObjSrc; pObjSrc = NULL; return NULL; } - m_SndObjSrcs.insert(val_Snd(pTbl->szFN, pObjSrc)); // ʿ ߰Ѵ.. + m_SndObjSrcs.insert(val_Snd(pTbl->szFN, pObjSrc)); // 맵에 추가한다.. if (!m_bSndDuplicated) { pObjSrc->Play(pPos); //this_Snd } @@ -341,14 +341,14 @@ bool CN3SndMgr::PlayOnceAndRelease(int iSndID, const _D3DVECTOR * pPos) { } CN3SndObj * pObj = new CN3SndObj(); - if (false == pObj->Duplicate(pObjSrc, (e_SndType)pTbl->iType)) // Duplicate ó.. + if (false == pObj->Duplicate(pObjSrc, (e_SndType)pTbl->iType)) // Duplicate 처리.. { delete pObj; pObj = NULL; return NULL; } - if (pObj) // Ʈ ִ´...noah + if (pObj) // 리스트에 넣는다...noah { m_SndObjs_PlayOnceAndRelease.push_back(pObj); pObj->Play(pPos); diff --git a/src/engine/N3Base/N3SndMgr.h b/src/engine/N3Base/N3SndMgr.h index 0a57c385..d870bc11 100644 --- a/src/engine/N3Base/N3SndMgr.h +++ b/src/engine/N3Base/N3SndMgr.h @@ -21,14 +21,14 @@ typedef typename std::map::value_type val_Snd; class CN3SndMgr { protected: - CN3TableBase<__TABLE_SOUND> m_Tbl_Source; // ҽ ̺.. + CN3TableBase<__TABLE_SOUND> m_Tbl_Source; // 사운드 소스 정보 테이블.. bool m_bSndEnable; bool m_bSndDuplicated; std::map m_SndObjSrcs; - std::list m_SndObjStreams; // Ʈ .. + std::list m_SndObjStreams; // 스트리밍 사운드.. std::list m_SndObjs_Duplicated; - std::list m_SndObjs_PlayOnceAndRelease; // ѹ ÷ ϰ ؾ ϴ + std::list m_SndObjs_PlayOnceAndRelease; // 한번만 플레이 하고 릴리즈 해야 하는 사운드들 public: void ReleaseObj(CN3SndObj ** ppObj); diff --git a/src/engine/N3Base/N3SndObj.cpp b/src/engine/N3Base/N3SndObj.cpp index 8d8b1cf4..c8e756ff 100644 --- a/src/engine/N3Base/N3SndObj.cpp +++ b/src/engine/N3Base/N3SndObj.cpp @@ -202,10 +202,10 @@ bool CN3SndObj::Create(const std::string & szFN, e_SndType eType) { dsbd.dwBufferBytes = WaveFile.GetSize(); dsbd.lpwfxFormat = WaveFile.m_pwfx; - if (SNDTYPE_2D == eType) // 2D + if (SNDTYPE_2D == eType) // 2D 음원 { dsbd.dwFlags = DSBCAPS_CTRLVOLUME; // | DSBCAPS_STATIC; - } else if (SNDTYPE_3D == eType) //3D .. + } else if (SNDTYPE_3D == eType) //3D 음원.. { dsbd.dwFlags = DSBCAPS_CTRL3D | DSBCAPS_MUTE3DATMAXDISTANCE; // | DSBCAPS_STATIC; dsbd.guid3DAlgorithm = DS3DALG_HRTF_LIGHT; @@ -227,13 +227,13 @@ bool CN3SndObj::Create(const std::string & szFN, e_SndType eType) { } m_lpDSBuff->SetCurrentPosition(0); - if (SNDTYPE_3D == eType) { //3D .. + if (SNDTYPE_3D == eType) { //3D 음원.. if (S_OK != m_lpDSBuff->QueryInterface(IID_IDirectSound3DBuffer, (VOID **)(&m_lpDS3DBuff))) { return false; } } - m_szFileName = szFN; // ̸ Ѵ.. + m_szFileName = szFN; // 파일 이름을 기록한다.. s_bNeedDeferredTick = true; // 3D Listener CommitDeferredSetting return true; @@ -287,7 +287,7 @@ bool CN3SndObj::Duplicate(CN3SndObj * pSrc, e_SndType eType, D3DVECTOR * pPos) { bool CN3SndObj::FillBufferWithSound(CWaveFile * pWaveFile) { if (NULL == m_lpDSBuff || NULL == pWaveFile) { - return false; // ͵ .. + return false; // 포인터들 점검.. } HRESULT hr; @@ -299,7 +299,7 @@ bool CN3SndObj::FillBufferWithSound(CWaveFile * pWaveFile) { dsbc.dwSize = sizeof(dsbc); m_lpDSBuff->GetCaps(&dsbc); if (dsbc.dwBufferBytes != pWaveFile->GetSize()) { - return false; // .. + return false; // 사이즈 점검.. } if (FAILED(hr = RestoreBuffer())) { @@ -371,7 +371,7 @@ void CN3SndObj::SetVolume(int Vol) { return; } if (m_lpDS3DBuff) { - return; // 3D Sound ϶ Ҹ ȵȴ..!!! + return; // 3D Sound 일때는 소리 조절이 안된다..!!! } m_iVol = Vol; @@ -381,7 +381,7 @@ void CN3SndObj::SetVolume(int Vol) { } float fVol = (float)(Vol) / 100.0f; - long dwVol = (long)(log10(fVol) * 3000); //ú Ҹ.. + long dwVol = (long)(log10(fVol) * 3000); //데시벨 관련 소리조절식.. m_lpDSBuff->SetVolume(dwVol); } @@ -447,7 +447,7 @@ void CN3SndObj::Tick() { this->SetVolume(0); HRESULT hr = m_lpDSBuff->Stop(); } else { - // ۰.... + //볼륨 점점 작게.... int vol = 0; if (m_fFadeOutTime > 0.0f) { vol = (((m_fFadeOutTime - m_fTmpSecPerFrm) / m_fFadeOutTime) * (float)m_iMaxVolume); @@ -472,7 +472,7 @@ void CN3SndObj::Play(const D3DVECTOR * pvPos, float delay, float fFadeInTime, bo m_fTmpSecPerFrm = 0; m_ePlayState = SNDSTATE_DELAY; - if (m_lpDS3DBuff) // 3D ϶ FadeIn ʿ .. ʱ .. + if (m_lpDS3DBuff) // 3D 사운드일때에는 FadeIn 등이 필요 없구.. 볼륨이 먹지 않기 때문에 리턴.. { m_ePlayState = SNDSTATE_PLAY; if (m_lpDSBuff) { diff --git a/src/engine/N3Base/N3SndObj.h b/src/engine/N3Base/N3SndObj.h index 15d61f7f..b9c74788 100644 --- a/src/engine/N3Base/N3SndObj.h +++ b/src/engine/N3Base/N3SndObj.h @@ -28,7 +28,7 @@ class CN3SndObj { float m_fTmpSecPerFrm; public: - std::string m_szFileName; //̸...(ID ). + std::string m_szFileName; //파일이름...(ID 대용). protected: virtual void RealPlay(); @@ -59,7 +59,7 @@ class CN3SndObj { int GetMaxVolume() { return m_iMaxVolume; } void Init(); - void Release(); // īƮ ش.. Ŵ īƮ ʿ .. + void Release(); // 참조 카운트를 리턴 해준다.. 사운드 매니저에서는 이 참조 카운트를 보고 맵에서 지운다.. virtual bool Create(const std::string & szFN, e_SndType eType); bool Duplicate(CN3SndObj * pSrc, e_SndType eType, D3DVECTOR * pPos = NULL); diff --git a/src/engine/N3Base/N3SndObj2D.cpp b/src/engine/N3Base/N3SndObj2D.cpp index c7202f8a..f66c317c 100644 --- a/src/engine/N3Base/N3SndObj2D.cpp +++ b/src/engine/N3Base/N3SndObj2D.cpp @@ -83,7 +83,7 @@ void CN3SndObj2D::SetVolume(int Vol) { float fVol = (float)(Vol) / 100.0f; - long dwVol = (long)(log10(fVol) * 3000); //ú Ҹ.. + long dwVol = (long)(log10(fVol) * 3000); //데시벨 관련 소리조절식.. m_pDSBuff->SetVolume(dwVol); } } @@ -154,7 +154,7 @@ void CN3SndObj2D::Tick() { HRESULT hr = m_pDSBuff->Stop(); } else { - // ۰.... + //볼륨 점점 작게.... if (this->m_iType != SNDTYPE_3D) { int vol = 0; if (m_fFadeOutTime > 0.0f) { diff --git a/src/engine/N3Base/N3SndObj2D.h b/src/engine/N3Base/N3SndObj2D.h index f54abc4e..31bf19be 100644 --- a/src/engine/N3Base/N3SndObj2D.h +++ b/src/engine/N3Base/N3SndObj2D.h @@ -31,7 +31,7 @@ class CN3SndObj2D { public: int m_iID; bool m_bUse; - std::string m_szFileName; //̸...(ID ). + std::string m_szFileName; //파일이름...(ID 대용). protected: virtual void RealPlay(); diff --git a/src/engine/N3Base/N3SndObjStream.cpp b/src/engine/N3Base/N3SndObjStream.cpp index 66d33d7c..0a54163a 100644 --- a/src/engine/N3Base/N3SndObjStream.cpp +++ b/src/engine/N3Base/N3SndObjStream.cpp @@ -1,10 +1,10 @@ ////////////////////////////////////////////////// // Commented By : Lynus -// Commented On 2001-04-12 8:42:02 +// Commented On 2001-04-12 오후 8:42:02 // // CN3SndObjStream class (N3SndObjStream.h) // -// End Of Comment (By Lynus On 2001-04-12 8:42:02 ) +// End Of Comment (By Lynus On 2001-04-12 오후 8:42:02 ) ////////////////////////////////////////////////// #include "StdAfx.h" #include "N3SndObjStream.h" @@ -199,12 +199,12 @@ void CN3SndObjStream::RealPlay() { m_PastTime--; if (m_PastTime < 0) { if (m_bIsLoop == false) { - //tick ΰ.. + //tick에 어케 적용할 것인가.. m_PastTime = m_PlayTime; Stop(); return; } else if (m_bIsLoop == true) { - //tick ΰ.. + //tick에 어케 적용할 것인가.. //Stop(); //m_lpDSBuff->Stop(); Play(); @@ -246,7 +246,7 @@ void CN3SndObjStream::Release() { } // -// ÷̵ǰ streammingŰ.. +// 음악이 플레이되고 있을때 streamming시키기.. // void CN3SndObjStream::Tick() { if (m_ePlayState == SNDSTATE_STOP) { @@ -288,7 +288,7 @@ void CN3SndObjStream::Tick() { HRESULT hr = m_lpDSBuff->Stop(); m_ePlayState = SNDSTATE_STOP; } else { - // ۰.... + //볼륨 점점 작게.... int vol = 0; if (m_fFadeOutTime > 0.0f) { vol = (((m_fFadeOutTime - m_fTmpSecPerFrm) / m_fFadeOutTime) * (float)m_iMaxVolume); @@ -301,7 +301,7 @@ void CN3SndObjStream::Tick() { /* // -// Ȱ. +// 똑같다. // void CN3SndObjStream::Play(float delay, float fFadeInTime) { @@ -314,7 +314,7 @@ void CN3SndObjStream::Play(float delay, float fFadeInTime) // -// Ȱ. +// 똑같다. // void CN3SndObjStream::Stop(float fFadeOutTime) { diff --git a/src/engine/N3Base/N3SndObjStream.h b/src/engine/N3Base/N3SndObjStream.h index 11ba2855..ba3b1553 100644 --- a/src/engine/N3Base/N3SndObjStream.h +++ b/src/engine/N3Base/N3SndObjStream.h @@ -1,10 +1,10 @@ ////////////////////////////////////////////////// // Commented By : Lynus -// Commented On 2001-04-12 5:09:28 +// Commented On 2001-04-12 오후 5:09:28 // // CN3SndObjStream class (SoundObj.h) // -// End Of Comment (By Lynus On 2001-04-12 5:09:28 ) +// End Of Comment (By Lynus On 2001-04-12 오후 5:09:28 ) ////////////////////////////////////////////////// #pragma once @@ -15,17 +15,17 @@ class CN3SndEng; class CN3SndObjStream : public CN3SndObj { private: - int m_PlayTime; //wave ü ÷ Ÿ. + int m_PlayTime; //wave파일의 전체 플레이 타임. int m_FinalByte; DSBUFFERDESC m_dsbd; DWORD m_BufferSize; - DWORD m_BlockSize; //buffer ʴ . + DWORD m_BlockSize; //buffer를 초단위로 나눈 것. - int m_CurrState; // ִ.. - int m_PrevState; // ٷ ־.. - DWORD m_CurrPos; // ۿ ġ - int m_PastTime; //ü ÷ Ÿӿ ð + int m_CurrState; //현재 어느 블럭에 있는지.. + int m_PrevState; //지금 바로 전에 어느 블럭에 있었는지.. + DWORD m_CurrPos; //현재 버퍼에서의 위치 + int m_PastTime; //전체 플레이 타임에서 남은 시간 //related wave data WAVEFORMATEX m_WaveFormat; diff --git a/src/engine/N3Base/N3Star.cpp b/src/engine/N3Base/N3Star.cpp index 63139c31..288fe859 100644 --- a/src/engine/N3Base/N3Star.cpp +++ b/src/engine/N3Base/N3Star.cpp @@ -25,7 +25,7 @@ void CN3Star::Release() { } void CN3Star::Tick() { - // þ پ° ϱ + // 별이 점점 늘어나고 줄어드는것 조정하기 static float fSec = 0.0f; if (0.0f == m_fAddTime) { return; diff --git a/src/engine/N3Base/N3Star.h b/src/engine/N3Base/N3Star.h index 689387d4..d08b66d8 100644 --- a/src/engine/N3Base/N3Star.h +++ b/src/engine/N3Base/N3Star.h @@ -18,10 +18,10 @@ class CN3Star : public CN3Base { int GetNumStar() const { return m_iCurNumStar; } protected: - int m_iCurNumStar; // ִ - int m_iNextNumStar; // - float m_fAddTime; // ϳ ߰ǰų ð - BOOL m_bIncrease; // ΰ ΰ + int m_iCurNumStar; // 현재 떠있는 별의 수 + int m_iNextNumStar; // 앞으로 보일 별 숫자 + float m_fAddTime; // 별 하나가 추가되거나 없어지는 시간 간격 + BOOL m_bIncrease; // 별이 증가할 것인가 감소할 것인가 __VertexXyzColor m_Stars[MAX_STAR]; // Operations diff --git a/src/engine/N3Base/N3Sun.cpp b/src/engine/N3Base/N3Sun.cpp index eb5b5115..f80e7f27 100644 --- a/src/engine/N3Base/N3Sun.cpp +++ b/src/engine/N3Base/N3Sun.cpp @@ -38,7 +38,7 @@ void CN3Sun::Release() { } void CN3Sun::Render(__Matrix44 & matView, __Matrix44 & matProj) { - // ذ ׷ ȭ ǥ ϱ (2D ׸ ְǾ ̴° ) + // 해가 그려지는 화면 좌표 계산하기 (2D로 그리는 이유는 왜곡되어서 보이는것을 막기 위해) __Matrix44 matWorld; matWorld.RotationZ(m_fCurRadian); __Matrix44 matFinal; @@ -92,10 +92,10 @@ void CN3Sun::Render(__Matrix44 & matView, __Matrix44 & matProj) { // clipping with screen. if (rcSun[i].right < rcScreen.left || rcSun[i].bottom < rcScreen.top || rcSun[i].left > rcScreen.right || rcSun[i].top > rcScreen.bottom) { - continue; // ȭ ۿ ׷. + continue; // 화면 밖에 그려진다. } - // 2D ׸ + // 2D로 그리기 pSP->pVertices[0].x = rcSun[i].left; pSP->pVertices[0].y = rcSun[i].top; pSP->pVertices[1].x = rcSun[i].right; @@ -123,7 +123,7 @@ void CN3Sun::Render(__Matrix44 & matView, __Matrix44 & matProj) { } void CN3Sun::Tick() { - // , ũ ȭ + // 해의 색, 크기 변화 계산 for (int i = 0; i < NUM_SUNPART; ++i) { m_Parts[i].Color.Tick(); m_Parts[i].Delta.Tick(); @@ -147,7 +147,7 @@ void CN3Sun::Init(const std::string * pszFNs) { m_Parts[i].pVertices[3].Set(0, 0, fZ, rhw, color, 0.0f, 1.0f); } - m_Parts[SUNPART_SUN].Delta.ChangeDelta(0.1f); // ViewPort ũ + m_Parts[SUNPART_SUN].Delta.ChangeDelta(0.1f); // ViewPort 에서 상대적인 크기 m_Parts[SUNPART_GLOW].Delta.ChangeDelta(0.25f); m_Parts[SUNPART_FLARE].Delta.ChangeDelta(0.13f); } diff --git a/src/engine/N3Base/N3Sun.h b/src/engine/N3Base/N3Sun.h index 6af0ca55..0d215a70 100644 --- a/src/engine/N3Base/N3Sun.h +++ b/src/engine/N3Base/N3Sun.h @@ -27,21 +27,21 @@ class CN3Sun : public CN3Base { CN3Texture * pTex; // texture __VertexTransformed pVertices[4]; // vertex - CN3ColorChange Color; // ϴ Ŭ + CN3ColorChange Color; // 색을 담당하는 클래스 CN3DeltaChange Delta; }; __SunPart m_Parts[NUM_SUNPART]; - float m_fCurRadian; // ȸġ + float m_fCurRadian; // 현재 해의 회전위치 // Operations public: - void SetCurAngle(float fAngle) { m_fCurRadian = D3DXToRadian(fAngle); } // + void SetCurAngle(float fAngle) { m_fCurRadian = D3DXToRadian(fAngle); } // 현재 각도설정 void Init(const std::string * pszFNs); - // By : Ecli666 ( On 2002-04-04 10:55:52 ) + // By : Ecli666 ( On 2002-04-04 오전 10:55:52 ) // float GetCurAngle() { return D3DXToDegree(m_fCurRadian); } - // ~(By Ecli666 On 2002-04-04 10:55:52 ) + // ~(By Ecli666 On 2002-04-04 오전 10:55:52 ) void Release(); void Render(__Matrix44 & matView, __Matrix44 & matProj); diff --git a/src/engine/N3Base/N3TableBase.h b/src/engine/N3Base/N3TableBase.h index 36baf12e..336e1248 100644 --- a/src/engine/N3Base/N3TableBase.h +++ b/src/engine/N3Base/N3TableBase.h @@ -36,23 +36,23 @@ template class CN3TableBase { typedef typename std::map::value_type val_Table; typedef std::pair pair_Table; - std::vector m_DataTypes; // Ǵ Ÿ Ÿ - std::map m_Datas; // Ǵ + std::vector m_DataTypes; // 실제 사용되는 정보의 데이타 타입 + std::map m_Datas; // 실제 사용되는 정보 // Operations public: void Release(); - Type * Find(unsigned int dwID) // ID data ã + Type * Find(unsigned int dwID) // ID로 data 찾기 { it_Table it = m_Datas.find(dwID); if (it == m_Datas.end()) { - return NULL; // ã⿡ ߴ!~!! + return NULL; // 찾기에 실패 했다!~!! } else { return &(it->second); } } int GetSize() { return m_Datas.size(); } - Type * GetIndexedData(int index) //index ã.. + Type * GetIndexedData(int index) //index로 찾기.. { if (index < 0 || m_Datas.empty()) { return NULL; @@ -67,11 +67,11 @@ template class CN3TableBase { } return &(it->second); } - int IDToIndex(unsigned int dwID) // ش ID Index .. Skill .. + int IDToIndex(unsigned int dwID) // 해당 ID의 Index 리턴.. Skill에서 쓴다.. { it_Table it = m_Datas.find(dwID); if (it == m_Datas.end()) { - return -1; // ã⿡ ߴ!~!! + return -1; // 찾기에 실패 했다!~!! } it_Table itSkill = m_Datas.begin(); @@ -95,7 +95,7 @@ template class CN3TableBase { BOOL MakeOffsetTable(std::vector & offsets); }; -// cppϿ ϱ link . ׷? +// cpp파일에 있으니까 link에러가 난다. 왜 그럴까? template CN3TableBase::CN3TableBase() {} @@ -104,11 +104,11 @@ template CN3TableBase::~CN3TableBase() { } template void CN3TableBase::Release() { - m_DataTypes.clear(); // data type Ѱ - m_Datas.clear(); // row Ÿ + m_DataTypes.clear(); // data type 저장한것 지우기 + m_Datas.clear(); // row 데이타 지우기 } -// Ͽ Ÿ ŸԺ .. +// 파일에 데이타 타입별로 쓰기.. template BOOL CN3TableBase::WriteData(HANDLE hFile, DATA_TYPE DataType, const char * lpszData) { DWORD dwNum; switch (DataType) { @@ -117,11 +117,11 @@ template BOOL CN3TableBase::WriteData(HANDLE hFile, DATA_TYPE if (isdigit(lpszData[0])) { int iTemp = atoi(lpszData); if (iTemp < -127 || iTemp > 128) { - return FALSE; // ~ + return FALSE; // 범위가 벗어났어~ } cWrite = (char)iTemp; } else { - return FALSE; // ڴ ȵ~! + return FALSE; // 문자는 안되~! } WriteFile(hFile, &cWrite, sizeof(cWrite), &dwNum, NULL); @@ -131,11 +131,11 @@ template BOOL CN3TableBase::WriteData(HANDLE hFile, DATA_TYPE if (isdigit(lpszData[0])) { int iTemp = atoi(lpszData); if (iTemp < 0 || iTemp > 255) { - return FALSE; // ~ + return FALSE; // 범위가 벗어났어~ } byteWrite = (BYTE)iTemp; } else { - return FALSE; // ڴ ȵ~! + return FALSE; // 문자는 안되~! } WriteFile(hFile, &byteWrite, sizeof(byteWrite), &dwNum, NULL); @@ -145,11 +145,11 @@ template BOOL CN3TableBase::WriteData(HANDLE hFile, DATA_TYPE if (isdigit(lpszData[0]) || '-' == lpszData[0]) { int iTemp = atoi(lpszData); if (iTemp < -32767 || iTemp > 32768) { - return FALSE; // ~ + return FALSE; // 범위가 벗어났어~ } iWrite = (short)iTemp; } else { - return FALSE; // ڴ ȵ~! + return FALSE; // 문자는 안되~! } WriteFile(hFile, &iWrite, sizeof(iWrite), &dwNum, NULL); @@ -159,11 +159,11 @@ template BOOL CN3TableBase::WriteData(HANDLE hFile, DATA_TYPE if (isdigit(lpszData[0])) { int iTemp = atoi(lpszData); if (iTemp < 0 || iTemp > 65535) { - return FALSE; // ~ + return FALSE; // 범위가 벗어났어~ } iWrite = (short)iTemp; } else { - return FALSE; // ڴ ȵ~! + return FALSE; // 문자는 안되~! } WriteFile(hFile, &iWrite, sizeof(iWrite), &dwNum, NULL); @@ -173,7 +173,7 @@ template BOOL CN3TableBase::WriteData(HANDLE hFile, DATA_TYPE if (isdigit(lpszData[0]) || '-' == lpszData[0]) { iWrite = atoi(lpszData); } else { - return FALSE; // ڴ ȵ~! + return FALSE; // 문자는 안되~! } WriteFile(hFile, &iWrite, sizeof(iWrite), &dwNum, NULL); @@ -183,7 +183,7 @@ template BOOL CN3TableBase::WriteData(HANDLE hFile, DATA_TYPE if (isdigit(lpszData[0])) { iWrite = strtoul(lpszData, NULL, 10); } else { - return FALSE; // ڴ ȵ~! + return FALSE; // 문자는 안되~! } WriteFile(hFile, &iWrite, sizeof(iWrite), &dwNum, NULL); @@ -201,7 +201,7 @@ template BOOL CN3TableBase::WriteData(HANDLE hFile, DATA_TYPE if (isdigit(lpszData[0]) || '-' == lpszData[0] || '.' == lpszData[0]) { fWrite = (float)atof(lpszData); } else { - return FALSE; // ڴ ȵ~! + return FALSE; // 문자는 안되~! } WriteFile(hFile, &fWrite, sizeof(fWrite), &dwNum, NULL); } break; @@ -282,23 +282,23 @@ template BOOL CN3TableBase::LoadFromFile(const std::string & return FALSE; } - // ȣȭ Ǯ.. .. ӽ Ͽ .. + // 파일 암호화 풀기.. .. 임시 파일에다 쓴다음 .. std::string szFNTmp = szFN + ".tmp"; DWORD dwSizeHigh = 0; DWORD dwSizeLow = ::GetFileSize(hFile, &dwSizeHigh); if (dwSizeLow <= 0) { CloseHandle(hFile); - ::remove(szFNTmp.c_str()); // ӽ .. + ::remove(szFNTmp.c_str()); // 임시 파일 지우기.. return FALSE; } - // а.. + // 원래 파일을 읽고.. BYTE * pDatas = new BYTE[dwSizeLow]; DWORD dwRWC = 0; - ::ReadFile(hFile, pDatas, dwSizeLow, &dwRWC, NULL); // ȣȭ а.. - CloseHandle(hFile); // ݰ + ::ReadFile(hFile, pDatas, dwSizeLow, &dwRWC, NULL); // 암호화된 데이터 읽고.. + CloseHandle(hFile); // 원래 파일 닫고 - // ̺ Ű Ű.. + // 테이블 만드는 툴에서 쓰는 키와 같은 키.. WORD key_r = 0x0816; WORD key_c1 = 0x6081; WORD key_c2 = 0x1608; @@ -319,22 +319,22 @@ template BOOL CN3TableBase::LoadFromFile(const std::string & // return plain; //} - // ȣȭ Ǯ.. + // 암호화 풀고.. for (int i = 0; i < dwSizeLow; i++) { BYTE byData = (pDatas[i] ^ (key_r >> 8)); key_r = (pDatas[i] + key_r) * key_c1 + key_c2; pDatas[i] = byData; } - // ӽ Ͽ .. ٽ .. + // 임시 파일에 쓴다음.. 다시 연다.. hFile = ::CreateFile(szFNTmp.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - ::WriteFile(hFile, pDatas, dwSizeLow, &dwRWC, NULL); // ӽϿ ȣȭ Ǯ - CloseHandle(hFile); // ӽ ݱ + ::WriteFile(hFile, pDatas, dwSizeLow, &dwRWC, NULL); // 임시파일에 암호화 풀린 데이터 쓰기 + CloseHandle(hFile); // 임시 파일 닫기 delete[] pDatas; pDatas = NULL; hFile = ::CreateFile(szFNTmp.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, - NULL); // ӽ б . + NULL); // 임시 파일 읽기 모드로 열기. BOOL bResult = Load(hFile); @@ -346,7 +346,7 @@ template BOOL CN3TableBase::LoadFromFile(const std::string & #endif } - // ӽ .. + // 임시 파일 지우기.. ::remove(szFNTmp.c_str()); return bResult; @@ -355,27 +355,27 @@ template BOOL CN3TableBase::LoadFromFile(const std::string & template BOOL CN3TableBase::Load(HANDLE hFile) { Release(); - // data(column)  Ǿ ִ б + // data(column) 의 구조가 어떻게 되어 있는지 읽기 DWORD dwNum; int iDataTypeCount = 0; - ReadFile(hFile, &iDataTypeCount, 4, &dwNum, NULL); // ( column ) + ReadFile(hFile, &iDataTypeCount, 4, &dwNum, NULL); // (엑셀에서 column 수) std::vector offsets; - __ASSERT(iDataTypeCount > 0, "Data Type 0 Դϴ."); + __ASSERT(iDataTypeCount > 0, "Data Type 이 0 이하입니다."); if (iDataTypeCount > 0) { m_DataTypes.insert(m_DataTypes.begin(), iDataTypeCount, DT_NONE); ReadFile(hFile, &(m_DataTypes[0]), sizeof(DATA_TYPE) * iDataTypeCount, &dwNum, - NULL); // column شϴ data type + NULL); // 각각의 column에 해당하는 data type if (FALSE == MakeOffsetTable(offsets)) { __ASSERT(0, "can't make offset table"); - return FALSE; // structure offset table ֱ + return FALSE; // structure변수에 대한 offset table 만들어주기 } int iSize = offsets - [iDataTypeCount]; // MakeOffstTable Լ ϵǴ m_iDataTypeCount° Լ  ִ. - if (sizeof(Type) != iSize || // ü type ũ ü ũ ٸų - DT_DWORD != m_DataTypes[0]) // ó Ÿ DT_DWORD ƴҶ(ó ID̹Ƿ) + [iDataTypeCount]; // MakeOffstTable 함수에서 리턴되는 값중 m_iDataTypeCount번째에 이 함수의 실제 사이즈가 들어있다. + if (sizeof(Type) != iSize || // 전체 type의 크기와 실제 구조체의 크기와 다르거나 + DT_DWORD != m_DataTypes[0]) // 맨 처음의 데이타가 DT_DWORD형이 아닐때(맨처음은 고유한 ID이므로) { m_DataTypes.clear(); __ASSERT(0, "DataType is mismatch or DataSize is incorrect!!"); @@ -383,7 +383,7 @@ template BOOL CN3TableBase::Load(HANDLE hFile) { } } - // row б + // row 가 몇줄인지 읽기 int iRC; ReadFile(hFile, &iRC, sizeof(iRC), &dwNum, NULL); Type Data; @@ -395,7 +395,7 @@ template BOOL CN3TableBase::Load(HANDLE hFile) { unsigned int dwKey = *((unsigned int *)(&Data)); pair_Table pt = m_Datas.insert(val_Table(dwKey, Data)); - __ASSERT(pt.second, "CN3TableBase : Key ߺ ."); + __ASSERT(pt.second, "CN3TableBase : Key 중복 경고."); } return TRUE; } @@ -425,8 +425,8 @@ template int CN3TableBase::SizeOf(DATA_TYPE DataType) const { return 0; } -// structure 4Ʈ Ͽ ޸𸮸 ´. Ʒ Լ ʿϴ. -// Ʒ Լ OffsetTable Ŀ ϰ delete [] ־ Ѵ. +// structure는 4바이트 정렬하여서 메모리를 잡는다. 따라서 아래 함수가 필요하다. +// 아래 함수로 OffsetTable을 만들어 쓴 후에는 만드시 리턴값을 delete [] 를 해주어야 한다. template BOOL CN3TableBase::MakeOffsetTable(std::vector & offsets) { if (m_DataTypes.empty()) { return false; @@ -434,27 +434,27 @@ template BOOL CN3TableBase::MakeOffsetTable(std::vector int iDataTypeCount = m_DataTypes.size(); offsets.clear(); - offsets.resize(iDataTypeCount + 1); // +1 Type  ֱ ؼ + offsets.resize(iDataTypeCount + 1); // +1을 한 이유는 맨 마지막 값에 Type의 실제 사이즈를 넣기 위해서 offsets[0] = 0; int iPrevDataSize = SizeOf(m_DataTypes[0]); for (int i = 1; i < iDataTypeCount; ++i) { int iCurDataSize = SizeOf(m_DataTypes[i]); - if (1 == iCurDataSize % 4) // Ͱ 1Ʈ ׳ Ͱ Ʈ . + if (1 == iCurDataSize % 4) // 현재 데이터가 1바이트면 그냥 이전 데이터가 몇바이트든 상관 없다. { offsets[i] = offsets[i - 1] + iPrevDataSize; - } else if (2 == iCurDataSize % 4) // Ͱ 2Ʈ ¦ ġؾ Ѵ. + } else if (2 == iCurDataSize % 4) // 현재 데이터가 2바이트면 짝수번지에 위치해야 한다. { if (0 == ((offsets[i - 1] + iPrevDataSize) % 2)) { offsets[i] = offsets[i - 1] + iPrevDataSize; } else { offsets[i] = offsets[i - 1] + iPrevDataSize + 1; } - } else if (0 == iCurDataSize % 4) // Ͱ 4Ʈ 4 ġؾ Ѵ. + } else if (0 == iCurDataSize % 4) // 현재 데이터가 4바이트면 4의 배수번지에 위치해야 한다. { if (0 == ((offsets[i - 1] + iPrevDataSize) % 4)) { offsets[i] = offsets[i - 1] + iPrevDataSize; } else { - offsets[i] = ((int)(offsets[i - 1] + iPrevDataSize + 3) / 4) * 4; // 4 + offsets[i] = ((int)(offsets[i - 1] + iPrevDataSize + 3) / 4) * 4; // 4의 배수로 만들기 } } else { __ASSERT(0, ""); @@ -462,8 +462,8 @@ template BOOL CN3TableBase::MakeOffsetTable(std::vector iPrevDataSize = iCurDataSize; } - // Type  . - offsets[iDataTypeCount] = ((int)(offsets[iDataTypeCount - 1] + iPrevDataSize + 3) / 4) * 4; // 4 + // 맨 마지막 값에 Type의 실제 사이즈를 넣자. + offsets[iDataTypeCount] = ((int)(offsets[iDataTypeCount - 1] + iPrevDataSize + 3) / 4) * 4; // 4의 배수로 만들기 return true; } diff --git a/src/engine/N3Base/N3Texture.cpp b/src/engine/N3Base/N3Texture.cpp index d4c43805..9bdca056 100644 --- a/src/engine/N3Base/N3Texture.cpp +++ b/src/engine/N3Base/N3Texture.cpp @@ -65,7 +65,7 @@ bool CN3Texture::Create(int nWidth, int nHeight, D3DFORMAT Format, BOOL bGenerat this->Release(); } - if (s_dwTextureCaps & TEX_CAPS_POW2) // 2 ¼ ȴٸ.. + if (s_dwTextureCaps & TEX_CAPS_POW2) // 2 의 승수만 된다면.. { int nW = 1, nH = 1; for (; nW <= nWidth; nW *= 2) { @@ -81,7 +81,7 @@ bool CN3Texture::Create(int nWidth, int nHeight, D3DFORMAT Format, BOOL bGenerat nHeight = nH; } - if ((s_dwTextureCaps & TEX_CAPS_SQUAREONLY) && nWidth != nHeight) // 簢 ؽó Ǹ.. + if ((s_dwTextureCaps & TEX_CAPS_SQUAREONLY) && nWidth != nHeight) // 정사각형 텍스처만 되면.. { if (nWidth > nHeight) { nWidth = nHeight; @@ -90,7 +90,7 @@ bool CN3Texture::Create(int nWidth, int nHeight, D3DFORMAT Format, BOOL bGenerat } } - // ī尡 256 ̻ ؽó ϸ.. + // 비디오 카드가 256 이상의 텍스처를 지원 하지 못하면.. if (nWidth > 256 && CN3Base::s_DevCaps.MaxTextureWidth <= 256) { nWidth = CN3Base::s_DevCaps.MaxTextureWidth; } @@ -98,11 +98,11 @@ bool CN3Texture::Create(int nWidth, int nHeight, D3DFORMAT Format, BOOL bGenerat nHeight = CN3Base::s_DevCaps.MaxTextureHeight; } - // .. + // 헤더 세팅.. memset(&m_Header, 0, sizeof(m_Header)); - // MipMap ܰ .. - // 4 X 4 ȼ MipMap .. + // MipMap 단계 결정.. + // 4 X 4 픽셀까지만 MipMap 을 만든다.. int nMMC = 1; if (bGenerateMipMap) { nMMC = 0; @@ -181,10 +181,10 @@ bool CN3Texture::LoadFromFile(const std::string & szFileName) { this->Release(); } - this->FileNameSet(szFileName); // ̸ ϰ.. + this->FileNameSet(szFileName); // 파일 이름을 복사하고.. std::string szFullPath; if (-1 != m_szFileName.find(':') || -1 != m_szFileName.find("\\\\") || - -1 != m_szFileName.find("//")) // ڿ ':', '\\', '//' ü ̴.. + -1 != m_szFileName.find("//")) // 문자열에 ':', '\\', '//' 이 들어 있으면 전체 경로이다.. { szFullPath = m_szFileName; } else { @@ -254,8 +254,8 @@ bool CN3Texture::Load(HANDLE hFile) { DWORD dwRWC = 0; - __DXT_HEADER HeaderOrg; // .. - ReadFile(hFile, &HeaderOrg, sizeof(HeaderOrg), &dwRWC, NULL); // д´.. + __DXT_HEADER HeaderOrg; // 헤더를 저장해 놓고.. + ReadFile(hFile, &HeaderOrg, sizeof(HeaderOrg), &dwRWC, NULL); // 헤더를 읽는다.. if ('N' != HeaderOrg.szID[0] || 'T' != HeaderOrg.szID[1] || 'F' != HeaderOrg.szID[2] || 3 != HeaderOrg.szID[3]) // "NTF"3 - Noah Texture File Ver. 3.0 { @@ -264,7 +264,7 @@ bool CN3Texture::Load(HANDLE hFile) { #endif } - // DXT Format о ϴµ Ǵ ȵǴ ȵǸ ü Ѵ. + // DXT Format 을 읽어야 하는데 지원이 되는지 안되는지 보고 지원안되면 대체 포맷을 정한다. bool bDXTSupport = FALSE; D3DFORMAT fmtNew = HeaderOrg.Format; if (D3DFMT_DXT1 == HeaderOrg.Format) { @@ -303,19 +303,19 @@ bool CN3Texture::Load(HANDLE hFile) { if (fmtNew != HeaderOrg.Format) { iWCreate /= 2; iHCreate /= 2; - } // DXT ȵǸ ʺ ̸ δ. - if (m_iLOD > 0 && m_iLOD <= 2 && HeaderOrg.nWidth >= 16 && HeaderOrg.nHeight >= 16) // LOD ŭ ۰ .. + } // DXT 지원이 안되면 너비 높이를 줄인다. + if (m_iLOD > 0 && m_iLOD <= 2 && HeaderOrg.nWidth >= 16 && HeaderOrg.nHeight >= 16) // LOD 만큼 작게 생성.. { for (int i = 0; i < m_iLOD; i++) { iWCreate /= 2; iHCreate /= 2; } } else { - m_iLOD = 0; // LOD ƴϸ.. + m_iLOD = 0; // LOD 적용이 아니면.. } int iLODPrev = m_iLOD; - this->Create(iWCreate, iHCreate, fmtNew, HeaderOrg.bMipMap); // ǽ .. + this->Create(iWCreate, iHCreate, fmtNew, HeaderOrg.bMipMap); // 서피스 만들고.. m_iLOD = iLODPrev; if (m_lpTexture == NULL) { @@ -327,25 +327,25 @@ bool CN3Texture::Load(HANDLE hFile) { D3DSURFACE_DESC sd; D3DLOCKED_RECT LR; - int iMMC = m_lpTexture->GetLevelCount(); // MipMap + int iMMC = m_lpTexture->GetLevelCount(); // 생성한 MipMap 수 - // ̸.. + // 압축 포맷이면.. if (D3DFMT_DXT1 == HeaderOrg.Format || D3DFMT_DXT2 == HeaderOrg.Format || D3DFMT_DXT3 == HeaderOrg.Format || D3DFMT_DXT4 == HeaderOrg.Format || D3DFMT_DXT5 == HeaderOrg.Format) { - if (TRUE == bDXTSupport) // ؽó ̸.. + if (TRUE == bDXTSupport) // 압축 텍스처 지원이면.. { if (iMMC > 1) { - if (m_iLOD > 0) // LOD ŭ dzʶٱ... + if (m_iLOD > 0) // LOD 만큼 건너뛰기... { int iWTmp = HeaderOrg.nWidth, iHTmp = HeaderOrg.nHeight, iSkipSize = 0; for (int i = 0; i < m_iLOD; i++, iWTmp /= 2, iHTmp /= 2) { if (D3DFMT_DXT1 == HeaderOrg.Format) { - iSkipSize += iWTmp * iHTmp / 2; // DXT1 16Ʈ ˿ 1/4 .. + iSkipSize += iWTmp * iHTmp / 2; // DXT1 형식은 16비트 포맷에 비해 1/4 로 압축.. } else { - iSkipSize += iWTmp * iHTmp; // DXT2 ~ DXT5 16Ʈ ˿ 1/2 .. + iSkipSize += iWTmp * iHTmp; // DXT2 ~ DXT5 형식은 16비트 포맷에 비해 1/2 로 압축.. } } - ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // dzʶٰ. + ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // 건너뛰고. } for (int i = 0; i < iMMC; i++) { @@ -354,16 +354,16 @@ bool CN3Texture::Load(HANDLE hFile) { int iTexBytesLength = 0; iTexBytesLength = sd.Format == D3DFMT_DXT1 ? (sd.Width * sd.Height / 2) : (sd.Width * sd.Height); - ReadFile(hFile, (BYTE *)LR.pBits, iTexBytesLength, &dwRWC, NULL); // Ϸķ ͸ .. + ReadFile(hFile, (BYTE *)LR.pBits, iTexBytesLength, &dwRWC, NULL); // 일렬로 된 데이터를 쓰고.. m_lpTexture->UnlockRect(i); } - // ؽó ȵǴ ī带 dzʶٱ.. + // 텍스처 압축안되는 비디오 카드를 위한 여분의 데이터 건너뛰기.. int iWTmp = HeaderOrg.nWidth / 2, iHTmp = HeaderOrg.nHeight / 2; for (; iWTmp >= 4 && iHTmp >= 4; iWTmp /= 2, - iHTmp /= 2) { // ȼ ιƮ  A1R5G5B5 Ȥ A4R4G4B4 Ǿ ִ.. - ::SetFilePointer(hFile, iWTmp * iHTmp * 2, 0, FILE_CURRENT); // dzʶٰ. + iHTmp /= 2) { // 한픽셀에 두바이트가 들어가는 A1R5G5B5 혹은 A4R4G4B4 포맷으로 되어 있다.. + ::SetFilePointer(hFile, iWTmp * iHTmp * 2, 0, FILE_CURRENT); // 건너뛰고. } } else // pair of if(iMMC > 1) { @@ -372,48 +372,48 @@ bool CN3Texture::Load(HANDLE hFile) { int iTexBytesLength = 0; iTexBytesLength = sd.Format == D3DFMT_DXT1 ? (sd.Width * sd.Height / 2) : (sd.Width * sd.Height); - ReadFile(hFile, (BYTE *)LR.pBits, iTexBytesLength, &dwRWC, NULL); // Ϸķ ͸ .. + ReadFile(hFile, (BYTE *)LR.pBits, iTexBytesLength, &dwRWC, NULL); // 일렬로 된 데이터를 쓰고.. m_lpTexture->UnlockRect(0); - // ؽó ȵǴ ī带 dzʶٱ.. - ::SetFilePointer(hFile, HeaderOrg.nWidth * HeaderOrg.nHeight / 4, 0, FILE_CURRENT); // dzʶٰ. + // 텍스처 압축안되는 비디오 카드를 위한 여분의 데이터 건너뛰기.. + ::SetFilePointer(hFile, HeaderOrg.nWidth * HeaderOrg.nHeight / 4, 0, FILE_CURRENT); // 건너뛰고. if (HeaderOrg.nWidth >= 1024) { SetFilePointer(hFile, 256 * 256 * 2, 0, - FILE_CURRENT); //  512 Ŭ εο dzʶٱ.. + FILE_CURRENT); // 사이즈가 512 보다 클경우 부두용 데이터 건너뛰기.. } } - } else // DXT ȵǸ.. + } else // DXT 지원이 안되면.. { - if (iMMC > 1) // LOD ŭ dzʶٱ... + if (iMMC > 1) // LOD 만큼 건너뛰기... { - // dzʶٱ.. + // 압축 데이터 건너뛰기.. int iWTmp = HeaderOrg.nWidth, iHTmp = HeaderOrg.nHeight, iSkipSize = 0; for (; iWTmp >= 4 && iHTmp >= 4; iWTmp /= 2, iHTmp /= 2) { if (D3DFMT_DXT1 == HeaderOrg.Format) { - iSkipSize += iWTmp * iHTmp / 2; // DXT1 16Ʈ ˿ 1/4 .. + iSkipSize += iWTmp * iHTmp / 2; // DXT1 형식은 16비트 포맷에 비해 1/4 로 압축.. } else { - iSkipSize += iWTmp * iHTmp; // DXT2 ~ DXT5 16Ʈ ˿ 1/2 .. + iSkipSize += iWTmp * iHTmp; // DXT2 ~ DXT5 형식은 16비트 포맷에 비해 1/2 로 압축.. } } - ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // dzʶٰ. + ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // 건너뛰고. - // LOD ŭ dzʶٱ.. + // LOD 만큼 건너뛰기.. iWTmp = HeaderOrg.nWidth / 2; iHTmp = HeaderOrg.nHeight / 2; iSkipSize = 0; if (m_iLOD > 0) { for (int i = 0; i < m_iLOD; i++, iWTmp /= 2, iHTmp /= 2) { - iSkipSize += iWTmp * iHTmp * 2; // ġ ʺ ȼ ũ Ѵ... + iSkipSize += iWTmp * iHTmp * 2; // 피치에 너비를 나눈게 픽셀의 크기라 생각한다... } } - // ī ؽó ũⰡ dzʶٱ.. + // 비디오 카드 지원 텍스처 크기가 작을경우 건너뛰기.. for (; iWTmp > s_DevCaps.MaxTextureWidth || iHTmp > s_DevCaps.MaxTextureHeight; iWTmp /= 2, iHTmp /= 2) { iSkipSize += iWTmp * iHTmp * 2; } if (iSkipSize) { - ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // dzʶٰ. + ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // 건너뛰고. } for (int i = 0; i < iMMC; i++) { @@ -427,12 +427,12 @@ bool CN3Texture::Load(HANDLE hFile) { } } else // pair of if(iMMC > 1) { - // dzʶٱ.. + // 압축 데이터 건너뛰기.. int iWTmp = HeaderOrg.nWidth, iHTmp = HeaderOrg.nHeight, iSkipSize = 0; if (D3DFMT_DXT1 == HeaderOrg.Format) { - iSkipSize = iWTmp * iHTmp / 2; // DXT1 16Ʈ ˿ 1/4 .. + iSkipSize = iWTmp * iHTmp / 2; // DXT1 형식은 16비트 포맷에 비해 1/4 로 압축.. } else { - iSkipSize = iWTmp * iHTmp; // DXT2 ~ DXT5 16Ʈ ˿ 1/2 .. + iSkipSize = iWTmp * iHTmp; // DXT2 ~ DXT5 형식은 16비트 포맷에 비해 1/2 로 압축.. } } } @@ -449,25 +449,25 @@ bool CN3Texture::Load(HANDLE hFile) { } if (iMMC > 1) { - if (m_iLOD > 0) // LOD ŭ dzʶٱ... + if (m_iLOD > 0) // LOD 만큼 건너뛰기... { int iWTmp = HeaderOrg.nWidth, iHTmp = HeaderOrg.nHeight, iSkipSize = 0; for (int i = 0; i < m_iLOD; i++, iWTmp /= 2, iHTmp /= 2) { - iSkipSize += iWTmp * iHTmp * iPixelSize; // ġ ʺ ȼ ũ Ѵ... + iSkipSize += iWTmp * iHTmp * iPixelSize; // 피치에 너비를 나눈게 픽셀의 크기라 생각한다... } - ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // dzʶٰ. + ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // 건너뛰고. } - // ī ؽó ũⰡ dzʶٱ.. + // 비디오 카드 지원 텍스처 크기가 작을경우 건너뛰기.. int iWTmp = HeaderOrg.nWidth, iHTmp = HeaderOrg.nHeight, iSkipSize = 0; for (; iWTmp > s_DevCaps.MaxTextureWidth || iHTmp > s_DevCaps.MaxTextureHeight; iWTmp /= 2, iHTmp /= 2) { iSkipSize += iWTmp * iHTmp * iPixelSize; } if (iSkipSize) { - ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // dzʶٰ. + ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // 건너뛰고. } - // б.. + // 데이터 읽기.. for (int i = 0; i < iMMC; i++) { m_lpTexture->GetLevelDesc(i, &sd); m_lpTexture->LockRect(i, &LR, NULL, NULL); @@ -478,10 +478,10 @@ bool CN3Texture::Load(HANDLE hFile) { } } else // pair of if(iMMC > 1) { - // ī ؽó ũⰡ dzʶٱ.. + // 비디오 카드 지원 텍스처 크기가 작을경우 건너뛰기.. if (HeaderOrg.nWidth >= 512 && m_Header.nWidth <= 256) { ::SetFilePointer(hFile, HeaderOrg.nWidth * HeaderOrg.nHeight * iPixelSize, 0, - FILE_CURRENT); // dzʶٰ. + FILE_CURRENT); // 건너뛰고. } m_lpTexture->GetLevelDesc(0, &sd); @@ -493,20 +493,20 @@ bool CN3Texture::Load(HANDLE hFile) { if (m_Header.nWidth >= 512 && m_Header.nHeight >= 512) { SetFilePointer(hFile, 256 * 256 * 2, 0, - FILE_CURRENT); //  512 Ŭ εο dzʶٱ.. + FILE_CURRENT); // 사이즈가 512 보다 클경우 부두용 데이터 건너뛰기.. } } } - // this->GenerateMipMap(); // Mip Map .. + // this->GenerateMipMap(); // Mip Map 을 만든다.. return true; } bool CN3Texture::SkipFileHandle(HANDLE hFile) { CN3BaseFileAccess::Load(hFile); - __DXT_HEADER HeaderOrg; // .. + __DXT_HEADER HeaderOrg; // 헤더를 저장해 놓고.. DWORD dwRWC = 0; - ReadFile(hFile, &HeaderOrg, sizeof(HeaderOrg), &dwRWC, NULL); // д´.. + ReadFile(hFile, &HeaderOrg, sizeof(HeaderOrg), &dwRWC, NULL); // 헤더를 읽는다.. if ('N' != HeaderOrg.szID[0] || 'T' != HeaderOrg.szID[1] || 'F' != HeaderOrg.szID[2] || 3 != HeaderOrg.szID[3]) // "NTF"3 - Noah Texture File Ver. 3.0 { @@ -515,12 +515,12 @@ bool CN3Texture::SkipFileHandle(HANDLE hFile) { #endif } - // ̸.. + // 압축 포맷이면.. if (D3DFMT_DXT1 == HeaderOrg.Format || D3DFMT_DXT2 == HeaderOrg.Format || D3DFMT_DXT3 == HeaderOrg.Format || D3DFMT_DXT4 == HeaderOrg.Format || D3DFMT_DXT5 == HeaderOrg.Format) { int iWTmp = HeaderOrg.nWidth, iHTmp = HeaderOrg.nHeight, iSkipSize = 0; if (HeaderOrg.bMipMap) { - // dzʶٱ.. + // 압축 데이터 건너뛰기.. for (; iWTmp >= 4 && iHTmp >= 4; iWTmp /= 2, iHTmp /= 2) { if (D3DFMT_DXT1 == HeaderOrg.Format) { iSkipSize += iWTmp * iHTmp / 2; @@ -528,30 +528,30 @@ bool CN3Texture::SkipFileHandle(HANDLE hFile) { iSkipSize += iWTmp * iHTmp; } } - // ؽó ȵǴ ī带 dzʶٱ.. + // 텍스처 압축안되는 비디오 카드를 위한 여분의 데이터 건너뛰기.. iWTmp = HeaderOrg.nWidth / 2; iHTmp = HeaderOrg.nHeight / 2; for (; iWTmp >= 4 && iHTmp >= 4; - iWTmp /= 2, iHTmp /= 2) { // ȼ ιƮ  A1R5G5B5 Ȥ A4R4G4B4 Ǿ ִ.. - iSkipSize += iWTmp * iHTmp * 2; // dzʶٰ. + iWTmp /= 2, iHTmp /= 2) { // 한픽셀에 두바이트가 들어가는 A1R5G5B5 혹은 A4R4G4B4 포맷으로 되어 있다.. + iSkipSize += iWTmp * iHTmp * 2; // 건너뛰고. } } else // pair of if(HeaderOrg.bMipMap) { - // dzʶٱ.. + // 압축 데이터 건너뛰기.. if (D3DFMT_DXT1 == HeaderOrg.Format) { iSkipSize += HeaderOrg.nWidth * HeaderOrg.nHeight / 2; } else { iSkipSize += iSkipSize += HeaderOrg.nWidth * HeaderOrg.nHeight; } - // ؽó ȵǴ ī带 dzʶٱ.. + // 텍스처 압축안되는 비디오 카드를 위한 여분의 데이터 건너뛰기.. iSkipSize += HeaderOrg.nWidth * HeaderOrg.nHeight * 2; if (HeaderOrg.nWidth >= 1024) { - iSkipSize += 256 * 256 * 2; //  1024 Ŭ εο dzʶٱ.. + iSkipSize += 256 * 256 * 2; // 사이즈가 1024 보다 클경우 부두용 데이터 건너뛰기.. } } - ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // dzʶٰ. + ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // 건너뛰고. } else { int iPixelSize = 0; if (HeaderOrg.Format == D3DFMT_A1R5G5B5 || HeaderOrg.Format == D3DFMT_A4R4G4B4) { @@ -572,11 +572,11 @@ bool CN3Texture::SkipFileHandle(HANDLE hFile) { } else { iSkipSize += iWTmp * iHTmp * iPixelSize; if (HeaderOrg.nWidth >= 512) { - iSkipSize += 256 * 256 * 2; //  512 Ŭ εο dzʶٱ.. + iSkipSize += 256 * 256 * 2; // 사이즈가 512 보다 클경우 부두용 데이터 건너뛰기.. } } - ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // dzʶٰ. + ::SetFilePointer(hFile, iSkipSize, 0, FILE_CURRENT); // 건너뛰고. } return true; } @@ -615,7 +615,7 @@ bool CN3Texture::Save(HANDLE hFile) { int nMMC = m_lpTexture->GetLevelCount(); (nMMC > 1) ? m_Header.bMipMap = TRUE : m_Header.bMipMap = FALSE; - if (TRUE == m_Header.bMipMap) // MipMap ´ Ȯ.. + if (TRUE == m_Header.bMipMap) // MipMap 갯수가 맞는지 확인.. { int nMMC2 = 0; for (int nW = sd.Width, nH = sd.Height; nW >= 4 && nH >= 4; nW /= 2, nH /= 2) { @@ -640,7 +640,7 @@ bool CN3Texture::Save(HANDLE hFile) { m_Header.nHeight = sd.Height; m_Header.bMipMap = (nMMC > 1) ? TRUE : FALSE; - WriteFile(hFile, &m_Header, sizeof(m_Header), &dwRWC, NULL); // + WriteFile(hFile, &m_Header, sizeof(m_Header), &dwRWC, NULL); // 헤더를 쓰고 if (m_lpTexture == NULL) { return false; @@ -657,12 +657,12 @@ bool CN3Texture::Save(HANDLE hFile) { int iTexBytesLength = 0; iTexBytesLength = sd.Format == D3DFMT_DXT1 ? (sd.Width * sd.Height / 2) : (sd.Width * sd.Height); - WriteFile(hFile, (BYTE *)LR.pBits, iTexBytesLength, &dwRWC, NULL); // Ϸķ ͸ .. + WriteFile(hFile, (BYTE *)LR.pBits, iTexBytesLength, &dwRWC, NULL); // 일렬로 된 데이터를 쓰고.. m_lpTexture->UnlockRect(i); } - // ߰ ش.. ũ̴. - // ػ󵵸 Ѵܰ ߾ . + // 추가로 압축되지 않은 형식을 써준다.. 절반 크기이다. + // 압축되지 않은 형식을 해상도를 한단계 낮추어서 저장. LPDIRECT3DSURFACE9 lpSurfSrc = NULL, lpSurfDest = NULL; D3DFORMAT fmtExtra = D3DFMT_UNKNOWN; if (D3DFMT_DXT1 == sd.Format) { @@ -681,7 +681,7 @@ bool CN3Texture::Save(HANDLE hFile) { int nW = sd.Width / 2, nH = sd.Height / 2; s_lpD3DDev->CreateOffscreenPlainSurface(nW, nH, fmtExtra, D3DPOOL_DEFAULT, &lpSurfDest, NULL); D3DXLoadSurfaceFromSurface(lpSurfDest, NULL, NULL, lpSurfSrc, NULL, NULL, D3DX_FILTER_TRIANGLE, - 0); // ǽ . + 0); // 서피스 복사. int nPixelSize = 2; lpSurfDest->LockRect(&LR, NULL, NULL); for (int y = 0; y < nH; y++) { @@ -694,14 +694,14 @@ bool CN3Texture::Save(HANDLE hFile) { lpSurfSrc = NULL; } - if (nMMC == 1 && m_Header.nWidth >= 1024) // εθ 256 * 256 ¥ ϳ ش.. + if (nMMC == 1 && m_Header.nWidth >= 1024) // 부두를 위해 256 * 256 짜리 하나 더 저장해준다.. { m_lpTexture->GetLevelDesc(0, &sd); m_lpTexture->GetSurfaceLevel(0, &lpSurfSrc); int nW = 256, nH = 256; s_lpD3DDev->CreateOffscreenPlainSurface(nW, nH, fmtExtra, D3DPOOL_DEFAULT, &lpSurfDest, NULL); D3DXLoadSurfaceFromSurface(lpSurfDest, NULL, NULL, lpSurfSrc, NULL, NULL, D3DX_FILTER_TRIANGLE, - 0); // ǽ . + 0); // 서피스 복사. int nPixelSize = 2; lpSurfDest->LockRect(&LR, NULL, NULL); for (int y = 0; y < nH; y++) { @@ -713,7 +713,7 @@ bool CN3Texture::Save(HANDLE hFile) { lpSurfSrc->Release(); lpSurfSrc = NULL; } - } else // Ϲ ̸. + } else // 일반적인 포맷이면. { int nPixelSize = 0; if (D3DFMT_A1R5G5B5 == sd.Format || D3DFMT_A4R4G4B4 == sd.Format) { @@ -729,15 +729,15 @@ bool CN3Texture::Save(HANDLE hFile) { D3DLOCKED_RECT LR; for (int i = 0; i < nMMC; i++) { m_lpTexture->GetLevelDesc(i, &sd); - m_lpTexture->LockRect(i, &LR, NULL, 0); // Lock + m_lpTexture->LockRect(i, &LR, NULL, 0); // 각 레벨 Lock int nH = sd.Height; - for (int y = 0; y < nH; y++) { // ׳ ȼ .. + for (int y = 0; y < nH; y++) { // 그냥 픽셀 저장.. WriteFile(hFile, (BYTE *)LR.pBits + y * LR.Pitch, sd.Width * nPixelSize, &dwRWC, NULL); } m_lpTexture->UnlockRect(i); } - if (nMMC == 1 && m_Header.nWidth >= 512) // εθ 256 * 256 ¥ ϳ ش.. + if (nMMC == 1 && m_Header.nWidth >= 512) // 부두를 위해 256 * 256 짜리 하나 더 저장해준다.. { LPDIRECT3DSURFACE9 lpSurfSrc = NULL, lpSurfDest = NULL; @@ -746,7 +746,7 @@ bool CN3Texture::Save(HANDLE hFile) { int nW = 256, nH = 256; s_lpD3DDev->CreateOffscreenPlainSurface(nW, nH, sd.Format, D3DPOOL_DEFAULT, &lpSurfDest, NULL); HRESULT rval = D3DXLoadSurfaceFromSurface(lpSurfDest, NULL, NULL, lpSurfSrc, NULL, NULL, - D3DX_FILTER_TRIANGLE, 0); // ǽ . + D3DX_FILTER_TRIANGLE, 0); // 서피스 복사. lpSurfDest->LockRect(&LR, NULL, NULL); for (int y = 0; y < nH; y++) { WriteFile(hFile, (BYTE *)LR.pBits + y * LR.Pitch, nW * 2, &dwRWC, NULL); @@ -785,7 +785,7 @@ bool CN3Texture::Convert(D3DFORMAT Format, int nWidth, int nHeight, BOOL bGenera if (bGenerateMipMap) { LPDIRECT3DSURFACE9 lpTSOld; lpTexOld->GetSurfaceLevel(0, &lpTSOld); - this->GenerateMipMap(lpTSOld); // MipMap + this->GenerateMipMap(lpTSOld); // MipMap 생성 lpTSOld->Release(); } else { LPDIRECT3DSURFACE9 lpTSNew; @@ -793,7 +793,7 @@ bool CN3Texture::Convert(D3DFORMAT Format, int nWidth, int nHeight, BOOL bGenera m_lpTexture->GetSurfaceLevel(0, &lpTSNew); lpTexOld->GetSurfaceLevel(0, &lpTSOld); D3DXLoadSurfaceFromSurface(lpTSNew, NULL, NULL, lpTSOld, NULL, NULL, D3DX_FILTER_NONE, - 0); // ù ǽ . + 0); // 첫번재 레벨 서피스 복사. lpTSOld->Release(); lpTSNew->Release(); } @@ -811,7 +811,7 @@ bool CN3Texture::GenerateMipMap(LPDIRECT3DSURFACE9 lpSurfSrc) { return false; } - // MipMap  ʿ .. + // MipMap 이 몇개 필요한지 계산.. int nMMC = m_lpTexture->GetLevelCount(); int nMMC2 = 0; for (int nW = m_Header.nWidth, nH = m_Header.nHeight; nW >= 4 && nH >= 4; nW /= 2, nH /= 2) { @@ -827,7 +827,7 @@ bool CN3Texture::GenerateMipMap(LPDIRECT3DSURFACE9 lpSurfSrc) { } HRESULT rval = D3D_OK; - if (nMMC < nMMC2) // .. + if (nMMC < nMMC2) // 적으면 새로 생성.. { LPDIRECT3DTEXTURE9 lpTexOld = m_lpTexture; m_lpTexture = NULL; @@ -846,15 +846,15 @@ bool CN3Texture::GenerateMipMap(LPDIRECT3DSURFACE9 lpSurfSrc) { m_Header.bMipMap = FALSE; return FALSE; } - } else // MipMap ׳ ǥ鸸 + } else // MipMap 이 있으면 그냥 표면만 복사 { - if (false == bNeedReleaseSurf) // ٸ ǽ ؾ Ǵ Ÿ 0 .. + if (false == bNeedReleaseSurf) // 다른 서피스에서 복사해야 되는 거면 0 레벨도 복사.. { LPDIRECT3DSURFACE9 lpSurfDest; m_lpTexture->GetSurfaceLevel(0, &lpSurfDest); - DWORD dwFilter = D3DX_FILTER_TRIANGLE; // ⺻ ʹ .. + DWORD dwFilter = D3DX_FILTER_TRIANGLE; // 기본 필터는 없다.. HRESULT rval = D3DXLoadSurfaceFromSurface(lpSurfDest, NULL, NULL, lpSurfSrc, NULL, NULL, dwFilter, - 0); // üο ǽ ̹ + 0); // 작은 맵 체인에 서피스 이미지 축소 복사 lpSurfDest->Release(); lpSurfDest = NULL; } @@ -863,9 +863,9 @@ bool CN3Texture::GenerateMipMap(LPDIRECT3DSURFACE9 lpSurfSrc) { LPDIRECT3DSURFACE9 lpSurfDest, lpSurfUp; m_lpTexture->GetSurfaceLevel(i - 1, &lpSurfUp); m_lpTexture->GetSurfaceLevel(i, &lpSurfDest); - DWORD dwFilter = D3DX_FILTER_TRIANGLE; // ⺻ ʹ .. + DWORD dwFilter = D3DX_FILTER_TRIANGLE; // 기본 필터는 없다.. HRESULT rval = D3DXLoadSurfaceFromSurface(lpSurfDest, NULL, NULL, lpSurfUp, NULL, NULL, dwFilter, - 0); // üο ǽ ̹ + 0); // 작은 맵 체인에 서피스 이미지 축소 복사 lpSurfDest->Release(); lpSurfUp->Release(); } @@ -911,7 +911,7 @@ bool CN3Texture::SaveToBitmapFile(const std::string & szFN) { return false; } if (D3D_OK != D3DXLoadSurfaceFromSurface(lpSurfDest, NULL, NULL, lpSurfSrc, NULL, NULL, D3DX_FILTER_TRIANGLE, - 0)) // ǽ . + 0)) // 서피스 복사. { lpSurfDest->Release(); lpSurfDest = NULL; diff --git a/src/engine/N3Base/N3Texture.h b/src/engine/N3Base/N3Texture.h index 3845854d..18ce9bc4 100644 --- a/src/engine/N3Base/N3Texture.h +++ b/src/engine/N3Base/N3Texture.h @@ -10,10 +10,10 @@ class CN3Texture : public CN3BaseFileAccess { public: typedef struct __DXT_HEADER { - char szID[4]; // "NTF" - Noah Texture File Ver. ?.0 + char szID[4]; // "NTF"숫자 - Noah Texture File Ver. ?.0 int nWidth; int nHeight; - D3DFORMAT Format; // 0 - 1 ~ 5 : D3DFMT_DXT1 ~ D3DFMT_DXT5 + D3DFORMAT Format; // 0 - 압축 안함 1 ~ 5 : D3DFMT_DXT1 ~ D3DFMT_DXT5 BOOL bMipMap; // Mip Map ?? } __DxtHeader; @@ -28,13 +28,13 @@ class CN3Texture : public CN3BaseFileAccess { bool SkipFileHandle(HANDLE hFile); #ifdef _N3TOOL - bool GenerateMipMap(LPDIRECT3DSURFACE9 lpSurf = NULL); // NULL ̸ 0 ǽκ .. + bool GenerateMipMap(LPDIRECT3DSURFACE9 lpSurf = NULL); // NULL 이면 0 레벨의 서피스로부터 생성.. bool Convert(D3DFORMAT Format, int nWidth = 0, int nHeight = 0, BOOL bGenerateMipMap = TRUE); //#ifdef _N3TOOL - bool SaveToFile(); // ̸ . - bool SaveToFile(const std::string & szFileName); // ̸ . + bool SaveToFile(); // 현재 파일 이름대로 저장. + bool SaveToFile(const std::string & szFileName); // 새이름으로 저장. bool Save(HANDLE hFile); - bool SaveToBitmapFile(const std::string & szFN); // 24Ʈ Ʈ Ϸ .. + bool SaveToBitmapFile(const std::string & szFN); // 24비트 비트맵 파일로 저장.. bool CreateFromSurface(LPDIRECT3DSURFACE9 lpSurf, D3DFORMAT Format, BOOL bGenerateMipMap); #endif // end of _N3TOOL @@ -49,7 +49,7 @@ class CN3Texture : public CN3BaseFileAccess { } } - bool Create(int nWidth, int nHeight, D3DFORMAT Format, BOOL bGenerateMipMap); // ġ ° + bool Create(int nWidth, int nHeight, D3DFORMAT Format, BOOL bGenerateMipMap); // 장치에 맞게 생성 LPDIRECT3DTEXTURE9 Get() { return m_lpTexture; } operator LPDIRECT3DTEXTURE9() { return m_lpTexture; } diff --git a/src/engine/N3Base/N3Transform.cpp b/src/engine/N3Base/N3Transform.cpp index 4e63aa48..d6818afe 100644 --- a/src/engine/N3Base/N3Transform.cpp +++ b/src/engine/N3Base/N3Transform.cpp @@ -7,12 +7,12 @@ CN3Transform::CN3Transform() { m_dwType |= OBJ_TRANSFORM; - m_vPos.Set(0, 0, 0); // ġ, , ȸ . + m_vPos.Set(0, 0, 0); // 위치, 스케일, 회전 벡터. m_vScale.Set(1, 1, 1); m_qRot.Identity(); m_Matrix.Identity(); - // ϸ̼ Ű + // 에니메이션 키 m_fFrmCur = 0; m_fFrmWhole = 0; } @@ -20,13 +20,13 @@ CN3Transform::CN3Transform() { CN3Transform::~CN3Transform() {} void CN3Transform::Release() { - m_vPos.Set(0, 0, 0); // ġ, , ȸ . + m_vPos.Set(0, 0, 0); // 위치, 스케일, 회전 벡터. m_vScale.Set(1, 1, 1); m_qRot.Identity(); m_Matrix.Identity(); - // ϸ̼ Ű + // 에니메이션 키 m_fFrmCur = 0; m_fFrmWhole = 0; @@ -41,11 +41,11 @@ bool CN3Transform::Load(HANDLE hFile) { CN3BaseFileAccess::Load(hFile); DWORD dwRWC = 0; - ReadFile(hFile, &m_vPos, sizeof(__Vector3), &dwRWC, NULL); // ġ, , ȸ . + ReadFile(hFile, &m_vPos, sizeof(__Vector3), &dwRWC, NULL); // 위치, 스케일, 회전 벡터. ReadFile(hFile, &m_qRot, sizeof(__Quaternion), &dwRWC, NULL); ReadFile(hFile, &m_vScale, sizeof(__Vector3), &dwRWC, NULL); - // ϸ̼ Ű + // 에니메이션 키 m_KeyPos.Load(hFile); m_KeyRot.Load(hFile); m_KeyScale.Load(hFile); @@ -68,7 +68,7 @@ bool CN3Transform::Load(HANDLE hFile) { m_fFrmWhole = fFrmWhole; } - this->ReCalcMatrix(); // ȯ .. + this->ReCalcMatrix(); // 변환 행렬 계산.. return true; } @@ -78,11 +78,11 @@ bool CN3Transform::Save(HANDLE hFile) { CN3BaseFileAccess::Save(hFile); DWORD dwRWC = 0; - WriteFile(hFile, &m_vPos, sizeof(__Vector3), &dwRWC, NULL); // ġ, , ȸ . + WriteFile(hFile, &m_vPos, sizeof(__Vector3), &dwRWC, NULL); // 위치, 스케일, 회전 벡터. WriteFile(hFile, &m_qRot, sizeof(__Quaternion), &dwRWC, NULL); WriteFile(hFile, &m_vScale, sizeof(__Vector3), &dwRWC, NULL); - // ϸ̼ Ű + // 에니메이션 키 m_KeyPos.Save(hFile); m_KeyRot.Save(hFile); m_KeyScale.Save(hFile); @@ -108,7 +108,7 @@ void CN3Transform::Tick(float fFrm) { bool bNdeedReCalcMatrix = this->TickAnimationKey(m_fFrmCur); if (m_dwType & OBJ_JOINT) { - return; // Joint ϴ ٸ Ѿ.. + return; // Joint 일 경우는 행렬을 계산하는 방법이 다르기 땜시 넘어간다.. } if (bNdeedReCalcMatrix) { @@ -127,7 +127,7 @@ void CN3Transform::ReCalcMatrix() { } bool CN3Transform::TickAnimationKey(float fFrm) { - // ϸ̼ Ű + // 에니메이션 키 int nKCP = m_KeyPos.Count(); int nKCR = m_KeyRot.Count(); int nKCS = m_KeyScale.Count(); @@ -151,7 +151,7 @@ bool CN3Transform::TickAnimationKey(float fFrm) { #ifdef _N3TOOL void CN3Transform::Render(const __Matrix44 * pMtxParent, float fUnitSize) { - // ׸.. + // 축 그리기.. static __Vector3 vAxis[9]; static bool bAxisCreated = false; if (false == bAxisCreated) { @@ -160,13 +160,13 @@ void CN3Transform::Render(const __Matrix44 * pMtxParent, float fUnitSize) { for (int i = 0; i < 3; i++) { if (i == 0) { mtxRot.Identity(); - } // X + } // X 축 else if (i == 1) { mtxRot.RotationZ(D3DXToRadian(90.0f)); - } // Y + } // Y 축 else if (i == 2) { mtxRot.RotationY(D3DXToRadian(-90.0f)); - } // Z + } // Z 축 vAxis[i * 3 + 0] = v0 * mtxRot; vAxis[i * 3 + 1] = v1 * mtxRot; @@ -177,22 +177,22 @@ void CN3Transform::Render(const __Matrix44 * pMtxParent, float fUnitSize) { } __Matrix44 mtxBox; - mtxBox.Scale(fUnitSize, fUnitSize, fUnitSize); // ڽ + mtxBox.Scale(fUnitSize, fUnitSize, fUnitSize); // 관절부 박스에 스케일 적용 mtxBox *= m_Matrix; s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtxBox); - CN3Base::RenderLines(&(vAxis[0]), 2, 0xffff0000); // ׸.. - CN3Base::RenderLines(&(vAxis[3]), 2, 0xff00ff00); // ׸.. - CN3Base::RenderLines(&(vAxis[6]), 2, 0xff0000ff); // ׸.. + CN3Base::RenderLines(&(vAxis[0]), 2, 0xffff0000); // 선그리기.. + CN3Base::RenderLines(&(vAxis[3]), 2, 0xff00ff00); // 선그리기.. + CN3Base::RenderLines(&(vAxis[6]), 2, 0xff0000ff); // 선그리기.. } #endif // end of _N3TOOL /* #if _DEBUG -// . +// 선택 상자 만들기. void CN3Transform::GenerateSelectBox(__Vector3 &vMin, __Vector3 &vMax) { - // Bounding Box Vertex Buffer + // Bounding Box Vertex Buffer 생성 if(m_lpVBBox != NULL) { m_lpVBBox->Release(); m_lpVBBox = NULL; } HRESULT rval = m_lpDevRef->CreateVertexBuffer(54 * sizeof(__VertexColor), 0, FVF_CV, D3DPOOL_MANAGED, &m_lpVBBox, NULL); if(rval != D3D_OK) @@ -201,17 +201,17 @@ void CN3Transform::GenerateSelectBox(__Vector3 &vMin, __Vector3 &vMax) if(rval != D3D_OK) { char szDebug[256]; D3DXGetErrorString(rval, szDebug, 256); - MessageBox(::GetActiveWindow(), szDebug, "VertexBuffer ", MB_OK); + MessageBox(::GetActiveWindow(), szDebug, "VertexBuffer 생성 실패", MB_OK); return; } } - float fW = (vMax.x - vMin.x)/5, fH = (vMax.y - vMin.y)/5, fL = (vMax.z - vMin.z)/5; // ʺ (x y z) + float fW = (vMax.x - vMin.x)/5, fH = (vMax.y - vMin.y)/5, fL = (vMax.z - vMin.z)/5; // 길이 높이 너비 (x y z) __VertexColor* pVC; m_lpVBBox->Lock(0, 0, (VOID**)&pVC, NULL); - pVC[4] = pVC[2] = pVC[0] = __VertexColor(vMin.x, vMax.y, vMin.z, 0xff7f7f7f); // - Ʒ Ʈ . + pVC[4] = pVC[2] = pVC[0] = __VertexColor(vMin.x, vMax.y, vMin.z, 0xff7f7f7f); // 정면 - 아래와 같은 선 리스트를 만든다. pVC[10] = pVC[8] = pVC[6] = __VertexColor(vMax.x, vMax.y, vMin.z, 0xff7f7f7f); // / / pVC[16] = pVC[14] = pVC[12] = __VertexColor(vMax.x, vMin.y, vMin.z, 0xff7f7f7f); // +-- --+ pVC[22] = pVC[20] = pVC[18] = __VertexColor(vMin.x, vMin.y, vMin.z, 0xff7f7f7f); // | | @@ -233,12 +233,12 @@ void CN3Transform::GenerateSelectBox(__Vector3 &vMin, __Vector3 &vMax) __Vector3 vLength = (vMax - vMin); float fLength = vLength.Magnitude(); __Vector3 vCenter = vMin + (vMax - vMin)/2.0f; - pVC[48].Set(0, 0, 0, 0xffff0000); pVC[48].x -= vLength.x/2 + fLength/5 + 0.5f;// x -> - pVC[49].Set(0, 0, 0, 0xffff0000); pVC[49].x += vLength.x/2 + fLength/5 + 0.5f;// x -> - pVC[50].Set(0, 0, 0, 0xff00ff00); pVC[50].y -= vLength.y/2 + fLength/5 + 0.5f;// y -> - pVC[51].Set(0, 0, 0, 0xff00ff00); pVC[51].y += vLength.y/2 + fLength/5 + 0.5f;// y -> - pVC[52].Set(0, 0, 0, 0xff0000ff); pVC[52].z -= vLength.z/2 + fLength/5 + 0.5f;// z Ķ -> Ķ - pVC[53].Set(0, 0, 0, 0xff0000ff); pVC[53].z += vLength.z/2 + fLength/5 + 0.5f;// z Ķ -> Ķ + pVC[48].Set(0, 0, 0, 0xffff0000); pVC[48].x -= vLength.x/2 + fLength/5 + 0.5f;// x 축 빨간색 -> 빨간색 + pVC[49].Set(0, 0, 0, 0xffff0000); pVC[49].x += vLength.x/2 + fLength/5 + 0.5f;// x 축 빨간색 -> 빨간색 + pVC[50].Set(0, 0, 0, 0xff00ff00); pVC[50].y -= vLength.y/2 + fLength/5 + 0.5f;// y 축 녹색 -> 녹색 + pVC[51].Set(0, 0, 0, 0xff00ff00); pVC[51].y += vLength.y/2 + fLength/5 + 0.5f;// y 축 녹색 -> 녹색 + pVC[52].Set(0, 0, 0, 0xff0000ff); pVC[52].z -= vLength.z/2 + fLength/5 + 0.5f;// z 축 파란색 -> 파란색 + pVC[53].Set(0, 0, 0, 0xff0000ff); pVC[53].z += vLength.z/2 + fLength/5 + 0.5f;// z 축 파란색 -> 파란색 m_lpVBBox->Unlock(); } #endif diff --git a/src/engine/N3Base/N3Transform.h b/src/engine/N3Base/N3Transform.h index d144cf50..0137f06a 100644 --- a/src/engine/N3Base/N3Transform.h +++ b/src/engine/N3Base/N3Transform.h @@ -14,19 +14,19 @@ class CN3Transform : public CN3BaseFileAccess { public: __Vector3 m_vPos; - __Matrix44 m_Matrix; // ȯ + __Matrix44 m_Matrix; // 변환 행렬 - CN3AnimKey m_KeyPos; // ϸ̼ Ű + CN3AnimKey m_KeyPos; // 에니메이션 키 CN3AnimKey m_KeyRot; CN3AnimKey m_KeyScale; - float m_fFrmWhole; // ü Ӽ - float m_fFrmCur; // + float m_fFrmWhole; // 전체 프레임수 + float m_fFrmCur; // 현재 프레임 public: virtual void Tick(float fFrm = FRAME_SELFPLAY); virtual bool TickAnimationKey( - float fFrm); // Animation Key Tick... Animation Key ־ ̸ true, ƴϸ false return; + float fFrm); // Animation Key Tick... Animation Key 가 있어 움직이면 true, 아니면 false 를 return; __Vector3 Pos() const { return m_vPos; } __Quaternion Rot() const { return m_qRot; } diff --git a/src/engine/N3Base/N3TransformCollision.cpp b/src/engine/N3Base/N3TransformCollision.cpp index 042522f1..a824d6cf 100644 --- a/src/engine/N3Base/N3TransformCollision.cpp +++ b/src/engine/N3Base/N3TransformCollision.cpp @@ -46,14 +46,14 @@ bool CN3TransformCollision::Load(HANDLE hFile) { ReadFile(hFile, &nL, 4, &dwRWC, NULL); // Mesh FileName if (nL > 0) { ReadFile(hFile, szFN, nL, &dwRWC, NULL); - szFN[nL] = NULL; // ޽ ̸.. + szFN[nL] = NULL; // 메시 파일 이름.. m_pMeshCollision = s_MngVMesh.Get(szFN); } ReadFile(hFile, &nL, 4, &dwRWC, NULL); // Mesh FileName if (nL > 0) { ReadFile(hFile, szFN, nL, &dwRWC, NULL); - szFN[nL] = NULL; // ޽ ̸.. + szFN[nL] = NULL; // 메시 파일 이름.. m_pMeshClimb = s_MngVMesh.Get(szFN); } return true; @@ -72,7 +72,7 @@ bool CN3TransformCollision::Save(HANDLE hFile) { WriteFile(hFile, &nL, 4, &dwRWC, NULL); // Mesh FileName if (nL > 0) { if (m_pMeshCollision->FileName().find("object\\") < - 0) // ӽ÷ θ ٲٷ ־.. ߿ ʿ .. + 0) // 임시로 경로를 바꾸려고 넣었다.. 나중에 필요없음 지운다.. { char szFNTmp[256]; wsprintf(szFNTmp, "Object\\%s.N3VMesh", m_pMeshCollision->m_szName.c_str()); @@ -92,7 +92,7 @@ bool CN3TransformCollision::Save(HANDLE hFile) { } WriteFile(hFile, &nL, 4, &dwRWC, NULL); // Mesh FileName if (nL > 0) { - if (-1 == m_pMeshClimb->FileName().find("object\\")) // ӽ÷ θ ٲٷ ־.. ߿ ʿ .. + if (-1 == m_pMeshClimb->FileName().find("object\\")) // 임시로 경로를 바꾸려고 넣었다.. 나중에 필요없음 지운다.. { char szFNTmp[256]; wsprintf(szFNTmp, "Object\\%s.N3VMesh", m_pMeshClimb->m_szName.c_str()); @@ -127,7 +127,7 @@ void CN3TransformCollision::ClimbMeshSet(const std::string & szFN) { int CN3TransformCollision::CheckCollisionPrecisely(bool bIgnoreBoxCheck, int ixScreen, int iyScreen, __Vector3 * pVCol, __Vector3 * pVNormal) { - __Vector3 vPos, vDir; // 2D ǥ 3D ǥ ٲٰ.. + __Vector3 vPos, vDir; // 2D 좌표를 3D 좌표로 바꾸고.. ::_Convert2D_To_3DCoordinate(ixScreen, iyScreen, s_CameraData.mtxView, s_CameraData.mtxProjection, s_CameraData.vp, vPos, vDir); @@ -144,7 +144,7 @@ void CN3TransformCollision::RenderCollisionMesh() { } s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); - m_pMeshCollision->Render(0xffff0000); // . + m_pMeshCollision->Render(0xffff0000); // 빨간색. } void CN3TransformCollision::RenderClimbMesh() { @@ -153,7 +153,7 @@ void CN3TransformCollision::RenderClimbMesh() { } s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); - m_pMeshClimb->Render(0xff0000ff); // Ķ.. + m_pMeshClimb->Render(0xff0000ff); // 파란색.. } /* @@ -288,6 +288,6 @@ void CN3TransformCollision::FindMinMax() { } } - // ִ ּҰ Ѵ.. + // 최대 최소값을 갖고 반지름 계산한다.. m_fRadius = (m_vMax - m_vMin).Magnitude() * 0.5f; } diff --git a/src/engine/N3Base/N3TransformCollision.h b/src/engine/N3Base/N3TransformCollision.h index 102ef0b1..4c8c2dc5 100644 --- a/src/engine/N3Base/N3TransformCollision.h +++ b/src/engine/N3Base/N3TransformCollision.h @@ -11,17 +11,17 @@ class CN3TransformCollision : public CN3Transform { protected: - float m_fRadius; // .. - __Vector3 m_vMin, m_vMax; // ִ ּ.. - CN3VMesh * m_pMeshCollision; // 浹 üũ ޽.. - CN3VMesh * m_pMeshClimb; // ö󰡴 浹 üũ ޽.. + float m_fRadius; // 반지름.. + __Vector3 m_vMin, m_vMax; // 최대 최소점.. + CN3VMesh * m_pMeshCollision; // 충돌 체크용 메시.. + CN3VMesh * m_pMeshClimb; // 기어 올라가는 충돌 체크용 메시.. public: virtual void FindMinMax(); - __Vector3 Min() { return m_vMin * m_Matrix; } // ּҰ - __Vector3 Max() { return m_vMax * m_Matrix; } // ִ밪 - __Vector3 RawMin() { return m_vMin; } // ּҰ - __Vector3 RawMax() { return m_vMax; } // ִ밪 + __Vector3 Min() { return m_vMin * m_Matrix; } // 월드 상의 최소값 + __Vector3 Max() { return m_vMax * m_Matrix; } // 월드 상의 최대값 + __Vector3 RawMin() { return m_vMin; } // 월드 상의 최소값 + __Vector3 RawMax() { return m_vMax; } // 월드 상의 최대값 float Radius() { return m_fRadius * m_vScale.y; } void SetRadius(float fRadius) { m_fRadius = fRadius; } @@ -30,15 +30,15 @@ class CN3TransformCollision : public CN3Transform { void SetMeshCollision(const std::string & szFN) { m_pMeshCollision = s_MngVMesh.Get(szFN); } void SetMeshClimb(const std::string & szFN) { m_pMeshClimb = s_MngVMesh.Get(szFN); } - // By : Dino ( On 2001-08-27 9:15:24 ) - // ־ m_fRadius ȿ ִ üũ + // By : Dino ( On 2001-08-27 오후 9:15:24 ) + // 주어진 지점이 m_fRadius 범위안에 있는지 체크 bool IsInRadius(__Vector3 & vCheckPos) { return ((vCheckPos - m_vPos).Magnitude() > m_fRadius ? FALSE : TRUE); } bool IsInRadiusXZ(float fX, float fZ) { fX -= m_vPos.x; fZ -= m_vPos.z; return (sqrtf(fX * fX + fZ * fZ) > m_fRadius ? FALSE : TRUE); } - // ~(By Dino On 2001-08-27 9:15:24 ) + // ~(By Dino On 2001-08-27 오후 9:15:24 ) virtual int CheckCollisionPrecisely(bool bIgnoreBoxCheck, int ixScreen, int iyScreen, __Vector3 * pVCol = NULL, __Vector3 * pVNormal = NULL); diff --git a/src/engine/N3Base/N3UIArea.cpp b/src/engine/N3Base/N3UIArea.cpp index 481e7af7..7a1354f9 100644 --- a/src/engine/N3Base/N3UIArea.cpp +++ b/src/engine/N3Base/N3UIArea.cpp @@ -39,10 +39,10 @@ bool CN3UIArea::Load(HANDLE hFile) { } #ifndef _REPENT - // ߰ ̰ ߰ϱ + // 추가사항이 있으면 이곳에 추가하기 DWORD dwNum; int iAreaType; - ReadFile(hFile, &iAreaType, sizeof(int), &dwNum, NULL); // click + ReadFile(hFile, &iAreaType, sizeof(int), &dwNum, NULL); // click 영역 m_eAreaType = (eUI_AREA_TYPE)iAreaType; #endif return true; @@ -57,19 +57,19 @@ DWORD CN3UIArea::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptO if (CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer) { return dwRet; } - // θ Ŵ̷ Inventory Wnd.. + // 부모가 아이콘 매니저이로 Inventory Wnd라면.. if ((m_pParent->UIType() == UI_TYPE_ICON_MANAGER) && (((CN3UIWndBase *)m_pParent)->GetUIWnd() == UIWND_INVENTORY)) { - // Ư ̺Ʈ ޽ .. + // 특정 이벤트에 대해 메시지 전송.. if (IsIn(ptCur.x, ptCur.y) && (dwFlags & UI_MOUSE_LBCLICK)) { - m_pParent->ReceiveMessage(this, UIMSG_AREA_DOWN_FIRST); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_AREA_DOWN_FIRST); // 부모에게 버튼 클릭 통지.. dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } } #endif - // Ư ̺Ʈ ޽ .. + // 특정 이벤트에 대해 메시지 전송.. if (IsIn(ptCur.x, ptCur.y) && (dwFlags & UI_MOUSE_LBCLICK)) { - m_pParent->ReceiveMessage(this, UIMSG_BUTTON_CLICK); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_BUTTON_CLICK); // 부모에게 버튼 클릭 통지.. dwRet |= UI_MOUSEPROC_DONESOMETHING; } @@ -82,16 +82,16 @@ bool CN3UIArea::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer) { return false; } - // θ Ŵ̷ Inventory Wnd.. + // 부모가 아이콘 매니저이로 Inventory Wnd라면.. if ((m_pParent->UIType() == UI_TYPE_ICON_MANAGER) && (((CN3UIWndBase *)m_pParent)->GetUIWnd() == UIWND_INVENTORY)) { if (dwMsg == UIMSG_BUTTON_CLICK) { if (pSender->m_szID == "btn_Destroy_ok") { - // κ丮 .. + // 인벤토리만 떠 있을때.. ((CUIInventory *)m_pParent)->ItemDestroyOK(); } if (pSender->m_szID == "btn_Destroy_cancel") { - // κ丮 .. + // 인벤토리만 떠 있을때.. ((CUIInventory *)m_pParent)->ItemDestroyCancel(); } } @@ -109,7 +109,7 @@ bool CN3UIArea::Save(HANDLE hFile) { #ifndef _REPENT DWORD dwNum; int iAreaType = (int)m_eAreaType; - WriteFile(hFile, &iAreaType, sizeof(int), &dwNum, NULL); // click + WriteFile(hFile, &iAreaType, sizeof(int), &dwNum, NULL); // click 영역 #endif return true; } diff --git a/src/engine/N3Base/N3UIArea.h b/src/engine/N3Base/N3UIArea.h index b62d446e..8bc6ef3c 100644 --- a/src/engine/N3Base/N3UIArea.h +++ b/src/engine/N3Base/N3UIArea.h @@ -41,7 +41,7 @@ class CN3UIArea : public CN3UIBase { #endif #ifdef _N3TOOL - // ϱ Լ + // 툴에서 사용하기 위한 함수 virtual void operator=(const CN3UIArea & other); virtual bool Save(HANDLE hFile); #endif diff --git a/src/engine/N3Base/N3UIBase.cpp b/src/engine/N3Base/N3UIBase.cpp index f367861b..ead53b75 100644 --- a/src/engine/N3Base/N3UIBase.cpp +++ b/src/engine/N3Base/N3UIBase.cpp @@ -26,7 +26,7 @@ CN3UIEdit * CN3UIBase::s_pFocusedEdit = NULL; CN3UITooltip * CN3UIBase::s_pTooltipCtrl = NULL; -std::string CN3UIBase::s_szStringTmp; // ӽú.. +std::string CN3UIBase::s_szStringTmp; // 임시변수.. CN3UIBase::CN3UIBase() { m_eType = UI_TYPE_BASE; @@ -49,7 +49,7 @@ CN3UIBase::CN3UIBase() { CN3UIBase::~CN3UIBase() { if (m_pParent) { - m_pParent->RemoveChild(this); // θ ڽĿ + m_pParent->RemoveChild(this); // 부모의 자식에서 나를 지우기 } CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_OpenUI); @@ -58,8 +58,8 @@ CN3UIBase::~CN3UIBase() { while (!m_Children.empty()) { CN3UIBase * pChild = m_Children.front(); if (pChild) { - delete pChild; // ڽ deleteǸ鼭 θ list ڵ ŵȴ. - // Ʈ κ  ȴ. + delete pChild; // 자식이 delete되면서 부모의 list에서는 자동으로 제거된다. + // 따라서 리스트에서 따로 지우는 부분이 없어도 된다. } } } @@ -85,8 +85,8 @@ void CN3UIBase::Release() { while (!m_Children.empty()) { CN3UIBase * pChild = m_Children.front(); if (pChild) { - delete pChild; // ڽ deleteǸ鼭 θ list ڵ ŵȴ. - // Ʈ κ  ȴ. + delete pChild; // 자식이 delete되면서 부모의 list에서는 자동으로 제거된다. + // 따라서 리스트에서 따로 지우는 부분이 없어도 된다. } } @@ -130,9 +130,9 @@ POINT CN3UIBase::GetPos() const { return p; } -// ġ ٲٱ +// 위치 바꾸기 void CN3UIBase::SetPos(int x, int y) { - // ϱ + // 움직인 차이 구하기 int dx, dy; dx = x - m_rcRegion.left; dy = y - m_rcRegion.top; @@ -148,22 +148,22 @@ void CN3UIBase::SetPosCenter() { int iWVP = CN3Base::s_CameraData.vp.Width; int iHVP = CN3Base::s_CameraData.vp.Height; - // ϱ + // 움직인 차이 구하기 MoveOffset(((iWVP - iW) / 2) - pt.x, ((iHVP - iH) / 2) - pt.y); } -// offsetŭ ̵ش.(children ̵) +// offset만큼 이동해준다.(children도 이동) BOOL CN3UIBase::MoveOffset(int iOffsetX, int iOffsetY) { if (0 == iOffsetX && 0 == iOffsetY) { return FALSE; } - // ui + // ui 영역 m_rcRegion.left += iOffsetX; m_rcRegion.top += iOffsetY; m_rcRegion.right += iOffsetX; m_rcRegion.bottom += iOffsetY; - // movable + // movable 영역 if (m_rcMovable.right - m_rcMovable.left != 0 && m_rcMovable.bottom - m_rcMovable.top != 0) { m_rcMovable.left += iOffsetX; m_rcMovable.top += iOffsetY; @@ -171,7 +171,7 @@ BOOL CN3UIBase::MoveOffset(int iOffsetX, int iOffsetY) { m_rcMovable.bottom += iOffsetY; } - // children ǥ + // children 좌표 갱신 CN3UIBase * pCUI = NULL; // Child UI... for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { pCUI = (*itor); @@ -181,7 +181,7 @@ BOOL CN3UIBase::MoveOffset(int iOffsetX, int iOffsetY) { return TRUE; } -// (x,y) ȿ true.. +// 점 (x,y)가 영역안에 있으면 true.. bool CN3UIBase::IsIn(int x, int y) { if (x < m_rcRegion.left || x > m_rcRegion.right || y < m_rcRegion.top || y > m_rcRegion.bottom) { return false; @@ -195,10 +195,10 @@ void CN3UIBase::SetSize(int iWidth, int iHeight) { SetRegion(rc); } -bool CN3UIBase::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) // ޽ ޴´.. , msg +bool CN3UIBase::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) // 메시지를 받는다.. 보낸놈, msg { if (m_pParent && pSender) { - m_pParent->ReceiveMessage(pSender, dwMsg); // θ ׳ѿԵ .. + m_pParent->ReceiveMessage(pSender, dwMsg); // 부모가 있으면 그넘에게도 보낸다.. } return true; } @@ -220,7 +220,7 @@ bool CN3UIBase::Load(HANDLE hFile) { CN3BaseFileAccess::Load(hFile); DWORD dwRWC = NULL; - // children + // children 정보 int16_t iCC = 0; ReadFile(hFile, &iCC, sizeof(int16_t), &dwRWC, NULL); ReadFile(hFile, &m_sUIVersion, sizeof(int16_t), &dwRWC, NULL); @@ -228,7 +228,7 @@ bool CN3UIBase::Load(HANDLE hFile) { eUI_TYPE eChildUIType; for (int i = 0; i < iCC; i++) { CN3UIBase * pChild = NULL; - ReadFile(hFile, &eChildUIType, sizeof(eChildUIType), &dwRWC, NULL); // child ui type + ReadFile(hFile, &eChildUIType, sizeof(eChildUIType), &dwRWC, NULL); // child의 ui type switch (eChildUIType) { case UI_TYPE_BASE: @@ -275,7 +275,7 @@ bool CN3UIBase::Load(HANDLE hFile) { pChild->Load(hFile); } - // base + // base 정보 int iIDLen = 0; ReadFile(hFile, &iIDLen, sizeof(iIDLen), &dwRWC, NULL); // ui id length if (iIDLen > 0) { @@ -291,16 +291,16 @@ bool CN3UIBase::Load(HANDLE hFile) { ReadFile(hFile, &m_dwReserved, sizeof(m_dwReserved), &dwRWC, NULL); // m_dwReserved int iTooltipLen; - ReadFile(hFile, &iTooltipLen, sizeof(iTooltipLen), &dwRWC, NULL); // tooltipڿ + ReadFile(hFile, &iTooltipLen, sizeof(iTooltipLen), &dwRWC, NULL); // tooltip문자열 길이 if (iTooltipLen > 0) { std::vector buffer(iTooltipLen, 0); ReadFile(hFile, &buffer[0], iTooltipLen, &dwRWC, NULL); m_szToolTip = std::string(buffer.begin(), buffer.end()); } - // uif Ϸ ε ϴ κ + // 이전 uif파일을 컨버팅 하려면 사운드 로드 하는 부분 막기 int iSndFNLen = 0; - ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwRWC, NULL); // ڿ + ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwRWC, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen > 0) { std::vector buffer(iSndFNLen, 0); ReadFile(hFile, &buffer[0], iSndFNLen, &dwRWC, NULL); @@ -309,7 +309,7 @@ bool CN3UIBase::Load(HANDLE hFile) { m_pSnd_OpenUI = s_SndMgr.CreateObj(std::string(buffer.begin(), buffer.end()), SNDTYPE_2D); } - ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwRWC, NULL); // ڿ + ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwRWC, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen > 0) { std::vector buffer(iSndFNLen, 0); ReadFile(hFile, &buffer[0], iSndFNLen, &dwRWC, NULL); @@ -330,7 +330,7 @@ void CN3UIBase::Tick() { void CN3UIBase::Render() { if (!m_bVisible) { - return; // ڽĵ render ʴ´. + return; // 보이지 않으면 자식들을 render하지 않는다. } for (UIListReverseItor itor = m_Children.rbegin(); m_Children.rend() != itor; ++itor) { @@ -353,7 +353,7 @@ DWORD CN3UIBase::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptO return dwRet; } - // UI ̴ ڵ + // UI 움직이는 코드 if (UI_STATE_COMMON_MOVE == m_eState) { if (dwFlags & UI_MOUSE_LBCLICKED) { SetState(UI_STATE_COMMON_NONE); @@ -364,40 +364,40 @@ DWORD CN3UIBase::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptO return dwRet; } - if (false == IsIn(ptCur.x, ptCur.y)) // ̸ + if (false == IsIn(ptCur.x, ptCur.y)) // 영역 밖이면 { if (false == IsIn(ptOld.x, ptOld.y)) { - return dwRet; // ǥ ̸ + return dwRet; // 이전 좌표도 영역 밖이면 } - dwRet |= UI_MOUSEPROC_PREVINREGION; // ǥ ̾. + dwRet |= UI_MOUSEPROC_PREVINREGION; // 이전 좌표는 영역 안이었다. } else { - // tool tip + // tool tip 관련 if (s_pTooltipCtrl) { s_pTooltipCtrl->SetText(m_szToolTip); } } - dwRet |= UI_MOUSEPROC_INREGION; // ̹ ǥ ̴. + dwRet |= UI_MOUSEPROC_INREGION; // 이번 좌표는 영역 안이다. //this_ui if (m_pChildUI && m_pChildUI->IsVisible()) { return dwRet; } - // child ޼ + // child에게 메세지 전달 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); DWORD dwChildRet = pChild->MouseProc(dwFlags, ptCur, ptOld); - if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // ̰쿡 հ Ŀ ̴. - // (Ʒ ڵ dialog ϴ ؾ Ѵ. Ƴ) - // m_Children.erase(itor); // 켱 Ʈ - // m_Children.push_front(pChild); // Ǿտ ִ´. ׸ ߿ ׸ Ϸ + if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // 이경우에는 먼가 포커스를 받은 경우이다. + // (아래 코드는 dialog를 관리하는 곳에서 해야 한다. 따라서 막아놓음) + // m_Children.erase(itor); // 우선 리스트에서 지우고 + // m_Children.push_front(pChild); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하려고 dwRet |= (UI_MOUSEPROC_CHILDDONESOMETHING | UI_MOUSEPROC_DONESOMETHING); return dwRet; } } - // UI ̴ ڵ + // UI 움직이는 코드 if (UI_STATE_COMMON_MOVE != m_eState && PtInRect(&m_rcMovable, ptCur) && (dwFlags & UI_MOUSE_LBCLICK)) { SetState(UI_STATE_COMMON_MOVE); dwRet |= UI_MOUSEPROC_DONESOMETHING; @@ -436,7 +436,7 @@ CN3UIBase * CN3UIBase::GetChildByID(const std::string & szID) { CN3UIBase * pChild = (*itor); // if(pChild->m_szID == szID) return pChild; if (lstrcmpi(pChild->m_szID.c_str(), szID.c_str()) == 0) { - return pChild; // ҹ Ȱ ˻.. + return pChild; // 대소문자 안가리고 검색.. } } return NULL; @@ -448,12 +448,12 @@ void CN3UIBase::SetVisible(bool bVisible) { if (m_pSnd_OpenUI) { m_pSnd_OpenUI->Play(); } - } // Ҹ + } // 여는 소리 else { if (m_pSnd_CloseUI) { m_pSnd_CloseUI->Play(); } - } // ݴ Ҹ + } // 닫는 소리 } m_bVisible = bVisible; if (!m_bVisible) { @@ -490,7 +490,7 @@ void CN3UIBase::SetVisibleWithNoSound(bool bVisible, bool bWork, bool bReFocus) #ifndef _N3TOOL void CN3UIBase::operator=(const CN3UIBase & other) { - Init(NULL); // ϴ θ ʱȭ + Init(NULL); // 일단 부모는 없게 초기화 UIListItorConst it = other.m_Children.begin(); UIListItorConst itEnd = other.m_Children.end(); @@ -518,7 +518,7 @@ void CN3UIBase::operator=(const CN3UIBase & other) { CN3UIStatic * pUINew = new CN3UIStatic(); *pUINew = *((CN3UIStatic *)pOtherChild); pChild = pUINew; - } break; // static (׸ ڰ Ŭ) + } break; // static (배경그림과 글자가 나오는 클래스) case UI_TYPE_PROGRESS: { CN3UIProgress * pUINew = new CN3UIProgress(); *pUINew = *((CN3UIProgress *)pOtherChild); @@ -575,7 +575,7 @@ void CN3UIBase::operator=(const CN3UIBase & other) { #endif } if (pChild) { - pChild->SetParent(this); // θ + pChild->SetParent(this); // 부모 지정 } } @@ -607,20 +607,20 @@ bool CN3UIBase::Save(HANDLE hFile) { CN3BaseFileAccess::Save(hFile); DWORD dwRWC = NULL; - // child + // child 정보 int iCC = m_Children.size(); - WriteFile(hFile, &iCC, sizeof(iCC), &dwRWC, NULL); // Child .... + WriteFile(hFile, &iCC, sizeof(iCC), &dwRWC, NULL); // Child 갯수 ㅆ고..고.. for (UIListReverseItor itor = m_Children.rbegin(); m_Children.rend() != itor; ++itor) - // childaddҶ push_front̹Ƿ Ųٷ ؾ Ѵ. + // childadd할때 push_front이므로 저장할 때 거꾸로 저장해야 한다. { CN3UIBase * pChild = (*itor); eUI_TYPE eUIType = pChild->UIType(); - WriteFile(hFile, &eUIType, sizeof(eUIType), &dwRWC, NULL); // UI Type .. + WriteFile(hFile, &eUIType, sizeof(eUIType), &dwRWC, NULL); // UI Type 쓰고.. pChild->Save(hFile); } - // base + // base 정보 int iIDLen = 0; iIDLen = m_szID.size(); WriteFile(hFile, &iIDLen, sizeof(iIDLen), &dwRWC, NULL); // id length @@ -633,7 +633,7 @@ bool CN3UIBase::Save(HANDLE hFile) { WriteFile(hFile, &m_dwReserved, sizeof(m_dwReserved), &dwRWC, NULL); // m_dwReserved int iTooltipLen = m_szToolTip.size(); - WriteFile(hFile, &iTooltipLen, sizeof(iTooltipLen), &dwRWC, NULL); // tooltipڿ + WriteFile(hFile, &iTooltipLen, sizeof(iTooltipLen), &dwRWC, NULL); // tooltip문자열 길이 if (iTooltipLen > 0) { WriteFile(hFile, m_szToolTip.c_str(), iTooltipLen, &dwRWC, NULL); } @@ -642,7 +642,7 @@ bool CN3UIBase::Save(HANDLE hFile) { if (m_pSnd_OpenUI) { iSndFNLen = m_pSnd_OpenUI->m_szFileName.size(); } - WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwRWC, NULL); // ڿ + WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwRWC, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen > 0) { WriteFile(hFile, m_pSnd_OpenUI->m_szFileName.c_str(), iSndFNLen, &dwRWC, NULL); } @@ -651,7 +651,7 @@ bool CN3UIBase::Save(HANDLE hFile) { if (m_pSnd_CloseUI) { iSndFNLen = m_pSnd_CloseUI->m_szFileName.size(); } - WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwRWC, NULL); // ڿ + WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwRWC, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen > 0) { WriteFile(hFile, m_pSnd_CloseUI->m_szFileName.c_str(), iSndFNLen, &dwRWC, NULL); } @@ -660,7 +660,7 @@ bool CN3UIBase::Save(HANDLE hFile) { } void CN3UIBase::ChangeImagePath(const std::string & szPathOld, const std::string & szPathNew) { - // child + // child 정보 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); pChild->ChangeImagePath(szPathOld, szPathNew); @@ -668,7 +668,7 @@ void CN3UIBase::ChangeImagePath(const std::string & szPathOld, const std::string } void CN3UIBase::ChangeFont(const std::string & szFont) { - // child + // child 정보 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); pChild->ChangeFont(szFont); @@ -676,7 +676,7 @@ void CN3UIBase::ChangeFont(const std::string & szFont) { } void CN3UIBase::GatherImageFileName(std::set & setImgFile) { - // child + // child 정보 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); pChild->GatherImageFileName(setImgFile); @@ -722,7 +722,7 @@ void CN3UIBase::ResizeAutomaticalyByChild() { } // this->SetRegion(rcCur); m_rcRegion = - rcCur; // SetRegion ع child ٲ 찡 Ƿ ٲٱ ִ´. + rcCur; // SetRegion을 해버리면 child의 영역을 바꿔버리는 경우가 있으므로 내 영역만 바꾸기위해 직접 넣는다. } int CN3UIBase::IsMyChild(CN3UIBase * pUI) { @@ -840,15 +840,15 @@ bool CN3UIBase::MoveToUpper(CN3UIBase * pChild) { } void CN3UIBase::ArrangeZOrder() { - // image ׸ ǹǷ child list ڷ . - // ֳϸ ڿ ִ° ׷Ƿ + // 보통 image가 배경그림이 되므로 child list에서 맨 뒤로 보낸다. + // 왜냐하면 맨 뒤에 있는것이 맨 먼저 그려지므로 UIList tempList; UIListItor itor; for (itor = m_Children.begin(); m_Children.end() != itor;) { CN3UIBase * pChild = (*itor); if (UI_TYPE_IMAGE == pChild->UIType()) { - itor = m_Children.erase(itor); // ġ - tempList.push_back(pChild); // ӽ ۿ + itor = m_Children.erase(itor); // 현재 위치에서 지우고 + tempList.push_back(pChild); // 임시 버퍼에 저장 } else { ++itor; } @@ -856,13 +856,13 @@ void CN3UIBase::ArrangeZOrder() { for (itor = tempList.begin(); tempList.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); - m_Children.push_back(pChild); // child list ڿ ֱ + m_Children.push_back(pChild); // child list맨 뒤에 넣기 } tempList.clear(); } void CN3UIBase::operator=(const CN3UIBase & other) { - Init(NULL); // ϴ θ ʱȭ + Init(NULL); // 일단 부모는 없게 초기화 UIListItorConst it = other.m_Children.begin(); UIListItorConst itEnd = other.m_Children.end(); @@ -890,7 +890,7 @@ void CN3UIBase::operator=(const CN3UIBase & other) { CN3UIStatic * pUINew = new CN3UIStatic(); *pUINew = *((CN3UIStatic *)pOtherChild); pChild = pUINew; - } break; // static (׸ ڰ Ŭ) + } break; // static (배경그림과 글자가 나오는 클래스) case UI_TYPE_PROGRESS: { CN3UIProgress * pUINew = new CN3UIProgress(); *pUINew = *((CN3UIProgress *)pOtherChild); @@ -947,7 +947,7 @@ void CN3UIBase::operator=(const CN3UIBase & other) { #endif } if (pChild) { - pChild->SetParent(this); // θ + pChild->SetParent(this); // 부모 지정 } } @@ -973,7 +973,7 @@ void CN3UIBase::SetSndOpen(const std::string & strFileName) { } CN3BaseFileAccess tmpBase; - tmpBase.FileNameSet(strFileName); // Baseο ؼ θ Ѱش. + tmpBase.FileNameSet(strFileName); // Base경로에 대해서 상대적 경로를 넘겨준다. SetCurrentDirectory(tmpBase.PathGet().c_str()); m_pSnd_OpenUI = s_SndMgr.CreateObj(tmpBase.FileName(), SNDTYPE_2D); @@ -986,7 +986,7 @@ void CN3UIBase::SetSndClose(const std::string & strFileName) { } CN3BaseFileAccess tmpBase; - tmpBase.FileNameSet(strFileName); // Baseο ؼ θ Ѱش. + tmpBase.FileNameSet(strFileName); // Base경로에 대해서 상대적 경로를 넘겨준다. SetCurrentDirectory(tmpBase.PathGet().c_str()); m_pSnd_CloseUI = s_SndMgr.CreateObj(tmpBase.FileName(), SNDTYPE_2D); diff --git a/src/engine/N3Base/N3UIBase.h b/src/engine/N3Base/N3UIBase.h index cc05b0c2..21ab29bc 100644 --- a/src/engine/N3Base/N3UIBase.h +++ b/src/engine/N3Base/N3UIBase.h @@ -37,9 +37,9 @@ class CN3UIBase : public CN3BaseFileAccess { //friend class CN3IME; #ifdef _N3TOOL friend class CN3UIBase; - friend class CHierarchyView; // child list ϱ ؼ. - friend class CPropertyView; // ϱ ؼ - friend class CUIEView; // child list ϱ ؼ. + friend class CHierarchyView; // 툴에서 child list를 접근하기 위해서. + friend class CPropertyView; // 툴에서 각 변수들을 접근하기 위해서 + friend class CUIEView; // 툴에서 child list를 접근하기 위해서. #endif public: @@ -51,12 +51,12 @@ class CN3UIBase : public CN3BaseFileAccess { static CN3UITooltip * s_pTooltipCtrl; // tool tip - CN3UIBase * m_pChildUI; // UI μ ƴ϶ ٸ UI ڽ ´.. + CN3UIBase * m_pChildUI; // UI 부속이 아니라 다른 UI를 자식으로 갖는다.. CN3UIBase * m_pParentUI; int16_t m_sUIVersion; protected: - static std::string s_szStringTmp; // ӽ ڿ.. ͸ ѱ ؼ̴.. + static std::string s_szStringTmp; // 임시 문자열.. 포인터를 넘기기 위해서이다.. int m_iChildID; CN3UIBase * m_pParent; // parent pointer @@ -64,17 +64,17 @@ class CN3UIBase : public CN3BaseFileAccess { eUI_TYPE m_eType; // UI Type - button, image ..... eUI_STATE m_eState; // UI state DWORD m_dwStyle; // style - DWORD m_dwReserved; // Ÿ ӽ÷ ְ ȴ. + DWORD m_dwReserved; // 기타 임시로 넣고 싶은 정보를 넣으면 된다. - RECT m_rcRegion; // UI - screen coordinates (screen : main window client area) : θ ǥ ƴϴ. + RECT m_rcRegion; // UI - screen coordinates (screen : main window client area) 중의 : 부모에 대한 상대좌표가 아니다. RECT - m_rcMovable; // UI 巡 Ͽ ̰ ִ - (screen : main window client area) ~~~~~~~ + m_rcMovable; // UI를 드래그 하여 움직이게 할 수 있는 영역 - (screen : main window client area) ~~~~~~~ - bool m_bVisible; // ȭ鿡 ̴° (θ ڽĵ render ʴ´.) - CN3SndObj * m_pSnd_OpenUI; // UI ȭ鿡 ̴ Ҹ - CN3SndObj * m_pSnd_CloseUI; // UI ȭ鿡 Ҹ + bool m_bVisible; // 화면에 보이는가 (부모가 보이지 않으면 자식들은 render 하지 않는다.) + CN3SndObj * m_pSnd_OpenUI; // UI가 화면에 보이는 순간 내는 소리 + CN3SndObj * m_pSnd_CloseUI; // UI가 화면에서 사라지는 순간 내는 소리 - static CN3UIEdit * s_pFocusedEdit; // Ŀ ִ Edit, NULL̸ ƹ Ŀ ʴ. + static CN3UIEdit * s_pFocusedEdit; // 현재 포커스를 가지고 있는 Edit, NULL이면 아무도 포커스를 가지고 있지 않다. public: CN3UIBase(); @@ -101,22 +101,22 @@ class CN3UIBase : public CN3BaseFileAccess { public: bool IsIn(int x, int y); void AddChild(CN3UIBase * pChild) { m_Children.push_front(pChild); } - void RemoveChild(CN3UIBase * pChild); // ڽ Ʈ ͸ delete ʴ´. - void SetParent(CN3UIBase * pParent); // θ ٲ۴. + void RemoveChild(CN3UIBase * pChild); // 자식 리스트에서 포인터만 없어지고 실제로 delete 되지는 않는다. + void SetParent(CN3UIBase * pParent); // 부모를 바꾼다. int GetWidth() { return m_rcRegion.right - m_rcRegion.left; } int GetHeight() { return m_rcRegion.bottom - m_rcRegion.top; } POINT GetPos() const; virtual void SetPos(int x, - int y); // ġ (chilren ġ ٲپش.) MoveOffsetԼ θ. + int y); // 위치 지정(chilren의 위치도 같이 바꾸어준다.) 내부적으로 MoveOffset함수를 부른다. void - SetPosCenter(); // ȭ  ߾ش..(chilren ġ ٲپش.) MoveOffsetԼ θ. + SetPosCenter(); // 화면 정가운데로 맞추어준다..(chilren의 위치도 같이 바꾸어준다.) 내부적으로 MoveOffset함수를 부른다. CN3UIBase * GetChildByID(const std::string & szID); - virtual void SetRegion(const RECT & pRect) { m_rcRegion = pRect; } // - virtual BOOL MoveOffset(int iOffsetX, int iOffsetY); // offsetŭ ̵ش.(region, children, move rect ̵) - virtual void SetSize(int iWidth, int iHeight); // ũ + virtual void SetRegion(const RECT & pRect) { m_rcRegion = pRect; } // 영역 지정 + virtual BOOL MoveOffset(int iOffsetX, int iOffsetY); // offset만큼 이동해준다.(region, children, move rect 이동) + virtual void SetSize(int iWidth, int iHeight); // 크기 지정 virtual void SetState(eUI_STATE eState) { m_eState = eState; } - virtual void SetStyle(DWORD dwStyle) { m_dwStyle = dwStyle; } // style + virtual void SetStyle(DWORD dwStyle) { m_dwStyle = dwStyle; } // style지정 virtual void SetVisible(bool bVisible); virtual void SetVisibleWithNoSound(bool bVisible, bool bWork = false, bool bReFocus = false); @@ -124,17 +124,17 @@ class CN3UIBase : public CN3BaseFileAccess { virtual void CallBackProc(int iID, DWORD dwFlag); virtual void ShowWindow(int iID = -1, CN3UIBase * pParent = NULL); virtual bool Load(HANDLE hFile); - virtual bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); // ޽ ޴´.. , msg + virtual bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); // 메시지를 받는다.. 보낸놈, msg virtual DWORD MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptOld); virtual void Tick(); virtual void Render(); - virtual void Release(); // ڽ ͱ delete Ѵ.. + virtual void Release(); // 자식 포인터까지 delete 한다.. virtual void Init(CN3UIBase * pParent); virtual bool OnKeyPress(int iKey) { return false; } virtual bool OnKeyPressed(int iKey) { return false; } - static bool EnableTooltip(const std::string & szFN); // tooltip UI ʱȭ ش. - static void DestroyTooltip(); // tooltip ui õ ش. + static bool EnableTooltip(const std::string & szFN); // tooltip UI를 초기화 해준다. + static void DestroyTooltip(); // tooltip ui에 관련된 것을 해제해준다. int GetChildrenCount() { return m_Children.size(); } CN3UIBase * GetChildByIndex(int iIndex) { diff --git a/src/engine/N3Base/N3UIButton.cpp b/src/engine/N3Base/N3UIButton.cpp index a2c40288..080382e1 100644 --- a/src/engine/N3Base/N3UIButton.cpp +++ b/src/engine/N3Base/N3UIButton.cpp @@ -57,7 +57,7 @@ BOOL CN3UIButton::MoveOffset(int iOffsetX, int iOffsetY) { if (FALSE == CN3UIBase::MoveOffset(iOffsetX, iOffsetY)) { return FALSE; } - // click + // click 영역 m_rcClick.left += iOffsetX; m_rcClick.top += iOffsetY; m_rcClick.right += iOffsetX; @@ -98,13 +98,13 @@ void CN3UIButton::Render() { for (UIListReverseItor itor = m_Children.rbegin(); m_Children.rend() != itor; ++itor) { CN3UIBase * pChild = (*itor); int i; - for (i = 0; i < NUM_BTN_STATE; i++) { // ư Ұ ƴ .. + for (i = 0; i < NUM_BTN_STATE; i++) { // 버튼의 구성 요소가 아닌지 보고.. if (pChild == m_ImageRef[i]) { break; } } if (i >= NUM_BTN_STATE) { - pChild->Render(); // ư ϵ尡 ƴϸ .. + pChild->Render(); // 버튼 차일드가 아니면 렌더링.. } } } @@ -121,135 +121,135 @@ DWORD CN3UIButton::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & p } #endif - if (false == IsIn(ptCur.x, ptCur.y)) // ̸ + if (false == IsIn(ptCur.x, ptCur.y)) // 영역 밖이면 { if (false == IsIn(ptOld.x, ptOld.y)) { - return dwRet; // pointer ̾ ׳ + return dwRet; // 이전 pointer도 영역 밖이었으면 그냥 리턴 } - dwRet |= UI_MOUSEPROC_PREVINREGION; // 콺 ǥ ̾. + dwRet |= UI_MOUSEPROC_PREVINREGION; // 이전 마우스 좌표는 영역 안이었다. if (UI_STATE_BUTTON_DISABLE == m_eState) { - return dwRet; // disable̸ ׳ + return dwRet; // disable이면 그냥 리턴 } - if (UISTYLE_BTN_NORMAL & m_dwStyle) // normal ư ̸ + if (UISTYLE_BTN_NORMAL & m_dwStyle) // normal 버튼 이면 { - SetState(UI_STATE_BUTTON_NORMAL); // normal · - } else if (UISTYLE_BTN_CHECK & m_dwStyle) // check ư ̸ + SetState(UI_STATE_BUTTON_NORMAL); // normal 상태로 + } else if (UISTYLE_BTN_CHECK & m_dwStyle) // check 버튼 이면 { - if (UI_STATE_BUTTON_DOWN_2CHECKUP == m_eState) { // upŰ - SetState(UI_STATE_BUTTON_DOWN); // down · - } else if (UI_STATE_BUTTON_DOWN_2CHECKDOWN == m_eState || // downŰ Ǵ - UI_STATE_BUTTON_ON == m_eState) { // on - SetState(UI_STATE_BUTTON_NORMAL); // normal · + if (UI_STATE_BUTTON_DOWN_2CHECKUP == m_eState) { // up시키려다 만 경우 + SetState(UI_STATE_BUTTON_DOWN); // down 상태로 + } else if (UI_STATE_BUTTON_DOWN_2CHECKDOWN == m_eState || // down시키려다 만 경우 또는 + UI_STATE_BUTTON_ON == m_eState) { // on 상태일 경우 + SetState(UI_STATE_BUTTON_NORMAL); // normal 상태로 } } - return dwRet; // ̹Ƿ ̻ ó ʴ´. + return dwRet; // 영역 밖이므로 더이상 처리 하지 않는다. } - dwRet |= UI_MOUSEPROC_INREGION; // ̹ 콺 ǥ ̴ + dwRet |= UI_MOUSEPROC_INREGION; // 이번 마우스 좌표는 영역 안이다 if (UI_STATE_BUTTON_DISABLE == m_eState) { - return dwRet; // disable̸ ׳ + return dwRet; // disable이면 그냥 리턴 } - // Ŭ ̸ + // 클릭 영역 밖이면 if (FALSE == PtInRect(&m_rcClick, ptCur)) { - if (UISTYLE_BTN_NORMAL & m_dwStyle) // normal ư ̸ + if (UISTYLE_BTN_NORMAL & m_dwStyle) // normal 버튼 이면 { - SetState(UI_STATE_BUTTON_NORMAL); // normal · - } else if (UISTYLE_BTN_CHECK & m_dwStyle) // check ư ̸ + SetState(UI_STATE_BUTTON_NORMAL); // normal 상태로 + } else if (UISTYLE_BTN_CHECK & m_dwStyle) // check 버튼 이면 { - if (UI_STATE_BUTTON_DOWN_2CHECKUP == m_eState) { // upŰ - SetState(UI_STATE_BUTTON_DOWN); // down · - } else if (UI_STATE_BUTTON_DOWN_2CHECKDOWN == m_eState || // downŰ Ǵ - UI_STATE_BUTTON_ON == m_eState) { // on - SetState(UI_STATE_BUTTON_NORMAL); // normal · + if (UI_STATE_BUTTON_DOWN_2CHECKUP == m_eState) { // up시키려다 만 경우 + SetState(UI_STATE_BUTTON_DOWN); // down 상태로 + } else if (UI_STATE_BUTTON_DOWN_2CHECKDOWN == m_eState || // down시키려다 만 경우 또는 + UI_STATE_BUTTON_ON == m_eState) { // on 상태일 경우 + SetState(UI_STATE_BUTTON_NORMAL); // normal 상태로 } } return dwRet; } - // Ʒ Ŭ ϶.. - // normal ư ̸ + // 아래는 클릭 영역 안일때.. + // normal 버튼 이면 if (UISTYLE_BTN_NORMAL & m_dwStyle) { - if (dwFlags & UI_MOUSE_LBCLICK) // ʹư + if (dwFlags & UI_MOUSE_LBCLICK) // 왼쪽버튼 눌르는 순간 { - SetState(UI_STATE_BUTTON_DOWN); // · .. + SetState(UI_STATE_BUTTON_DOWN); // 누른 상태로 만들고.. if (m_pSnd_Click) { - m_pSnd_Click->Play(); // 尡 play ϱ + m_pSnd_Click->Play(); // 사운드가 있으면 play 하기 } dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; - } else if (dwFlags & UI_MOUSE_LBCLICKED) // ʹư + } else if (dwFlags & UI_MOUSE_LBCLICKED) // 왼쪽버튼을 떼는 순간 { - if (m_pParent && UI_STATE_BUTTON_DOWN == m_eState) // ° ư Down ̸ + if (m_pParent && UI_STATE_BUTTON_DOWN == m_eState) // 이전 상태가 버튼을 Down 상태이면 { - SetState(UI_STATE_BUTTON_ON); // ư On · .. - m_pParent->ReceiveMessage(this, UIMSG_BUTTON_CLICK); // θ𿡰 ư Ŭ .. + SetState(UI_STATE_BUTTON_ON); // 버튼을 On 상태로 만든다.. + m_pParent->ReceiveMessage(this, UIMSG_BUTTON_CLICK); // 부모에게 버튼 클릭 통지.. } dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; - } else if (UI_STATE_BUTTON_NORMAL == m_eState) // normal̸ on·.. + } else if (UI_STATE_BUTTON_NORMAL == m_eState) // normal상태이면 on상태로.. { - SetState(UI_STATE_BUTTON_ON); // On · .. + SetState(UI_STATE_BUTTON_ON); // On 상태로 만들고.. if (m_pSnd_On) { - m_pSnd_On->Play(); // 尡 play ϱ + m_pSnd_On->Play(); // 사운드가 있으면 play 하기 } dwRet |= CN3UIBase::MouseProc(dwFlags, ptCur, ptOld); return dwRet; - // UI_MOUSEPROC_DONESOMETHING ȵȴ.(콺 Ͱ ư ٸ ư Űܰ - // ư ° ̻ ϱ ) + // UI_MOUSEPROC_DONESOMETHING를 넣으면 안된다.(마우스 포인터가 버튼에서 다른 버튼으로 빠르게 옮겨갈때 + // 이전 버튼의 상태가 이상해지는 것을 방지하기 위해) } } - // üũ ư̸ + // 체크 버튼이면 else if (UISTYLE_BTN_CHECK & m_dwStyle) { - if (dwFlags & UI_MOUSE_LBCLICK) // ʹư + if (dwFlags & UI_MOUSE_LBCLICK) // 왼쪽버튼 눌르는 순간 { if (UI_STATE_BUTTON_NORMAL == m_eState || UI_STATE_BUTTON_ON == m_eState) { - SetState(UI_STATE_BUTTON_DOWN_2CHECKDOWN); // ӽ÷ (DOWN_2CHECKDOWN) .. + SetState(UI_STATE_BUTTON_DOWN_2CHECKDOWN); // 임시로 누른 상태(DOWN_2CHECKDOWN)로 만들고.. if (m_pSnd_Click) { - m_pSnd_Click->Play(); // 尡 play ϱ + m_pSnd_Click->Play(); // 사운드가 있으면 play 하기 } dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } else if (UI_STATE_BUTTON_DOWN == m_eState) { - SetState(UI_STATE_BUTTON_DOWN_2CHECKUP); // ӽ÷ (DOWN_2CHECKUP) .. + SetState(UI_STATE_BUTTON_DOWN_2CHECKUP); // 임시로 누른 상태(DOWN_2CHECKUP)로 만들고.. if (m_pSnd_Click) { - m_pSnd_Click->Play(); // 尡 play ϱ + m_pSnd_Click->Play(); // 사운드가 있으면 play 하기 } dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } - } else if (dwFlags & UI_MOUSE_LBCLICKED) // ʹư + } else if (dwFlags & UI_MOUSE_LBCLICKED) // 왼쪽버튼 떼는 순간 { - if (UI_STATE_BUTTON_DOWN_2CHECKDOWN == m_eState) // ° 2CHECKDOWN ̸ + if (UI_STATE_BUTTON_DOWN_2CHECKDOWN == m_eState) // 이전 상태가 2CHECKDOWN 상태이면 { - SetState(UI_STATE_BUTTON_DOWN); // down · + SetState(UI_STATE_BUTTON_DOWN); // down 상태로 만들기 if (m_pParent) { - m_pParent->ReceiveMessage(this, UIMSG_BUTTON_CLICK); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_BUTTON_CLICK); // 부모에게 버튼 클릭 통지.. } dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; - } else if (UI_STATE_BUTTON_DOWN_2CHECKUP == m_eState) // ° 2CHECKUP ̸ + } else if (UI_STATE_BUTTON_DOWN_2CHECKUP == m_eState) // 전의 상태가 2CHECKUP 상태이면 { - SetState(UI_STATE_BUTTON_ON); // On · + SetState(UI_STATE_BUTTON_ON); // On 상태로 만들기 if (m_pParent) { - m_pParent->ReceiveMessage(this, UIMSG_BUTTON_CLICK); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_BUTTON_CLICK); // 부모에게 버튼 클릭 통지.. } dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } - } else if (UI_STATE_BUTTON_NORMAL == m_eState) // normal̸ on·.. + } else if (UI_STATE_BUTTON_NORMAL == m_eState) // normal상태이면 on상태로.. { - SetState(UI_STATE_BUTTON_ON); // On · .. + SetState(UI_STATE_BUTTON_ON); // On 상태로 만들고.. if (m_pSnd_On) { - m_pSnd_On->Play(); // 尡 play ϱ + m_pSnd_On->Play(); // 사운드가 있으면 play 하기 } dwRet |= CN3UIBase::MouseProc(dwFlags, ptCur, ptOld); return dwRet; - // UI_MOUSEPROC_DONESOMETHING ȵȴ.(콺 Ͱ ư ٸ ư Űܰ - // ư ° ̻ ϱ ) + // UI_MOUSEPROC_DONESOMETHING를 넣으면 안된다.(마우스 포인터가 버튼에서 다른 버튼으로 빠르게 옮겨갈때 + // 이전 버튼의 상태가 이상해지는 것을 방지하기 위해) } } dwRet |= CN3UIBase::MouseProc(dwFlags, ptCur, ptOld); @@ -262,13 +262,13 @@ bool CN3UIButton::Load(HANDLE hFile) { } DWORD dwNum; - ReadFile(hFile, &m_rcClick, sizeof(m_rcClick), &dwNum, NULL); // click + ReadFile(hFile, &m_rcClick, sizeof(m_rcClick), &dwNum, NULL); // click 영역 - // m_ImageRef ϱ + // m_ImageRef 설정하기 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); if (UI_TYPE_IMAGE != pChild->UIType()) { - continue; // image 󳻱 + continue; // image만 골라내기 } int iBtnState = (int)(pChild->GetReserved()); if (iBtnState < NUM_BTN_STATE) { @@ -276,9 +276,9 @@ bool CN3UIButton::Load(HANDLE hFile) { } } - // uif Ϸ ε ϴ κ + // 이전 uif파일을 컨버팅 하려면 사운드 로드 하는 부분 막기 int iSndFNLen = 0; - ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // ڿ + ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen > 0) { std::vector buffer(iSndFNLen, 0); ReadFile(hFile, &buffer[0], iSndFNLen, &dwNum, NULL); @@ -287,7 +287,7 @@ bool CN3UIButton::Load(HANDLE hFile) { m_pSnd_On = s_SndMgr.CreateObj(std::string(buffer.begin(), buffer.end()), SNDTYPE_2D); } - ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // ڿ + ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen > 0) { std::vector buffer(iSndFNLen, 0); ReadFile(hFile, &buffer[0], iSndFNLen, &dwNum, NULL); @@ -303,15 +303,15 @@ bool CN3UIButton::Load(HANDLE hFile) { void CN3UIButton::operator=(const CN3UIButton & other) { CN3UIBase::operator=(other); - m_rcClick = other.m_rcClick; // Ŭ - SetSndOn(other.GetSndFName_On()); // - SetSndClick(other.GetSndFName_Click()); // + m_rcClick = other.m_rcClick; // 클릭 영역 + SetSndOn(other.GetSndFName_On()); // 사운드 + SetSndClick(other.GetSndFName_Click()); // 사운드 - // m_ImageRef ϱ + // m_ImageRef 설정하기 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); if (UI_TYPE_IMAGE != pChild->UIType()) { - continue; // image 󳻱 + continue; // image만 골라내기 } int iBtnState = (int)(pChild->GetReserved()); if (iBtnState < NUM_BTN_STATE) { @@ -325,13 +325,13 @@ bool CN3UIButton::Save(HANDLE hFile) { return false; } DWORD dwNum; - WriteFile(hFile, &m_rcClick, sizeof(m_rcClick), &dwNum, NULL); // click + WriteFile(hFile, &m_rcClick, sizeof(m_rcClick), &dwNum, NULL); // click 영역 int iSndFNLen = 0; if (m_pSnd_On) { iSndFNLen = m_pSnd_On->m_szFileName.size(); } - WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // ڿ + WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen > 0) { WriteFile(hFile, m_pSnd_On->m_szFileName.c_str(), iSndFNLen, &dwNum, NULL); } @@ -340,7 +340,7 @@ bool CN3UIButton::Save(HANDLE hFile) { if (m_pSnd_Click) { iSndFNLen = m_pSnd_Click->m_szFileName.size(); } - WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // ڿ + WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen > 0) { WriteFile(hFile, m_pSnd_Click->m_szFileName.c_str(), iSndFNLen, &dwNum, NULL); } @@ -348,15 +348,15 @@ bool CN3UIButton::Save(HANDLE hFile) { return true; } -// ϱ Լ : n3uiImage Ѵ. +// 툴에서 사용하기 위한 함수 : n3uiImage를 생성한다. void CN3UIButton::CreateImages() { for (int i = 0; i < NUM_BTN_STATE; ++i) { - __ASSERT(NULL == m_ImageRef[i], "̹ ̹ ҴǾ ־"); + __ASSERT(NULL == m_ImageRef[i], "이미지가 이미 할당되어 있어여"); m_ImageRef[i] = new CN3UIImage(); m_ImageRef[i]->Init(this); m_ImageRef[i]->SetRegion(m_rcRegion); - m_ImageRef[i]->SetReserved(i); // ȣ(eBTN_STATE) Ҵ. + m_ImageRef[i]->SetReserved(i); // 상태 번호(eBTN_STATE) 할당. } } @@ -367,7 +367,7 @@ void CN3UIButton::SetSndOn(const std::string & strFileName) { } CN3BaseFileAccess tmpBase; - tmpBase.FileNameSet(strFileName); // Baseο ؼ θ Ѱش. + tmpBase.FileNameSet(strFileName); // Base경로에 대해서 상대적 경로를 넘겨준다. SetCurrentDirectory(tmpBase.PathGet().c_str()); m_pSnd_On = s_SndMgr.CreateObj(tmpBase.FileName(), SNDTYPE_2D); @@ -380,7 +380,7 @@ void CN3UIButton::SetSndClick(const std::string & strFileName) { } CN3BaseFileAccess tmpBase; - tmpBase.FileNameSet(strFileName); // Baseο ؼ θ Ѱش. + tmpBase.FileNameSet(strFileName); // Base경로에 대해서 상대적 경로를 넘겨준다. SetCurrentDirectory(tmpBase.PathGet().c_str()); m_pSnd_Click = s_SndMgr.CreateObj(tmpBase.FileName(), SNDTYPE_2D); diff --git a/src/engine/N3Base/N3UIButton.h b/src/engine/N3Base/N3UIButton.h index 94336a69..099a5f8f 100644 --- a/src/engine/N3Base/N3UIButton.h +++ b/src/engine/N3Base/N3UIButton.h @@ -26,11 +26,11 @@ class CN3UIButton : public CN3UIBase { protected: CN3UIImage * m_ImageRef - [NUM_BTN_STATE]; // ư º image ( children list ϹǷ Ѵ.) - RECT m_rcClick; // clickǴ + [NUM_BTN_STATE]; // 버튼의 각 상태별 image의 참조 포인터(참조인 이유는 children list로 관리하므로 참조만 한다.) + RECT m_rcClick; // click되는 영역 - CN3SndObj * m_pSnd_On; // ư 콺 ö󰡴 Ҹ - CN3SndObj * m_pSnd_Click; // ư Ҹ + CN3SndObj * m_pSnd_On; // 버튼 위에 마우스가 올라가는 순간 내는 소리 + CN3SndObj * m_pSnd_Click; // 버튼이 눌리는 순간 내는 소리 // Operations public: @@ -43,7 +43,7 @@ class CN3UIButton : public CN3UIBase { virtual void Render(); #ifdef _N3TOOL - // ϱ Լ + // 툴에서 사용하기 위한 함수 public: virtual void operator=(const CN3UIButton & other); virtual bool Save(HANDLE hFile); diff --git a/src/engine/N3Base/N3UIDef.h b/src/engine/N3Base/N3UIDef.h index b083077f..dfcbff39 100644 --- a/src/engine/N3Base/N3UIDef.h +++ b/src/engine/N3Base/N3UIDef.h @@ -15,7 +15,7 @@ const float UI_DEFAULT_RHW = 1.0f; enum eUI_TYPE { UI_TYPE_BASE = 0, // none UI_TYPE_BUTTON, // button - UI_TYPE_STATIC, // static (׸ ڰ Ŭ) + UI_TYPE_STATIC, // static (배경그림과 글자가 나오는 클래스) UI_TYPE_PROGRESS, // progress UI_TYPE_IMAGE, // image UI_TYPE_SCROLLBAR, // scroll bar @@ -31,7 +31,7 @@ enum eUI_TYPE { UI_TYPE_ICON, // icon UI_TYPE_ICON_MANAGER, // icon manager.. - // repent + // repent 전용 UI_TYPE_ICONSLOT, // icon slot UI_TYPE_LIST, // Text List... }; @@ -39,62 +39,62 @@ enum eUI_TYPE { // State enum eUI_STATE { UI_STATE_COMMON_NONE = - 0, // ƹ ׳ Ȥ 찡 - UI_STATE_COMMON_MOVE, // ϴ - UI_STATE_BUTTON_NORMAL, // ƹ ׳ .. - UI_STATE_BUTTON_DOWN, // ư - UI_STATE_BUTTON_DOWN_2CHECKDOWN, // ư ӽ (üũ ư , ¥ ° ƴϴ) down· - UI_STATE_BUTTON_DOWN_2CHECKUP, // ư ӽ (üũ ư , ¥ ° ƴϴ) normal· - UI_STATE_BUTTON_ON, // ư .. - UI_STATE_BUTTON_DISABLE, // ư Ȱȭ - UI_STATE_BUTTON_CLICK, // ư ȴ - Click. - UI_STATE_SCROLLBAR_NULL, // ƹµ ƴ.. - UI_STATE_SCROLLBAR_TOPBUTTON_DOWN, // ø ư . - UI_STATE_SCROLLBAR_BOTTOMBUTTON_DOWN, // Ʒ ư . + 0, // 아무렇지도 않은 그냥 평범한 상태 혹은 아이콘을 가진 윈도우가 아이콘을 선택하지 않은 상태 + UI_STATE_COMMON_MOVE, // 움직여야 하는 + UI_STATE_BUTTON_NORMAL, // 아무렇지도 않은 그냥 평범한 상태.. + UI_STATE_BUTTON_DOWN, // 버튼이 눌린상태 + UI_STATE_BUTTON_DOWN_2CHECKDOWN, // 버튼이 임시적으로 눌린 상태(체크 버튼시 사용, 진짜로 눌린 상태가 아니다) 다음에 down상태로 + UI_STATE_BUTTON_DOWN_2CHECKUP, // 버튼이 임시적으로 눌린 상태(체크 버튼시 사용, 진짜로 눌린 상태가 아니다) 다음에 normal상태로 + UI_STATE_BUTTON_ON, // 버튼이 켜진 상태.. + UI_STATE_BUTTON_DISABLE, // 버튼이 비활성화된 상태 + UI_STATE_BUTTON_CLICK, // 버튼이 눌렸다 떨어진 상태 - Click. + UI_STATE_SCROLLBAR_NULL, // 아무상태도 아님.. + UI_STATE_SCROLLBAR_TOPBUTTON_DOWN, // 위로 올리는 버튼이 눌린 상태. + UI_STATE_SCROLLBAR_BOTTOMBUTTON_DOWN, // 아래로 내리는 버튼이 눌린상태. UI_STATE_EDTCTRL_ACTIVE, UI_STATE_EDTCTRL_UNACTIVE, - UI_STATE_TRACKBAR_THUMBDRAG, // Thumb 巡 ϴ ̴. - UI_STATE_LIST_ENABLE, // List - UI_STATE_LIST_DISABLE, // List Ұ - - // ecli666 ( .. ü ƴϴ..) - // UI_STATE_ICON_NONE, // 찡 .. - UI_STATE_ICON_MOVING, // 찡 ̰ ִ .. - // UI_STATE_ICON_SELECTED, // 찡 .. - UI_STATE_ICON_WAIT_FROM_SERVER, // 찡 ű ٸ .. - UI_STATE_ICON_DO_SUCCESS, // 찡 .. - UI_STATE_ICON_DO_FAIL, // 찡 и .. - UI_STATE_ICON_DO_RECOVERY, // 찡 и ޾ ؾ ϴ .. + UI_STATE_TRACKBAR_THUMBDRAG, // Thumb를 드래그 하는 중이다. + UI_STATE_LIST_ENABLE, // List 에서 선택 가능 + UI_STATE_LIST_DISABLE, // List 에서 선택 불가능 + + // ecli666 (아이콘을 가진 윈도우.. 아이콘 자체는 아니다..) + // UI_STATE_ICON_NONE, // 아이콘을 가진 윈도우가 아이콘을 선택하지 않은 상태.. + UI_STATE_ICON_MOVING, // 아이콘을 가진 윈도우가 아이콘을 움직이고 있는 상태.. + // UI_STATE_ICON_SELECTED, // 아이콘을 가진 윈도우가 아이콘을 선택한 상태.. + UI_STATE_ICON_WAIT_FROM_SERVER, // 아이콘을 가진 윈도우가 아이콘을 옮기고 서버로 부터 응답을 기다리는 상태.. + UI_STATE_ICON_DO_SUCCESS, // 아이콘을 가진 윈도우가 서버로 부터 성공을 받은 상태.. + UI_STATE_ICON_DO_FAIL, // 아이콘을 가진 윈도우가 서버로 부터 실패를 받은 상태.. + UI_STATE_ICON_DO_RECOVERY, // 아이콘을 가진 윈도우가 서버로 부터 실패를 받아 복구해야 하는 상태.. }; // message -const DWORD UIMSG_BUTTON_CLICK = 0x00000001; // normal ư Ŭ -const DWORD UIMSG_TRACKBAR_POS = 0x00000010; // trackbar pos -const DWORD UIMSG_SCROLLBAR_POS = 0x00000100; // scrollbar pos . -const DWORD UIMSG_EDIT_RETURN = 0x00001000; // Edit enter -const DWORD UIMSG_EDIT_TAB = 0x00002000; // Edit Tab -const DWORD UIMSG_EDIT_ESCAPE = 0x00004000; // Edit esc -const DWORD UIMSG_ICON_DOWN_FIRST = 0x00010000; // Icon 콺 ư ó ٿ.. -const DWORD UIMSG_ICON_DOWN = 0x00020000; // Icon 콺 ư ٿ.. -const DWORD UIMSG_ICON_UP = 0x00040000; // Icon 콺 ư .. -const DWORD UIMSG_ICON_DBLCLK = 0x00080000; // Icon ư Ŭ -const DWORD UIMSG_AREA_DOWN_FIRST = 0x00100000; // Area 콺 ư ó ٿ.. +const DWORD UIMSG_BUTTON_CLICK = 0x00000001; // normal 버튼 클릭 +const DWORD UIMSG_TRACKBAR_POS = 0x00000010; // trackbar의 pos가 변경됨 +const DWORD UIMSG_SCROLLBAR_POS = 0x00000100; // scrollbar의 pos가 변경됨. +const DWORD UIMSG_EDIT_RETURN = 0x00001000; // Edit에서 enter가 들어옴 +const DWORD UIMSG_EDIT_TAB = 0x00002000; // Edit에서 Tab이 들어옴 +const DWORD UIMSG_EDIT_ESCAPE = 0x00004000; // Edit에서 esc이 들어옴 +const DWORD UIMSG_ICON_DOWN_FIRST = 0x00010000; // Icon에 왼쪽 마우스 버튼 처음으로 다운.. +const DWORD UIMSG_ICON_DOWN = 0x00020000; // Icon에 왼쪽 마우스 버튼 다운.. +const DWORD UIMSG_ICON_UP = 0x00040000; // Icon에 왼쪽 마우스 버튼 업.. +const DWORD UIMSG_ICON_DBLCLK = 0x00080000; // Icon에 버튼 더블 클릭 +const DWORD UIMSG_AREA_DOWN_FIRST = 0x00100000; // Area에 왼쪽 마우스 버튼 처음으로 다운.. const DWORD UIMSG_LIST_SELCHANGE = 0x00200000; // List Selection Change.. const DWORD UIMSG_LIST_DBLCLK = 0x00400000; -const DWORD UIMSG_ICON_RDOWN_FIRST = 0x01000000; // Icon 콺 ư ó ٿ.. -const DWORD UIMSG_ICON_RDOWN = 0x02000000; // Icon 콺 ư ٿ.. -const DWORD UIMSG_ICON_RUP = 0x04000000; // Icon 콺 ư .. -const DWORD UIMSG_ICON_RDBLCLK = 0x08000000; // Icon 콺 Ŭ -const DWORD UIMSG_STRING_LCLICK = 0x10000000; // string 콺 Ŭ Ǿ... -const DWORD UIMSG_STRING_LDCLICK = 0x20000000; // string 콺 Ŭ Ǿ... - -// Ʈ ޼ -const DWORD UIMSG_ICONSLOT_LBCLICK = 0x00010000; // icon slot 콺 ư Ŭ -const DWORD UIMSG_ICONSLOT_RBCLICK = 0x00020000; // icon slot 콺 ư Ŭ -const DWORD UIMSG_ICONSLOT_MBCLICK = 0x00040000; // icon slot 콺 ư Ŭ -const DWORD UIMSG_ICONSLOT_MOUSEOVER = 0x00080000; // icon slot 콺 ִ. - -// mouse flag (localinput.h ġؾ Ѵ.) +const DWORD UIMSG_ICON_RDOWN_FIRST = 0x01000000; // Icon에 오른쪽 마우스 버튼 처음으로 다운.. +const DWORD UIMSG_ICON_RDOWN = 0x02000000; // Icon에 오른쪽 마우스 버튼 다운.. +const DWORD UIMSG_ICON_RUP = 0x04000000; // Icon에 오른쪽 마우스 버튼 업.. +const DWORD UIMSG_ICON_RDBLCLK = 0x08000000; // Icon에 오른쪽 마우스 더블 클릭 +const DWORD UIMSG_STRING_LCLICK = 0x10000000; // string에 마우스가 왼쪽 클릭 되었을때... +const DWORD UIMSG_STRING_LDCLICK = 0x20000000; // string에 마우스가 왼쪽 더블 클릭 되었을때... + +// 리펜트용 메세지 +const DWORD UIMSG_ICONSLOT_LBCLICK = 0x00010000; // icon slot에 왼쪽 마우스 버튼 클릭 +const DWORD UIMSG_ICONSLOT_RBCLICK = 0x00020000; // icon slot에 오른쪽 마우스 버튼 클릭 +const DWORD UIMSG_ICONSLOT_MBCLICK = 0x00040000; // icon slot에 왼쪽 마우스 버튼 클릭 +const DWORD UIMSG_ICONSLOT_MOUSEOVER = 0x00080000; // icon slot에 마우스가 걸쳐 있다. + +// mouse flag (localinput.h의 값과 일치해야 한다.) const DWORD UI_MOUSE_LBCLICK = 0x00000001; const DWORD UI_MOUSE_LBCLICKED = 0x00000002; const DWORD UI_MOUSE_LBDOWN = 0x00000004; @@ -109,64 +109,64 @@ const DWORD UI_MOUSE_MBDBLCLK = 0x00000400; const DWORD UI_MOUSE_RBDBLCLK = 0x00000800; // mouse procedure return value flag -const DWORD UI_MOUSEPROC_NONE = 0x00000000; // ƹ ϵ ʾҴ. -const DWORD UI_MOUSEPROC_DONESOMETHING = 0x00000001; // հ ߴ. +const DWORD UI_MOUSEPROC_NONE = 0x00000000; // 아무 일도 하지 않았다. +const DWORD UI_MOUSEPROC_DONESOMETHING = 0x00000001; // 먼가 일을 했다. const DWORD UI_MOUSEPROC_CHILDDONESOMETHING = - 0x00000002; // ڽ հ ߴ.( ÷װ Ǿ ׻ UI_MOUSEPROC_DONESOMETHING Ǿִ.) -const DWORD UI_MOUSEPROC_INREGION = 0x00000004; // ȿ 콺 Ͱ ִ. -const DWORD UI_MOUSEPROC_PREVINREGION = 0x00000008; // ȿ ƽ 콺 Ͱ ־. -const DWORD UI_MOUSEPROC_DIALOGFOCUS = 0x00000010; // dialog Ŀ ޾Ҵ. + 0x00000002; // 자식이 먼가 일을 했다.(이 플래그가 설정되어 있으면 항상 UI_MOUSEPROC_DONESOMETHING도 설정되어있다.) +const DWORD UI_MOUSEPROC_INREGION = 0x00000004; // 영역 안에 마우스 포인터가 있다. +const DWORD UI_MOUSEPROC_PREVINREGION = 0x00000008; // 영역 안에 이전 틱의 마우스 포인터가 있었다. +const DWORD UI_MOUSEPROC_DIALOGFOCUS = 0x00000010; // dialog가 포커스 받았다. // ui_string type -const DWORD UI_STR_TYPE_LINE = 0x00000000; // Ʈ ̱۶ Ƽ.. -const DWORD UI_STR_TYPE_HALIGN = 0x00000001; // Ʈ -const DWORD UI_STR_TYPE_VALIGN = 0x00000002; // Ʈ +const DWORD UI_STR_TYPE_LINE = 0x00000000; // 스트링 라인 설정 싱글라인인지 멀티라인인지.. +const DWORD UI_STR_TYPE_HALIGN = 0x00000001; // 스트링 수평정렬 +const DWORD UI_STR_TYPE_VALIGN = 0x00000002; // 스트링 수직정렬 // ui style const DWORD UISTYLE_NONE = 0x00000000; -const DWORD UISTYLE_ALWAYSTOP = 0x00000001; // ׻ ֻ +const DWORD UISTYLE_ALWAYSTOP = 0x00000001; // 항상 최상위에 const DWORD UISTYLE_MODAL = 0x00000002; // modal dialog -const DWORD UISTYLE_FOCUS_UNABLE = 0x00000004; // Ŀ -const DWORD UISTYLE_SHOW_ME_ALONE = 0x00000008; // ڱ ڽŸ ִ ٸ Ѵٸ.. -const DWORD UISTYLE_HIDE_UNABLE = 0x00000010; // ʴ -const DWORD UISTYLE_USER_MOVE_HIDE = 0x00000020; // ̸ -const DWORD UISTYLE_POS_LEFT = 0x00000040; // ʿ ޸ -const DWORD UISTYLE_POS_RIGHT = 0x00000080; // ʿ ޸ +const DWORD UISTYLE_FOCUS_UNABLE = 0x00000004; // 포커스를 받을수 없는 유아이 +const DWORD UISTYLE_SHOW_ME_ALONE = 0x00000008; // 단지 자기 자신만 열릴수 있는 다른것은 닫혀야한다면.. +const DWORD UISTYLE_HIDE_UNABLE = 0x00000010; // 닫히지 않는 유아이 +const DWORD UISTYLE_USER_MOVE_HIDE = 0x00000020; // 유저가 움직이면 닫히는 유아이 +const DWORD UISTYLE_POS_LEFT = 0x00000040; // 왼쪽에 달린 유아이 +const DWORD UISTYLE_POS_RIGHT = 0x00000080; // 오른쪽에 달린 유아이 // button -const DWORD UISTYLE_BTN_NORMAL = 0x00010000; // Ϲ ư -const DWORD UISTYLE_BTN_CHECK = 0x00020000; // üũ ư(toggleư) +const DWORD UISTYLE_BTN_NORMAL = 0x00010000; // 일반 버튼 +const DWORD UISTYLE_BTN_CHECK = 0x00020000; // 체크 버튼(toggle버튼) // image -const DWORD UISTYLE_IMAGE_ANIMATE = 0x00010000; // ϸ̼ Ǵ ̴̹. +const DWORD UISTYLE_IMAGE_ANIMATE = 0x00010000; // 에니메이션 되는 이미지이다. // string -const DWORD UISTYLE_STRING_MULTILINE = 0x00000000; // ٷ ǥõȴ. -const DWORD UISTYLE_STRING_SINGLELINE = 0x00100000; // ٷθ ǥõȴ. -const DWORD UISTYLE_STRING_ALIGNLEFT = 0x00200000; // (default) -const DWORD UISTYLE_STRING_ALIGNRIGHT = 0x00400000; // (϶) -const DWORD UISTYLE_STRING_ALIGNCENTER = 0x00800000; //  (϶) -const DWORD UISTYLE_STRING_ALIGNTOP = 0x01000000; // (϶, default) -const DWORD UISTYLE_STRING_ALIGNBOTTOM = 0x02000000; // ϴ (϶) -const DWORD UISTYLE_STRING_ALIGNVCENTER = 0x04000000; //  (϶) +const DWORD UISTYLE_STRING_MULTILINE = 0x00000000; // 여러줄로 표시된다. +const DWORD UISTYLE_STRING_SINGLELINE = 0x00100000; // 한줄로만 표시된다. +const DWORD UISTYLE_STRING_ALIGNLEFT = 0x00200000; // 왼쪽 정렬(default) +const DWORD UISTYLE_STRING_ALIGNRIGHT = 0x00400000; // 오른쪽 정렬 (한줄일때만) +const DWORD UISTYLE_STRING_ALIGNCENTER = 0x00800000; // 가운데 정렬 (한줄일때만) +const DWORD UISTYLE_STRING_ALIGNTOP = 0x01000000; // 상단 정렬 (한줄일때만, default) +const DWORD UISTYLE_STRING_ALIGNBOTTOM = 0x02000000; // 하단 정렬 (한줄일때만) +const DWORD UISTYLE_STRING_ALIGNVCENTER = 0x04000000; // 수직가운데 정렬 (한줄일때만) // edit -const DWORD UISTYLE_EDIT_PASSWORD = 0x10000000; // ȣ Է¹޴ edit̴. +const DWORD UISTYLE_EDIT_PASSWORD = 0x10000000; // 암호를 입력받는 edit이다. const DWORD UISTYLE_EDIT_NUMBERONLY = 0x20000000; // progress -const DWORD UISTYLE_PROGRESS_LEFT2RIGHT = 0x10000000; // ʿ (default) -const DWORD UISTYLE_PROGRESS_RIGHT2LEFT = 0x20000000; // ʿ -const DWORD UISTYLE_PROGRESS_TOP2BOTTOM = 0x40000000; // ʿ Ʒ -const DWORD UISTYLE_PROGRESS_BOTTOM2TOP = 0x80000000; // Ʒʿ +const DWORD UISTYLE_PROGRESS_LEFT2RIGHT = 0x10000000; // 왼쪽에서 오른쪽으로 증가(default) +const DWORD UISTYLE_PROGRESS_RIGHT2LEFT = 0x20000000; // 오른쪽에서 왼쪽으로 증가 +const DWORD UISTYLE_PROGRESS_TOP2BOTTOM = 0x40000000; // 위쪽에서 아래쪽으로 증가 +const DWORD UISTYLE_PROGRESS_BOTTOM2TOP = 0x80000000; // 아래쪽에서 위쪽으로 증가 // TrackBar -const DWORD UISTYLE_TRACKBAR_HORIZONTAL = 0x00010000; // (default) -const DWORD UISTYLE_TRACKBAR_VERTICAL = 0x00020000; // +const DWORD UISTYLE_TRACKBAR_HORIZONTAL = 0x00010000; // 가로(default) +const DWORD UISTYLE_TRACKBAR_VERTICAL = 0x00020000; // 세로 // ScrollBar -const DWORD UISTYLE_SCROLLBAR_HORIZONTAL = 0x00010000; // (default) -const DWORD UISTYLE_SCROLLBAR_VERTICAL = 0x00020000; // +const DWORD UISTYLE_SCROLLBAR_HORIZONTAL = 0x00010000; // 가로(default) +const DWORD UISTYLE_SCROLLBAR_VERTICAL = 0x00020000; // 세로 // Icon type.. ecli666.. -const DWORD UISTYLE_ICON_ITEM = 0x00000010; // .. -const DWORD UISTYLE_ICON_SKILL = 0x00000020; // ų .. -const DWORD UISTYLE_ICON_CERTIFICATION_NEED = 0X00000100; // ʿ .. -const DWORD UISTYLE_ICON_CERTIFICATION_NONEED = 0X00000200; // ʿ .. +const DWORD UISTYLE_ICON_ITEM = 0x00000010; // 아이템 아이콘.. +const DWORD UISTYLE_ICON_SKILL = 0x00000020; // 스킬 아이콘.. +const DWORD UISTYLE_ICON_CERTIFICATION_NEED = 0X00000100; // 서버로 부터 인증이 필요한 아이콘.. +const DWORD UISTYLE_ICON_CERTIFICATION_NONEED = 0X00000200; // 서버로 부터 인증이 불필요한 아이콘.. const DWORD UISTYLE_ICON_HIGHLIGHT = 0x00001000; // No highlight Icon.. const DWORD UISTYLE_DURABILITY_EXHAUST = 0x00002000; // Durability exhausted Icon.. const DWORD UISTYLE_DISABLE_SKILL = 0x00004000; // Disable Skill Icon.. diff --git a/src/engine/N3Base/N3UIEdit.cpp b/src/engine/N3Base/N3UIEdit.cpp index aaabe7b6..c9ac6deb 100644 --- a/src/engine/N3Base/N3UIEdit.cpp +++ b/src/engine/N3Base/N3UIEdit.cpp @@ -28,7 +28,7 @@ CN3UIEdit::CN3Caret::CN3Caret() { m_pVB[0].Set(0, 0, UI_DEFAULT_Z, UI_DEFAULT_RHW, 0xffff0000); m_pVB[1].Set(0, 10, UI_DEFAULT_Z, UI_DEFAULT_RHW, 0xffff0000); m_bVisible = FALSE; - m_fFlickerTimePrev = CN3Base::TimeGet(); // ̱ ð.. + m_fFlickerTimePrev = CN3Base::TimeGet(); // 깜박이기 위한 시간.. m_bFlickerStatus = true; } CN3UIEdit::CN3Caret::~CN3Caret() {} @@ -59,7 +59,7 @@ void CN3UIEdit::CN3Caret::Render(LPDIRECT3DDEVICE9 lpD3DDev) { return; } - // ó.. + // 깜박임 처리.. float fTime = CN3Base::TimeGet(); if (fTime - m_fFlickerTimePrev > CARET_FLICKERING_TIME) { m_bFlickerStatus = !m_bFlickerStatus; @@ -77,7 +77,7 @@ void CN3UIEdit::CN3Caret::Render(LPDIRECT3DDEVICE9 lpD3DDev) { lpD3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 1, m_pVB, sizeof(m_pVB[0])); } void CN3UIEdit::CN3Caret::InitFlckering() { - m_fFlickerTimePrev = CN3Base::TimeGet(); // ̱ ð.. + m_fFlickerTimePrev = CN3Base::TimeGet(); // 깜박이기 위한 시간.. m_bFlickerStatus = true; } @@ -106,7 +106,7 @@ BOOL CN3UIEdit::CreateEditWindow(HWND hParent, RECT rect) { ::SendMessage(s_hWndEdit, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); ::SendMessage(s_hWndEdit, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); - // ...?? + // 배경 지우기...?? HDC hDC = GetDC(s_hWndEdit); SetBkMode(hDC, TRANSPARENT); SetROP2(hDC, R2_XORPEN); @@ -416,14 +416,14 @@ void CN3UIEdit::Render() { CN3UIStatic::Render(); if (HaveFocus()) { - s_Caret.Render(s_lpD3DDev); // Ŀ ij ׸ + s_Caret.Render(s_lpD3DDev); // 포커스가 있으면 캐럿 그리기 } } void CN3UIEdit::SetVisible(bool bVisible) { CN3UIBase::SetVisible(bVisible); - if (false == bVisible && true == m_bVisible) // ʰ Ҷ + if (false == bVisible && true == m_bVisible) // 보이지 않게 할때 { KillFocus(); } @@ -442,21 +442,21 @@ void CN3UIEdit::KillFocus() { } bool CN3UIEdit::SetFocus() { - // if (HaveFocus()) return true; // ̹ Ŀ return true; + // if (HaveFocus()) return true; // 이미 내가 포커스를 가지고 있으면 return true; if (NULL != s_pFocusedEdit) { - s_pFocusedEdit->KillFocus(); // ٸ edit killfocusȣ + s_pFocusedEdit->KillFocus(); // 다른 edit 가 가지고 있으면 killfocus호출 } - s_pFocusedEdit = this; // Ŀ ִ edit + s_pFocusedEdit = this; // 포커스를 가지고 있는 edit를 나로 설정 SIZE size; - if (m_pBuffOutRef && m_pBuffOutRef->GetTextExtent("", 2, &size)) { + if (m_pBuffOutRef && m_pBuffOutRef->GetTextExtent("가", 2, &size)) { s_Caret.SetSize(size.cy); s_Caret.SetColor(m_pBuffOutRef->GetFontColor()); } s_Caret.m_bVisible = TRUE; s_Caret.InitFlckering(); - CN3UIEdit::UpdateCaretPosFromEditCtrl(true); // ij + CN3UIEdit::UpdateCaretPosFromEditCtrl(true); // 캐럿 포지션 설정 if (s_hWndEdit) { ::SetFocus(s_hWndEdit); @@ -487,9 +487,9 @@ DWORD CN3UIEdit::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptO if (!m_bVisible) { return dwRet; } - if (dwFlags & UI_MOUSE_LBCLICK && IsIn(ptCur.x, ptCur.y)) // ȿ ư + if (dwFlags & UI_MOUSE_LBCLICK && IsIn(ptCur.x, ptCur.y)) // 영역 안에서 왼쪽 버튼이 눌렸으면 { - SetFocus(); // Ŀ ش. + SetFocus(); // 나에게 포커스를 준다. dwRet |= (UI_MOUSEPROC_DONESOMETHING | UI_MOUSEPROC_INREGION); return dwRet; } @@ -499,12 +499,12 @@ DWORD CN3UIEdit::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptO void CN3UIEdit::SetCaretPos(UINT nPos) { if (nPos > m_iMaxStrLen) { - nPos = m_iMaxStrLen; // ִ ̺ ۰ + nPos = m_iMaxStrLen; // 최대 길이보다 길경우 작게 세팅 } m_nCaretPos = nPos; const std::string & szBuff = m_pBuffOutRef->GetString(); - __ASSERT(szBuff.empty() || -1 == szBuff.find('\n'), "multiline edit"); // multiline ʴ´. + __ASSERT(szBuff.empty() || -1 == szBuff.find('\n'), "multiline edit"); // 지금은 multiline은 지원하지 않는다. SIZE size = {0, 0}; if (!szBuff.empty() && m_pBuffOutRef) { m_pBuffOutRef->GetTextExtent(szBuff, m_nCaretPos, &size); @@ -517,10 +517,10 @@ void CN3UIEdit::SetCaretPos(UINT nPos) { s_Caret.SetPos(m_pBuffOutRef->m_ptDrawPos.x + size.cx, m_pBuffOutRef->m_ptDrawPos.y); } -void CN3UIEdit::SetMaxString(int iMax) // ִ ۾ ش +void CN3UIEdit::SetMaxString(int iMax) // 최대 글씨 수를 정해준다 { if (iMax <= 0) { - __ASSERT(0, "ִ ۾ 0 ũ ּ"); + __ASSERT(0, "최대 글씨 수를 0보다 크게 정해주세요"); return; } m_iMaxStrLen = iMax; @@ -534,19 +534,19 @@ void CN3UIEdit::SetCaretPos(UINT nPos) { return; } - // ۾̰ iMax ū ̹Ƿ ѱڿ ߶ְ ٽ Ѵ. + // 여기까지 오는 경우는 현재 글씨길이가 iMax보다 큰 경우이므로 제한글자에 맞춰 잘라주게 다시 설정한다. SetString(szBuff); } ///////////////////////////////////////////////////////////////////// // -// Ư ġ ѱ 2byte߿ ι° Ʈ ˻ϴ κ̴. -// IsDBCSLeadByte Լ -// Byte byte Լ ˻ . -// ó ˻縦 ϴ ܿ ٸ . +// 특정 위치가 한글의 2byte중에 두번째 바이트인지 검사하는 부분이다. +// IsDBCSLeadByte라는 함수가 있지만 조합형일 경우는 +// 시작Byte와 끝byte의 범위가 같으로 이 함수로 검사 할 수 없다. +// 따라서 처음부터 검사를 하는 방법 외에는 다른 방법이 없다. // -// NT Unicode  ۿϴ ˻ ʾ -// ٸ ִٰ Ѵ. +// NT의 Unicode에서는 어떻게 작용하는지 검사해 보지 않았지만 +// 별 다른 문제 없이 사용할 수 있다고 생각한다. // ///////////////////////////////////////////////////////////////////// BOOL CN3UIEdit::IsHangulMiddleByte(const char * lpszStr, int iPos) { @@ -589,23 +589,23 @@ void CN3UIEdit::SetString(const std::string & szString) { if (IsHangulMiddleByte(szString.c_str(), m_iMaxStrLen)) { szNewBuff = szString.substr( - 0, m_iMaxStrLen - 1); // -1 ѱ̹Ƿ ϳ īϱ +1 NULL ֱ + 0, m_iMaxStrLen - 1); // -1은 한글이므로 하나 덜 카피하기 위해 +1은 맨 마지막에 NULL 넣기 위해 if (UISTYLE_EDIT_PASSWORD & m_dwStyle) { int iNewBuffLen = szNewBuff.size(); m_szPassword = szNewBuff; szNewBuff.assign(m_iMaxStrLen - 1, '*'); - __ASSERT(NULL == szNewBuff[m_iMaxStrLen - 1], "ڼ ٸ."); + __ASSERT(NULL == szNewBuff[m_iMaxStrLen - 1], "글자수가 다르다."); } m_pBuffOutRef->SetString(szNewBuff); } else { - szNewBuff = szString.substr(0, m_iMaxStrLen); // +1 NULL ֱ + szNewBuff = szString.substr(0, m_iMaxStrLen); // +1은 맨 마지막에 NULL 넣기 위해 if (UISTYLE_EDIT_PASSWORD & m_dwStyle) { int iNewBuffLen = szNewBuff.size(); m_szPassword = szNewBuff; szNewBuff.assign(m_iMaxStrLen, '*'); - __ASSERT(NULL == szNewBuff[m_iMaxStrLen], "ڼ ٸ."); + __ASSERT(NULL == szNewBuff[m_iMaxStrLen], "글자수가 다르다."); } m_pBuffOutRef->SetString(szNewBuff); } @@ -631,7 +631,7 @@ void CN3UIEdit::SetString(const std::string & szString) { } BOOL CN3UIEdit::MoveOffset(int iOffsetX, - int iOffsetY) // ġ (chilren ġ ٲپش. caretġ ٲپ.) + int iOffsetY) // 위치 지정(chilren의 위치도 같이 바꾸어준다. caret위치도 같이 바꾸어줌.) { if (FALSE == CN3UIBase::MoveOffset(iOffsetX, iOffsetY)) { return FALSE; @@ -656,11 +656,11 @@ bool CN3UIEdit::Load(HANDLE hFile) { return false; } - // uif Ϸ ε ϴ κ + // 이전 uif파일을 컨버팅 하려면 사운드 로드 하는 부분 막기 int iSndFNLen = 0; DWORD dwNum; - ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // ڿ + ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen > 0) { std::vector buffer(iSndFNLen, 0); ReadFile(hFile, &buffer[0], iSndFNLen, &dwNum, NULL); @@ -689,7 +689,7 @@ bool CN3UIEdit::Save(HANDLE hFile) { if (m_pSnd_Typing) { iSndFNLen = m_pSnd_Typing->m_szFileName.size(); } - WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // ڿ + WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen > 0) { WriteFile(hFile, m_pSnd_Typing->m_szFileName.c_str(), iSndFNLen, &dwNum, NULL); } @@ -704,7 +704,7 @@ void CN3UIEdit::SetSndTyping(const std::string & strFileName) { } CN3BaseFileAccess tmpBase; - tmpBase.FileNameSet(strFileName); // Baseο ؼ θ Ѱش. + tmpBase.FileNameSet(strFileName); // Base경로에 대해서 상대적 경로를 넘겨준다. SetCurrentDirectory(tmpBase.PathGet().c_str()); m_pSnd_Typing = s_SndMgr.CreateObj(tmpBase.FileName(), SNDTYPE_2D); @@ -761,7 +761,7 @@ void CN3UIEdit::SetImeStatus(POINT ptPos, bool bOpen) { /* /////////////////////////////////////////////////////////////////////////////////////////////////////// -// IME ؼ +// IME 관련해서 // /////////////////////////////////////////////////////////////////////////////////////////////////////// // @@ -779,12 +779,12 @@ bool CN3UIEdit::AddEdit(CN3UIEdit* pEdit) } it_Edit it = s_Edits.find(pEdit->m_hWndEdit); - if(it == s_Edits.end()) // ߺȰ .. + if(it == s_Edits.end()) // 중복된게 없으면.. { s_Edits.insert(val_Edit(pEdit->m_hWndEdit, pEdit)); return true; } - else // ߺǾ.. + else // 중복되었으면.. { __ASSERT(0, "Edit Handle Duplicate"); return false; diff --git a/src/engine/N3Base/N3UIEdit.h b/src/engine/N3Base/N3UIEdit.h index 6224d2f8..4865a664 100644 --- a/src/engine/N3Base/N3UIEdit.h +++ b/src/engine/N3Base/N3UIEdit.h @@ -22,14 +22,14 @@ class CN3UIEdit : public CN3UIStatic { void SetSize(int iSize); void SetColor(D3DCOLOR color); void Render(LPDIRECT3DDEVICE9 lpD3DDev); - void InitFlckering(); // ʱȭ.. - BOOL m_bVisible; // ̳ + void InitFlckering(); // 깜박임 초기화.. + BOOL m_bVisible; // 보이나 protected: - int m_iSize; // caret pixel ũ - float m_fFlickerTimePrev; // ̱ ð.. + int m_iSize; // caret의 pixel 크기 + float m_fFlickerTimePrev; // 깜박이기 위한 시간.. bool m_bFlickerStatus; - // POINT m_ptPos; // caret pixel ǥ - __VertexTransformedColor m_pVB[2]; // vertex + // POINT m_ptPos; // caret의 pixel 좌표 + __VertexTransformedColor m_pVB[2]; // vertex 버퍼 }; // Attributes @@ -56,12 +56,12 @@ class CN3UIEdit : public CN3UIStatic { protected: static CN3Caret s_Caret; - UINT m_nCaretPos; // ġ(byte) - int m_iCompLength; // byte 0̸ ƴϴ. - int m_iMaxStrLen; // ִ ۾ ִ + UINT m_nCaretPos; // 글자 단위위치(byte단위) + int m_iCompLength; // 현재 조합중인 글자의 byte수 0이면 조합중이 아니다. + int m_iMaxStrLen; // 쓸수 있는 글씨의 최대 숫자 std::string m_szPassword; // password buffer - CN3SndObj * m_pSnd_Typing; // Ÿ Ҹ + CN3SndObj * m_pSnd_Typing; // 타이핑 할 때 나는 소리 // Operations public: @@ -74,14 +74,14 @@ class CN3UIEdit : public CN3UIStatic { virtual void SetVisible(bool bVisible); virtual DWORD MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptOld); virtual BOOL MoveOffset(int iOffsetX, - int iOffsetY); // ġ (chilren ġ ٲپش. caretġ ٲپ.) - void KillFocus(); // Ŀ ش. - bool SetFocus(); // Ŀ ش. + int iOffsetY); // 위치 지정(chilren의 위치도 같이 바꾸어준다. caret위치도 같이 바꾸어줌.) + void KillFocus(); // 포커스를 없앤다. + bool SetFocus(); // 포커스를 준다. bool HaveFocus() const { return (this == s_pFocusedEdit); } - void SetCaretPos(UINT nPos); //° Ʈ ִ Ѵ. - void SetMaxString(int iMax); // ִ ۾ ش. + void SetCaretPos(UINT nPos); //몇번째 바이트에 있는지 설정한다. + void SetMaxString(int iMax); // 최대 글씨 수를 정해준다. protected: - BOOL IsHangulMiddleByte(const char * lpszStr, int iPos); // ѱ 2° Ʈ ΰ? + BOOL IsHangulMiddleByte(const char * lpszStr, int iPos); // 한글의 2번째 바이트 글자인가? #ifdef _N3TOOL public: diff --git a/src/engine/N3Base/N3UIImage.cpp b/src/engine/N3Base/N3UIImage.cpp index 6833bc19..a6636f5d 100644 --- a/src/engine/N3Base/N3UIImage.cpp +++ b/src/engine/N3Base/N3UIImage.cpp @@ -74,7 +74,7 @@ bool CN3UIImage::CreateVB() { } void CN3UIImage::SetVB() { - if (UISTYLE_IMAGE_ANIMATE & m_dwStyle) // animate image̸ vertex buffer releaseϱ + if (UISTYLE_IMAGE_ANIMATE & m_dwStyle) // animate image이면 vertex buffer release하기 { if (m_pVB) { m_pVB->Release(); @@ -87,7 +87,7 @@ void CN3UIImage::SetVB() { DWORD dwColor = 0xffffffff; float fRHW = 1.0f; - // -0.5f ̹ Ʈ и 찡 ִ.( ׷ Ȯϰ 𸣰) + // -0.5f를 해주지 않으면 가끔 이미지가 한 돗트씩 밀리는 경우가 있다.(왜 그런지는 확실하게 모르겠음) pVertices[0].Set((float)m_rcRegion.left - 0.5f, (float)m_rcRegion.top - 0.5f, UI_DEFAULT_Z, fRHW, m_Color, m_frcUVRect.left, m_frcUVRect.top); pVertices[1].Set((float)m_rcRegion.right - 0.5f, (float)m_rcRegion.top - 0.5f, UI_DEFAULT_Z, fRHW, m_Color, @@ -105,7 +105,7 @@ void CN3UIImage::SetVB() { void CN3UIImage::SetTex(const std::string & szFN) { m_szTexFN = szFN; s_MngTex.Delete(&m_pTexRef); - // animate image϶ texture ϱ + // animate image일때만 texture 지정하기 if (!(UISTYLE_IMAGE_ANIMATE & m_dwStyle)) { m_pTexRef = s_MngTex.Get(szFN); } @@ -129,7 +129,7 @@ void CN3UIImage::SetUVRect(float left, float top, float right, float bottom) { void CN3UIImage::Tick() { CN3UIBase::Tick(); - if (m_iAnimCount > 0) // Animate Image϶ frame + if (m_iAnimCount > 0) // Animate Image일때 현재 frame 계산 { m_fCurAnimFrame += (s_fSecPerFrm * m_fAnimFrame); while (m_fCurAnimFrame >= (float)m_iAnimCount) { @@ -143,10 +143,10 @@ void CN3UIImage::Render() { return; } - if (UISTYLE_IMAGE_ANIMATE & m_dwStyle) // AnimateǴ ̸̹ + if (UISTYLE_IMAGE_ANIMATE & m_dwStyle) // Animate되는 이미지이면 { - __ASSERT(m_fCurAnimFrame >= 0.0f && m_fCurAnimFrame < (float)m_iAnimCount, "animate image ̻۵"); - __ASSERT(m_pAnimImagesRef, "ʱȭ ̻"); + __ASSERT(m_fCurAnimFrame >= 0.0f && m_fCurAnimFrame < (float)m_iAnimCount, "animate image 가 이상작동"); + __ASSERT(m_pAnimImagesRef, "초기화 이상"); m_pAnimImagesRef[(int)m_fCurAnimFrame]->Render(); } else { if (m_pVB && m_pTexRef) { @@ -207,22 +207,22 @@ bool CN3UIImage::Load(HANDLE hFile) { return false; } DWORD dwNum; - // texture - __ASSERT(NULL == m_pTexRef, "load ϱ ʱȭ ʾҽϴ."); + // texture 정보 + __ASSERT(NULL == m_pTexRef, "load 하기 전에 초기화가 되지 않았습니다."); int iStrLen = 0; - ReadFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // ̸ + ReadFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // 파일 이름 길이 char szFName[MAX_PATH] = ""; if (iStrLen > 0) { - ReadFile(hFile, szFName, iStrLen, &dwNum, NULL); // ̸ + ReadFile(hFile, szFName, iStrLen, &dwNum, NULL); // 파일 이름 szFName[iStrLen] = '\0'; this->SetTex(szFName); } - ReadFile(hFile, &m_frcUVRect, sizeof(m_frcUVRect), &dwNum, NULL); // uvǥ + ReadFile(hFile, &m_frcUVRect, sizeof(m_frcUVRect), &dwNum, NULL); // uv좌표 ReadFile(hFile, &m_fAnimFrame, sizeof(m_fAnimFrame), &dwNum, NULL); - // Animate Ǵ image̸ õ - m_iAnimCount = 0; // animate image ϱ + // Animate 되는 image이면 관련된 변수 세팅 + m_iAnimCount = 0; // animate image 수 정하기 UIListItor itor; for (itor = m_Children.begin(); m_Children.end() != itor; ++itor) { if (UI_TYPE_IMAGE == (*itor)->UIType()) { @@ -239,12 +239,12 @@ bool CN3UIImage::Load(HANDLE hFile) { m_pAnimImagesRef[i] = (CN3UIImage *)(*itor); } __ASSERT(m_pAnimImagesRef[i]->GetReserved() == (DWORD)i, - "animate Image load fail"); // ʾ Ѵ. + "animate Image load fail"); // 제대로 정렬이 되지 않았을경우 실패한다. ++i; } } - SetVB(); // vertex + SetVB(); // vertex 세팅 return true; } @@ -262,42 +262,42 @@ void CN3UIImage::operator=(const CN3UIImage & other) { } m_szTexFN = other.m_szTexFN; - // Animate Ǵ image̸ õ - m_iAnimCount = m_Children.size(); // animate image ϱ + // Animate 되는 image이면 관련된 변수 세팅 + m_iAnimCount = m_Children.size(); // animate image 수 정하기 if ((UISTYLE_IMAGE_ANIMATE & m_dwStyle) && m_iAnimCount > 0) { m_pAnimImagesRef = new CN3UIImage *[m_iAnimCount]; ZeroMemory(m_pAnimImagesRef, sizeof(CN3UIImage *) * m_iAnimCount); int i = 0; for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { - __ASSERT(UI_TYPE_IMAGE == (*itor)->UIType(), "animate image child UI type image ƴϴ."); + __ASSERT(UI_TYPE_IMAGE == (*itor)->UIType(), "animate image child의 UI type이 image가 아니다."); m_pAnimImagesRef[i] = (CN3UIImage *)(*itor); __ASSERT(m_pAnimImagesRef[i]->GetReserved() == (DWORD)i, - "animate Image load fail"); // ʾ Ѵ. + "animate Image load fail"); // 제대로 정렬이 되지 않았을경우 실패한다. ++i; } } - SetVB(); // vertex + SetVB(); // vertex 세팅 } #ifdef _N3TOOL bool CN3UIImage::Save(HANDLE hFile) { - ReorderChildImage(); // child image + ReorderChildImage(); // child image들 순서대로 정렬 if (false == CN3UIBase::Save(hFile)) { return false; } DWORD dwNum; - // texture + // texture 정보 if (m_pTexRef) { m_szTexFN = m_pTexRef->FileName(); } int iStrLen = m_szTexFN.size(); - WriteFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // + WriteFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // 파일 길이 if (iStrLen > 0) { - WriteFile(hFile, m_szTexFN.c_str(), iStrLen, &dwNum, NULL); // ̸ + WriteFile(hFile, m_szTexFN.c_str(), iStrLen, &dwNum, NULL); // 파일 이름 } - WriteFile(hFile, &m_frcUVRect, sizeof(m_frcUVRect), &dwNum, NULL); // uvǥ + WriteFile(hFile, &m_frcUVRect, sizeof(m_frcUVRect), &dwNum, NULL); // uv좌표 WriteFile(hFile, &m_fAnimFrame, sizeof(m_fAnimFrame), &dwNum, NULL); // Animate frame return true; @@ -332,7 +332,7 @@ void CN3UIImage::ChangeImagePath(const std::string & szPathOld, const std::strin } void CN3UIImage::GatherImageFileName(std::set & setImgFile) { - CN3UIBase::GatherImageFileName(setImgFile); // child + CN3UIBase::GatherImageFileName(setImgFile); // child 정보 std::string szImgFN = m_szTexFN; if (!szImgFN.empty()) { @@ -341,7 +341,7 @@ void CN3UIImage::GatherImageFileName(std::set & setImgFile) { } } -// child image m_dwReserved ִ ° ġ +// child의 image가 m_dwReserved에 들어가있는 숫자 순서에 맞게 재배치 void CN3UIImage::ReorderChildImage() { if (m_iAnimCount <= 0) { return; @@ -353,20 +353,20 @@ void CN3UIImage::ReorderChildImage() { CN3UIBase * pSelChild = NULL; for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); - __ASSERT(UI_TYPE_IMAGE == pChild->UIType(), "image ƴ child ֽϴ."); + __ASSERT(UI_TYPE_IMAGE == pChild->UIType(), "image가 아닌 child가 있습니다."); if (NULL == pSelChild) { pSelChild = pChild; } else if (pSelChild->GetReserved() > pChild->GetReserved()) { pSelChild = pChild; } } - __ASSERT(pSelChild, " m_dwReserved child ."); + __ASSERT(pSelChild, "제일 작은 m_dwReserved를 가진 child가 없다."); pNewList[i] = pSelChild; RemoveChild(pSelChild); } for (int i = 0; i < m_iAnimCount; ++i) { - m_Children.push_back(pNewList[i]); // ֱ + m_Children.push_back(pNewList[i]); // 작은 순서대로 넣기 } delete[] pNewList; @@ -380,9 +380,9 @@ CN3UIImage * CN3UIImage::GetChildImage(int iIndex) { } void CN3UIImage::SetAnimImage(int iAnimCount) { - // ̹ Ǿ ִ° + // 이미 설정 되어 있는것이 있으면 지우기 if (m_pAnimImagesRef) { - for (int i = 0; i < m_iAnimCount; ++i) { // ڽ + for (int i = 0; i < m_iAnimCount; ++i) { // 자식 지우기 if (m_pAnimImagesRef[i]) { delete m_pAnimImagesRef[i]; m_pAnimImagesRef[i] = NULL; @@ -393,7 +393,7 @@ void CN3UIImage::SetAnimImage(int iAnimCount) { } m_iAnimCount = iAnimCount; - // 0 ϸ image ȯ + // 0으로 설정하면 보통 image로 전환 if (0 == m_iAnimCount) { SetStyle(m_dwStyle & (~UISTYLE_IMAGE_ANIMATE)); CreateVB(); @@ -446,7 +446,7 @@ bool CN3UIImage::ReplaceAllTextures(const std::string & strFind, const std::stri } } else { // *.tga -> if (lstrcmpi(szFindExt, szTexExt) != 0) { - break; // Ȯڰ Ƿ ׳ + break; // 확장자가 같지 않으므로 그냥 리턴 } if (lstrcmpi(szReplaceFName, "*") == 0) { @@ -462,7 +462,7 @@ bool CN3UIImage::ReplaceAllTextures(const std::string & strFind, const std::stri } } else { if (lstrcmpi(szFindFName, szTexFName) != 0) { - break; // ̸ Ƿ ׳ + break; // 이름이 같지 않으므로 그냥 리턴 } if (lstrcmpi(szFindExt, ".*") == 0) { // abc.* -> @@ -476,9 +476,9 @@ bool CN3UIImage::ReplaceAllTextures(const std::string & strFind, const std::stri } else { strNew += szReplaceExt; } - } else { // ã ϸ Ȯڰ Ǿ // abc.tga -> + } else { // 찾는 파일명과 확장자가 지정되어 있을경우 // abc.tga -> if (lstrcmpi(szFindExt, szTexExt) != 0) { - break; // Ȯڰ Ƿ ׳ + break; // 확장자가 같지 않으므로 그냥 리턴 } if (lstrcmpi(szReplaceFName, "*") == 0) { @@ -493,7 +493,7 @@ bool CN3UIImage::ReplaceAllTextures(const std::string & strFind, const std::stri } } } - // ؽ ٽ ϱ + // 텍스쳐 다시 지정하기 SetTex(strNew); break; } diff --git a/src/engine/N3Base/N3UIImage.h b/src/engine/N3Base/N3UIImage.h index bbdae7d8..c073c542 100644 --- a/src/engine/N3Base/N3UIImage.h +++ b/src/engine/N3Base/N3UIImage.h @@ -1,5 +1,5 @@ // N3UIImage.h: interface for the CN3UIImage class. -// ؾ : animationǴ ̹ ׸ ϰ .. +// 보강해야 할 점 : animation되는 이미지도 그리도록 가능하게 하자.. ////////////////////////////////////////////////////////////////////// #pragma once @@ -9,7 +9,7 @@ class N3Texture; class CN3UIImage : public CN3UIBase { #ifdef _N3TOOL - friend class CPropertyView; // ϱ ؼ + friend class CPropertyView; // 툴에서 각 변수들을 접근하기 위해서 #endif public: @@ -22,40 +22,40 @@ class CN3UIImage : public CN3UIBase { protected: LPDIRECT3DVERTEXBUFFER9 m_pVB; // vertex buffer - CN3Texture * m_pTexRef; // texture (s_TexMng ϹǷ ̴.) - std::string m_szTexFN; // ؽó ̸.. ִ ؽó θⰡ 츦 ؼ̴. - __FLOAT_RECT m_frcUVRect; // uv ǥ - D3DCOLOR m_Color; // Į( ̹ ȴ.) + CN3Texture * m_pTexRef; // texture 참조 포인터 (s_TexMng에서 관리하므로 참조포인터이다.) + std::string m_szTexFN; // 텍스처 이름.. 따로 갖고 있는 이유는 툴에서 텍스처 부르기가 실패할 경우를 대비해서이다. + __FLOAT_RECT m_frcUVRect; // uv 좌표를 저장 + D3DCOLOR m_Color; // 칼라(배경 이미지가 없을경우 사용된다.) - float m_fAnimFrame; // 1ʴ ׷ ̹ - int m_iAnimCount; // AnimateǴ ̹ (Load child ڷ ľ) - float m_fCurAnimFrame; // ׷ animate frame index (Ҽ ) - CN3UIImage ** m_pAnimImagesRef; // Animate ڽ ̹ ͵ + float m_fAnimFrame; // 1초당 그려지는 이미지의 수 + int m_iAnimCount; // Animate되는 이미지 수(Load할 때 child의 숫자로 파악) + float m_fCurAnimFrame; // 현재 그려질 animate frame index (소수는 버리고 사용하자) + CN3UIImage ** m_pAnimImagesRef; // Animate 될 자식 이미지들 참조 포인터들 // Operations public: D3DCOLOR GetColor() { return m_Color; } - CN3Texture * GetTex() const { return m_pTexRef; } // Texture - void SetTex(const std::string & szFN); // Texture - void SetUVRect(float left, float top, float right, float bottom); // image uvǥ - void SetColor(D3DCOLOR color); // Į + CN3Texture * GetTex() const { return m_pTexRef; } // Texture 포인터 얻기 + void SetTex(const std::string & szFN); // Texture 지정 + void SetUVRect(float left, float top, float right, float bottom); // image의 uv좌표 지정 + void SetColor(D3DCOLOR color); // 칼라 지정 - virtual void SetRegion(const RECT & Rect); // + virtual void SetRegion(const RECT & Rect); // 영역 지정 virtual BOOL MoveOffset(int iOffsetX, int iOffsetY); virtual void Release(); // Release virtual void Tick(); // Tick - virtual void Render(); // ׸ + virtual void Render(); // 그리기 virtual void RenderIconWrapper(); - virtual void Init(CN3UIBase * pParent); // ʱȭ + virtual void Init(CN3UIBase * pParent); // 초기화 virtual bool Load(HANDLE hFile); virtual void operator=(const CN3UIImage & other); protected: - bool CreateVB(); // 4 vertex vertex buffer - virtual void SetVB(); // vertex buffer ٽ -// tool ϴ Լ + bool CreateVB(); // 4개의 vertex를 가진 vertex buffer 생성 + virtual void SetVB(); // vertex buffer 다시 세팅 +// tool에서 사용하는 함수들 #ifdef _N3TOOL public: virtual bool Save(HANDLE hFile); diff --git a/src/engine/N3Base/N3UIList.cpp b/src/engine/N3Base/N3UIList.cpp index 25de5183..bc3f3005 100644 --- a/src/engine/N3Base/N3UIList.cpp +++ b/src/engine/N3Base/N3UIList.cpp @@ -14,10 +14,10 @@ CN3UIList::CN3UIList() { m_eType = UI_TYPE_LIST; - m_iCurSel = 0; // .. + m_iCurSel = 0; // 현재 선택.. m_pScrollBarRef = NULL; - m_szFontName = "ü"; + m_szFontName = "굴림체"; m_dwFontHeight = 10; m_bFontBold = FALSE; m_bFontItalic = FALSE; @@ -35,11 +35,11 @@ void CN3UIList::Release() { // delete (*it); // } - m_ListString.clear(); // ڽ ϱ... Ʈ ͸ Delete ʿ .. + m_ListString.clear(); // 어차피 자식은 다지우니까... 리스트의 포인터를 Delete 할 필요 없다.. m_iCurSel = 0; m_pScrollBarRef = NULL; - m_szFontName = "ü"; + m_szFontName = "굴림체"; m_dwFontHeight = 10; m_bFontBold = FALSE; m_bFontItalic = FALSE; @@ -262,10 +262,10 @@ bool CN3UIList::SetScrollPos(int iScrollPos) { bool CN3UIList::Load(HANDLE hFile) { bool bSuccess = CN3UIBase::Load(hFile); - // font + // font 정보 DWORD dwNum; int iStrLen = 0; - ReadFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // font ̸ + ReadFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // font 이름 길이 __ASSERT(iStrLen > 0, "No font name"); if (iStrLen > 0) { m_szFontName.assign(iStrLen, ' '); @@ -276,7 +276,7 @@ bool CN3UIList::Load(HANDLE hFile) { ReadFile(hFile, &m_bFontItalic, 4, &dwNum, NULL); // font flag (bold, italic) } - // Child ߿ Scroll Bar ִ ãƺ. + // Child 중에 Scroll Bar 가 있는지 찾아본다. for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pUI = *itor; if (pUI->UIType() == UI_TYPE_SCROLLBAR) { @@ -288,7 +288,7 @@ bool CN3UIList::Load(HANDLE hFile) { // if( pString->GetFontName != m_szFontName || // pString->GetFontHeight() != m_dwFontHeight || // m_bFontBold != (pString->GetFontFlags() & D3DFONT_BOLD) || - // m_bFontItalic != (pString->GetFontFlags() & D3DFONT_ITALIC) ) // Ʈ ٸ.. + // m_bFontItalic != (pString->GetFontFlags() & D3DFONT_ITALIC) ) // 폰트가 다르면.. 적용 // { // pString->SetFont(m_szFontName, m_dwFontHeight, m_bFontBold, m_bFontItalic); // } @@ -306,10 +306,10 @@ bool CN3UIList::Save(HANDLE hFile) { DWORD dwNum; - // font + // font 정보 int iStrLen = m_szFontName.size(); __ASSERT(iStrLen > 0, "No font name"); - WriteFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // font ̸ + WriteFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // font 이름 길이 if (iStrLen > 0) { WriteFile(hFile, m_szFontName.c_str(), iStrLen, &dwNum, NULL); // string WriteFile(hFile, &m_dwFontHeight, 4, &dwNum, NULL); // font height @@ -340,7 +340,7 @@ DWORD CN3UIList::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptO return dwRet; } - // Ư ̺Ʈ ޽ .. + // 특정 이벤트에 대해 메시지 전송.. if (IsIn(ptCur.x, ptCur.y) && ((dwFlags & UI_MOUSE_LBCLICK) || (dwFlags & UI_MOUSE_LBDBLCLK))) { RECT rc = this->GetRegion(), rcStr; SIZE size; @@ -362,12 +362,12 @@ DWORD CN3UIList::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptO m_iCurSel = i; if (dwFlags & UI_MOUSE_LBCLICK) { if (m_pParent) { - m_pParent->ReceiveMessage(this, UIMSG_LIST_SELCHANGE); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_LIST_SELCHANGE); // 부모에게 버튼 클릭 통지.. } dwRet |= UIMSG_LIST_SELCHANGE; } else { if (m_pParent) { - m_pParent->ReceiveMessage(this, UIMSG_LIST_DBLCLK); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_LIST_DBLCLK); // 부모에게 버튼 클릭 통지.. } dwRet |= UIMSG_LIST_DBLCLK; } @@ -391,7 +391,7 @@ void CN3UIList::Render() { } CN3UIString * pStr = *it; if (pStr) { - RECT rc = pStr->GetRegion(); // ǥ + RECT rc = pStr->GetRegion(); // 선택 표시 __VertexTransformedColor vLines[5]; vLines[0].Set(rc.left, rc.top, UI_DEFAULT_Z, UI_DEFAULT_RHW, 0xff00ff00); diff --git a/src/engine/N3Base/N3UIList.h b/src/engine/N3Base/N3UIList.h index 6abcd6d7..6a9100b4 100644 --- a/src/engine/N3Base/N3UIList.h +++ b/src/engine/N3Base/N3UIList.h @@ -12,7 +12,7 @@ typedef typename std::list::iterator it_pString; class CN3UIList : public CN3UIBase { protected: - int m_iCurSel; // .. + int m_iCurSel; // 현재 선택.. std::list m_ListString; // String List class CN3UIScrollBar * m_pScrollBarRef; diff --git a/src/engine/N3Base/N3UIManager.cpp b/src/engine/N3Base/N3UIManager.cpp index 1e6eabb9..6a3827e4 100644 --- a/src/engine/N3Base/N3UIManager.cpp +++ b/src/engine/N3Base/N3UIManager.cpp @@ -26,27 +26,27 @@ DWORD CN3UIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & } if (s_pTooltipCtrl) { - s_pTooltipCtrl->MouseProc(dwFlags, ptCur, ptOld); // 콺 ޼ . + s_pTooltipCtrl->MouseProc(dwFlags, ptCur, ptOld); // 툴팁에게 마우스 메세지 전달. } - // child ޼ + // child에게 메세지 전달 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor;) { CN3UIBase * pChild = (*itor); DWORD dwChildRet = pChild->MouseProc(dwFlags, ptCur, ptOld); - if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // ̰쿡 հ Ŀ ̴. - itor = m_Children.erase(itor); // 켱 Ʈ + if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // 이경우에는 먼가 포커스를 받은 경우이다. + itor = m_Children.erase(itor); // 우선 리스트에서 지우고 m_Children.push_front( - pChild); // Ǿտ ִ´. ׸ ߿ ׸ ϰ ޼ ް Ϸ + pChild); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하고 메세지를 맨 먼저 받게 하려고 m_dwMouseFlagsCur |= (UI_MOUSEPROC_DONESOMETHING | UI_MOUSEPROC_CHILDDONESOMETHING); - ReorderChildList(); // child list (׻ ߴ dialog ٽ Ѵ.) + ReorderChildList(); // child list 재정렬(항상 위에 뜨는 dialog 때문에 다시 정렬한다.) return m_dwMouseFlagsCur; } else if ((UI_MOUSE_LBCLICK & dwFlags) && - (UI_MOUSEPROC_INREGION & dwChildRet)) { // Ŭ հ ߴٰ ϰ ع. - itor = m_Children.erase(itor); // 켱 Ʈ + (UI_MOUSEPROC_INREGION & dwChildRet)) { // 영역 안을 클릭 했을때 먼가 일을 했다고 하고 리턴해버린다. + itor = m_Children.erase(itor); // 우선 리스트에서 지우고 m_Children.push_front( - pChild); // Ǿտ ִ´. ׸ ߿ ׸ ϰ ޼ ް Ϸ + pChild); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하고 메세지를 맨 먼저 받게 하려고 m_dwMouseFlagsCur |= (UI_MOUSEPROC_DIALOGFOCUS); - ReorderChildList(); // child list (׻ ߴ dialog ٽ Ѵ.) + ReorderChildList(); // child list 재정렬(항상 위에 뜨는 dialog 때문에 다시 정렬한다.) return m_dwMouseFlagsCur; } else { ++itor; @@ -59,7 +59,7 @@ DWORD CN3UIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & return m_dwMouseFlagsCur; } -void CN3UIManager::ReorderChildList() // ̾˷α ġ +void CN3UIManager::ReorderChildList() // 다이알로그 순서 재배치 { int iChildCount = m_Children.size(); if (iChildCount <= 0) { @@ -71,7 +71,7 @@ DWORD CN3UIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & for (UIListItor itor = m_Children.begin(); m_Children.end() != itor;) { CN3UIBase * pChild = (*itor); if (pChild->GetStyle() & UISTYLE_ALWAYSTOP) { - itor = m_Children.erase(itor); // 켱 Ʈ + itor = m_Children.erase(itor); // 우선 리스트에서 지우고 ppBuffer[iAlwaysTopChildCount++] = pChild; } else { ++itor; @@ -79,7 +79,7 @@ DWORD CN3UIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & } for (int i = iAlwaysTopChildCount - 1; i >= 0; --i) { m_Children.push_front( - ppBuffer[i]); // Ǿտ ִ´. ׸ ߿ ׸ ϰ ޼ ް Ϸ + ppBuffer[i]); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하고 메세지를 맨 먼저 받게 하려고 } delete[] ppBuffer; } @@ -94,7 +94,7 @@ void CN3UIManager::Tick() { void CN3UIManager::Render() { this->RenderStateSet(); - CN3UIBase::Render(); // ڽĵ render + CN3UIBase::Render(); // 자식들 render if (s_pTooltipCtrl) { s_pTooltipCtrl->Render(); // tooltip render } @@ -109,7 +109,7 @@ void CN3UIManager::RenderStateSet() { #ifdef _DEBUG __ASSERT(FALSE == s_sRSFU.bSet, - " RenderStateSet()Լ ȣϰ RenderStateRestore()Լ ȣ Դϴ."); + "이전에 RenderStateSet()함수를 호출하고 RenderStateRestore()함수가 호출되지 않은 상태입니다."); s_sRSFU.bSet = TRUE; #endif @@ -137,7 +137,7 @@ void CN3UIManager::RenderStateSet() { s_lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); } if (FALSE != s_sRSFU.dwFog) { - s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); // 2d fog Դ´ .; + s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); // 2d도 fog를 먹는다 ㅡ.ㅡ; } if (D3DTEXF_POINT != s_sRSFU.dwMagFilter) { s_lpD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); @@ -152,7 +152,7 @@ void CN3UIManager::RenderStateSet() { void CN3UIManager::RenderStateRestore() { #ifdef _DEBUG - __ASSERT(TRUE == s_sRSFU.bSet, " RenderStateSet()Լ ȣ ʾҽϴ."); + __ASSERT(TRUE == s_sRSFU.bSet, "이전에 RenderStateSet()함수를 호출하지 않았습니다."); s_sRSFU.bSet = FALSE; #endif diff --git a/src/engine/N3Base/N3UIManager.h b/src/engine/N3Base/N3UIManager.h index d78b8227..55631b82 100644 --- a/src/engine/N3Base/N3UIManager.h +++ b/src/engine/N3Base/N3UIManager.h @@ -12,7 +12,7 @@ class CN3UIManager : public CN3UIBase { DWORD dwZEnable, dwAlphaBlend, dwSrcBlend, dwDestBlend, dwFog; DWORD dwMagFilter, dwMinFilter, dwMipFilter; #ifdef _DEBUG - BOOL bSet; // ̹ 3D device Ǿ Ǵ. + BOOL bSet; // 이미 값이 3D device의 값으로 세팅이 되었는지 판단. #endif }; diff --git a/src/engine/N3Base/N3UIProgress.cpp b/src/engine/N3Base/N3UIProgress.cpp index f550ff75..1b1176b1 100644 --- a/src/engine/N3Base/N3UIProgress.cpp +++ b/src/engine/N3Base/N3UIProgress.cpp @@ -20,7 +20,7 @@ CN3UIProgress::CN3UIProgress() { m_iValueToReach = 0; m_fCurValue = 0; m_fChangeSpeedPerSec = 0; - m_fTimeToDelay = 0; // ð.. + m_fTimeToDelay = 0; // 지연시간.. } CN3UIProgress::~CN3UIProgress() {} @@ -65,10 +65,10 @@ void CN3UIProgress::SetCurValue(int iValue, float fTimeToDelay, float fChangeSpe } m_iValueToReach = iValue; - m_fTimeToDelay = fTimeToDelay; // ð.. + m_fTimeToDelay = fTimeToDelay; // 지연시간.. m_fChangeSpeedPerSec = fChangeSpeedPerSec; - if (0.0f == fTimeToDelay && 0.0f == fChangeSpeedPerSec) // ð ٷ .. + if (0.0f == fTimeToDelay && 0.0f == fChangeSpeedPerSec) // 지연 시간이 없으면 바로 세팅.. { m_fCurValue = (float)iValue; UpdateFrGndImage(); @@ -155,7 +155,7 @@ void CN3UIProgress::UpdateFrGndImage() { } void CN3UIProgress::SetFrGndUVFromFrGndImage() -// m_pFrGndImgRefκ uvǥ ͼ m_frcFrGndImgUV Ѵ. +// m_pFrGndImgRef로부터 uv좌표를 얻어와서 m_frcFrGndImgUV를 세팅한다. { __ASSERT(m_pFrGndImgRef, "not found foreground image in N3UIProgress"); if (NULL == m_pFrGndImgRef) { @@ -170,11 +170,11 @@ bool CN3UIProgress::Load(HANDLE hFile) { return false; } - // m_ImageRef ϱ + // m_ImageRef 설정하기 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); if (UI_TYPE_IMAGE != pChild->UIType()) { - continue; // image 󳻱 + continue; // image만 골라내기 } int iImageType = (int)(pChild->GetReserved()); if (iImageType == IMAGETYPE_BKGND) { @@ -192,20 +192,20 @@ bool CN3UIProgress::Load(HANDLE hFile) { void CN3UIProgress::operator=(const CN3UIProgress & other) { CN3UIBase::operator=(other); - m_frcFrGndImgUV = other.m_frcFrGndImgUV; // m_FrGndImgRef uvǥ - m_iMaxValue = other.m_iMaxValue; // ִ - m_iMinValue = other.m_iMinValue; // ּ - m_fCurValue = other.m_fCurValue; // - ε巴 ÷ float ߴ.. - m_fChangeSpeedPerSec = other.m_fChangeSpeedPerSec; // 簪 ؾ Ǵ ӵ.. Unit SpeedPerSec - m_iValueToReach = other.m_iValueToReach; // ؾ ɰ - ε巴 ö󰡴 쿡 ʿϴ.. - m_fTimeToDelay = other.m_fTimeToDelay; // ð.. - m_iStepValue = other.m_iStepValue; // ȭ StepIt() ȭǴ + m_frcFrGndImgUV = other.m_frcFrGndImgUV; // m_FrGndImgRef 의 uv좌표 + m_iMaxValue = other.m_iMaxValue; // 최대 + m_iMinValue = other.m_iMinValue; // 최소 + m_fCurValue = other.m_fCurValue; // 현재 값 - 부드럽게 점차 값을 올려가려고 float 로 했다.. + m_fChangeSpeedPerSec = other.m_fChangeSpeedPerSec; // 현재값이 변해야 되는 속도.. Unit SpeedPerSec + m_iValueToReach = other.m_iValueToReach; // 도달해야 될값 - 부드럽게 값이 올라가는 경우에 필요하다.. + m_fTimeToDelay = other.m_fTimeToDelay; // 지연시간.. + m_iStepValue = other.m_iStepValue; // 변화값 StepIt()을 통한 변화되는 값 - // m_ImageRef ϱ + // m_ImageRef 설정하기 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); if (UI_TYPE_IMAGE != pChild->UIType()) { - continue; // image 󳻱 + continue; // image만 골라내기 } int iImageType = (int)(pChild->GetReserved()); if (iImageType == IMAGETYPE_BKGND) { @@ -218,11 +218,11 @@ void CN3UIProgress::operator=(const CN3UIProgress & other) { } bool CN3UIProgress::Save(HANDLE hFile) { - int iCur = (int)m_fCurValue; // - SetCurValue(m_iMaxValue); // foreground ä ̹ - bool bRet = CN3UIBase::Save(hFile); // ϱ + int iCur = (int)m_fCurValue; // 이전 상태 기억해 놓기 + SetCurValue(m_iMaxValue); // foreground가 꽉 채운 이미지 만들기 + bool bRet = CN3UIBase::Save(hFile); // 저장하기 - SetCurValue((int)m_fCurValue); // · ǵ + SetCurValue((int)m_fCurValue); // 이전 상태로 되돌리기 return bRet; } @@ -231,20 +231,20 @@ void CN3UIProgress::CreateImages() { m_pBkGndImgRef = new CN3UIImage(); m_pBkGndImgRef->Init(this); m_pBkGndImgRef->SetRegion(m_rcRegion); - m_pBkGndImgRef->SetReserved(IMAGETYPE_BKGND); // ̹ ̹ + m_pBkGndImgRef->SetReserved(IMAGETYPE_BKGND); // 이 이미지가 배경이미지임을 지정해줌 m_pFrGndImgRef = new CN3UIImage(); m_pFrGndImgRef->Init(this); m_pFrGndImgRef->SetRegion(m_rcRegion); - m_pFrGndImgRef->SetReserved(IMAGETYPE_FRGND); // ̹ foreground ̹ + m_pFrGndImgRef->SetReserved(IMAGETYPE_FRGND); // 이 이미지가 foreground 이미지임을 지정해줌 - // ӽ÷ ֱ + // 임시로 넣기 m_iMaxValue = 100; m_iMinValue = 0; m_fCurValue = 70; } -void CN3UIProgress::DeleteBkGndImage() // Back ground̹ ʿ 찡 ִ. +void CN3UIProgress::DeleteBkGndImage() // Back ground이미지는 필요 없는 경우가 있다. { if (m_pBkGndImgRef) { delete m_pBkGndImgRef; @@ -258,7 +258,7 @@ void CN3UIProgress::Tick() { CN3UIBase::Tick(); if (m_fTimeToDelay > 0) { - m_fTimeToDelay -= s_fSecPerFrm; // ð + m_fTimeToDelay -= s_fSecPerFrm; // 시간 지연 if (m_fTimeToDelay < 0) { m_fTimeToDelay = 0; } @@ -273,13 +273,13 @@ void CN3UIProgress::Tick() { } if (m_fCurValue < m_iValueToReach) { - m_fCurValue += m_fChangeSpeedPerSec * s_fSecPerFrm; // ʴ 30 ۼƮ ö󰡰 .. + m_fCurValue += m_fChangeSpeedPerSec * s_fSecPerFrm; // 초당 30 퍼센트 올라가게 조정.. if (m_fCurValue > m_iValueToReach) { m_fCurValue = (float)m_iValueToReach; } UpdateFrGndImage(); } else if (m_fCurValue > m_iValueToReach) { - m_fCurValue -= m_fChangeSpeedPerSec * s_fSecPerFrm; // ʴ 30 ۼƮ ö󰡰 .. + m_fCurValue -= m_fChangeSpeedPerSec * s_fSecPerFrm; // 초당 30 퍼센트 올라가게 조정.. if (m_fCurValue < m_iValueToReach) { m_fCurValue = (float)m_iValueToReach; } diff --git a/src/engine/N3Base/N3UIProgress.h b/src/engine/N3Base/N3UIProgress.h index e7de5c2a..49160957 100644 --- a/src/engine/N3Base/N3UIProgress.h +++ b/src/engine/N3Base/N3UIProgress.h @@ -9,7 +9,7 @@ class CN3UIImage; class CN3UIProgress : public CN3UIBase { #ifdef _N3TOOL - friend class CPropertyView; // ϱ ؼ + friend class CPropertyView; // 툴에서 각 변수들을 접근하기 위해서 #endif public: @@ -33,16 +33,16 @@ class CN3UIProgress : public CN3UIBase { CN3UIImage * m_pBkGndImgRef; CN3UIImage * m_pFrGndImgRef; - __FLOAT_RECT m_frcFrGndImgUV; // m_FrGndImgRef uvǥ + __FLOAT_RECT m_frcFrGndImgUV; // m_FrGndImgRef 의 uv좌표 - int m_iMaxValue; // ִ - int m_iMinValue; // ּ - float m_fCurValue; // - ε巴 ÷ float ߴ.. - float m_fChangeSpeedPerSec; // 簪 ؾ Ǵ ӵ.. Unit SpeedPerSec - int m_iValueToReach; // ؾ ɰ - ε巴 ö󰡴 쿡 ʿϴ.. - float m_fTimeToDelay; // ð.. + int m_iMaxValue; // 최대 + int m_iMinValue; // 최소 + float m_fCurValue; // 현재 값 - 부드럽게 점차 값을 올려가려고 float 로 했다.. + float m_fChangeSpeedPerSec; // 현재값이 변해야 되는 속도.. Unit SpeedPerSec + int m_iValueToReach; // 도달해야 될값 - 부드럽게 값이 올라가는 경우에 필요하다.. + float m_fTimeToDelay; // 지연시간.. - int m_iStepValue; // ȭ StepIt() ȭǴ + int m_iStepValue; // 변화값 StepIt()을 통한 변화되는 값 // Operations public: @@ -56,24 +56,24 @@ class CN3UIProgress : public CN3UIBase { void SetCurValue(int iValue, float fTimeToDelay = 0, float fChangeSpeedPerSec = 0); void SetCurValue_Smoothly(int iValue, float fPercentPerSec) { SetCurValue(iValue, 0, fPercentPerSec * (m_iMaxValue - m_iMinValue)); - } // ʴ ۼƮ ġ ö󰣴. + } // 초당 몇 퍼센트 수치로 올라간다. void SetRange(int iMin, int iMax) { m_iMinValue = iMin; m_iMaxValue = iMax; UpdateFrGndImage(); } - void SetFrGndUVFromFrGndImage(); // m_pFrGndImgRefκ uvǥ ͼ m_frcFrGndImgUV Ѵ. + void SetFrGndUVFromFrGndImage(); // m_pFrGndImgRef로부터 uv좌표를 얻어와서 m_frcFrGndImgUV를 세팅한다. protected: - void UpdateFrGndImage(); //m_FrGndImgRef uvǥ m_fCurValue ˸° ٲ۴. + void UpdateFrGndImage(); //m_FrGndImgRef 의 영역과 uv좌표를 m_fCurValue에 따라 알맞게 바꾼다. #ifdef _N3TOOL - // tool ϴ Լ + // tool에서 사용하는 함수들 public: virtual void operator=(const CN3UIProgress & other); virtual bool Save(HANDLE hFile); CN3UIImage * GetBkGndImgRef() const { return m_pBkGndImgRef; } CN3UIImage * GetFrGndImgRef() const { return m_pFrGndImgRef; } - void CreateImages(); // ̹ - void DeleteBkGndImage(); // Back ground̹ ʿ 찡 ִ. + void CreateImages(); // 이미지 생성 + void DeleteBkGndImage(); // Back ground이미지는 필요 없는 경우가 있다. #endif }; diff --git a/src/engine/N3Base/N3UIScrollBar.cpp b/src/engine/N3Base/N3UIScrollBar.cpp index 4da0752d..6586c04f 100644 --- a/src/engine/N3Base/N3UIScrollBar.cpp +++ b/src/engine/N3Base/N3UIScrollBar.cpp @@ -30,9 +30,9 @@ bool CN3UIScrollBar::Load(HANDLE hFile) { if (false == CN3UIBase::Load(hFile)) { return false; } - __ASSERT(NULL == m_pTrackBarRef, "scrollbar ʱȭǾ ʾƿ"); + __ASSERT(NULL == m_pTrackBarRef, "scrollbar가 초기화되어 있지 않아여"); - // m_pTrackBarRef, m_pBtnRef ϱ + // m_pTrackBarRef, m_pBtnRef 설정하기 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); if (UI_TYPE_TRACKBAR == pChild->UIType()) { @@ -50,7 +50,7 @@ bool CN3UIScrollBar::Load(HANDLE hFile) { void CN3UIScrollBar::SetRegion(const RECT & Rect) { CN3UIBase::SetRegion(Rect); - // 켱 ӽ÷ ũ ũ ġ + // 우선 임시로 스크롤 영역 크기와 같게 배치 // for(UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) // { // (*itor)->SetRegion(Rect); @@ -94,9 +94,9 @@ void CN3UIScrollBar::SetStyle(DWORD dwStyle) { #ifdef _N3TOOL void CN3UIScrollBar::operator=(const CN3UIScrollBar & other) { CN3UIBase::operator=(other); - m_iLineSize = other.m_iLineSize; // ư trackbar ũ + m_iLineSize = other.m_iLineSize; // 버튼을 눌렀을때 trackbar가 움직여지는 크기 - // m_pTrackBarRef, m_pBtnRef ϱ + // m_pTrackBarRef, m_pBtnRef 설정하기 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); if (UI_TYPE_TRACKBAR == pChild->UIType()) { @@ -112,16 +112,16 @@ void CN3UIScrollBar::operator=(const CN3UIScrollBar & other) { } void CN3UIScrollBar::CreateTrackBarAndBtns() { - __ASSERT(NULL == m_pTrackBarRef, "Ұ ̹ ҴǾ ־"); + __ASSERT(NULL == m_pTrackBarRef, "구성요소가 이미 할당되어 있어요"); for (int i = 0; i < NUM_BTN_TYPE; ++i) { m_pBtnRef[i] = new CN3UIButton(); m_pBtnRef[i]->Init(this); - m_pBtnRef[i]->SetReserved(i); // ȣ(eBTN_TYPE) Ҵ. + m_pBtnRef[i]->SetReserved(i); // 상태 번호(eBTN_TYPE) 할당. m_pBtnRef[i]->CreateImages(); } m_pTrackBarRef = new CN3UITrackBar(); m_pTrackBarRef->Init(this); - m_pTrackBarRef->CreateImages(); // trackbar ̹ + m_pTrackBarRef->CreateImages(); // trackbar의 이미지 생성 } #endif \ No newline at end of file diff --git a/src/engine/N3Base/N3UIScrollBar.h b/src/engine/N3Base/N3UIScrollBar.h index 84ecdc62..08079c22 100644 --- a/src/engine/N3Base/N3UIScrollBar.h +++ b/src/engine/N3Base/N3UIScrollBar.h @@ -23,7 +23,7 @@ class CN3UIScrollBar : public CN3UIBase { CN3UITrackBar * m_pTrackBarRef; CN3UIButton * m_pBtnRef[NUM_BTN_TYPE]; - int m_iLineSize; // ư trackbar ũ + int m_iLineSize; // 버튼을 눌렀을때 trackbar가 움직여지는 크기 // Operations public: @@ -31,7 +31,7 @@ class CN3UIScrollBar : public CN3UIBase { virtual bool Load(HANDLE hFile); virtual void SetRegion(const RECT & Rect); virtual void SetStyle(DWORD dwStyle); - virtual bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); // ޽ ޴´.. , msg + virtual bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); // 메시지를 받는다.. 보낸놈, msg void SetRange(int iMin, int iMax) { if (m_pTrackBarRef) { @@ -80,10 +80,10 @@ class CN3UIScrollBar : public CN3UIBase { } #ifdef _N3TOOL - // tool ϴ Լ + // tool에서 사용하는 함수들 public: virtual void operator=(const CN3UIScrollBar & other); - void CreateTrackBarAndBtns(); // trackbar button + void CreateTrackBarAndBtns(); // trackbar와 button 생성 CN3UITrackBar * GetTrackBarRef() const { return m_pTrackBarRef; } CN3UIButton * GetBtnRef(eBTN_TYPE eBtnType) const { return m_pBtnRef[eBtnType]; } #endif diff --git a/src/engine/N3Base/N3UIStatic.cpp b/src/engine/N3Base/N3UIStatic.cpp index 5b0ce1b4..32fd2cc5 100644 --- a/src/engine/N3Base/N3UIStatic.cpp +++ b/src/engine/N3Base/N3UIStatic.cpp @@ -55,7 +55,7 @@ bool CN3UIStatic::Load(HANDLE hFile) { return false; } - // m_pImageBkGnd, m_pBuffOutRef ϱ + // m_pImageBkGnd, m_pBuffOutRef 설정하기 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); if (UI_TYPE_IMAGE == pChild->UIType()) { @@ -65,10 +65,10 @@ bool CN3UIStatic::Load(HANDLE hFile) { } } - // uif Ϸ ε ϴ κ + // 이전 uif파일을 컨버팅 하려면 사운드 로드 하는 부분 막기 int iSndFNLen = 0; DWORD dwNum; - ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // ڿ + ReadFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen > 0) { std::vector buffer(iSndFNLen, 0); ReadFile(hFile, &buffer[0], iSndFNLen, &dwNum, NULL); @@ -100,14 +100,14 @@ DWORD CN3UIStatic::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & p return dwRet; } - if ((dwFlags & UI_MOUSE_LBCLICK) && IsIn(ptCur.x, ptCur.y)) // ʹư ̸ + if ((dwFlags & UI_MOUSE_LBCLICK) && IsIn(ptCur.x, ptCur.y)) // 왼쪽버튼 눌르는 순간 영역 안이면 { if (m_pSnd_Click) { - m_pSnd_Click->Play(); // 尡 playϱ + m_pSnd_Click->Play(); // 사운드가 있으면 play하기 } if (m_pParent) { - m_pParent->ReceiveMessage(this, UIMSG_BUTTON_CLICK); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_BUTTON_CLICK); // 부모에게 버튼 클릭 통지.. } dwRet |= (UI_MOUSEPROC_DONESOMETHING | UI_MOUSEPROC_INREGION); return dwRet; @@ -123,7 +123,7 @@ void CN3UIStatic::operator=(const CN3UIStatic & other) { SetSndClick(other.GetSndFName_Click()); - // m_pImageBkGnd, m_pBuffOutRef ϱ + // m_pImageBkGnd, m_pBuffOutRef 설정하기 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); if (UI_TYPE_IMAGE == pChild->UIType()) { @@ -144,7 +144,7 @@ bool CN3UIStatic::Save(HANDLE hFile) { if (m_pSnd_Click) { iSndFNLen = m_pSnd_Click->m_szFileName.size(); } - WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // ڿ + WriteFile(hFile, &iSndFNLen, sizeof(iSndFNLen), &dwNum, NULL); // 사운드 파일 문자열 길이 if (iSndFNLen > 0) { WriteFile(hFile, m_pSnd_Click->m_szFileName.c_str(), iSndFNLen, &dwNum, NULL); } @@ -156,8 +156,8 @@ void CN3UIStatic::CreateImageAndString() { m_pImageBkGnd->Init(this); m_pImageBkGnd->SetRegion(m_rcRegion); - m_pBuffOutRef = new CN3UIString(); // ȭ鿡 ǥ ui string ϰ - m_pBuffOutRef->Init(this); // ʱȭ(ڵ children list .) + m_pBuffOutRef = new CN3UIString(); // 화면에 표시할 ui string 생성하고 + m_pBuffOutRef->Init(this); // 초기화(자동으로 children list 들어간다.) m_pImageBkGnd->SetRegion(m_rcRegion); } @@ -175,7 +175,7 @@ void CN3UIStatic::SetSndClick(const std::string & strFileName) { } CN3BaseFileAccess tmpBase; - tmpBase.FileNameSet(strFileName); // Baseο ؼ θ Ѱش. + tmpBase.FileNameSet(strFileName); // Base경로에 대해서 상대적 경로를 넘겨준다. SetCurrentDirectory(tmpBase.PathGet().c_str()); m_pSnd_Click = s_SndMgr.CreateObj(tmpBase.FileName(), SNDTYPE_2D); diff --git a/src/engine/N3Base/N3UIStatic.h b/src/engine/N3Base/N3UIStatic.h index cff06628..5692ffae 100644 --- a/src/engine/N3Base/N3UIStatic.h +++ b/src/engine/N3Base/N3UIStatic.h @@ -12,9 +12,9 @@ class CN3UIStatic : public CN3UIBase { virtual ~CN3UIStatic(); // Attributes protected: - CN3UIString * m_pBuffOutRef; // CN3UIString ( childƮ ) - CN3UIImage * m_pImageBkGnd; // ̹ ( childƮ ) - CN3SndObj * m_pSnd_Click; // static Ҹ + CN3UIString * m_pBuffOutRef; // CN3UIString 참조 포인터 (실제는 child리스트에서 관리) + CN3UIImage * m_pImageBkGnd; // 배경 이미지 참조 포인터 (실제는 child리스트에서 관리) + CN3SndObj * m_pSnd_Click; // static이 눌리는 순간 내는 소리 // Operations public: @@ -28,14 +28,14 @@ class CN3UIStatic : public CN3UIBase { protected: #ifdef _N3TOOL - // ϴ Լ + // 툴에서만 사용하는 함수 public: virtual void operator=(const CN3UIStatic & other); virtual bool Save(HANDLE hFile); - void CreateImageAndString(); // ̹ string ϱ + void CreateImageAndString(); // 배경 이미지 및 string 생성하기 CN3UIImage * GetImageBkGnd() const { return m_pImageBkGnd; } CN3UIString * GetUIString() const { return m_pBuffOutRef; } - void DeleteImage(); // ̹ ʴ static ȣϸ . + void DeleteImage(); // 이미지를 사용하지 않는 static일 경우 호출하면 지워진다. void SetSndClick(const std::string & strFileName); std::string GetSndFName_Click() const; #endif diff --git a/src/engine/N3Base/N3UIString.cpp b/src/engine/N3Base/N3UIString.cpp index acb74780..fa931350 100644 --- a/src/engine/N3Base/N3UIString.cpp +++ b/src/engine/N3Base/N3UIString.cpp @@ -62,7 +62,7 @@ void CN3UIString::Init(CN3UIBase * pParent) { delete m_pDFont; } m_pDFont = NULL; - m_pDFont = new CDFont("", 16); // default 16 + m_pDFont = new CDFont("굴림", 16); // default 로 굴림 16으로 설정 m_pDFont->InitDeviceObjects(CN3Base::s_lpD3DDev); m_pDFont->RestoreDeviceObjects(); } @@ -82,7 +82,7 @@ void CN3UIString::SetStringAsInt(int iVal) { } void CN3UIString::SetString_NoWordWrap(const std::string & szString) { - // ؼ ׸. + // 왼쪽위 정렬해서 그린다. m_ptDrawPos.x = m_rcRegion.left; m_ptDrawPos.y = m_rcRegion.top; @@ -113,7 +113,7 @@ void CN3UIString::SetStyle(DWORD dwStyle) { WordWrap(); } -// ۾ ġ ٲ ش. +// 글씨찍는 위치도 바뀌어 준다. BOOL CN3UIString::MoveOffset(int iOffsetX, int iOffsetY) { if (FALSE == CN3UIBase::MoveOffset(iOffsetX, iOffsetY)) { return FALSE; @@ -123,7 +123,7 @@ BOOL CN3UIString::MoveOffset(int iOffsetX, int iOffsetY) { return TRUE; } -// ڸ dwStyle ° ش. +// 문자를 dwStyle에 맞게 정렬해준다. void CN3UIString::WordWrap() { m_iLineCount = 0; @@ -135,7 +135,7 @@ void CN3UIString::WordWrap() { if (0 == iStrLen) { m_pDFont->SetText(""); - // ۾ edit caret ⶧ ۾ ׸ ǥ ش. + // 글씨를 찍지는 않지만 edit의 경우 caret을 찍기때문에 글씨 그리는 좌표를 세팅해준다. if (m_dwStyle & UISTYLE_STRING_SINGLELINE) { if (m_dwStyle & UISTYLE_STRING_ALIGNCENTER) { m_ptDrawPos.x = m_rcRegion.left + (m_rcRegion.right - m_rcRegion.left) / 2; @@ -144,9 +144,9 @@ void CN3UIString::WordWrap() { } if (m_dwStyle & UISTYLE_STRING_ALIGNVCENTER) { - // ڿ pixel + // 문자열의 pixel 길이 측정 SIZE sizeTmp = {0, 0}; - m_pDFont->GetTextExtent("", 2, &sizeTmp); + m_pDFont->GetTextExtent("가", 2, &sizeTmp); m_ptDrawPos.y = m_rcRegion.top + ((m_rcRegion.bottom - m_rcRegion.top - sizeTmp.cy) / 2); } else { m_ptDrawPos.y = m_rcRegion.top; @@ -159,12 +159,12 @@ void CN3UIString::WordWrap() { return; } - // ڿ pixel + // 문자열의 pixel 길이 측정 SIZE size; const std::string szString = GetString(); iStrLen = szString.size(); if (FALSE == m_pDFont->GetTextExtent(szString.c_str(), iStrLen, - &size)) { // ̸ (m_hDC ʾ) + &size)) { // 길이를 측정할 수 없을경우(m_hDC가 생성되지 않았을경우) m_pDFont->SetText(szString); return; } @@ -173,7 +173,7 @@ void CN3UIString::WordWrap() { int iRegionHeight = m_rcRegion.bottom - m_rcRegion.top; if (m_dwStyle & UISTYLE_STRING_SINGLELINE) { - // ӽ + // 임시 변수 잡기 std::string szNewBuff; // TODO: fix this @@ -187,7 +187,7 @@ void CN3UIString::WordWrap() { { szNewBuff = m_szString; - // + // 가로 정렬 if (m_dwStyle & UISTYLE_STRING_ALIGNRIGHT) { m_ptDrawPos.x = m_rcRegion.right - size.cx; } else if (m_dwStyle & UISTYLE_STRING_ALIGNCENTER) { @@ -195,7 +195,7 @@ void CN3UIString::WordWrap() { } else { m_ptDrawPos.x = m_rcRegion.left; } - // + // 세로 정렬 if (m_dwStyle & UISTYLE_STRING_ALIGNBOTTOM) { m_ptDrawPos.y = m_rcRegion.bottom - size.cy; } else if (m_dwStyle & UISTYLE_STRING_ALIGNVCENTER) { @@ -204,11 +204,11 @@ void CN3UIString::WordWrap() { m_ptDrawPos.y = m_rcRegion.top; } m_iLineCount = 1; - } else // ̰ ̺ Ŭ ȿ  ڸ ǥ. + } else // 글자 가로 길이가 영역 길이보다 클경우 영역안에 들어가는 글자만 표시하자. { - // ķ. + // 가로 정렬은 왼쪽 정렬로. m_ptDrawPos.x = m_rcRegion.left; - // + // 세로 정렬 if (m_dwStyle & UISTYLE_STRING_ALIGNBOTTOM) { m_ptDrawPos.y = m_rcRegion.bottom - size.cy; } else if (m_dwStyle & UISTYLE_STRING_ALIGNVCENTER) { @@ -217,13 +217,13 @@ void CN3UIString::WordWrap() { m_ptDrawPos.y = m_rcRegion.top; } - // ڸ ڵ + // 글자 자르는 코드 int iCount = 0; while (iCount < iStrLen) { if ('\n' == szString[iCount]) // \n { break; - } else if (0x80 & szString[iCount]) // 2BYTE + } else if (0x80 & szString[iCount]) // 2BYTE 문자 { BOOL bFlag = m_pDFont->GetTextExtent(szString.c_str(), iCount + 2, &size); __ASSERT(bFlag, "cannot get size of dfont"); @@ -231,7 +231,7 @@ void CN3UIString::WordWrap() { break; } iCount += 2; - } else // 1BYTE + } else // 1BYTE 문자 { BOOL bFlag = m_pDFont->GetTextExtent(szString.c_str(), iCount + 1, &size); __ASSERT(bFlag, "cannot get size of dfont"); @@ -241,24 +241,24 @@ void CN3UIString::WordWrap() { ++iCount; } } - // strDisplayString iCount ŭ īϱ - szNewBuff = m_szString.substr(0, iCount); // +1 NULL ֱ + // strDisplayString 에 iCount 만큼만 카피하기 + szNewBuff = m_szString.substr(0, iCount); // +1은 맨 마지막에 NULL 넣기 위해 m_iLineCount = 1; } m_pDFont->SetText(szNewBuff); - } else { // mutiline϶ ׻ ؼ ׸. + } else { // mutiline일때는 항상 왼쪽 정렬해서 그린다. m_ptDrawPos.x = m_rcRegion.left; m_ptDrawPos.y = m_rcRegion.top; - m_NewLineIndices.clear(); // ο ε Ŭ + m_NewLineIndices.clear(); // 새로운 라인 인덱스 클리어 - // ڸ ڵ,  ڴ ʴ´. + // 글자 자르는 코드, 영역 밖으로 벗어나는 글자는 찍지 않는다. int iCX = 0; //, iCY=0; int iCount = 0; - // 켱 ó  ִ ũ üũϱ - BOOL bFlag = m_pDFont->GetTextExtent("", 2, &size); + // 우선 맨 처음 한줄이 들어갈 수 있는 크기인지 체크하기 + BOOL bFlag = m_pDFont->GetTextExtent("최", 2, &size); __ASSERT(bFlag, "cannot get size of dfont"); // iCY += size.cy; // if (iCY > iRegionHeight) @@ -268,43 +268,43 @@ void CN3UIString::WordWrap() { // return; } - m_iLineCount = 1; // 1 . - m_NewLineIndices.push_back(0); // ÷ 0 + m_iLineCount = 1; // 여기까지 오면 1줄은 찍힌다. + m_NewLineIndices.push_back(0); // 맨 첨 시작은 0 while (iCount < iStrLen) { if ('\n' == szString[iCount]) // \n { // szNewBuff += '\n'; // iCY += size.cy; - // if (iCY > iRegionHeight) break; // ̻ ڸ ʴ´. + // if (iCY > iRegionHeight) break; // 세로 범위가 넘으면 더이상 글자를 찍지 않는다. ++iCount; iCX = 0; if (iCount < iStrLen - 1) { - ++m_iLineCount; // ڰ ƴҰ ϱ + ++m_iLineCount; // 마지막 글자가 아닐경우 한줄 더하기 m_NewLineIndices.push_back(iCount); } } else { int iCC = 0; if (0x80 & szString[iCount]) { - iCC = 2; // 2BYTE + iCC = 2; // 2BYTE 문자 } else { - iCC = 1; // 1BYTE + iCC = 1; // 1BYTE 문자 } BOOL bFlag = m_pDFont->GetTextExtent(&(szString[iCount]), iCC, &size); __ASSERT(bFlag, "cannot get size of dfont"); - if ((iCX + size.cx) > iRegionWidth) // ̰ Ѿ + if ((iCX + size.cx) > iRegionWidth) // 가로 길이가 넘었으면 { - // szNewBuff += '\n'; // ٷ . + // szNewBuff += '\n'; // 다음줄로 내린다. iCX = 0; // iCY += size.cy; - // if (iCY > iRegionHeight) break; // ̻ ڸ ʴ´. + // if (iCY > iRegionHeight) break; // 세로 범위가 넘으면 더이상 글자를 찍지 않는다. if (iCount < iStrLen - 1) { - ++m_iLineCount; // ڰ ƴҰ ϱ + ++m_iLineCount; // 마지막 글자가 아닐경우 한줄 더하기 m_NewLineIndices.push_back(iCount); } } - // ī + // 글자 카피 // szNewBuff += szString.substr(iCount, iCC); iCount += iCC; @@ -323,7 +323,7 @@ void CN3UIString::SetStartLine(int iLine) { m_iStartLine = iLine; SIZE size = {0, 0}; - BOOL bFlag = m_pDFont->GetTextExtent("", 2, &size); + BOOL bFlag = m_pDFont->GetTextExtent("최", 2, &size); __ASSERT(bFlag, "cannot get size of dfont"); if (0 == size.cy) { return; @@ -347,7 +347,7 @@ void CN3UIString::SetStartLine(int iLine) { } } } - // ó + // 마지막줄 처리 if (iEndLine > 0) { // TODO: Added sanity check due to out of range access. Need to check if something else is off. if (bMoreLine) { iCC = m_NewLineIndices[iEndLine] - m_NewLineIndices[iEndLine - 1]; @@ -369,9 +369,9 @@ bool CN3UIString::Load(HANDLE hFile) { return false; } DWORD dwNum; - // font + // font 정보 int iStrLen = 0; - ReadFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // font ̸ + ReadFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // font 이름 길이 if (iStrLen > 0) { std::string szFontName(iStrLen, '?'); ReadFile(hFile, &(szFontName[0]), iStrLen, &dwNum, NULL); // string @@ -380,12 +380,12 @@ bool CN3UIString::Load(HANDLE hFile) { ReadFile(hFile, &dwFontHeight, sizeof(dwFontHeight), &dwNum, NULL); // font height ReadFile(hFile, &dwFontFlags, sizeof(dwFontFlags), &dwNum, NULL); // font flag (bold, italic) - SetFont(szFontName, dwFontHeight, dwFontFlags & D3DFONT_BOLD, dwFontFlags & D3DFONT_ITALIC); // ۲ + SetFont(szFontName, dwFontHeight, dwFontFlags & D3DFONT_BOLD, dwFontFlags & D3DFONT_ITALIC); // 글꼴 지정 } #ifdef _N3TOOL else { - SetFont("", 10, FALSE, FALSE); // ӽ÷ ۲ - MessageBox(GetActiveWindow(), "Ʈ UIString ־ (10) Ͽϴ.", "No font", + SetFont("굴림", 10, FALSE, FALSE); // 임시로 글꼴 지정 + MessageBox(GetActiveWindow(), "폰트가 지정되지 않은 UIString이 있어서 굴림(10)으로 설정하였습니다.", "No font", MB_OK); } #else @@ -393,8 +393,8 @@ bool CN3UIString::Load(HANDLE hFile) { #endif // string - ReadFile(hFile, &m_Color, sizeof(m_Color), &dwNum, NULL); // - ReadFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // string + ReadFile(hFile, &m_Color, sizeof(m_Color), &dwNum, NULL); // 글자 색 + ReadFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // string 길이 if (iStrLen > 0) { std::string szString(iStrLen, '?'); ReadFile(hFile, &(szString[0]), iStrLen, &dwNum, NULL); // string @@ -411,14 +411,14 @@ bool CN3UIString::Load(HANDLE hFile) { void CN3UIString::operator=(const CN3UIString & other) { CN3UIBase::operator=(other); - m_ptDrawPos = other.m_ptDrawPos; // ȭ鿡 ǥõ ǥ - m_Color = other.m_Color; // + m_ptDrawPos = other.m_ptDrawPos; // 실제 화면에 표시될 글자의 제일 왼쪽 상단 좌표 + m_Color = other.m_Color; // 글자 색 - // Ʈ + // 폰트 설정 DWORD dwFontFlags = other.GetFontFlags(); SetFont(other.GetFontName(), other.GetFontHeight(), dwFontFlags & D3DFONT_BOLD, dwFontFlags & D3DFONT_ITALIC); - // ۾ + // 글씨 설정 this->SetString(other.m_szString); // m_szString = other.m_szString; // string buffer } @@ -428,13 +428,13 @@ bool CN3UIString::Save(HANDLE hFile) { return false; } DWORD dwNum; - // font + // font 정보 char * pszFontName = NULL; __ASSERT(m_pDFont, "no font"); const std::string strFontName(m_pDFont->GetFontName()); int iStrLen = strFontName.size(); __ASSERT(iStrLen > 0, "No font name"); - WriteFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // font ̸ + WriteFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // font 이름 길이 if (iStrLen > 0) { WriteFile(hFile, strFontName.c_str(), iStrLen, &dwNum, NULL); // string DWORD dwFontFlags = 0, dwFontHeight = 0; @@ -447,10 +447,10 @@ bool CN3UIString::Save(HANDLE hFile) { } // string - WriteFile(hFile, &m_Color, sizeof(m_Color), &dwNum, NULL); // + WriteFile(hFile, &m_Color, sizeof(m_Color), &dwNum, NULL); // 글자 색 iStrLen = 0; iStrLen = m_szString.size(); - WriteFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // string + WriteFile(hFile, &iStrLen, sizeof(iStrLen), &dwNum, NULL); // string 길이 if (iStrLen > 0) { WriteFile(hFile, m_szString.c_str(), iStrLen, &dwNum, NULL); // string } @@ -480,7 +480,7 @@ int64_t CN3UIString::GetStringAsInt(const std::vector & remove /* = {}*/) int CN3UIString::GetStringRealWidth(int iNum) { SIZE size{}; - BOOL bFlag = m_pDFont->GetTextExtent("", lstrlen(""), &size); + BOOL bFlag = m_pDFont->GetTextExtent("가", lstrlen("가"), &size); __ASSERT(bFlag, "cannot get size of dfont"); int iLength = iNum / 2; if (iLength == 0) { @@ -491,7 +491,7 @@ int CN3UIString::GetStringRealWidth(int iNum) { int CN3UIString::GetStringRealWidthRect() { SIZE size{}; - BOOL bFlag = m_pDFont->GetTextExtent("", lstrlen(""), &size); + BOOL bFlag = m_pDFont->GetTextExtent("가", lstrlen("가"), &size); __ASSERT(bFlag, "cannot get size of dfont"); return (size.cy > 0) ? (m_rcRegion.bottom - m_rcRegion.top) / size.cy : 0; @@ -547,14 +547,14 @@ DWORD CN3UIString::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & p } #endif - // Ư ̺Ʈ ޽ .. + // 특정 이벤트에 대해 메시지 전송.. if (IsIn(ptCur.x, ptCur.y) && (dwFlags & UI_MOUSE_LBCLICKED)) { - m_pParent->ReceiveMessage(this, UIMSG_STRING_LCLICK); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_STRING_LCLICK); // 부모에게 버튼 클릭 통지.. // dwRet |= UI_MOUSEPROC_DONESOMETHING; } if (IsIn(ptCur.x, ptCur.y) && (dwFlags & UI_MOUSE_LBDBLCLK)) { - m_pParent->ReceiveMessage(this, UIMSG_STRING_LDCLICK); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_STRING_LDCLICK); // 부모에게 버튼 클릭 통지.. // dwRet |= UI_MOUSEPROC_DONESOMETHING; } diff --git a/src/engine/N3Base/N3UIString.h b/src/engine/N3Base/N3UIString.h index 95aadc84..44c50fa6 100644 --- a/src/engine/N3Base/N3UIString.h +++ b/src/engine/N3Base/N3UIString.h @@ -12,17 +12,17 @@ class CDFont; class CN3UIString : public CN3UIBase { friend class CN3UIEdit; #ifdef _N3TOOL - friend class CPropertyView; // ϱ ؼ + friend class CPropertyView; // 툴에서 각 변수들을 접근하기 위해서 #endif protected: - CDFont * m_pDFont; // DFont( ڸ ȭ鿡 ִ Ŭ) - POINT m_ptDrawPos; // ȭ鿡 ǥõ ǥ + CDFont * m_pDFont; // DFont(실제 글자를 화면에 찍어주는 클래스다) + POINT m_ptDrawPos; // 실제 화면에 표시될 글자의 제일 왼쪽 상단 좌표 std::string m_szString; // string buffer - D3DCOLOR m_Color; // - int m_iLineCount; // õ ۾ line - std::vector m_NewLineIndices; // multilineϰ ο ε - int m_iStartLine; // multilineϰ ۾ ιȣ + D3DCOLOR m_Color; // 글자 색 + int m_iLineCount; // 현재 세팅된 글씨들의 line수 + std::vector m_NewLineIndices; // multiline일경우 새로운 라인의 인덱스들 + int m_iStartLine; // multiline일경우 글씨가 찍히는 시작 라인번호 int m_iPadding; public: @@ -44,10 +44,10 @@ class CN3UIString : public CN3UIBase { virtual void Render(); virtual void Release(); virtual void Init(CN3UIBase * pParent); - virtual BOOL MoveOffset(int iOffsetX, int iOffsetY); // ۾ ġ ٲ ش. + virtual BOOL MoveOffset(int iOffsetX, int iOffsetY); // 글씨찍는 위치도 바뀌어 준다. virtual bool Load(HANDLE hFile); - void ClearOnlyStringBuffer() { m_szString = ""; } // string ۸ . - void SetStartLine(int iLine); // multilineϰ ϴ ϱ + void ClearOnlyStringBuffer() { m_szString = ""; } // string 버퍼만 지운다. + void SetStartLine(int iLine); // multiline일경우 시작하는 라인 변경하기 virtual void operator=(const CN3UIString & other); @@ -62,9 +62,9 @@ class CN3UIString : public CN3UIBase { virtual void SetString(const std::string & szString); virtual void SetStringAsInt(int iVal); - void SetString_NoWordWrap(const std::string & szString); // ʴ´. + void SetString_NoWordWrap(const std::string & szString); // 글자 정렬 하지 않는다. virtual void SetFont(const std::string & szFontName, DWORD dwHeight, BOOL bBold, - BOOL bItalic); // dwHeight point size̴. + BOOL bItalic); // dwHeight는 point size이다. BOOL GetTextExtent(const std::string & szString, int iStrLen, SIZE * pSize) { if (m_pDFont) { return m_pDFont->GetTextExtent(szString, iStrLen, pSize); diff --git a/src/engine/N3Base/N3UITooltip.cpp b/src/engine/N3Base/N3UITooltip.cpp index d07ff08d..44b3a209 100644 --- a/src/engine/N3Base/N3UITooltip.cpp +++ b/src/engine/N3Base/N3UITooltip.cpp @@ -34,7 +34,7 @@ void CN3UITooltip::Render() { if (!m_bVisible || !m_bSetText) { return; } - if (NULL == m_pImageBkGnd) { // ̹ Ʈ ׷ + if (NULL == m_pImageBkGnd) { // 이미지가 없으면 디폴트로 그려주자 static __VertexTransformedColor pVB[8]; static const WORD pIB[16] = {0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4}; static const D3DCOLOR BkColor = 0x80000000; @@ -57,16 +57,16 @@ void CN3UITooltip::Render() { // draw s_lpD3DDev->SetFVF(FVF_TRANSFORMEDCOLOR); HRESULT hr = - s_lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, pVB, sizeof(__VertexTransformedColor)); // ĥϱ + s_lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, pVB, sizeof(__VertexTransformedColor)); // 배경색 칠하기 __VertexTransformedColor * pTemp = pVB; for (int i = 0; i < 4; ++i) { - pTemp++->color = BorderColorOut; // ٱ ׵θ ٲ۴. + pTemp++->color = BorderColorOut; // 바깥 테두리 색을 바꾼다. } s_lpD3DDev->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, 8, 8, pIB, D3DFMT_INDEX16, pVB, - sizeof(__VertexTransformedColor)); // ׵θ ĥϱ + sizeof(__VertexTransformedColor)); // 테두리 칠하기 - // ۾ ׸ + // 글씨 그리기 m_pBuffOutRef->Render(); } else { CN3UIStatic::Render(); @@ -78,23 +78,23 @@ void CN3UITooltip::SetText(const std::string & szText) { return; } - // ũ⸦ Ѵ. + // 툴팁상자 크기를 조정한다. int iStrLen = szText.size(); if (0 == iStrLen || NULL == m_pBuffOutRef) { return; } - m_pBuffOutRef->ClearOnlyStringBuffer(); //켱 ִ ۾ .( ʰ) + m_pBuffOutRef->ClearOnlyStringBuffer(); //우선 기존에 있던 글씨를 지운다.(정렬하지 않고) SIZE size; if (m_pBuffOutRef->GetTextExtent(szText, iStrLen, &size)) { - if (std::string::npos != szText.find('\n')) { // '\n'ڿ߿ \n  Ƿ multi line + if (std::string::npos != szText.find('\n')) { // '\n'문자열중에 \n이 들어가 있으므로 multi line으로 간주 m_pBuffOutRef->SetStyle(UISTYLE_STRING_ALIGNLEFT | UISTYLE_STRING_ALIGNTOP); - } else if (iStrLen < 25) { // 25byte ̸̸ ׳ ٷ. + } else if (iStrLen < 25) { // 25byte 미만이면 그냥 한줄로. m_pBuffOutRef->SetStyle(UISTYLE_STRING_SINGLELINE | UISTYLE_STRING_ALIGNCENTER | UISTYLE_STRING_ALIGNVCENTER); - } else { // single line̹Ƿ ũ⸦ Ѵ. + } else { // single line이므로 적당한 크기를 계산한다. SIZE CharSize = {0, 0}; - if (FALSE == m_pBuffOutRef->GetTextExtent("", 2, &CharSize)) { + if (FALSE == m_pBuffOutRef->GetTextExtent("가", 2, &CharSize)) { return; } @@ -114,7 +114,7 @@ void CN3UITooltip::SetText(const std::string & szText) { } m_pBuffOutRef->SetString(szText); - // ġ + // 위치 조정 POINT ptNew = m_ptCursor; ptNew.x -= (m_rcRegion.right - m_rcRegion.left) / 2; ptNew.y -= (m_rcRegion.bottom - m_rcRegion.top) + 10; @@ -123,18 +123,18 @@ void CN3UITooltip::SetText(const std::string & szText) { int iRegionWidth = m_rcRegion.right - m_rcRegion.left; int iRegionHeight = m_rcRegion.bottom - m_rcRegion.top; - if (ptNew.x + iRegionWidth > vp.X + vp.Width) { // ȭ U  + if (ptNew.x + iRegionWidth > vp.X + vp.Width) { // 화면 오른쪾으로 벗어난 경우 ptNew.x = vp.X + vp.Width - iRegionWidth; } if (ptNew.x < vp.X) { - ptNew.x = vp.X; // ȭ  + ptNew.x = vp.X; // 화면 왼쪽으로 벗어난 경우 } - if (ptNew.y + iRegionHeight > vp.Y + vp.Height) { // ȭ ϴ  + if (ptNew.y + iRegionHeight > vp.Y + vp.Height) { // 화면 하단으로 벗어난 경우 ptNew.y = vp.Y + vp.Height - iRegionHeight; } if (ptNew.y < vp.Y) { - ptNew.y = vp.Y; // ȭ  + ptNew.y = vp.Y; // 화면 상단으로 벗어난 경우 } SetPos(ptNew.x, ptNew.y); @@ -147,7 +147,7 @@ void CN3UITooltip::Tick() { m_fHoverTime += s_fSecPerFrm; static const float fDisplayTime = 0.3f; if (fOldTime < fDisplayTime && m_fHoverTime >= fDisplayTime) { - SetVisible(true); // tool tip ǥ + SetVisible(true); // tool tip 표시 } } @@ -157,12 +157,12 @@ DWORD CN3UITooltip::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & return dwRet; } - // 콺 ̸ m_fHoverTime 0 + // 마우스를 움직이면 m_fHoverTime를 0으로 만들기 if (ptCur.x != ptOld.x || ptCur.y != ptOld.y) { m_fHoverTime = 0.0f; m_bSetText = false; - SetVisible(false); // tool tip ش. - } else { // ȿ̸ Ŀ ġ + SetVisible(false); // tool tip을 없앤다. + } else { // 안움직이면 커서 위치 저장 m_ptCursor = ptCur; } diff --git a/src/engine/N3Base/N3UITooltip.h b/src/engine/N3Base/N3UITooltip.h index 1b87ce28..95782353 100644 --- a/src/engine/N3Base/N3UITooltip.h +++ b/src/engine/N3Base/N3UITooltip.h @@ -1,12 +1,12 @@ // N3UITooltip.h: interface for the CN3UITooltip class. -// CN3UIBase EnableTooltip() DestroyTooltip()Լ Ʒ ׸ ݴϴ. -// 1. tooltip θ null ְ ؾ մϴ. -// 2. Save/Load մϴ. +// CN3UIBase에 EnableTooltip() 과 DestroyTooltip()함수가 아래 항목들을 관리해줍니다. +// 1. tooltip은 부모를 null로 해주고 따로 관리 해야 합니다. +// 2. Save/Load도 따로 관리합니다. // -// Ʒ ׸ ׸ ܿ ó־ ͵Դϴ. -// 1. Render UI ׸ Renderؾ մϴ. -// 2. MouseProcԼ ȣ մϴ. -// 3. TickԼ ȣ մϴ. +// 아래 항목들은 위의 항목 외에도 처리해주어야 할 것들입니다. +// 1. Render는 모든 UI를 다 그린후 Render해야 합니다. +// 2. MouseProc함수를 호출해줘야 합니다. +// 3. Tick함수도 호출해줘야 합니다. ////////////////////////////////////////////////////////////////////// #pragma once @@ -21,9 +21,9 @@ class CN3UITooltip : public CN3UIStatic { // Attributes public: protected: - float m_fHoverTime; // 콺 Ѱ Ͽ ִ ð() - bool m_bSetText; // ̹ text Ǿ°? - POINT m_ptCursor; // Ŀ ġ + float m_fHoverTime; // 마우스가 한곳에서 정지하여 있는 시간(누적) + bool m_bSetText; // 이미 text가 설정되었는가? + POINT m_ptCursor; // 커서의 위치 // Operations public: diff --git a/src/engine/N3Base/N3UITrackBar.cpp b/src/engine/N3Base/N3UITrackBar.cpp index 1f85abf4..0ffc8d6d 100644 --- a/src/engine/N3Base/N3UITrackBar.cpp +++ b/src/engine/N3Base/N3UITrackBar.cpp @@ -38,11 +38,11 @@ bool CN3UITrackBar::Load(HANDLE hFile) { return false; } - // ImageRef ϱ + // ImageRef 설정하기 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); if (UI_TYPE_IMAGE != pChild->UIType()) { - continue; // image 󳻱 + continue; // image만 골라내기 } int iImageType = (int)(pChild->GetReserved()); if (IMAGETYPE_BKGND == iImageType) { @@ -57,7 +57,7 @@ bool CN3UITrackBar::Load(HANDLE hFile) { void CN3UITrackBar::SetRegion(const RECT & Rect) { CN3UIBase::SetRegion(Rect); if (m_pBkGndImageRef) { - m_pBkGndImageRef->SetRegion(m_rcRegion); // ̹ + m_pBkGndImageRef->SetRegion(m_rcRegion); // 배경이미지는 같은 영역으로 } RECT rcThumb = m_pThumbImageRef->GetRegion(); @@ -69,14 +69,14 @@ void CN3UITrackBar::SetRegion(const RECT & Rect) { return; } - if (iThumbWidth <= 0 && iThumbHeight <= 0) { // thumb ̹ Ǿ ʴٸ ϰ + if (iThumbWidth <= 0 && iThumbHeight <= 0) { // thumb 이미지는 설정되어 있지 않다면 임으로 적당하게 설정 RECT rc; - if (UISTYLE_TRACKBAR_VERTICAL == m_dwStyle) { // + if (UISTYLE_TRACKBAR_VERTICAL == m_dwStyle) { // 세로 rc.left = Rect.left; rc.top = Rect.top + iBkHeight * 0.3f; rc.right = Rect.right; rc.bottom = rc.top + iBkHeight * 0.3f; - } else { // + } else { // 가로 rc.left = Rect.left + iBkWidth * 0.3f; rc.top = Rect.top; rc.right = rc.left + iBkWidth * 0.3f; @@ -92,27 +92,27 @@ DWORD CN3UITrackBar::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & if (!m_bVisible) { return dwRet; } - if (false == IsIn(ptCur.x, ptCur.y)) // ̸ + if (false == IsIn(ptCur.x, ptCur.y)) // 영역 밖이면 { SetState(UI_STATE_COMMON_NONE); return dwRet; } - dwRet |= UI_MOUSEPROC_INREGION; // ̹ǥ ̴. + dwRet |= UI_MOUSEPROC_INREGION; // 이번좌표가 영역 안이다. if (UI_STATE_TRACKBAR_THUMBDRAG == m_eState) { - if (dwFlags & UI_MOUSE_LBCLICKED) // ʹư + if (dwFlags & UI_MOUSE_LBCLICKED) // 왼쪽버튼 떼는 순간 { - SetState(UI_STATE_COMMON_NONE); // drag + SetState(UI_STATE_COMMON_NONE); // drag 해제 dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } else if (dwFlags & UI_MOUSE_LBDOWN) { - // thumb δ. + // thumb을 움직인다. if (UISTYLE_TRACKBAR_VERTICAL == m_dwStyle) { UpDownThumbPos(ptCur.y - ptOld.y); } else { UpDownThumbPos(ptCur.x - ptOld.x); } - // θ𿡰 ޼ + // 부모에게 메세지를 보내자 if (m_pParent) { m_pParent->ReceiveMessage(this, UIMSG_TRACKBAR_POS); } @@ -120,27 +120,27 @@ DWORD CN3UITrackBar::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & return dwRet; } } else { - if (dwFlags & UI_MOUSE_LBCLICK) // ʹư + if (dwFlags & UI_MOUSE_LBCLICK) // 왼쪽버튼 눌르는 순간 { - if (m_pThumbImageRef->IsIn(ptCur.x, ptCur.y)) // thumb . + if (m_pThumbImageRef->IsIn(ptCur.x, ptCur.y)) // thumb을 눌렀다. { SetState(UI_STATE_TRACKBAR_THUMBDRAG); dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; - } else // thumbκ Ǵ Ʒ κ( Ǵ ) . + } else // thumb위부분 또는 아래 부분(좌 또는 우 여백)을 눌렀따. { RECT rcThumb = m_pThumbImageRef->GetRegion(); if (UISTYLE_TRACKBAR_VERTICAL == m_dwStyle) { if (ptCur.y <= rcThumb.top) { - SetCurrentPos(m_iCurPos - m_iPageSize); // κ Ŭ + SetCurrentPos(m_iCurPos - m_iPageSize); // 윗부분 클릭 } else { - SetCurrentPos(m_iCurPos + m_iPageSize); // Ʒ κ Ŭ + SetCurrentPos(m_iCurPos + m_iPageSize); // 아래 부분 클릭 } } else { if (ptCur.x <= rcThumb.left) { - SetCurrentPos(m_iCurPos - m_iPageSize); // κ Ŭ + SetCurrentPos(m_iCurPos - m_iPageSize); // 왼쪽 부분 클릭 } else { - SetCurrentPos(m_iCurPos + m_iPageSize); // κ Ŭ + SetCurrentPos(m_iCurPos + m_iPageSize); // 오른쪽 부분 클릭 } } if (m_pParent) { @@ -191,7 +191,7 @@ void CN3UITrackBar::SetCurrentPos(int iPos) { UpdateThumbPos(); } -// Posġ Thumb ġ +// Pos수치로 Thumb의 위치를 조정 void CN3UITrackBar::UpdateThumbPos() { if (NULL == m_pThumbImageRef) { return; @@ -212,14 +212,14 @@ void CN3UITrackBar::UpdateThumbPos() { } } -// thumb pixel ġ ϰ thumb ġ pos ġ Ͽ +// thumb을 pixel단위로 위치 조정하고 thumb의 위치를 바탕으로 pos 수치를 계산하여 넣음 void CN3UITrackBar::UpDownThumbPos(int iDiff) { if (NULL == m_pThumbImageRef) { return; } RECT rcThumb = m_pThumbImageRef->GetRegion(); - if (UISTYLE_TRACKBAR_VERTICAL == m_dwStyle) // Ʒ + if (UISTYLE_TRACKBAR_VERTICAL == m_dwStyle) // 아래 움직일 대 { int iRegionHeight = m_rcRegion.bottom - m_rcRegion.top; int iThumbHeight = rcThumb.bottom - rcThumb.top; @@ -227,24 +227,24 @@ void CN3UITrackBar::UpDownThumbPos(int iDiff) { return; } - // ű thumb ġ percentage ϱ + // 옮긴후 thumb의 위치 percentage 구하기 float fPercentage = ((rcThumb.top - m_rcRegion.top) + iDiff) / (((float)(iRegionHeight)) - iThumbHeight); - if (fPercentage > 1.0f) // ʹ Ʒ ȴ. + if (fPercentage > 1.0f) // 너무 아래로 내렸다. { m_pThumbImageRef->SetPos(rcThumb.left, rcThumb.bottom - iThumbHeight); - m_iCurPos = m_iMaxPos; // SetCurrentPosԼ ȣϸ thumbġ ٽ ϱ ٲپ. - } else if (fPercentage < 0.0f) // ʹ ÷ȴ. + m_iCurPos = m_iMaxPos; // SetCurrentPos함수를 호출하면 thumb위치를 다시 계산하기 때문에 직접 바꾸어줌. + } else if (fPercentage < 0.0f) // 너무 위로 올렸다. { m_pThumbImageRef->SetPos(rcThumb.left, rcThumb.top); - m_iCurPos = m_iMinPos; // SetCurrentPosԼ ȣϸ thumbġ ٽ ϱ ٲپ. + m_iCurPos = m_iMinPos; // SetCurrentPos함수를 호출하면 thumb위치를 다시 계산하기 때문에 직접 바꾸어줌. } else { m_pThumbImageRef->SetPos(rcThumb.left, rcThumb.top + iDiff); m_iCurPos = m_iMinPos + (m_iMaxPos - m_iMinPos) * - fPercentage; // SetCurrentPosԼ ȣϸ thumbġ ٽ ϱ ٲپ. + fPercentage; // SetCurrentPos함수를 호출하면 thumb위치를 다시 계산하기 때문에 직접 바꾸어줌. } - } else // ¿ + } else // 좌우로 움직일 때 { int iRegionWidth = m_rcRegion.right - m_rcRegion.left; int iThumbWidth = rcThumb.right - rcThumb.left; @@ -252,22 +252,22 @@ void CN3UITrackBar::UpDownThumbPos(int iDiff) { return; } - // ű thumb ġ percentage ϱ + // 옮긴후 thumb의 위치 percentage 구하기 float fPercentage = ((rcThumb.left - m_rcRegion.left) + iDiff) / (((float)(iRegionWidth)) - iThumbWidth); - if (fPercentage > 1.0f) // ʹ о. + if (fPercentage > 1.0f) // 너무 오른쪽으로 밀었다. { m_pThumbImageRef->SetPos(rcThumb.right - iThumbWidth, rcThumb.top); - m_iCurPos = m_iMaxPos; // SetCurrentPosԼ ȣϸ thumbġ ٽ ϱ ٲپ. - } else if (fPercentage < 0.0f) // ʹ о + m_iCurPos = m_iMaxPos; // SetCurrentPos함수를 호출하면 thumb위치를 다시 계산하기 때문에 직접 바꾸어줌. + } else if (fPercentage < 0.0f) // 너무 왼쪽으로 밀었다 { m_pThumbImageRef->SetPos(rcThumb.left, rcThumb.top); - m_iCurPos = m_iMinPos; // SetCurrentPosԼ ȣϸ thumbġ ٽ ϱ ٲپ. + m_iCurPos = m_iMinPos; // SetCurrentPos함수를 호출하면 thumb위치를 다시 계산하기 때문에 직접 바꾸어줌. } else { m_pThumbImageRef->SetPos(rcThumb.left + iDiff, rcThumb.top); m_iCurPos = m_iMinPos + (m_iMaxPos - m_iMinPos) * - fPercentage; // SetCurrentPosԼ ȣϸ thumbġ ٽ ϱ ٲپ. + fPercentage; // SetCurrentPos함수를 호출하면 thumb위치를 다시 계산하기 때문에 직접 바꾸어줌. } } } @@ -276,16 +276,16 @@ void CN3UITrackBar::UpDownThumbPos(int iDiff) { void CN3UITrackBar::operator=(const CN3UITrackBar & other) { CN3UIBase::operator=(other); - m_iMaxPos = other.m_iMaxPos; // ִ - m_iMinPos = other.m_iMinPos; // ּ - m_iCurPos = other.m_iCurPos; // - m_iPageSize = other.m_iPageSize; // page ̵Ҷ ̵ + m_iMaxPos = other.m_iMaxPos; // 최대 + m_iMinPos = other.m_iMinPos; // 최소 + m_iCurPos = other.m_iCurPos; // 현재 값 + m_iPageSize = other.m_iPageSize; // page단위 이동할때 이동값 - // ImageRef ϱ + // ImageRef 설정하기 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); if (UI_TYPE_IMAGE != pChild->UIType()) { - continue; // image 󳻱 + continue; // image만 골라내기 } int iImageType = (int)(pChild->GetReserved()); if (IMAGETYPE_BKGND == iImageType) { @@ -297,7 +297,7 @@ void CN3UITrackBar::operator=(const CN3UITrackBar & other) { } void CN3UITrackBar::CreateImages() { - __ASSERT(NULL == m_pBkGndImageRef && NULL == m_pThumbImageRef, "̹ ̹ ҴǾ ־"); + __ASSERT(NULL == m_pBkGndImageRef && NULL == m_pThumbImageRef, "이미지가 이미 할당되어 있어여"); m_pBkGndImageRef = new CN3UIImage(); m_pBkGndImageRef->Init(this); m_pBkGndImageRef->SetReserved(IMAGETYPE_BKGND); @@ -306,7 +306,7 @@ void CN3UITrackBar::CreateImages() { m_pThumbImageRef->Init(this); m_pThumbImageRef->SetReserved(IMAGETYPE_THUMB); - SetRegion(m_rcRegion); // ٽ + SetRegion(m_rcRegion); // 영역 다시 설정 } void CN3UITrackBar::DeleteBkImage() { diff --git a/src/engine/N3Base/N3UITrackBar.h b/src/engine/N3Base/N3UITrackBar.h index b1326d49..21db64ac 100644 --- a/src/engine/N3Base/N3UITrackBar.h +++ b/src/engine/N3Base/N3UITrackBar.h @@ -20,13 +20,13 @@ class CN3UITrackBar : public CN3UIBase { }; protected: - CN3UIImage * m_pBkGndImageRef; // ̹ referance (޸ Ҵ children list ) - CN3UIImage * m_pThumbImageRef; //  巹 Ͽ ű ִ ̹ referance + CN3UIImage * m_pBkGndImageRef; // 배경 이미지 referance (메모리 할당은 children list로 관리) + CN3UIImage * m_pThumbImageRef; // 가운데 드레그 하여 옮길 수 있는 이미지 referance - int m_iMaxPos; // ִ - int m_iMinPos; // ּ - int m_iCurPos; // - int m_iPageSize; // page ̵Ҷ ̵ + int m_iMaxPos; // 최대 + int m_iMinPos; // 최소 + int m_iCurPos; // 현재 값 + int m_iPageSize; // page단위 이동할때 이동값 // Operations public: @@ -47,15 +47,15 @@ class CN3UITrackBar : public CN3UIBase { int GetMinPos() const { return m_iMinPos; } protected: - void UpdateThumbPos(); // m_iCurPos Ͽ Thumbġ ٽ Ͽ ٲٱ - void UpDownThumbPos(int iDiff); // Thumbġ Ʒ iDiff pixelŭ m_iCurPos ϱ + void UpdateThumbPos(); // m_iCurPos를 계산하여 Thumb위치 다시 계산하여 바꾸기 + void UpDownThumbPos(int iDiff); // Thumb위치를 아래 위로 iDiff pixel만큼 움직인 후 m_iCurPos 갱신하기 #ifdef _N3TOOL - // tool ̴ Լ + // tool에서 쓰이는 함수 public: virtual void operator=(const CN3UITrackBar & other); - void CreateImages(); // ̹ - void DeleteBkImage(); // ̹ + void CreateImages(); // 이미지 생성 + void DeleteBkImage(); // 배경이미지 삭제 CN3UIImage * GetBkGndImgRef() const { return m_pBkGndImageRef; } CN3UIImage * GetThumbImgRef() const { return m_pThumbImageRef; } #endif diff --git a/src/engine/N3Base/N3VMesh.cpp b/src/engine/N3Base/N3VMesh.cpp index f92af7d9..9773c9e8 100644 --- a/src/engine/N3Base/N3VMesh.cpp +++ b/src/engine/N3Base/N3VMesh.cpp @@ -12,7 +12,7 @@ CN3VMesh::CN3VMesh() { m_dwType |= OBJ_MESH_VECTOR3; - m_pVertices = NULL; // + m_pVertices = NULL; // 점 버퍼 m_pwIndices = NULL; // Index... m_nVC = 0; @@ -20,7 +20,7 @@ CN3VMesh::CN3VMesh() { m_vMin.Zero(); m_vMax.Zero(); - m_fRadius = 0.0f; // + m_fRadius = 0.0f; // 반지름 } CN3VMesh::~CN3VMesh() { @@ -48,7 +48,7 @@ void CN3VMesh::Release() { m_vMin.Zero(); m_vMax.Zero(); - m_fRadius = 0.0f; // + m_fRadius = 0.0f; // 반지름 } bool CN3VMesh::Load(HANDLE hFile) { @@ -57,20 +57,20 @@ bool CN3VMesh::Load(HANDLE hFile) { DWORD dwRWC = 0; int nVC; - ReadFile(hFile, &nVC, 4, &dwRWC, NULL); // б.. + ReadFile(hFile, &nVC, 4, &dwRWC, NULL); // 점갯수 읽기.. if (nVC > 0) { - this->CreateVertices(nVC); // Vertex Buffer ä + this->CreateVertices(nVC); // Vertex Buffer 생성 및 데이터 채우기 ReadFile(hFile, m_pVertices, nVC * sizeof(__Vector3), &dwRWC, NULL); } int nIC; ReadFile(hFile, &nIC, 4, &dwRWC, NULL); // Index Count.. if (nIC > 0) { - this->CreateIndex(nIC); // Vertex Buffer ä + this->CreateIndex(nIC); // Vertex Buffer 생성 및 데이터 채우기 ReadFile(hFile, m_pwIndices, nIC * 2, &dwRWC, NULL); } - this->FindMinMax(); // ִ ּ ߽ ش.. + this->FindMinMax(); // 최대 최소점과 중심점과 반지름을 계산해 준다.. return true; } @@ -81,14 +81,14 @@ bool CN3VMesh::Save(HANDLE hFile) { DWORD dwRWC = 0; - WriteFile(hFile, &m_nVC, 4, &dwRWC, NULL); // б.. + WriteFile(hFile, &m_nVC, 4, &dwRWC, NULL); // 점갯수 읽기.. if (m_nVC > 0) { WriteFile(hFile, m_pVertices, m_nVC * sizeof(__Vector3), &dwRWC, NULL); } WriteFile(hFile, &m_nIC, 4, &dwRWC, NULL); // Index Count.. if (m_nIC > 0) { - WriteFile(hFile, m_pwIndices, m_nIC * 2, &dwRWC, NULL); // Index Buffer .. + WriteFile(hFile, m_pwIndices, m_nIC * 2, &dwRWC, NULL); // Index Buffer 데이터 쓰기.. } return true; @@ -114,7 +114,7 @@ void CN3VMesh::CreateVertices(int nVC) { m_pVertices = new __Vector3[nVC]; } - memset(m_pVertices, 0, nVC * sizeof(__Vector3)); // Vertex Buffer + memset(m_pVertices, 0, nVC * sizeof(__Vector3)); // Vertex Buffer 생성 m_nVC = nVC; } @@ -129,7 +129,7 @@ void CN3VMesh::CreateIndex(int nIC) { delete[] m_pwIndices; m_pwIndices = new WORD[nIC]; - memset(m_pwIndices, 0, nIC * 2); // Index Buffer + memset(m_pwIndices, 0, nIC * 2); // Index Buffer 생성 m_nIC = nIC; } @@ -184,7 +184,7 @@ void CN3VMesh::CreateCube(const __Vector3 & vMin, const __Vector3 & vMax) { m_pwIndices[34] = 7; m_pwIndices[35] = 6; - this->FindMinMax(); // ߽ ش.. + this->FindMinMax(); // 중심점과 반지름을 계산해 준다.. } //#ifdef _DEBUG @@ -270,7 +270,7 @@ void CN3VMesh::FindMinMax() { } } - // ִ ּҰ Ѵ.. + // 최대 최소값을 갖고 반지름 계산한다.. m_fRadius = (m_vMax - m_vMin).Magnitude() * 0.5f; } @@ -316,12 +316,12 @@ bool CN3VMesh::CheckCollision(const __Matrix44 & MtxWorld, const __Vector3 & v0, if (false == ::_IntersectTriangle(vPos0, vDir, m_pVertices[nCI0], m_pVertices[nCI1], m_pVertices[nCI2], fT, fU, fV, &vColTmp)) { - continue; // ù° Ͱ ġ.. + continue; // 첫째 벡터가 걸치면.. } if (false == ::_IntersectTriangle(vPos1, vDir, m_pVertices[nCI0], m_pVertices[nCI1], - m_pVertices[nCI2])) // ° ġ.. + m_pVertices[nCI2])) // 둘째는 안 걸치면.. { - fDistTmp = (vPos0 - vColTmp).Magnitude(); // Ÿ 纸.. + fDistTmp = (vPos0 - vColTmp).Magnitude(); // 거리를 재보고.. if (fDistTmp < fDistClosest) { fDistClosest = fDistTmp; @@ -329,7 +329,7 @@ bool CN3VMesh::CheckCollision(const __Matrix44 & MtxWorld, const __Vector3 & v0, *pVCol = vColTmp * MtxWorld; } - // ϱ.. + // 법선 벡터 구하기.. if (pVNormal) { (*pVNormal).Cross(m_pVertices[nCI1] - m_pVertices[nCI0], m_pVertices[nCI2] - m_pVertices[nCI1]); (*pVNormal) *= mtxRot; @@ -342,7 +342,7 @@ bool CN3VMesh::CheckCollision(const __Matrix44 & MtxWorld, const __Vector3 & v0, return true; } - // 浹޽ ȿ ִ ..by lynus.. + //두점이 충돌메시 안에 있는 경우..by lynus.. __Vector3 tmpNormal; for (int i = 0; i < nFC; i++) { if (m_nIC > 0) { @@ -404,7 +404,7 @@ bool CN3VMesh::Pick(const __Matrix44 & MtxWorld, const __Vector3 & vPos, const _ continue; } - // 浹̴.. + // 충돌이다.. if (pVCol) { float fT, fU, fV; ::_IntersectTriangle(vPos2, vDir2, m_pVertices[nCI0], m_pVertices[nCI1], m_pVertices[nCI2], fT, fU, fV, @@ -412,7 +412,7 @@ bool CN3VMesh::Pick(const __Matrix44 & MtxWorld, const __Vector3 & vPos, const _ (*pVCol) *= MtxWorld; } - // ϱ.. + // 법선 벡터 구하기.. if (pVNormal) { (*pVNormal).Cross(m_pVertices[nCI1] - m_pVertices[nCI0], m_pVertices[nCI2] - m_pVertices[nCI1]); (*pVNormal) *= mtxRot; @@ -439,14 +439,14 @@ bool CN3VMesh::Import(CN3IMesh * pIMesh) { this->Release(); this->CreateVertices(nFC * 3); - for (int i = 0; i < nFC; i++) // Normal ٽ .. + for (int i = 0; i < nFC; i++) // Normal 값 다시 세팅.. { m_pVertices[i * 3 + 0] = pvSrc[i * 3 + 0]; m_pVertices[i * 3 + 1] = pvSrc[i * 3 + 1]; m_pVertices[i * 3 + 2] = pvSrc[i * 3 + 2]; } - m_szName = pIMesh->m_szName; // ̸.. + m_szName = pIMesh->m_szName; // 이름.. return true; } #endif // end of _N3TOOL diff --git a/src/engine/N3Base/N3VMesh.h b/src/engine/N3Base/N3VMesh.h index 37f8a97d..8ebe04e6 100644 --- a/src/engine/N3Base/N3VMesh.h +++ b/src/engine/N3Base/N3VMesh.h @@ -10,15 +10,15 @@ class CN3IMesh; class CN3VMesh : public CN3BaseFileAccess { protected: - __Vector3 * m_pVertices; // - int m_nVC; // + __Vector3 * m_pVertices; // 점 버퍼 + int m_nVC; // 점 갯수 WORD * m_pwIndices; // Index... int m_nIC; // Index Count __Vector3 m_vMin; __Vector3 m_vMax; - float m_fRadius; // + float m_fRadius; // 반지름 public: __Vector3 Min() { return m_vMin; } @@ -26,7 +26,7 @@ class CN3VMesh : public CN3BaseFileAccess { bool Pick(const __Matrix44 & MtxWorld, const __Vector3 & vPos, const __Vector3 & vDir, __Vector3 * pVCol = NULL, __Vector3 * pVNormal = NULL); bool CheckCollision(const __Matrix44 & MtxWorld, const __Vector3 & v0, const __Vector3 & v1, - __Vector3 * pVCol = NULL, __Vector3 * pVNormal = NULL); // Local ǥ 浹 üũ .. + __Vector3 * pVCol = NULL, __Vector3 * pVNormal = NULL); // Local 좌표를 통한 충돌 체크 판정.. float Radius() { return m_fRadius; } void FindMinMax(); void Render(D3DCOLOR crLine); @@ -51,11 +51,11 @@ class CN3VMesh : public CN3BaseFileAccess { CN3VMesh(); virtual ~CN3VMesh(); - // By : Ecli666 ( On 2002-08-09 2:47:59 ) + // By : Ecli666 ( On 2002-08-09 오후 2:47:59 ) // int GetColIndexByiOrder(int iOrder); __Vector3 GetColVertexByIndex(int iIndex); void PartialColRender(int iCount, int * piIndices); void PartialGetCollision(int iIndex, __Vector3 & vec); - // ~(By Ecli666 On 2002-08-09 2:47:59 ) + // ~(By Ecli666 On 2002-08-09 오후 2:47:59 ) }; diff --git a/src/engine/N3Base/Pick.h b/src/engine/N3Base/Pick.h index edb90ab3..7ed140cd 100644 --- a/src/engine/N3Base/Pick.h +++ b/src/engine/N3Base/Pick.h @@ -16,20 +16,20 @@ class CPick { CN3Mesh m_MeshBox; // Picking Box protected: - __Vector3 m_vPickRayDir; // 浹 üũ - __Vector3 m_vPickRayOrig; // 浹 üũ + __Vector3 m_vPickRayDir; // 충돌 체크할 직선의 방향 + __Vector3 m_vPickRayOrig; // 충돌 체크할 직선의 시작점 // Operations public: BOOL PickByBox(__Vector3 & vMin, __Vector3 & vMax, __Vector3 & vIntersect); - void SetPickXY(long x, long y); // Ŭ̾Ʈ ǥ ־ش.. + void SetPickXY(long x, long y); // 클라이언트 좌표를 넣어준다.. - // [in] v0, v1, v2 ǥ - // [out] t Ŭ ִ. t*dir + orig ϸ ִ. - // [out] uv ǥ v0 (0,0), v1(1,0), v2(0,1) <ȣ (U, V)ǥ> ̷ Ÿ - // v0 + (v1-v0)*u + (v2-v0)*v ϸ ִ. - // [out] vPos 콺 3D ǥ - // FALSE̸ ̷ ﰢ ȿ ʴ´ٴ , t u v vPos ȿ ̹Ƿ ȵȴ. + // [in] v0, v1, v2 세점의 좌표 + // [out] t가 클수록 직선과 평면과 만나는 점이 멀다. t*dir + orig 를 구하면 만나는 점을 구할 수 있다. + // [out] uv 좌표 v0 (0,0), v1(1,0), v2(0,1) <괄호안은 (U, V)좌표> 이런식으로 어느 점에 가깝나 나타낸 것 + // v0 + (v1-v0)*u + (v2-v0)*v 를 구하면 만나는 점을 구할 수 있다. + // [out] vPos 마우스로 찍은 곳의 3D 좌표 + // 리턴 값이 FALSE이면 세점이 이루는 삼각형 안에서 만나지 않는다는 뜻, t u v vPos 모두 무효한 값이므로 쓰면 안된다. bool IntersectTriangle(__Vector3 & v0, __Vector3 & v1, __Vector3 & v2, float & t, float & u, float & v, __Vector3 * pVPos) { return ::_IntersectTriangle(m_vPickRayOrig, m_vPickRayDir, v0, v1, v2, t, u, v, pVPos); diff --git a/src/engine/N3Base/StreamSoundObj.cpp b/src/engine/N3Base/StreamSoundObj.cpp index 170c8898..0ebd2b62 100644 --- a/src/engine/N3Base/StreamSoundObj.cpp +++ b/src/engine/N3Base/StreamSoundObj.cpp @@ -1,10 +1,10 @@ ////////////////////////////////////////////////// // Commented By : Lynus -// Commented On 2001-04-12 8:42:02 +// Commented On 2001-04-12 오후 8:42:02 // // CStreamSoundObj class (StreamSoundObj.h) // -// End Of Comment (By Lynus On 2001-04-12 8:42:02 ) +// End Of Comment (By Lynus On 2001-04-12 오후 8:42:02 ) ////////////////////////////////////////////////// #include "StdAfx.h" #include "N3SndEng.h" @@ -191,12 +191,12 @@ void CStreamSoundObj::RealPlay() { m_PastTime--; if (m_PastTime < 0) { if (m_bIsLoop == false) { - //tick ΰ.. + //tick에 어케 적용할 것인가.. m_PastTime = m_PlayTime; Stop(); return; } else if (m_bIsLoop == true) { - //tick ΰ.. + //tick에 어케 적용할 것인가.. //Stop(); //m_pDSBuff->Stop(); Play(); @@ -238,7 +238,7 @@ void CStreamSoundObj::Release() { } // -// ÷̵ǰ streammingŰ.. +// 음악이 플레이되고 있을때 streamming시키기.. // void CStreamSoundObj::Tick() { if (m_ePlayState == SNDSTATE_STOP) { @@ -280,7 +280,7 @@ void CStreamSoundObj::Tick() { HRESULT hr = m_pDSBuff->Stop(); m_ePlayState = SNDSTATE_STOP; } else { - // ۰.... + //볼륨 점점 작게.... int vol = 0; if (m_fFadeOutTime > 0.0f) { vol = (((m_fFadeOutTime - m_fTmpSecPerFrm) / m_fFadeOutTime) * (float)m_iMaxVolume); @@ -293,7 +293,7 @@ void CStreamSoundObj::Tick() { /* // -// Ȱ. +// 똑같다. // void CStreamSoundObj::Play(float delay, float fFadeInTime) { @@ -306,7 +306,7 @@ void CStreamSoundObj::Play(float delay, float fFadeInTime) // -// Ȱ. +// 똑같다. // void CStreamSoundObj::Stop(float fFadeOutTime) { diff --git a/src/engine/N3Base/StreamSoundObj.h b/src/engine/N3Base/StreamSoundObj.h index 46c718ac..20b4453b 100644 --- a/src/engine/N3Base/StreamSoundObj.h +++ b/src/engine/N3Base/StreamSoundObj.h @@ -1,10 +1,10 @@ ////////////////////////////////////////////////// // Commented By : Lynus -// Commented On 2001-04-12 5:09:28 +// Commented On 2001-04-12 오후 5:09:28 // // CStreamSoundObj class (SoundObj.h) // -// End Of Comment (By Lynus On 2001-04-12 5:09:28 ) +// End Of Comment (By Lynus On 2001-04-12 오후 5:09:28 ) ////////////////////////////////////////////////// #pragma once @@ -15,17 +15,17 @@ class CN3SndEng; class CStreamSoundObj : public CN3SndObj { private: - int m_PlayTime; //wave ü ÷ Ÿ. + int m_PlayTime; //wave파일의 전체 플레이 타임. int m_FinalByte; DSBUFFERDESC m_dsbd; DWORD m_BufferSize; - DWORD m_BlockSize; //buffer ʴ . + DWORD m_BlockSize; //buffer를 초단위로 나눈 것. - int m_CurrState; // ִ.. - int m_PrevState; // ٷ ־.. - DWORD m_CurrPos; // ۿ ġ - int m_PastTime; //ü ÷ Ÿӿ ð + int m_CurrState; //현재 어느 블럭에 있는지.. + int m_PrevState; //지금 바로 전에 어느 블럭에 있었는지.. + DWORD m_CurrPos; //현재 버퍼에서의 위치 + int m_PastTime; //전체 플레이 타임에서 남은 시간 //related wave data WAVEFORMATEX m_WaveFormat; diff --git a/src/engine/N3Base/WaveFile.cpp b/src/engine/N3Base/WaveFile.cpp index 489ea039..556661a3 100644 --- a/src/engine/N3Base/WaveFile.cpp +++ b/src/engine/N3Base/WaveFile.cpp @@ -1,15 +1,15 @@ ////////////////////////////////////////////////// // Commented By : Lynus -// Commented On 2001-04-12 1:52:29 +// Commented On 2001-04-12 오후 1:52:29 // // CWave class(wave.cpp) // -// End Of Comment (By Lynus On 2001-04-12 1:52:29 ) +// End Of Comment (By Lynus On 2001-04-12 오후 1:52:29 ) ////////////////////////////////////////////////// ////////////////////////////////////////////////// // Coded By : Lynus -// Coded On 2001-04-12 1:52:49 +// Coded On 2001-04-12 오후 1:52:49 // #include "StdAfx.h" #include "WaveFile.h" @@ -535,5 +535,5 @@ HRESULT CWaveFile::Write(UINT nSizeToWrite, BYTE * pbSrcData, UINT * pnSizeWrote return S_OK; } -// End Of Code (By Lynus On 2001-04-12 1:52:49 ) +// End Of Code (By Lynus On 2001-04-12 오후 1:52:49 ) ////////////////////////////////////////////////// diff --git a/src/engine/N3Base/WaveFile.h b/src/engine/N3Base/WaveFile.h index e357e37a..3859107d 100644 --- a/src/engine/N3Base/WaveFile.h +++ b/src/engine/N3Base/WaveFile.h @@ -1,14 +1,14 @@ ////////////////////////////////////////////////// // Commented By : Lynus -// Commented On 2001-04-12 1:51:00 +// Commented On 2001-04-12 오후 1:51:00 // // CWave Class (WaveFile.h) // -// End Of Comment (By Lynus On 2001-04-12 1:51:00 ) +// End Of Comment (By Lynus On 2001-04-12 오후 1:51:00 ) ////////////////////////////////////////////////// ////////////////////////////////////////////////// // Coded By : Lynus -// Coded On 2001-04-12 1:50:14 +// Coded On 2001-04-12 오후 1:50:14 // #pragma once @@ -54,5 +54,5 @@ class CWaveFile { WAVEFORMATEX * GetFormat() { return m_pwfx; }; }; -// End Of Code (By Lynus On 2001-04-12 1:50:14 ) +// End Of Code (By Lynus On 2001-04-12 오후 1:50:14 ) ////////////////////////////////////////////////// diff --git a/src/game/APISocket.cpp b/src/game/APISocket.cpp index 714995d4..0813acfe 100644 --- a/src/game/APISocket.cpp +++ b/src/game/APISocket.cpp @@ -14,7 +14,7 @@ WSAData CAPISocket::s_WSData; int CAPISocket::s_nInstanceCount = 0; #ifdef _CRYPTION -BOOL DataPack::s_bCryptionFlag = FALSE; //0 : ȣȭ , 1 : ȣȭ +BOOL DataPack::s_bCryptionFlag = FALSE; //0 : 비암호화 , 1 : 암호화 //_int64 DataPack::s_PublicKey; //_int64 DataPack::s_PrivateKey = 0x1234567890123456; CJvCryption DataPack::s_JvCrypt; @@ -36,20 +36,20 @@ const WORD PACKET_TAIL = 0X55AA; #endif #ifdef _CRYPTION -// bSend TRUE̸ Encrypt, FALSE̸ Decryptش. +// bSend가 TRUE이면 Encrypt, FALSE이면 Decrypt해준다. DataPack::DataPack(int size, BYTE * pData, BOOL bSend) { static BYTE pTIBuf[RECEIVE_BUF_SIZE]; static BYTE pTBuf[RECEIVE_BUF_SIZE]; __ASSERT(size, "size is 0"); if (TRUE == s_bCryptionFlag) { - if (bSend) { // (Ϲ -> ȣȭȰ) + if (bSend) { // 서버로 보낼것 (일반 -> 암호화된것) // inmate - cryption if (TRUE == s_bCryptionFlag) { int clyp_size = size + (sizeof(WORD) + 1 + 1); ++s_wSendVal; - pTIBuf[0] = 0xfc; // ȣ Ȯ + pTIBuf[0] = 0xfc; // 암호가 정확한지 memcpy(pTIBuf + 1, &s_wSendVal, sizeof(WORD)); pTIBuf[3] = 0x00; memcpy(pTIBuf + 4, pData, size); @@ -65,9 +65,9 @@ DataPack::DataPack(int size, BYTE * pData, BOOL bSend) { m_pData = new BYTE[m_Size + 1]; CopyMemory(m_pData, pData, m_Size); } - } else { // κ Ÿ(ȣȭȰ -> Ϲ) + } else { // 서버로부터 받은 데이타(암호화된것 -> 일반) s_JvCrypt.JvDecryptionFast(size, pData, pTBuf); - if (pTBuf[0] != 0xfc) // Ǭ ϰ + if (pTBuf[0] != 0xfc) // 압축 푼 데이터 오류 일경우 { m_Size = 0; m_pData = NULL; @@ -79,7 +79,7 @@ DataPack::DataPack(int size, BYTE * pData, BOOL bSend) { m_pData[m_Size] = '\0'; } } - } else { // ȣȭ ƴϴ. + } else { // 암호화가 아니다. m_Size = size; m_pData = new BYTE[size + 1]; CopyMemory(m_pData, pData, size); @@ -100,7 +100,7 @@ CAPISocket::CAPISocket() { m_iSendByteCount = 0; m_bConnected = FALSE; - m_bEnableSend = TRUE; // ..? + m_bEnableSend = TRUE; // 보내기 가능..? } CAPISocket::~CAPISocket() { @@ -124,7 +124,7 @@ void CAPISocket::Release() { m_iSendByteCount = 0; - // 踦 ش.. + // 통계를 써준다.. #ifdef _DEBUG /* DWORD dwRWC = 0; char szFN1[256] = "", szFN2[256] = ""; @@ -139,7 +139,7 @@ void CAPISocket::Release() { char szBuff[64] = ""; char szCmd[32] = ""; - strcpy(szBuff, "Packet\t\tȽ\r\n"); + strcpy(szBuff, "Packet\t양\t횟수\r\n"); WriteFile(hFile1, szBuff, lstrlen(szBuff), &dwRWC, NULL); WriteFile(hFile2, szBuff, lstrlen(szBuff), &dwRWC, NULL); @@ -188,10 +188,10 @@ void CAPISocket::Disconnect() { m_dwPort = 0; m_bConnected = FALSE; - m_bEnableSend = TRUE; // ..? + m_bEnableSend = TRUE; // 보내기 가능..? #ifdef _CRYPTION - DataPack::InitCrypt(0); // ȣȭ .. + DataPack::InitCrypt(0); // 암호화 해제.. #endif // #ifdef _CRYPTION } @@ -240,7 +240,7 @@ int CAPISocket::Connect(HWND hWnd, const char * pszIP, DWORD dwPort) { return iErrCode; } - // ɼ + // 소켓 옵션 int iRecvBufferLen = RECEIVE_BUF_SIZE; int iErr = setsockopt(m_hSocket, SOL_SOCKET, SO_RCVBUF, (char *)&iRecvBufferLen, 4); @@ -331,7 +331,7 @@ BOOL CAPISocket::ReceiveProcess() { if (PACKET_HEADER == ntohs(*((WORD *)pData))) { short siCore = *((short *)(pData + 2)); if (siCore <= iCount) { - if (PACKET_TAIL == ntohs(*((WORD *)(pData + iCount - 2)))) // Ŷ κ ˻.. + if (PACKET_TAIL == ntohs(*((WORD *)(pData + iCount - 2)))) // 패킷 꼬리 부분 검사.. { #ifdef _CRYPTION DataPack * pDP = new DataPack(siCore, pData + 4, FALSE); @@ -342,7 +342,7 @@ BOOL CAPISocket::ReceiveProcess() { PacketToString[pDP->m_pData[0]]); m_qRecvPkt.push(pDP); - m_CB.HeadIncrease(siCore + 6); // ȯ ε Ű.. + m_CB.HeadIncrease(siCore + 6); // 환형 버퍼 인덱스 증가 시키기.. bFoundTail = TRUE; #ifdef _DEBUG BYTE byCmd = pData[4]; @@ -352,9 +352,9 @@ BOOL CAPISocket::ReceiveProcess() { } } } else { - // Ŷ ?? + // 패킷이 깨졌다?? __ASSERT(0, "broken packet header.. skip!"); - m_CB.HeadIncrease(iCount); // ȯ ε Ű.. + m_CB.HeadIncrease(iCount); // 환형 버퍼 인덱스 증가 시키기.. } delete[] pData, pData = NULL; @@ -367,14 +367,14 @@ void CAPISocket::Send(BYTE * pData, int nSize) { N3_DEBUG("[CAPISocket::Send] Opcode: [0x{:02X}:{}]", pData[0], PacketToString[pData[0]]); if (!m_bEnableSend) { - return; // ..? + return; // 보내기 가능..? } if (INVALID_SOCKET == m_hSocket || FALSE == m_bConnected) { return; } #ifdef _CRYPTION - DataPack DP(nSize, pData, TRUE); // ȣȭ(s_bCryptionFlag FALSE϶ ȣȭ ) + DataPack DP(nSize, pData, TRUE); // 암호화(s_bCryptionFlag가 FALSE일때는 암호화하지 않음) nSize = DP.m_Size; pData = DP.m_pData; #endif @@ -410,7 +410,7 @@ void CAPISocket::Send(BYTE * pData, int nSize) { } #ifdef _DEBUG - BYTE byCmd = pData[0]; // ֱ.. + BYTE byCmd = pData[0]; // 통계 넣기.. m_Statistics_Send_Sum[byCmd].dwTime++; m_Statistics_Send_Sum[byCmd].iSize += nSize; #endif diff --git a/src/game/APISocket.h b/src/game/APISocket.h index a2fbfa20..a72b360b 100644 --- a/src/game/APISocket.h +++ b/src/game/APISocket.h @@ -11,9 +11,9 @@ #include #define WM_SOCKETMSG (WM_USER + 1) -#define RECEIVE_BUF_SIZE 262144 // ִ .. +#define RECEIVE_BUF_SIZE 262144 // 최대 버퍼.. -#define _CRYPTION // ȣȭ +#define _CRYPTION // 암호화 사용 #ifdef _CRYPTION #include "JvCryption.h" #endif @@ -76,7 +76,7 @@ class BB_CircularBuffer { } } } - int GetOutData(BYTE * pData) //HeadPos, ȭ + int GetOutData(BYTE * pData) //HeadPos, 변화 { int len = GetValidCount(); int fc, sc; @@ -108,7 +108,7 @@ class BB_CircularBuffer { } BYTE & GetHeadData() { return m_pBuffer[m_iHeadPos]; } //1 Byte Operation; - //false : 絥 ٺ, TRUE: + //false : 모든데이터 다빠짐, TRUE: 정상적으로 진행중 BOOL HeadIncrease(int increasement = 1) { __ASSERT(increasement <= GetValidCount(), "1"); m_iHeadPos += increasement; @@ -132,10 +132,10 @@ class BB_CircularBuffer { } protected: - //over flow IndexOverFlow + //over flow 먼저 점검한 후 IndexOverFlow 점검 BOOL IsOverFlowCondition(int & len) { return (len >= m_iBufSize - GetValidCount()) ? TRUE : FALSE; } BOOL IsIndexOverFlow(int & len) { return (len + m_iTailPos >= m_iBufSize) ? TRUE : FALSE; } - void BufferResize() //overflow condition ϶ size ι ø + void BufferResize() //overflow condition 일때 size를 현재의 두배로 늘림 { int prevBufSize = m_iBufSize; m_iBufSize <<= 1; @@ -164,7 +164,7 @@ class DataPack { #ifdef _CRYPTION protected: - static BOOL s_bCryptionFlag; //0 : ȣȭ , 1 : ȣȭ + static BOOL s_bCryptionFlag; //0 : 비암호화 , 1 : 암호화 // static _int64 s_PublicKey; // static _int64 s_PrivateKey; // = 0x1234567890123456; static CJvCryption s_JvCrypt; @@ -239,7 +239,7 @@ class CAPISocket { int m_iSendByteCount; - BOOL m_bEnableSend; // ..? + BOOL m_bEnableSend; // 보내기 가능..? public: inline size_t PktQueueSize() { return m_qRecvPkt.size(); } inline DataPack *& PktQueueFront() { return m_qRecvPkt.front(); } @@ -258,7 +258,7 @@ class CAPISocket { BOOL ReceiveProcess(); void Send(BYTE * pData, int nSize); - //Ŷ Լ + //패킷 만들기 함수 static void MP_AddByte(BYTE * dest, int & iOffset, BYTE byte) { CopyMemory(dest + iOffset, &byte, 1); iOffset++; @@ -290,7 +290,7 @@ class CAPISocket { } } - //Ŷ Parsing Լ + //패킷 Parsing 함수 static BYTE & Parse_GetByte(const BYTE * buf, int & iOffset) { iOffset++; return *(BYTE *)(buf + iOffset - 1); diff --git a/src/game/Bird.cpp b/src/game/Bird.cpp index ddb096e0..3ff2879a 100644 --- a/src/game/Bird.cpp +++ b/src/game/Bird.cpp @@ -70,14 +70,14 @@ void CBird::Tick() { m_fFactorY2 -= (2 * D3DX_PI); } - // ġ + // 위치계산 __Vector3 vPos; vPos.Set(sinf(m_fFactor1) * m_fRadius * cosf(m_fRadian), m_fRadiusY * (sinf(m_fFactorY1) + cosf(m_fFactorY2)) / 2.0f, sinf(m_fFactor2) * m_fRadius * sinf(m_fRadian)); - // - // ̺н ̿Ͽ ϱ + // 각도 계산 + // 미분식을 이용하여 기울기 구하기 float x = (m_fFactorSpeed1 * cosf(m_fFactor1) * cosf(m_fRadian) - m_fRadianSpeed * sinf(m_fFactor1) * sinf(m_fRadian)); float z = @@ -111,7 +111,7 @@ void CBird::Render() { int CBird::LoadBird(const std::string & szFN) { Release(); - FILE * stream = fopen(szFN.c_str(), "r"); //textϷ + FILE * stream = fopen(szFN.c_str(), "r"); //text파일로 만든다 if (NULL == stream) { #if _DEBUG char szErr[512]; @@ -124,19 +124,19 @@ int CBird::LoadBird(const std::string & szFN) { char szRrcName[_MAX_PATH]; float fSpeed = 0.0f; int result = fscanf(stream, "ResourceName = %s\n", szRrcName); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Pivot = %f %f %f\n", &(m_vPivot.x), &(m_vPivot.y), &(m_vPivot.z)); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Radius = %f\n", &m_fRadius); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "RadiusY = %f\n", &m_fRadiusY); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Speed = %f\n", &fSpeed); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); fclose(stream); - __ASSERT(m_pShape == NULL, "Bird memory leak ɼ"); + __ASSERT(m_pShape == NULL, "Bird memory leak 가능성"); m_pShape = new CN3Shape; m_pShape->LoadFromFile(szRrcName); diff --git a/src/game/Bird.h b/src/game/Bird.h index 91f59b07..bf908291 100644 --- a/src/game/Bird.h +++ b/src/game/Bird.h @@ -17,20 +17,20 @@ class CBird : public CN3Base { // Attributes public: protected: - // Ͽ о + // 파일에서 읽어오는 정보 CN3Shape * m_pShape; // Shape pointer - __Vector3 m_vPivot; // ߽(߽ ݰ m_fRadiusŭ δ. - float m_fRadius; // ݰ + __Vector3 m_vPivot; // 중심점(중심점에서 반경 m_fRadius만큼 범위내에서 움직인다. + float m_fRadius; // 반경 - // __Vector3 m_vVelocity; // ӵ(ǵ+) - float m_fRadianSpeed; // ӷ - float m_fRadian; // Ÿ ġ + // __Vector3 m_vVelocity; // 현재 속도(스피드+방향) + float m_fRadianSpeed; // 속력 + float m_fRadian; // 현재 타원의 위치각 float m_fFactor1, m_fFactor2; float m_fFactorSpeed1, m_fFactorSpeed2; - float m_fRadiusY; // ݰ - float m_fFactorY1, m_fFactorY2; // ȭ - float m_fFactorYSpeed1, m_fFactorYSpeed2; // ȭ ȭ.. + float m_fRadiusY; // 높이 반경 + float m_fFactorY1, m_fFactorY2; // 높이 변화 요소 + float m_fFactorYSpeed1, m_fFactorYSpeed2; // 높이 변화 요소 변화율.. CN3SndObj * m_pSnd; float m_fSndInterval; diff --git a/src/game/BirdMng.cpp b/src/game/BirdMng.cpp index 0806eb30..4f95080e 100644 --- a/src/game/BirdMng.cpp +++ b/src/game/BirdMng.cpp @@ -33,7 +33,7 @@ void CBirdMng::LoadFromFile(const std::string & szFN) { if (szFN.empty()) { return; } - FILE * stream = fopen(szFN.c_str(), "r"); //textϷ + FILE * stream = fopen(szFN.c_str(), "r"); //text파일로 만든다 if (NULL == stream) { #if _DEBUG @@ -46,7 +46,7 @@ void CBirdMng::LoadFromFile(const std::string & szFN) { char szRrcName[_MAX_PATH]; int result = fscanf(stream, "count = %d\n", &m_iBirdCount); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); if (m_iBirdCount > 0) { m_pBird = new CBird[m_iBirdCount]; @@ -54,7 +54,7 @@ void CBirdMng::LoadFromFile(const std::string & szFN) { for (int i = 0; i < m_iBirdCount; i++) { result = fscanf(stream, "%s\n", szRrcName); - __ASSERT(result != EOF, "߸ bird list "); + __ASSERT(result != EOF, "잘못된 bird list 세팅 파일"); m_pBird[i].LoadBird(szRrcName); } fclose(stream); diff --git a/src/game/BirdMng.h b/src/game/BirdMng.h index 330e5a8b..20990625 100644 --- a/src/game/BirdMng.h +++ b/src/game/BirdMng.h @@ -10,7 +10,7 @@ typedef struct __TABLE_BIRD { DWORD dwID; // zone ID char * pszTerrainFN; // Terrain FileName - Terrain, Tile Map, ColorMap.... char * pszColorMapFN; - char * pszObjectPostDataFN; // Object ġ - ̾ȿ 浹 üũ ͵ ִ. + char * pszObjectPostDataFN; // Object 위치 정보 - 이안에 충돌 체크 데이터도 들어 있다. } TABLE_BIRD; class CBird; diff --git a/src/game/Catapult.cpp b/src/game/Catapult.cpp index c1dcec18..1abbe53d 100644 --- a/src/game/Catapult.cpp +++ b/src/game/Catapult.cpp @@ -30,7 +30,7 @@ void CCatapult::Release() { void CCatapult::ReCalcMatrix4AnimatedPart() { CMachineBase::ReCalcMatrix4AnimatedPart(); - if (m_Thrower.bFire == TRUE) // ߻ ̸ + if (m_Thrower.bFire == TRUE) // 발사 상태이면 { int iSize = m_Parts.size(); for (int i = 0; i < iSize; i++) { @@ -48,7 +48,7 @@ void CCatapult::ReCalcMatrix4AnimatedPart() { void CCatapult::Render() { CMachineBase::Render(); - __ASSERT(m_Thrower.pStone, "⿡ "); + __ASSERT(m_Thrower.pStone, "투석기에 돌맹이 없음"); if (m_Thrower.bDontRenderStone == FALSE) { m_Thrower.pStone->Render(); } @@ -62,36 +62,36 @@ void CCatapult::Tick(float fFrm) { } BOOL IsStoneThrown = FALSE; - if (m_Thrower.bFire == TRUE) // ߻ ̸ + if (m_Thrower.bFire == TRUE) // 발사 상태이면 { m_Thrower.fTime += s_fSecPerFrm; float fReloadTime = m_Thrower.fTime - (m_Thrower.fReleaseTime + m_Thrower.fReloadDelayTime); - if (fReloadTime<0) // ߻̰ų delay.. + if (fReloadTime<0) // 발사중이거나 delay상태중.. { float fVibrationTime = m_Thrower.fTime - m_Thrower.fReleaseTime; if (fVibrationTime<0) { m_Thrower.fCurRadian = -m_Thrower.fRadianAccel*(m_Thrower.fTime*m_Thrower.fTime); } - else // ߻ ݵ + else // 발사후 반동으로 인해 진동중 { if (m_Thrower.bDontRenderStone == FALSE) { - m_Thrower.bDontRenderStone = TRUE; // ȱ׸ + m_Thrower.bDontRenderStone = TRUE; // 돌덩이 안그리기 - // ޼ ߻ ؾ Ѵ.(ѹ) + // 돌 날리는 메세지 발생 해야 한다.(한번만) IsStoneThrown = TRUE; } float fFactor = fVibrationTime*20.0f; - // 5.. + // 진동 5번만.. if ( fFactor < D3DX_PI*8) m_Thrower.fCurRadian = -m_Thrower.fLimitRadian - sinf(fFactor) * (m_Thrower.fRecoilRadian/(10*(1.0f+fVibrationTime)*(1.0f+fVibrationTime))); else m_Thrower.fCurRadian = -m_Thrower.fLimitRadian; } } else { - m_Thrower.bDontRenderStone = TRUE; // ȱ׸ + m_Thrower.bDontRenderStone = TRUE; // 돌덩이 안그리기 m_Thrower.fCurRadian = -(m_Thrower.fLimitRadian - fReloadTime*m_Thrower.fRadianSpeed2Reload); if (m_Thrower.fCurRadian > 0) @@ -105,7 +105,7 @@ void CCatapult::Tick(float fFrm) { } CMachineBase::Tick(fFrm); - // ġ + // 돌덩이 위치 계산 if (m_Thrower.bDontRenderStone == FALSE) { __Matrix44& mtx = m_Thrower.pStone->m_Matrix; @@ -119,14 +119,14 @@ void CCatapult::Tick(float fFrm) { if (IsStoneThrown) { - __Matrix44 mtx; // ȸ ϱ.. + __Matrix44 mtx; // 회전 행렬 구하기.. mtx.Identity(); mtx.RotationX(m_Thrower.fLimitRadian); mtx.PosSet(m_Thrower.pThrowerPart->m_vPivot); mtx *= m_Matrix; - // ޼ ߻ - // tigger - 08.25 ޽  .. + // 돌 날리는 메세지 발생 + // tigger - 08.25 직접 메시지를 만들어서 날린다.. LocalMsg Msg; Msg.s_MagicNum = MAGIC_NUM; Msg.s_iAddressLen = CN3GameBase::s_pMsgRouter->GetThisClassLevel(ID_FX_MGR); @@ -135,14 +135,14 @@ void CCatapult::Tick(float fFrm) { Msg.s_ipAddress[1] = ID_FX_MGR; Msg.s_iGameID = ID_THROW_STONE; - Msg.s_vPos = m_Thrower.vStoneOffset * mtx; // ġ - __Vector3 vVel; vVel.Set(0, sinf(m_fFireRadian), cosf(m_fFireRadian)); // . + Msg.s_vPos = m_Thrower.vStoneOffset * mtx; // 위치 + __Vector3 vVel; vVel.Set(0, sinf(m_fFireRadian), cosf(m_fFireRadian)); // 방향 계산. mtx = m_Matrix; mtx.PosSet(0,0,0); - Msg.s_vDir= vVel*mtx; Msg.s_vDir.Normalize();// - Msg.s_fVelocity = m_fFireSpeed; // ư ǵ.. - Msg.s_pShape = m_Thrower.pStone; // Shape + Msg.s_vDir= vVel*mtx; Msg.s_vDir.Normalize();// 방향 + Msg.s_fVelocity = m_fFireSpeed; // 날아가는 스피드.. + Msg.s_pShape = m_Thrower.pStone; // 돌 Shape - CN3GameBase::s_pMsgRouter->m_cMsgQueue.RouteLocalMsg(Msg); // Message .. + CN3GameBase::s_pMsgRouter->m_cMsgQueue.RouteLocalMsg(Msg); // Message 보냄.. } */ } @@ -154,47 +154,47 @@ void CCatapult::LoadMachine(FILE * stream) { Release(); CMachineBase::LoadMachine(stream); - char szThrowerName[_MAX_PATH]; // Thrower pmesh ̸ - char szStoneShapeName[_MAX_PATH]; // stone shape ̸ + char szThrowerName[_MAX_PATH]; // Thrower pmesh파일 이름 + char szStoneShapeName[_MAX_PATH]; // stone shape의 이름 int result; float x, y, z; result = fscanf(stream, "Thrower_Name = %s\n", &szThrowerName); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Thrower_LimitRadian = %f\n", &(m_Thrower.fLimitRadian)); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Thrower_RadianAccel = %f\n", &(m_Thrower.fRadianAccel)); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Thrower_RadianSpeed2Reload = %f\n", &(m_Thrower.fRadianSpeed2Reload)); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Thrower_ReloadDelayTime = %f\n", &(m_Thrower.fReloadDelayTime)); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Thrower_RecoilRadian = %f\n", &(m_Thrower.fRecoilRadian)); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Thrower_StoneShapeName = %s\n", szStoneShapeName); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Thrower_StoneOffset = %f %f %f\n", &x, &y, &z); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); - __ASSERT(m_Thrower.pStone == NULL, "catapult memory leak ɼ "); + __ASSERT(m_Thrower.pStone == NULL, "catapult memory leak 가능성 존재"); m_Thrower.pStone = new CN3Shape; m_Thrower.pStone->Load(szStoneShapeName); m_Thrower.vStoneOffset.Set(x, y, z); - // ߻翡 ɸ ð + // 발사에 걸리는 시간 계산 m_Thrower.fReleaseTime = sqrtf(m_Thrower.fLimitRadian / m_Thrower.fRadianAccel); - // Thrower ã + // Thrower 찾기 m_Thrower.pThrowerPart = GetPartByPMeshName(szThrowerName); } void CCatapult::Fire() { if (m_Thrower.bFire == TRUE) { - return; // ̹ ߻̴. + return; // 이미 발사상태이다. } m_Thrower.bFire = TRUE; m_Thrower.fTime = 0; m_Thrower.fCurRadian = 0; - m_Thrower.bDontRenderStone = FALSE; // ׸ + m_Thrower.bDontRenderStone = FALSE; // 돌덩이 그리기 } diff --git a/src/game/Catapult.h b/src/game/Catapult.h index 2dd4421e..01414459 100644 --- a/src/game/Catapult.h +++ b/src/game/Catapult.h @@ -14,29 +14,29 @@ class CCatapult : public CMachineBase { // Structure public: struct __Thrower { - // Ͽ о - CN3SPart * pThrowerPart; // Thrower Ʈ - float fLimitRadian; // Ѱ ȸ - float fRadianAccel; // ȸ ӵ - float fRadianSpeed2Reload; // ȸ ӵ - float fReloadDelayTime; // ߻ ϱ ð delay - float fRecoilRadian; // ߻ ݵϴ - class CN3Shape * pStone; // ߻ϴ shape - __Vector3 vStoneOffset; // offset (thrower pivot Ÿ) - - // Ͽ - float fReleaseTime; // ߻ Ѱ ȸ ϱ ð [ sqrtf(fLimitRadian/fRadianAccel) ] - - // ߿ Ǵ - float fTime; // ߻ ð() ߽ ð0 . - BOOL bFire; // ߻ΰ? - float fCurRadian; // Thrower ư ȸ - BOOL bDontRenderStone; // ߻ϴ ȱ׸ ΰ? + // 파일에서 읽어오는 정보 + CN3SPart * pThrowerPart; // Thrower의 파트 포인터 + float fLimitRadian; // 한계 회전 각도 + float fRadianAccel; // 회전 가속도 + float fRadianSpeed2Reload; // 재장전 회전 속도 + float fReloadDelayTime; // 완전 발사후 재장전 시작하기까지의 시간 delay + float fRecoilRadian; // 발사후 반동하는 각도 + class CN3Shape * pStone; // 발사하는 돌덩이 shape 포인터 + __Vector3 vStoneOffset; // 돌덩이 offset (thrower의 pivot 점에서 떨어진 거리) + + // 파일에서 읽은 정보를 토대로 만들어지는 정보 + float fReleaseTime; // 발사후 한계 회전 각도에 도달하기까지의 시간 [ sqrtf(fLimitRadian/fRadianAccel) ] + + // 게임 중에 사용되는 정보 + float fTime; // 발사 경과 시간(초) 발시 시간0을 기준으로 축적됨. + BOOL bFire; // 발사중인가? + float fCurRadian; // 현재 Thrower가 돌아간 회전각 + BOOL bDontRenderStone; // 발사하는 돌을 안그릴 것인가? }; // Attributes public: protected: - __Thrower m_Thrower; // ߻ + __Thrower m_Thrower; // 발사대 // Operations public: @@ -49,7 +49,7 @@ class CCatapult : public CMachineBase { virtual void ReCalcMatrix4AnimatedPart(); void ThrowStone(__Vector3 & vPos, __Vector3 & vVel, CN3Shape * pShape) const; - // ӽ + // 머신 동작 관련 public: - virtual void Fire(); // ߻ + virtual void Fire(); // 발사 }; diff --git a/src/game/CountableItemEditDlg.cpp b/src/game/CountableItemEditDlg.cpp index 03ee310e..7dacea7b 100644 --- a/src/game/CountableItemEditDlg.cpp +++ b/src/game/CountableItemEditDlg.cpp @@ -194,7 +194,7 @@ void CCountableItemEditDlg::Open(e_UIWND eUW, e_UIWND_DISTRICT eUD, bool bCountG void CCountableItemEditDlg::Close() { m_bLocked = false; - // SetVisible(false); //̰ SetVisibleWithNoSound Լ ּ... + // SetVisible(false); //이거 쓰지 말고 SetVisibleWithNoSound 함수 써주세요... SetVisibleWithNoSound(false); CN3UIEdit * pEdit = GetFocusedEdit(); @@ -232,7 +232,7 @@ void CCountableItemEditDlg::SetVisible(bool bVisible) { } void CCountableItemEditDlg::SetVisibleWithNoSound(bool bVisible, bool bWork, bool bReFocus) { - if (bWork) { //⼭ ReceiveMessage ̰ ̴ üũ ؼ ϴ ʿ д. + if (bWork) { //여기서는 ReceiveMessage에서 유아이가 보이는지를 체크를 해서 일단 앞쪽에 둔다. ReceiveMessage(m_pBtnCancel, UIMSG_BUTTON_CLICK); } diff --git a/src/game/CountableItemEditDlg.h b/src/game/CountableItemEditDlg.h index 64b5c101..45b3a37b 100644 --- a/src/game/CountableItemEditDlg.h +++ b/src/game/CountableItemEditDlg.h @@ -36,8 +36,8 @@ class CCountableItemEditDlg : public CN3UIBase { bool Load(HANDLE hFile); void SetVisibleWithNoSound(bool bVisible, bool bWork = false, bool bReFocus = false); void SetVisible(bool bVisible); - int64_t GetQuantity(); // "edit_trade" Edit Control ´.. - void SetQuantity(int64_t iQuantity); // "edit_trade" Edit Control ڿ Ѵ.. + int64_t GetQuantity(); // "edit_trade" Edit Control 에서 정수값을 얻오온다.. + void SetQuantity(int64_t iQuantity); // "edit_trade" Edit Control 에서 정수값을 문자열로 세팅한다.. CCountableItemEditDlg(); virtual ~CCountableItemEditDlg(); diff --git a/src/game/DungeonManager.cpp b/src/game/DungeonManager.cpp index 8181d9f9..8f713333 100644 --- a/src/game/DungeonManager.cpp +++ b/src/game/DungeonManager.cpp @@ -103,12 +103,12 @@ float CDungeonManager::GetHeightWithShape(float fX, float fZ, __Vector3 * pvNorm return m_pvsmgr.GetHeightWithShape(fX, fZ, pvNormal); } -bool CDungeonManager::CheckCollisionWithShape(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol, // 浹 - __Vector3 * pvNormal, // 浹Ѹ - __Vector3 * pVec) // 浹 __Vector3[3] +bool CDungeonManager::CheckCollisionWithShape(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol, // 충돌 지점 + __Vector3 * pvNormal, // 충돌한면의 법선벡터 + __Vector3 * pVec) // 충돌한 면 의 폴리곤 __Vector3[3] { return m_pvsmgr.CheckCollisionWithShape(vPos, vDir, fSpeedPerSec, pvCol, pvNormal, pVec); } diff --git a/src/game/DungeonManager.h b/src/game/DungeonManager.h index 91135a61..3327ff77 100644 --- a/src/game/DungeonManager.h +++ b/src/game/DungeonManager.h @@ -41,12 +41,12 @@ class CDungeonManager : public CN3WorldBase { float GetHeightWithShape(float fX, float fZ, __Vector3 * pvNormal = NULL); CN3Shape * ShapeGetByIDWithShape(int iID); CN3Shape * PickWithShape(int iXScreen, int iYScreen, bool bMustHaveEvent, __Vector3 * pvPick = NULL); - bool CheckCollisionWithShape(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol = NULL, // 浹 - __Vector3 * pvNormal = NULL, // 浹Ѹ - __Vector3 * pVec = NULL); // 浹 __Vector3[3] + bool CheckCollisionWithShape(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol = NULL, // 충돌 지점 + __Vector3 * pvNormal = NULL, // 충돌한면의 법선벡터 + __Vector3 * pVec = NULL); // 충돌한 면 의 폴리곤 __Vector3[3] // Rendering.. void RenderTerrain(); diff --git a/src/game/GameBase.cpp b/src/game/GameBase.cpp index 06a33cd0..6814d063 100644 --- a/src/game/GameBase.cpp +++ b/src/game/GameBase.cpp @@ -11,28 +11,28 @@ #include "N3Base/N3ShapeMgr.h" -CN3TableBase<__TABLE_ZONE> * CGameBase::s_pTbl_Zones = NULL; // Zone Table +CN3TableBase<__TABLE_ZONE> * CGameBase::s_pTbl_Zones = NULL; // Zone 정보에 관한 Table CN3TableBase<__TABLE_UI_RESRC> * CGameBase::s_pTbl_UI = NULL; // UI FileName Table CN3TableBase<__TABLE_ITEM_BASIC> * CGameBase::s_pTbl_Items_Basic = - NULL; // ( ڽŰ ٸ ) Ŭ ҽ ̺ + NULL; // 각 유저의(내 자신과 주위 다른 사람) 클레스별 장착 아이템 리소스 테이블 CN3TableBase<__TABLE_ITEM_EXT> * CGameBase::s_pTbl_Items_Exts[MAX_ITEM_EXTENSION] = { NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL}; // ( ڽŰ ٸ ) Ŭ ҽ ̺ + NULL, NULL, NULL, NULL}; // 각 유저의(내 자신과 주위 다른 사람) 클레스별 장착 아이템 리소스 테이블 CN3TableBase<__TABLE_PLAYER_LOOKS> * CGameBase::s_pTbl_UPC_Looks = - NULL; // ( ڽŰ ٸ ) Ŭ ⺻ Ų + NULL; // 각 유저의(내 자신과 주위 다른 사람) 클레스별 기본 스킨 CN3TableBase<__TABLE_PLAYER_LOOKS> * CGameBase::s_pTbl_NPC_Looks = - NULL; // NPC, Mob ⺻ - 6 ij Ʈ(), 2 ÷ -CN3TableBase<__TABLE_UPC_SKILL> * CGameBase::s_pTbl_Skill = NULL; // Skill Table -CN3TableBase<__TABLE_EXCHANGE_QUEST> * CGameBase::s_pTbl_Exchange_Quest = NULL; // ȯ Ʈ ̺.. -CN3TableBase<__TABLE_FX> * CGameBase::s_pTbl_FXSource; // FXҽ ̺.. -CN3TableBase<__TABLE_QUEST_MENU> * CGameBase::s_pTbl_QuestMenu = NULL; // Ʈ ޴ -CN3TableBase<__TABLE_QUEST_TALK> * CGameBase::s_pTbl_QuestTalk = NULL; // Ʈ + NULL; // NPC, Mob 기본 모습 - 6개의 캐릭터 파트(), 2개의 플러그 +CN3TableBase<__TABLE_UPC_SKILL> * CGameBase::s_pTbl_Skill = NULL; // Skill 정보에 관한 Table +CN3TableBase<__TABLE_EXCHANGE_QUEST> * CGameBase::s_pTbl_Exchange_Quest = NULL; // 교환 퀘스트에 관한 테이블.. +CN3TableBase<__TABLE_FX> * CGameBase::s_pTbl_FXSource; // FX소스 정보 테이블.. +CN3TableBase<__TABLE_QUEST_MENU> * CGameBase::s_pTbl_QuestMenu = NULL; // 퀘스트 선택 메뉴 +CN3TableBase<__TABLE_QUEST_TALK> * CGameBase::s_pTbl_QuestTalk = NULL; // 퀘스트 지문 CN3TableBase<__TABLE_TEXTS> * CGameBase::s_pTbl_Texts = NULL; CN3TableBase<__TABLE_HELP> * CGameBase::s_pTbl_Help = NULL; -CN3WorldManager * CGameBase::s_pWorldMgr = NULL; // Ŵ.. -CPlayerOtherMgr * CGameBase::s_pOPMgr = NULL; // Other Player Manager - ٸ Ŭ.. -CPlayerMySelf * CGameBase::s_pPlayer = NULL; // Ŭ.. +CN3WorldManager * CGameBase::s_pWorldMgr = NULL; // 월드 매니져.. +CPlayerOtherMgr * CGameBase::s_pOPMgr = NULL; // Other Player Manager - 다른 유저 관리 클래스.. +CPlayerMySelf * CGameBase::s_pPlayer = NULL; // 유저 클래스.. CGameBase::CGameBase() {} @@ -75,19 +75,19 @@ void _FormatCoins(int64_t nCoins, std::string & szCoins) { void CGameBase::StaticMemberInit() { ////////////////////////////////////////////////////////////////////////////////////////// - // Resource Table ε ʱȭ... - s_pTbl_Zones = new CN3TableBase<__TABLE_ZONE>; // Zone Table + // Resource Table 로딩 및 초기화... + s_pTbl_Zones = new CN3TableBase<__TABLE_ZONE>; // Zone 정보에 관한 Table s_pTbl_UI = new CN3TableBase<__TABLE_UI_RESRC>; // UI Resource File Table loading s_pTbl_UPC_Looks = - new CN3TableBase<__TABLE_PLAYER_LOOKS>; // ÷̾ ⺻ Ǵ NPC Resource Table loading + new CN3TableBase<__TABLE_PLAYER_LOOKS>; // 플레이어들의 기본 모습이 되는 NPC Resource Table loading s_pTbl_Items_Basic = new CN3TableBase<__TABLE_ITEM_BASIC>; // Item Resource Table loading for (int i = 0; i < MAX_ITEM_EXTENSION; i++) { s_pTbl_Items_Exts[i] = new CN3TableBase<__TABLE_ITEM_EXT>; } s_pTbl_NPC_Looks = new CN3TableBase<__TABLE_PLAYER_LOOKS>; // NPC Resource Table loading - s_pTbl_Skill = new CN3TableBase<__TABLE_UPC_SKILL>; // Skill Table - s_pTbl_Exchange_Quest = new CN3TableBase<__TABLE_EXCHANGE_QUEST>; // ȯ Ʈ ̺.. - s_pTbl_FXSource = new CN3TableBase<__TABLE_FX>; // FX Source ̺.. + s_pTbl_Skill = new CN3TableBase<__TABLE_UPC_SKILL>; // Skill 정보에 관한 Table + s_pTbl_Exchange_Quest = new CN3TableBase<__TABLE_EXCHANGE_QUEST>; // 교환 퀘스트에 관한 테이블.. + s_pTbl_FXSource = new CN3TableBase<__TABLE_FX>; // FX Source에 관한 테이블.. s_pTbl_QuestMenu = new CN3TableBase<__TABLE_QUEST_MENU>; s_pTbl_QuestTalk = new CN3TableBase<__TABLE_QUEST_TALK>; s_pTbl_Texts = new CN3TableBase<__TABLE_TEXTS>; @@ -101,18 +101,18 @@ void CGameBase::StaticMemberInit() { std::string szFN; szFN = "Data\\Zones.tbl"; - s_pTbl_Zones->LoadFromFile(szFN.c_str()); // Zone Table + s_pTbl_Zones->LoadFromFile(szFN.c_str()); // Zone 정보에 관한 Table szFN = "Data\\UIs" + szLangTail; s_pTbl_UI->LoadFromFile(szFN.c_str()); // UI Resource File Table loading szFN = "Data\\UPC_DefaultLooks.tbl"; - s_pTbl_UPC_Looks->LoadFromFile(szFN.c_str()); // ÷̾ ⺻ Ǵ NPC Resource Table loading + s_pTbl_UPC_Looks->LoadFromFile(szFN.c_str()); // 플레이어들의 기본 모습이 되는 NPC Resource Table loading szFN = "Data\\Item_Org" + szLangTail; s_pTbl_Items_Basic->LoadFromFile(szFN.c_str()); // Item Resource Table loading szFN = "Data\\Quest_Menu" + szLangTail; - s_pTbl_QuestMenu->LoadFromFile(szFN.c_str()); // Ʈ ø޴ + s_pTbl_QuestMenu->LoadFromFile(szFN.c_str()); // 퀘스트 관련 선택메뉴 szFN = "Data\\Quest_Talk" + szLangTail; - s_pTbl_QuestTalk->LoadFromFile(szFN.c_str()); // Ʈ + s_pTbl_QuestTalk->LoadFromFile(szFN.c_str()); // 퀘스트 관련 지문 szFN = "Data\\Texts" + szLangTail; s_pTbl_Texts->LoadFromFile(szFN.c_str()); szFN = "Data\\help" + szLangTail; @@ -128,25 +128,25 @@ void CGameBase::StaticMemberInit() { szFN = "Data\\NPC_Looks.tbl"; s_pTbl_NPC_Looks->LoadFromFile(szFN.c_str()); // NPC Resource Table loading szFN = "Data\\skill_magic_main" + szLangTail; - s_pTbl_Skill->LoadFromFile(szFN.c_str()); // Skill Table + s_pTbl_Skill->LoadFromFile(szFN.c_str()); // Skill 정보에 관한 Table szFN = "Data\\Exchange_Quest.tbl"; - s_pTbl_Exchange_Quest->LoadFromFile(szFN.c_str()); // ȯ Ʈ ̺.. + s_pTbl_Exchange_Quest->LoadFromFile(szFN.c_str()); // 교환 퀘스트에 관한 테이블.. szFN = "Data\\fx.tbl"; s_pTbl_FXSource->LoadFromFile(szFN.c_str()); s_pWorldMgr = new CN3WorldManager(); s_pOPMgr = new CPlayerOtherMgr(); - s_pPlayer = new CPlayerMySelf(); // ⺻ ÷̾ .. + s_pPlayer = new CPlayerMySelf(); // 기본적인 내 플레이어 생성.. } void CGameBase::StaticMemberRelease() { // Tables .... delete s_pTbl_Zones; - s_pTbl_Zones = NULL; // Zone Table + s_pTbl_Zones = NULL; // Zone 정보에 관한 Table delete s_pTbl_UI; s_pTbl_UI = NULL; // UI Resource File Table loading delete s_pTbl_UPC_Looks; - s_pTbl_UPC_Looks = NULL; // ÷̾ ⺻ Ǵ NPC Resource Table loading + s_pTbl_UPC_Looks = NULL; // 플레이어들의 기본 모습이 되는 NPC Resource Table loading delete s_pTbl_Items_Basic; s_pTbl_Items_Basic = NULL; // Item Resource Table loading for (int i = 0; i < MAX_ITEM_EXTENSION; i++) { @@ -156,15 +156,15 @@ void CGameBase::StaticMemberRelease() { delete s_pTbl_NPC_Looks; s_pTbl_NPC_Looks = NULL; // NPC Resource Table loading delete s_pTbl_Skill; - s_pTbl_Skill = NULL; // Skill Table + s_pTbl_Skill = NULL; // Skill 정보에 관한 Table delete s_pTbl_Exchange_Quest; - s_pTbl_Exchange_Quest = NULL; // Skill Table + s_pTbl_Exchange_Quest = NULL; // Skill 정보에 관한 Table delete s_pTbl_FXSource; - s_pTbl_FXSource = NULL; // FX Source ̺.. + s_pTbl_FXSource = NULL; // FX Source에 관한 테이블.. delete s_pTbl_QuestMenu; - s_pTbl_QuestMenu = NULL; // Ʈ ø޴ + s_pTbl_QuestMenu = NULL; // 퀘스트 관련 선택메뉴 delete s_pTbl_QuestTalk; - s_pTbl_QuestTalk = NULL; // Ʈ + s_pTbl_QuestTalk = NULL; // 퀘스트 관련 지문 delete s_pTbl_Texts; s_pTbl_Texts = NULL; delete s_pTbl_Help; @@ -297,25 +297,25 @@ bool CGameBase::GetTextByKnightsDuty(e_KnightsDuty eDuty, std::string & szText) switch (eDuty) { case KNIGHTS_DUTY_UNKNOWN: ::_LoadStringFromResource(IDS_KNIGHTS_DUTY_UNKNOWN, szText); - break; // ????? Ѱܳ?? + break; // ????? 쫓겨남?? case KNIGHTS_DUTY_PUNISH: ::_LoadStringFromResource(IDS_KNIGHTS_DUTY_PUNISH, szText); - break; // ¡. + break; // 징계중. case KNIGHTS_DUTY_TRAINEE: ::_LoadStringFromResource(IDS_KNIGHTS_DUTY_TRAINEE, szText); - break; // ߽ + break; // 견습기사 case KNIGHTS_DUTY_KNIGHT: ::_LoadStringFromResource(IDS_KNIGHTS_DUTY_KNIGHT, szText); - break; // Ϲݱ + break; // 일반기사 case KNIGHTS_DUTY_OFFICER: ::_LoadStringFromResource(IDS_KNIGHTS_DUTY_OFFICER, szText); - break; // 屳 + break; // 장교 case KNIGHTS_DUTY_VICECHIEF: ::_LoadStringFromResource(IDS_KNIGHTS_DUTY_VICECHIEF, szText); - break; // δ. + break; // 부단장. case KNIGHTS_DUTY_CHIEF: ::_LoadStringFromResource(IDS_KNIGHTS_DUTY_CHIEF, szText); - break; // .. + break; // 기사단장 직위.. default: __ASSERT(0, "Invalid Knights Duty"); szText = "Unknown Duty"; @@ -329,70 +329,70 @@ bool CGameBase::GetTextByItemClass(e_ItemClass eItemClass, std::string & szText) switch (eItemClass) { case ITEM_CLASS_DAGGER: ::_LoadStringFromResource(IDS_ITEM_CLASS_DAGGER, szText); - break; // ܰ(dagger) + break; // 단검(dagger) case ITEM_CLASS_SWORD: ::_LoadStringFromResource(IDS_ITEM_CLASS_SWORD, szText); - break; // Ѽհ(onehandsword) + break; // 한손검(onehandsword) case ITEM_CLASS_SWORD_2H: ::_LoadStringFromResource(IDS_ITEM_CLASS_SWORD_2H, szText); - break; // 3 : հ(twohandsword) + break; // 3 : 양손검(twohandsword) case ITEM_CLASS_AXE: ::_LoadStringFromResource(IDS_ITEM_CLASS_AXE, szText); - break; // Ѽյ(onehandaxe) + break; // 한손도끼(onehandaxe) case ITEM_CLASS_AXE_2H: ::_LoadStringFromResource(IDS_ITEM_CLASS_AXE_2H, szText); - break; // μյ(twohandaxe) + break; // 두손도끼(twohandaxe) case ITEM_CLASS_MACE: ::_LoadStringFromResource(IDS_ITEM_CLASS_MACE, szText); - break; // ѼŸݹ(mace) + break; // 한손타격무기(mace) case ITEM_CLASS_MACE_2H: ::_LoadStringFromResource(IDS_ITEM_CLASS_MACE_2H, szText); - break; // μŸݹ(twohandmace) + break; // 두손타격무기(twohandmace) case ITEM_CLASS_SPEAR: ::_LoadStringFromResource(IDS_ITEM_CLASS_SPEAR, szText); - break; // â(spear) + break; // 창(spear) case ITEM_CLASS_POLEARM: ::_LoadStringFromResource(IDS_ITEM_CLASS_POLEARM, szText); - break; // (polearm) + break; // 폴암(polearm) case ITEM_CLASS_SHIELD: ::_LoadStringFromResource(IDS_ITEM_CLASS_SHIELD, szText); - break; // (shield) + break; // 쉴드(shield) case ITEM_CLASS_BOW: ::_LoadStringFromResource(IDS_ITEM_CLASS_BOW, szText); - break; // Ʈ(Shortbow) + break; // 쇼트보우(Shortbow) case ITEM_CLASS_BOW_CROSS: ::_LoadStringFromResource(IDS_ITEM_CLASS_BOW_CROSS, szText); - break; // ũν(crossbow) + break; // 크로스보우(crossbow) case ITEM_CLASS_BOW_LONG: ::_LoadStringFromResource(IDS_ITEM_CLASS_BOW_LONG, szText); - break; // պ(longbow) + break; // 롱보우(longbow) case ITEM_CLASS_EARRING: ::_LoadStringFromResource(IDS_ITEM_CLASS_EARRING, szText); - break; // Ͱ + break; // 귀걸이 case ITEM_CLASS_AMULET: ::_LoadStringFromResource(IDS_ITEM_CLASS_AMULET, szText); - break; // + break; // 목걸이 case ITEM_CLASS_RING: ::_LoadStringFromResource(IDS_ITEM_CLASS_RING, szText); - break; // + break; // 반지 case ITEM_CLASS_BELT: ::_LoadStringFromResource(IDS_ITEM_CLASS_BELT, szText); - break; // 㸮 + break; // 허리띠 case ITEM_CLASS_CHARM: ::_LoadStringFromResource(IDS_ITEM_CLASS_CHARM, szText); - break; //κ丮 ϰ ִ + break; //인벤토리에 지니고 있는 아이템 case ITEM_CLASS_JEWEL: ::_LoadStringFromResource(IDS_ITEM_CLASS_JEWEL, szText); - break; // + break; //보석종류 case ITEM_CLASS_POTION: ::_LoadStringFromResource(IDS_ITEM_CLASS_POTION, szText); - break; // + break; // 물약 case ITEM_CLASS_SCROLL: ::_LoadStringFromResource(IDS_ITEM_CLASS_SCROLL, szText); - break; // ũ + break; // 스크롤 case ITEM_CLASS_LAUNCHER: ::_LoadStringFromResource(IDS_ITEM_CLASS_LAUNCHER, szText); @@ -400,26 +400,26 @@ bool CGameBase::GetTextByItemClass(e_ItemClass eItemClass, std::string & szText) case ITEM_CLASS_STAFF: ::_LoadStringFromResource(IDS_ITEM_CLASS_STAFF, szText); - break; // (staff) + break; // 지팡이(staff) case ITEM_CLASS_ARROW: ::_LoadStringFromResource(IDS_ITEM_CLASS_ARROW, szText); - break; // ȭ(Arrow) + break; // 화살(Arrow) case ITEM_CLASS_JAVELIN: ::_LoadStringFromResource(IDS_ITEM_CLASS_JAVELIN, szText); - break; // â + break; // 투창 case ITEM_CLASS_ARMOR_WARRIOR: ::_LoadStringFromResource(IDS_ITEM_CLASS_ARMOR_WARRIOR, szText); - break; //  + break; // 전사 방어구 case ITEM_CLASS_ARMOR_ROGUE: ::_LoadStringFromResource(IDS_ITEM_CLASS_ARMOR_ROGUE, szText); - break; // α  + break; // 로그 방어구 case ITEM_CLASS_ARMOR_MAGE: ::_LoadStringFromResource(IDS_ITEM_CLASS_ARMOR_MAGE, szText); - break; //  + break; // 마법사 방어구 case ITEM_CLASS_ARMOR_PRIEST: ::_LoadStringFromResource(IDS_ITEM_CLASS_ARMOR_PRIEST, szText); - break; //  + break; // 사제 방어구 default: // __ASSERT(0, "Invalid Item Class"); szText = "Unknonw Item Class"; return false; @@ -432,22 +432,22 @@ bool CGameBase::GetTextByAttrib(e_ItemAttrib eAttrib, std::string & szAttrib) { switch (eAttrib) { case ITEM_ATTRIB_GENERAL: ::_LoadStringFromResource(IDS_ITEM_ATTRIB_GENERAL, szAttrib); - break; // ܰ(dagger) + break; // 단검(dagger) case ITEM_ATTRIB_MAGIC: ::_LoadStringFromResource(IDS_ITEM_ATTRIB_MAGIC, szAttrib); - break; // Ѽհ(onehandsword) + break; // 한손검(onehandsword) case ITEM_ATTRIB_LAIR: ::_LoadStringFromResource(IDS_ITEM_ATTRIB_LAIR, szAttrib); - break; // 3 : հ(twohandsword) + break; // 3 : 양손검(twohandsword) case ITEM_ATTRIB_CRAFT: ::_LoadStringFromResource(IDS_ITEM_ATTRIB_CRAFT, szAttrib); - break; // Ѽյ(onehandaxe) + break; // 한손도끼(onehandaxe) case ITEM_ATTRIB_UNIQUE: ::_LoadStringFromResource(IDS_ITEM_ATTRIB_UNIQUE, szAttrib); - break; // μյ(twohandaxe) + break; // 두손도끼(twohandaxe) case ITEM_ATTRIB_UPGRADE: ::_LoadStringFromResource(IDS_ITEM_ATTRIB_UPGRADE, szAttrib); - break; // ѼŸݹ(mace) + break; // 한손타격무기(mace) default: return false; } @@ -544,14 +544,14 @@ bool CGameBase::GetTextByRace(e_Race eRace, std::string & szText) { } D3DCOLOR CGameBase::GetIDColorByLevelDifference(int iLevelDiff) { - // ̿ ... - // : ÷̾ +8, - // : ÷̾ +5, +6, +7 - // : ÷̾ +2, +3, +4 - // : -1 ? ÷̾ ? 1 - // Ķ : ÷̾ 2 -2, -3, -4 - // ʷϻ : ÷̾ -5, -6, -7 - // ϴû : ÷̾ -8, (ġ ) + // 레벨 차이에 따른 색깔... + // 보라색 : 플레이어보다 +8, + // 빨간색: 플레이어보다 +5, +6, +7 + // 노란색 : 플레이어어보다 +2, +3, +4 + // 흰색 : -1 ? 플레이어 ? 1 + // 파란색 : 플레이어보다 2레벨 이하 -2, -3, -4 + // 초록색 : 플레이어보다 -5, -6, -7 + // 하늘색 : 플레이어보다 -8, …(경험치를 얻지 못함) D3DCOLOR crID = 0xffffffff; if (iLevelDiff >= 8) { @@ -573,12 +573,12 @@ D3DCOLOR CGameBase::GetIDColorByLevelDifference(int iLevelDiff) { return crID; } -// Item Data ̸ .. -e_ItemType CGameBase::MakeResrcFileNameForUPC(__TABLE_ITEM_BASIC * pItem, // ... +// Item Data 를 가지고 파일이름을 만든다.. +e_ItemType CGameBase::MakeResrcFileNameForUPC(__TABLE_ITEM_BASIC * pItem, // 아이템 데이터... std::string * pszResrcFN, // Resource FileName std::string * pszIconFN, // Icon FileName - e_PartPosition & ePartPosition, // Part ϰ Index - e_PlugPosition & ePlugPosition) // Plug ϰ Index + e_PartPosition & ePartPosition, // Part 일경우 Index + e_PlugPosition & ePlugPosition) // Plug 일경우 Index { ePartPosition = PART_POS_UNKNOWN; ePlugPosition = PLUG_POS_UNKNOWN; @@ -593,12 +593,12 @@ D3DCOLOR CGameBase::GetIDColorByLevelDifference(int iLevelDiff) { return ITEM_TYPE_UNKNOWN; } - // 8 ڸ̴. + // 총 8 자리이다. e_ItemType eType = ITEM_TYPE_UNKNOWN; - e_ItemPosition ePos = (e_ItemPosition)pItem->byAttachPoint; // ġ... + e_ItemPosition ePos = (e_ItemPosition)pItem->byAttachPoint; // 장착위치... int iPos = 0; - std::string szExt; // Ȯ.. + std::string szExt; // 확장자.. if (ePos >= ITEM_POS_DUAL && ePos <= ITEM_POS_TWOHANDLEFT) { if (ITEM_POS_DUAL == ePos || ITEM_POS_RIGHTHAND == ePos || ITEM_POS_TWOHANDRIGHT == ePos) { @@ -611,15 +611,15 @@ D3DCOLOR CGameBase::GetIDColorByLevelDifference(int iLevelDiff) { szExt = ".n3cplug"; } else if (ePos >= ITEM_POS_UPPER && ePos <= ITEM_POS_SHOES) { if (ITEM_POS_UPPER == ePos) { - ePartPosition = PART_POS_UPPER; // ü + ePartPosition = PART_POS_UPPER; // 상체 } else if (ITEM_POS_LOWER == ePos) { - ePartPosition = PART_POS_LOWER; // ü + ePartPosition = PART_POS_LOWER; // 하체 } else if (ITEM_POS_HEAD == ePos) { - ePartPosition = PART_POS_HAIR_HELMET; // + ePartPosition = PART_POS_HAIR_HELMET; // 투구 } else if (ITEM_POS_GLOVES == ePos) { - ePartPosition = PART_POS_HANDS; // + ePartPosition = PART_POS_HANDS; // 팔 } else if (ITEM_POS_SHOES == ePos) { - ePartPosition = PART_POS_FEET; // + ePartPosition = PART_POS_FEET; // 발 } else { __ASSERT(0, "lll"); } @@ -646,7 +646,7 @@ D3DCOLOR CGameBase::GetIDColorByLevelDifference(int iLevelDiff) { (pItem->dwIDResrc / 1000) % 10000, (pItem->dwIDResrc / 10) % 100, pItem->dwIDResrc % 10, szExt); } else { - // ܸ ִ ÷׳ Ʈ ϼ ִ... + // 아이콘만 있는 플러그나 파트 일수도 있다... *pszResrcFN = ""; } } @@ -664,9 +664,9 @@ bool CGameBase::IsValidCharacter(CPlayerBase * pCharacter) { return false; } if (pCharacter == s_pPlayer) { - return true; // ÷̴̾. + return true; // 플레이어이다. } - return s_pOPMgr->IsValidCharacter(pCharacter); // ϴ ִ ѵ߿ ͺ.. + return s_pOPMgr->IsValidCharacter(pCharacter); // 일단 살아있는 넘들중에서 가져와보고.. } CPlayerBase * CGameBase::CharacterGetByID(int iID, bool bFromAlive) { diff --git a/src/game/GameBase.h b/src/game/GameBase.h index 9beae60a..ff16f232 100644 --- a/src/game/GameBase.h +++ b/src/game/GameBase.h @@ -12,31 +12,31 @@ class CGameBase : public CN3Base { #define ACT_WORLD s_pWorldMgr->GetActiveWorld() public: - static CN3TableBase * s_pTbl_Zones; // Zone ̺.. + static CN3TableBase * s_pTbl_Zones; // Zone 정보에 관한 테이블.. static CN3TableBase * s_pTbl_UI; // UI FileName Table static CN3TableBase * - s_pTbl_Items_Basic; // ( ڽŰ ٸ ) Ŭ ҽ ̺ + s_pTbl_Items_Basic; // 각 유저의(내 자신과 주위 다른 사람) 클레스별 장착 아이템 리소스 테이블 static CN3TableBase * - s_pTbl_Items_Exts[MAX_ITEM_EXTENSION]; // ( ڽŰ ٸ ) Ŭ ҽ ̺ + s_pTbl_Items_Exts[MAX_ITEM_EXTENSION]; // 각 유저의(내 자신과 주위 다른 사람) 클레스별 장착 아이템 리소스 테이블 static CN3TableBase * - s_pTbl_UPC_Looks; // ( ڽŰ ٸ ) Ŭ ⺻ Ų + s_pTbl_UPC_Looks; // 각 유저의(내 자신과 주위 다른 사람) 클레스별 기본 스킨 static CN3TableBase * - s_pTbl_NPC_Looks; // NPC, Mob ⺻ - 6 ij Ʈ(), 2 ÷ - static CN3TableBase * s_pTbl_Skill; // Skill Table - static CN3TableBase * s_pTbl_Exchange_Quest; // ȯ Ʈ ̺.. - static CN3TableBase * s_pTbl_FXSource; // FXҽ ̺.. - static CN3TableBase * s_pTbl_QuestMenu; // Ʈ ޴ - static CN3TableBase * s_pTbl_QuestTalk; // Ʈ + s_pTbl_NPC_Looks; // NPC, Mob 기본 모습 - 6개의 캐릭터 파트(), 2개의 플러그 + static CN3TableBase * s_pTbl_Skill; // Skill 정보에 관한 Table + static CN3TableBase * s_pTbl_Exchange_Quest; // 교환 퀘스트에 관한 테이블.. + static CN3TableBase * s_pTbl_FXSource; // FX소스 정보 테이블.. + static CN3TableBase * s_pTbl_QuestMenu; // 퀘스트 선택 메뉴 + static CN3TableBase * s_pTbl_QuestTalk; // 퀘스트 지문 static CN3TableBase * s_pTbl_Texts; // Localized strings static CN3TableBase * s_pTbl_Help; // Leveling Guide - static class CN3WorldManager * s_pWorldMgr; // Ŵ Ŭ.. - static class CPlayerOtherMgr * s_pOPMgr; // Other Player Manager - ٸ Ŭ.. - static class CPlayerMySelf * s_pPlayer; // Ŭ.. + static class CN3WorldManager * s_pWorldMgr; // 월드 매니져 클래스.. + static class CPlayerOtherMgr * s_pOPMgr; // Other Player Manager - 다른 유저 관리 클래스.. + static class CPlayerMySelf * s_pPlayer; // 유저 클래스.. protected: - static void StaticMemberInit(); // ̺ ⺻ , Ʈ, ij͵ ʱȭ.. - static void StaticMemberRelease(); // ̺ ⺻ , Ʈ, ij͵ ʱȭ.. + static void StaticMemberInit(); // 테이블 및 기본 지형, 오브젝트, 캐리터등 초기화.. + static void StaticMemberRelease(); // 테이블 및 기본 지형, 오브젝트, 캐리터등 초기화.. public: static bool GetTextByAttrib(e_ItemAttrib eAttrib, std::string & szAttrib); @@ -45,13 +45,13 @@ class CGameBase : public CN3Base { static bool GetTextByKnightsDuty(e_KnightsDuty eDuty, std::string & szText); static bool GetTextByNation(e_Nation eNation, std::string & szText); static bool GetTextByRace(e_Race eRace, std::string & szText); - static D3DCOLOR GetIDColorByLevelDifference(int iLevelDiff); // ̿ ID ش. - static e_Class_Represent GetRepresentClass(e_Class eClass); // ־ָ ǥǴ ش. - static e_ItemType MakeResrcFileNameForUPC(__TABLE_ITEM_BASIC * pItem, // ... + static D3DCOLOR GetIDColorByLevelDifference(int iLevelDiff); // 레벨 차이에 따른 ID 색 돌려준다. + static e_Class_Represent GetRepresentClass(e_Class eClass); // 세부직업을 넣어주면 대표되는 직업을 돌려준다. + static e_ItemType MakeResrcFileNameForUPC(__TABLE_ITEM_BASIC * pItem, // 아이템 데이터... std::string * szResrcFN, // Resource FileName std::string * szIconFN, // Icon FileName - e_PartPosition & ePartPosition, // Part ϰ Index - e_PlugPosition & ePlugPosition); // Plug ϰ Index + e_PartPosition & ePartPosition, // Part 일경우 Index + e_PlugPosition & ePlugPosition); // Plug 일경우 Index class CPlayerBase * CharacterGetByID(int iID, bool bFromAlive); bool IsValidCharacter(CPlayerBase * pCharacter); diff --git a/src/game/GameDef.h b/src/game/GameDef.h index 61af78fb..a82e365b 100644 --- a/src/game/GameDef.h +++ b/src/game/GameDef.h @@ -2,13 +2,13 @@ #include #include -const int CURRENT_VERSION = 1097; // +const int CURRENT_VERSION = 1097; // 현재 버전 -const float PACKET_INTERVAL_MOVE = 1.5f; // Ŷ ð .. +const float PACKET_INTERVAL_MOVE = 1.5f; // 정기적으로 보내는 패킷 시간 간격.. const float PACKET_INTERVAL_ROTATE = 4.0f; const float PACKET_INTERVAL_REQUEST_TARGET_HP = 2.0f; -// Ű κ.. +// 단축키 지정해 놓은 부분.. enum eKeyMap { KM_HOTKEY1 = DIK_1, KM_HOTKEY2 = DIK_2, @@ -84,7 +84,7 @@ enum e_Class { CLASS_KA_WARRIOR = 101, CLASS_KA_ROGUE, CLASS_KA_WIZARD, - CLASS_KA_PRIEST, // ⺻ + CLASS_KA_PRIEST, // 여기까지 기본 직업 CLASS_KA_BERSERKER = 105, CLASS_KA_GUARDIAN, CLASS_KA_HUNTER = 107, @@ -97,7 +97,7 @@ enum e_Class { CLASS_EL_WARRIOR = 201, CLASS_EL_ROGUE, CLASS_EL_WIZARD, - CLASS_EL_PRIEST, // ⺻ + CLASS_EL_PRIEST, // 여기까지 기본 직업 CLASS_EL_BLADE = 205, CLASS_EL_PROTECTOR, CLASS_EL_RANGER = 207, @@ -119,9 +119,9 @@ enum e_Class_Represent { CLASS_REPRESENT_UNKNOWN = 0xffffffff }; -const float WEAPON_WEIGHT_STAND_SWORD = 5.0f; // ...Į -const float WEAPON_WEIGHT_STAND_AXE = 5.0f; // ... -const float WEAPON_WEIGHT_STAND_BLUNT = 8.0f; // ... +const float WEAPON_WEIGHT_STAND_SWORD = 5.0f; // 무기의 무게 기준...칼 +const float WEAPON_WEIGHT_STAND_AXE = 5.0f; // 무기의 무게 기준...도끼 +const float WEAPON_WEIGHT_STAND_BLUNT = 8.0f; // 무기의 무게 기준...몽둥이 종류 enum e_Ani { ANI_BREATH = 0, @@ -164,84 +164,84 @@ enum e_Ani { ANI_SWORD_ATTACK_A1, ANI_SWORD_BREATH_B, ANI_SWORD_ATTACK_B0, - ANI_SWORD_ATTACK_B1, // Ѽհ + ANI_SWORD_ATTACK_B1, // 한손검 ANI_DAGGER_BREATH_A = 38, ANI_DAGGER_ATTACK_A0, ANI_DAGGER_ATTACK_A1, ANI_DAGGER_BREATH_B, ANI_DAGGER_ATTACK_B0, - ANI_DAGGER_ATTACK_B1, // ܵ + ANI_DAGGER_ATTACK_B1, // 단도 ANI_DUAL_BREATH_A = 44, ANI_DUAL_ATTACK_A0, ANI_DUAL_ATTACK_A1, ANI_DUAL_BREATH_B, ANI_DUAL_ATTACK_B0, - ANI_DUAL_ATTACK_B1, // ̵ + ANI_DUAL_ATTACK_B1, // 이도류 ANI_SWORD2H_BREATH_A = 50, ANI_SWORD2H_ATTACK_A0, ANI_SWORD2H_ATTACK_A1, ANI_SWORD2H_BREATH_B, ANI_SWORD2H_ATTACK_B0, - ANI_SWORD2H_ATTACK_B1, // հ + ANI_SWORD2H_ATTACK_B1, // 양손검 ANI_BLUNT_BREATH_A = 56, ANI_BLUNT_ATTACK_A0, ANI_BLUNT_ATTACK_A1, ANI_BLUNT_BREATH_B, ANI_BLUNT_ATTACK_B0, - ANI_BLUNT_ATTACK_B1, // б - ? + ANI_BLUNT_ATTACK_B1, // 둔기 - 몽둥이 ? ANI_BLUNT2H_BREATH_A = 62, ANI_BLUNT2H_ATTACK_A0, ANI_BLUNT2H_ATTACK_A1, ANI_BLUNT2H_BREATH_B, ANI_BLUNT2H_ATTACK_B0, - ANI_BLUNT2H_ATTACK_B1, // б. - . + ANI_BLUNT2H_ATTACK_B1, // 양손으로 잡는 둔기. - 양손 도끼와 같다. ANI_AXE_BREATH_A = 68, ANI_AXE_ATTACK_A0, ANI_AXE_ATTACK_A1, ANI_AXE_BREATH_B, ANI_AXE_ATTACK_B0, - ANI_AXE_ATTACK_B1, // Ѽ + ANI_AXE_ATTACK_B1, // 한손 도끼 ANI_SPEAR_BREATH_A = 74, ANI_SPEAR_ATTACK_A0, ANI_SPEAR_ATTACK_A1, ANI_SPEAR_BREATH_B, ANI_SPEAR_ATTACK_B0, - ANI_SPEAR_ATTACK_B1, // â - ׳ â̴. + ANI_SPEAR_ATTACK_B1, // 창 - 베는 날이 없는 그냥 창이다. ANI_POLEARM_BREATH_A = 80, ANI_POLEARM_ATTACK_A0, ANI_POLEARM_ATTACK_A1, ANI_POLEARM_BREATH_B, ANI_POLEARM_ATTACK_B0, - ANI_POLEARM_ATTACK_B1, // ִ â - û浵 ?? + ANI_POLEARM_ATTACK_B1, // 양손으로 잡는 날있는 창 - 청룡도 ?? ANI_NAKED_BREATH_A = 86, ANI_NAKED_ATTACK_A0, ANI_NAKED_ATTACK_A1, ANI_NAKED_BREATH_B, ANI_NAKED_ATTACK_B0, - ANI_NAKED_ATTACK_B1, // Ǹ ?? + ANI_NAKED_ATTACK_B1, // 맨몸으로 ?? ANI_BOW_BREATH = 92, ANI_CROSS_BOW_BREATH, ANI_LAUNCHER_BREATH, ANI_BOW_BREATH_B, ANI_BOW_ATTACK_B0, - ANI_BOW_ATTACK_B1, // Ȱ + ANI_BOW_ATTACK_B1, // 활 공격 ANI_SHIELD_BREATH_A = 98, ANI_SHIELD_ATTACK_A0, ANI_SHIELD_ATTACK_A1, ANI_SHIELD_BREATH_B, ANI_SHIELD_ATTACK_B0, - ANI_SHIELD_ATTACK_B1, // + ANI_SHIELD_ATTACK_B1, // 방패 공격 ANI_GREETING0 = 104, ANI_GREETING1, @@ -277,7 +277,7 @@ enum e_Ani { ANI_SKILL_SWORD2H0 = 134, ANI_SKILL_SWORD2H1, - // ʹ NPC Animation + // 여기부터는 NPC Animation ANI_NPC_BREATH = 0, ANI_NPC_WALK, ANI_NPC_RUN, @@ -300,12 +300,12 @@ enum e_Ani { ANI_UNKNOWN = 0xffffffff }; -//MAX_INCLINE_CLIMB = sqrt( 1 - sin(90-ִ簢)^2 ) -//const float MAX_INCLINE_CLIMB = 0.5f; // ö󰥼 ִ ִ 簪 = 30 -const float MAX_INCLINE_CLIMB = 0.6430f; // ö󰥼 ִ ִ 簪 = 40 -//const float MAX_INCLINE_CLIMB = 0.7071f; // ö󰥼 ִ ִ 簪 = 45 -//const float MAX_INCLINE_CLIMB = 0.7660f; // ö󰥼 ִ ִ 簪 = 50 -//const float MAX_INCLINE_CLIMB = 0.8660f; // ö󰥼 ִ ִ 簪 = 60 +//MAX_INCLINE_CLIMB = sqrt( 1 - sin(90-최대경사각)^2 ) +//const float MAX_INCLINE_CLIMB = 0.5f; // 올라갈수 있는 최대 경사값 = 30 도 +const float MAX_INCLINE_CLIMB = 0.6430f; // 올라갈수 있는 최대 경사값 = 40 도 +//const float MAX_INCLINE_CLIMB = 0.7071f; // 올라갈수 있는 최대 경사값 = 45 도 +//const float MAX_INCLINE_CLIMB = 0.7660f; // 올라갈수 있는 최대 경사값 = 50 도 +//const float MAX_INCLINE_CLIMB = 0.8660f; // 올라갈수 있는 최대 경사값 = 60 도 enum e_MoveDirection { MD_STOP, @@ -314,10 +314,10 @@ enum e_MoveDirection { MD_UNKNOWN = 0xffffffff }; -const float MOVE_DELTA_WHEN_RUNNING = 3.0f; // ۶ .. -const float MOVE_SPEED_WHEN_WALK = 1.5f; // Player ǥؼӵ +const float MOVE_DELTA_WHEN_RUNNING = 3.0f; // 뛸때 곱해지는 변수.. +const float MOVE_SPEED_WHEN_WALK = 1.5f; // Player 들이 걸을때 표준속도 -// ... +// 현재 상태... enum e_StateMove { PSM_STOP = 0, PSM_WALK, @@ -327,21 +327,21 @@ enum e_StateMove { }; enum e_StateAction { - PSA_BASIC = 0, // ƹ ϰ ... - PSA_ATTACK, // .. - PSA_GUARD, //  - .. - PSA_STRUCK, // . - PSA_DYING, // װ ִ() - PSA_DEATH, // ׾ .. - PSA_SPELLMAGIC, // ֹ ܿ .. - PSA_SITDOWN, // ɾ ִ... + PSA_BASIC = 0, // 아무짓도 안하고 있음... + PSA_ATTACK, // 공격 상태.. + PSA_GUARD, // 방어성공 - 막음.. + PSA_STRUCK, // 얻어터짐. + PSA_DYING, // 죽고 있는중(쓰러지는중) + PSA_DEATH, // 죽어서 뻗음.. + PSA_SPELLMAGIC, // 마법 주문 외우는 중.. + PSA_SITDOWN, // 앉아 있는중... PSA_COUNT }; enum e_StateDying { - PSD_DISJOINT = 0, // صǾ ״´.. - PSD_KNOCK_DOWN, // ưų ڷ и鼭 ״´. - PSD_KEEP_POSITION, // ڸ ״´.. + PSD_DISJOINT = 0, // 분해되어 죽는다.. + PSD_KNOCK_DOWN, // 날아가거나 뒤로 밀리면서 죽는다. + PSD_KEEP_POSITION, // 제 자리에서 폼잡고 죽는다.. PSD_COUNT, PSD_UNKNOWN = 0xffffffff @@ -377,45 +377,45 @@ enum e_PlugPosition { }; /* -enum e_ItemClass { ITEM_CLASS_DAGGER = 1, // ܰ(dagger) - ITEM_CLASS_SWORD, // 2 : Ѽհ(onehandsword) - ITEM_CLASS_SWORD_2H, // 3 : հ(twohandsword) - ITEM_CLASS_AXE, // 4 : Ѽյ(onehandaxe) - ITEM_CLASS_AXE_2H, // 5 : μյ(twohandaxe) - ITEM_CLASS_MACE, // 6 : ѼŸݹ(mace) - ITEM_CLASS_MACE_2H, // 7 : μŸݹ(twohandmace) - ITEM_CLASS_SPEAR, // 8 : â(spear) - ITEM_CLASS_POLEARM, // 9 : (polearm) +enum e_ItemClass { ITEM_CLASS_DAGGER = 1, // 단검(dagger) + ITEM_CLASS_SWORD, // 2 : 한손검(onehandsword) + ITEM_CLASS_SWORD_2H, // 3 : 양손검(twohandsword) + ITEM_CLASS_AXE, // 4 : 한손도끼(onehandaxe) + ITEM_CLASS_AXE_2H, // 5 : 두손도끼(twohandaxe) + ITEM_CLASS_MACE, // 6 : 한손타격무기(mace) + ITEM_CLASS_MACE_2H, // 7 : 두손타격무기(twohandmace) + ITEM_CLASS_SPEAR, // 8 : 창(spear) + ITEM_CLASS_POLEARM, // 9 : 폴암(polearm) - ITEM_CLASS_SHIELD_SMALL = 11, // 11 : (smallshield) - ITEM_CLASS_SHIELD_LARGE, // 12 : (largeshield) - ITEM_CLASS_SHIELD_KITE, // 13 : īƮ(kiteshield) - ITEM_CLASS_SHIELD_LARGETKITE, // 14 : īƮ(largekite) - ITEM_CLASS_SHIELD_PLATE, // 15 : ÷Ʈ(plateshield) + ITEM_CLASS_SHIELD_SMALL = 11, // 11 : 스몰쉴드(smallshield) + ITEM_CLASS_SHIELD_LARGE, // 12 : 라아지쉴드(largeshield) + ITEM_CLASS_SHIELD_KITE, // 13 : 카이트쉴드(kiteshield) + ITEM_CLASS_SHIELD_LARGETKITE, // 14 : 라아지카이트(largekite) + ITEM_CLASS_SHIELD_PLATE, // 15 : 플레이트쉴드(plateshield) - ITEM_CLASS_BOW_SHORT = 21, // 21 : Ʈ(Shortbow) - ITEM_CLASS_BOW_WRAPT, // 22 : Ʈ(wraptbow) - ITEM_CLASS_BOW_COMPOSITE, // 23 : Ʈ(compositebow) - ITEM_CLASS_BOW_IRON, // 24 : ̾𺸿(ironbow) - ITEM_CLASS_BOW_LONG, // 25 : պ(longbow) - ITEM_CLASS_BOW_CROSS, // 28 : ũν(crossbow) + ITEM_CLASS_BOW_SHORT = 21, // 21 : 쇼트보우(Shortbow) + ITEM_CLASS_BOW_WRAPT, // 22 : 랩트보우(wraptbow) + ITEM_CLASS_BOW_COMPOSITE, // 23 : 콤포지트보우(compositebow) + ITEM_CLASS_BOW_IRON, // 24 : 아이언보우(ironbow) + ITEM_CLASS_BOW_LONG, // 25 : 롱보우(longbow) + ITEM_CLASS_BOW_CROSS, // 28 : 크로스보우(crossbow) - ITEM_CLASS_STAFF = 31, // 31 : (staff) - ITEM_CLASS_ETC, // 32 : Ÿ ǰ + ITEM_CLASS_STAFF = 31, // 31 : 지팡이(staff) + ITEM_CLASS_ETC, // 32 : 기타 마법 물품 - ITEM_CLASS_ARMOR_COTTON = 41, // 41 : õ(cotton) - ITEM_CLASS_ARMOR_FUR, // 42 : а(Fur) - ITEM_CLASS_ARMOR_LEATHER, // 43 : ׹(leather) - ITEM_CLASS_ARMOR_HADLEATHER, // 44 : ϵ巹(hardleather) - ITEM_CLASS_ARMOR_RINGMAIL, // 45 : (ringmail) - ITEM_CLASS_ARMOR_SCALEMAIL, // 46 : ù(scaledmail) - ITEM_CLASS_ARMOR_HALFPLATE, // 47 : ÷Ʈ  - ITEM_CLASS_ARMOR_FULLPLATE, // 48 : öǹ(platemail) - ITEM_CLASS_ROBE, // 49 : κ(robe) + ITEM_CLASS_ARMOR_COTTON = 41, // 41 : 천방어구(cotton) + ITEM_CLASS_ARMOR_FUR, // 42 : 털가죽(Fur) + ITEM_CLASS_ARMOR_LEATHER, // 43 : 가죽방어구(leather) + ITEM_CLASS_ARMOR_HADLEATHER, // 44 : 하드레더방어구(hardleather) + ITEM_CLASS_ARMOR_RINGMAIL, // 45 : 링방어구(ringmail) + ITEM_CLASS_ARMOR_SCALEMAIL, // 46 : 비늘방어구(scaledmail) + ITEM_CLASS_ARMOR_HALFPLATE, // 47 : 하프 플레이트 방어구 + ITEM_CLASS_ARMOR_FULLPLATE, // 48 : 철판방어구(platemail) + ITEM_CLASS_ROBE, // 49 : 마법사로브(robe) ITEM_CLASS_ARROW = 101, - ITEM_CLASS_UNKNOWN = 0xffffffff }; // 101: ȭ(arrow) + ITEM_CLASS_UNKNOWN = 0xffffffff }; // 101: 화살(arrow) */ enum e_ItemAttrib { ITEM_ATTRIB_GENERAL = 0, @@ -428,43 +428,43 @@ enum e_ItemAttrib { }; enum e_ItemClass { - ITEM_CLASS_DAGGER = 11, // ܰ(dagger) - ITEM_CLASS_SWORD = 21, // Ѽհ(onehandsword) - ITEM_CLASS_SWORD_2H = 22, // 3 : հ(twohandsword) - ITEM_CLASS_AXE = 31, // Ѽյ(onehandaxe) - ITEM_CLASS_AXE_2H = 32, // μյ(twohandaxe) - ITEM_CLASS_MACE = 41, // ѼŸݹ(mace) - ITEM_CLASS_MACE_2H = 42, // μŸݹ(twohandmace) - ITEM_CLASS_SPEAR = 51, // â(spear) - ITEM_CLASS_POLEARM = 52, // (polearm) - - ITEM_CLASS_SHIELD = 60, // (shield) - - ITEM_CLASS_BOW = 70, // Ʈ(Shortbow) - ITEM_CLASS_BOW_CROSS = 71, // ũν(crossbow) - ITEM_CLASS_BOW_LONG = 80, // պ(longbow) - - ITEM_CLASS_EARRING = 91, // Ͱ - ITEM_CLASS_AMULET = 92, // - ITEM_CLASS_RING = 93, // - ITEM_CLASS_BELT = 94, // 㸮 - ITEM_CLASS_CHARM = 95, //κ丮 ϰ ִ - ITEM_CLASS_JEWEL = 96, // - ITEM_CLASS_POTION = 97, // - ITEM_CLASS_SCROLL = 98, // ũ - - ITEM_CLASS_LAUNCHER = 100, // â .. - - ITEM_CLASS_STAFF = 110, // (staff) - ITEM_CLASS_ARROW = 120, // ȭ(Arrow) - ITEM_CLASS_JAVELIN = 130, // â - - ITEM_CLASS_ARMOR_WARRIOR = 210, //  - ITEM_CLASS_ARMOR_ROGUE = 220, // α  - ITEM_CLASS_ARMOR_MAGE = 230, //  - ITEM_CLASS_ARMOR_PRIEST = 240, //  - - ITEM_CLASS_ETC = 251, // Ÿ + ITEM_CLASS_DAGGER = 11, // 단검(dagger) + ITEM_CLASS_SWORD = 21, // 한손검(onehandsword) + ITEM_CLASS_SWORD_2H = 22, // 3 : 양손검(twohandsword) + ITEM_CLASS_AXE = 31, // 한손도끼(onehandaxe) + ITEM_CLASS_AXE_2H = 32, // 두손도끼(twohandaxe) + ITEM_CLASS_MACE = 41, // 한손타격무기(mace) + ITEM_CLASS_MACE_2H = 42, // 두손타격무기(twohandmace) + ITEM_CLASS_SPEAR = 51, // 창(spear) + ITEM_CLASS_POLEARM = 52, // 폴암(polearm) + + ITEM_CLASS_SHIELD = 60, // 쉴드(shield) + + ITEM_CLASS_BOW = 70, // 쇼트보우(Shortbow) + ITEM_CLASS_BOW_CROSS = 71, // 크로스보우(crossbow) + ITEM_CLASS_BOW_LONG = 80, // 롱보우(longbow) + + ITEM_CLASS_EARRING = 91, // 귀걸이 + ITEM_CLASS_AMULET = 92, // 목걸이 + ITEM_CLASS_RING = 93, // 반지 + ITEM_CLASS_BELT = 94, // 허리띠 + ITEM_CLASS_CHARM = 95, //인벤토리에 지니고 있는 아이템 + ITEM_CLASS_JEWEL = 96, //보석종류 + ITEM_CLASS_POTION = 97, // 물약 + ITEM_CLASS_SCROLL = 98, // 스크롤 + + ITEM_CLASS_LAUNCHER = 100, // 창던질때 쓰는 아이템.. + + ITEM_CLASS_STAFF = 110, // 지팡이(staff) + ITEM_CLASS_ARROW = 120, // 화살(Arrow) + ITEM_CLASS_JAVELIN = 130, // 투창 + + ITEM_CLASS_ARMOR_WARRIOR = 210, // 전사 방어구 + ITEM_CLASS_ARMOR_ROGUE = 220, // 로그 방어구 + ITEM_CLASS_ARMOR_MAGE = 230, // 마법사 방어구 + ITEM_CLASS_ARMOR_PRIEST = 240, // 사제 방어구 + + ITEM_CLASS_ETC = 251, // 기타 ITEM_CLASS_UNKNOWN = 0xffffffff }; // @@ -489,68 +489,68 @@ enum e_Authority { }; struct __InfoPlayerBase { - int iID; // ID - std::string szID; // ̸ - D3DCOLOR crID; // ̸ .. - e_Race eRace; // ij ݿ - e_Nation eNation; // Ҽ .. - e_Class eClass; // - int iLevel; // + int iID; // 고유 ID + std::string szID; // 이름 + D3DCOLOR crID; // 이름 색깔.. + e_Race eRace; // 캐릭터 골격에 따른 종족 + e_Nation eNation; // 소속 국가.. + e_Class eClass; // 직업 + int iLevel; // 레벨 int iHPMax; int iHP; - int iAuthority; // - 0 , 1 - Ϲ, 255 - ... + int iAuthority; // 권한 - 0 관리자, 1 - 일반유저, 255 - 블럭당한 유저... - bool bRenderID; // ȭ鿡 ID .. + bool bRenderID; // 화면에 ID 를 찍는지.. void Init() { - iID = 0; // ID - szID = ""; // ̸ - crID = 0; // ̸ .. - eRace = RACE_UNKNOWN; // ij ݿ - eNation = NATION_UNKNOWN; // Ҽ .. - eClass = CLASS_UNKNOWN; // - iLevel = 0; // + iID = 0; // 고유 ID + szID = ""; // 이름 + crID = 0; // 이름 색깔.. + eRace = RACE_UNKNOWN; // 캐릭터 골격에 따른 종족 + eNation = NATION_UNKNOWN; // 소속 국가.. + eClass = CLASS_UNKNOWN; // 직업 + iLevel = 0; // 레벨 iHPMax = 0; iHP = 0; - iAuthority = 1; // - 0 , 1 - Ϲ, 255 - ... + iAuthority = 1; // 권한 - 0 관리자, 1 - 일반유저, 255 - 블럭당한 유저... bRenderID = true; } }; struct __InfoPlayerOther { - int iFace; // .. - int iHair; // Ӹī .. + int iFace; // 얼굴 모양.. + int iHair; // 머리카락 모양.. - int iCity; // Ҽӵ - int iKnightsID; // Ҽ () ID - std::string szKnights; // Ҽ () ̸ - int iKnightsGrade; // Ҽ () - int iKnightsRank; // Ҽ () + int iCity; // 소속도시 + int iKnightsID; // 소속 기사단(길드) ID + std::string szKnights; // 소속 기사단(길드) 이름 + int iKnightsGrade; // 소속 기사단(길드) 등급 + int iKnightsRank; // 소속 기사단(길드) 순위 - int iRank; // - , - ѿ з - int iTitle; // - , - ܼ ź -> ... + int iRank; // 작위 - 백작, 공작 - 권한에 따른 분류 + int iTitle; // 직위 - 영주, 성주 - 단순한 신분 -> 길드장... void Init() { - iFace = 0; // .. - iHair = 0; // Ӹī .. - iCity; // Ҽӵ - iKnightsID = 0; // Ҽ () - szKnights = ""; // Ҽ () - iKnightsGrade = 0; // Ҽ () - iKnightsRank = 0; // - , - ѿ з - iTitle = 0; // - , - ܼ ź -> ... + iFace = 0; // 얼굴 모양.. + iHair = 0; // 머리카락 모양.. + iCity; // 소속도시 + iKnightsID = 0; // 소속 기사단(길드) + szKnights = ""; // 소속 기사단(길드) + iKnightsGrade = 0; // 소속 기사단(길드) 색깔 + iKnightsRank = 0; // 작위 - 백작, 공작 - 권한에 따른 분류 + iTitle = 0; // 직위 - 영주, 성주 - 단순한 신분 -> 길드장... } }; -// .. +// 기사단 직위.. enum e_KnightsDuty { - KNIGHTS_DUTY_UNKNOWN = 0, // ????? Ѱܳ?? - KNIGHTS_DUTY_CHIEF = 1, // - KNIGHTS_DUTY_VICECHIEF = 2, // δ - KNIGHTS_DUTY_PUNISH = 3, // ¡. - KNIGHTS_DUTY_TRAINEE = 4, // ߽ - KNIGHTS_DUTY_KNIGHT = 5, // Ϲݱ - KNIGHTS_DUTY_OFFICER = 6 // 屳 + KNIGHTS_DUTY_UNKNOWN = 0, // ????? 쫓겨남?? + KNIGHTS_DUTY_CHIEF = 1, // 단장 + KNIGHTS_DUTY_VICECHIEF = 2, // 부단장 + KNIGHTS_DUTY_PUNISH = 3, // 징계중. + KNIGHTS_DUTY_TRAINEE = 4, // 견습기사 + KNIGHTS_DUTY_KNIGHT = 5, // 일반기사 + KNIGHTS_DUTY_OFFICER = 6 // 장교 }; #define VICTORY_ABSENCE 0 @@ -558,8 +558,8 @@ enum e_KnightsDuty { #define VICTORY_ELMORAD 2 struct __InfoPlayerMySelf : public __InfoPlayerOther { - int iBonusPointRemain; // ʽ Ʈ... - int iLevelPrev; // ... + int iBonusPointRemain; // 남는 보너스 포인트... + int iLevelPrev; // 직전의 레벨... int iMSPMax; int iMSP; @@ -568,48 +568,48 @@ struct __InfoPlayerMySelf : public __InfoPlayerOther { int64_t iGold; int iExpNext; int iExp; - int iRealmPoint; // ⿩ - e_KnightsDuty eKnightsDuty; // - int iWeightMax; // ѹ - int iWeight; // ִ .. - int iStrength; // - int iStrength_Delta; // ̳ Ȱ. - int iStamina; // ׹̳ - int iStamina_Delta; // ̳ Ȱ. - int iDexterity; // ÷.. - int iDexterity_Delta; // ̳ Ȱ. - int iIntelligence; // - int iIntelligence_Delta; // ̳ Ȱ. - int iMagicAttak; // - int iMagicAttak_Delta; // ̳ Ȱ. - - int iAttack; // ݷ - int iAttack_Delta; // .. - int iGuard; // - int iGuard_Delta; // .. - - int iRegistFire; // ׷ - int iRegistFire_Delta; // ׷ ȭ.. - int iRegistCold; // ׷ - int iRegistCold_Delta; // ׷ ȭ.. - int iRegistLight; // ׷ - int iRegistLight_Delta; // ׷ ȭ.. - int iRegistMagic; // ׷ - int iRegistMagic_Delta; // ׷ ȭ.. - int iRegistCurse; // ׷ - int iRegistCurse_Delta; // ׷ ȭ.. - int iRegistPoison; // ׷ - int iRegistPoison_Delta; // ׷ ȭ.. - - int iZoneInit; // ó ȣ - int iZoneCur; // .. - int iVictoryNation; // 0: º 1: ¸ 2:ī罺 ¸ + int iRealmPoint; // 국가 기여도 + e_KnightsDuty eKnightsDuty; // 기사단 권한 + int iWeightMax; // 아이템의 총무게 + int iWeight; // 들수 있는 아이템 무게.. + int iStrength; // 힘 + int iStrength_Delta; // 아이템이나 마법에 의해 가감된값. + int iStamina; // 스테미너 + int iStamina_Delta; // 아이템이나 마법에 의해 가감된값. + int iDexterity; // 민첨성.. + int iDexterity_Delta; // 아이템이나 마법에 의해 가감된값. + int iIntelligence; // 지능 + int iIntelligence_Delta; // 아이템이나 마법에 의해 가감된값. + int iMagicAttak; // 마력 + int iMagicAttak_Delta; // 아이템이나 마법에 의해 가감된값. + + int iAttack; // 공격력 + int iAttack_Delta; // 마법에 의해 가감된 값.. + int iGuard; // 방어력 + int iGuard_Delta; // 마법에 의해 가감된 값.. + + int iRegistFire; // 저항력 + int iRegistFire_Delta; // 마법에 의한 저항력 변화값.. + int iRegistCold; // 저항력 + int iRegistCold_Delta; // 마법에 의한 저항력 변화값.. + int iRegistLight; // 저항력 + int iRegistLight_Delta; // 마법에 의한 저항력 변화값.. + int iRegistMagic; // 저항력 + int iRegistMagic_Delta; // 마법에 의한 저항력 변화값.. + int iRegistCurse; // 저항력 + int iRegistCurse_Delta; // 마법에 의한 저항력 변화값.. + int iRegistPoison; // 저항력 + int iRegistPoison_Delta; // 마법에 의한 저항력 변화값.. + + int iZoneInit; // 서버한테 처음에 받은 존번호 + int iZoneCur; // 현재 존.. + int iVictoryNation; // 0: 무승부 1:엘모라드 승리 2:카루스 승리 void Init() { __InfoPlayerOther::Init(); - iBonusPointRemain = 0; // ʽ Ʈ... - iLevelPrev = 0; // ... + iBonusPointRemain = 0; // 남는 보너스 포인트... + iLevelPrev = 0; // 직전의 레벨... iMSPMax = 0; iMSP = 0; @@ -618,56 +618,56 @@ struct __InfoPlayerMySelf : public __InfoPlayerOther { iGold = 0; iExpNext = 0; iExp = 0; - iRealmPoint = 0; // ⿩ - eKnightsDuty = KNIGHTS_DUTY_UNKNOWN; // - iWeightMax = 0; // ѹ - iWeight = 0; // ִ .. - iStrength = 0; // - iStrength_Delta = 0; // ̳ Ȱ. - iStamina = 0; // ׹̳ - iStamina_Delta = 0; // ̳ Ȱ. - iDexterity = 0; // ÷.. - iDexterity_Delta = 0; // ̳ Ȱ. - iIntelligence = 0; // - iIntelligence_Delta = 0; // ̳ Ȱ. - iMagicAttak = 0; // - iMagicAttak_Delta = 0; // ̳ Ȱ. - - iAttack = 0; // ݷ - iAttack_Delta = 0; // .. - iGuard = 0; // - iGuard_Delta = 0; // .. - - iRegistFire = 0; // ׷ - iRegistFire_Delta = 0; // ׷ ȭ.. - iRegistCold = 0; // ׷ - iRegistCold_Delta = 0; // ׷ ȭ.. - iRegistLight = 0; // ׷ - iRegistLight_Delta = 0; // ׷ ȭ.. - iRegistMagic = 0; // ׷ - iRegistMagic_Delta = 0; // ׷ ȭ.. - iRegistCurse = 0; // ׷ - iRegistCurse_Delta = 0; // ׷ ȭ.. - iRegistPoison = 0; // ׷ - iRegistPoison_Delta = 0; // ׷ ȭ.. - - iZoneInit = 0x01; // ó ȣ - iZoneCur = 0; // .. - iVictoryNation = -1; // £ ̱ + iRealmPoint = 0; // 국가 기여도 + eKnightsDuty = KNIGHTS_DUTY_UNKNOWN; // 기사단 권한 + iWeightMax = 0; // 아이템의 총무게 + iWeight = 0; // 들수 있는 아이템 무게.. + iStrength = 0; // 힘 + iStrength_Delta = 0; // 아이템이나 마법에 의해 가감된값. + iStamina = 0; // 스테미너 + iStamina_Delta = 0; // 아이템이나 마법에 의해 가감된값. + iDexterity = 0; // 민첨성.. + iDexterity_Delta = 0; // 아이템이나 마법에 의해 가감된값. + iIntelligence = 0; // 지능 + iIntelligence_Delta = 0; // 아이템이나 마법에 의해 가감된값. + iMagicAttak = 0; // 마력 + iMagicAttak_Delta = 0; // 아이템이나 마법에 의해 가감된값. + + iAttack = 0; // 공격력 + iAttack_Delta = 0; // 마법에 의해 가감된 값.. + iGuard = 0; // 방어력 + iGuard_Delta = 0; // 마법에 의해 가감된 값.. + + iRegistFire = 0; // 저항력 + iRegistFire_Delta = 0; // 마법에 의한 저항력 변화값.. + iRegistCold = 0; // 저항력 + iRegistCold_Delta = 0; // 마법에 의한 저항력 변화값.. + iRegistLight = 0; // 저항력 + iRegistLight_Delta = 0; // 마법에 의한 저항력 변화값.. + iRegistMagic = 0; // 저항력 + iRegistMagic_Delta = 0; // 마법에 의한 저항력 변화값.. + iRegistCurse = 0; // 저항력 + iRegistCurse_Delta = 0; // 마법에 의한 저항력 변화값.. + iRegistPoison = 0; // 저항력 + iRegistPoison_Delta = 0; // 마법에 의한 저항력 변화값.. + + iZoneInit = 0x01; // 서버한테 처음에 받은 존번호 + iZoneCur = 0; // 현재 존.. + iVictoryNation = -1; // 전쟁에서 이긴 국가 } }; const int MAX_PARTY_OR_FORCE = 8; struct __InfoPartyOrForce { - int iID; // Ƽ ID + int iID; // 파티원 ID int iLevel; // Level - e_Class eClass; // + e_Class eClass; // 직업 int iHP; // Hit Point int iHPMax; // Hit Point Max - bool bSufferDown_HP; // Status - HP ... - bool bSufferDown_Etc; // Status - ְ迭 - std::string szID; // Ƽ ̸ ڿ + bool bSufferDown_HP; // Status - HP 떨어짐... + bool bSufferDown_Etc; // Status - 저주계열 영향을 받을때 + std::string szID; // 파티 이름 문자열 void Init() { iID = -1; @@ -677,8 +677,8 @@ struct __InfoPartyOrForce { iHPMax = 0; szID = ""; - bSufferDown_HP = false; // Status - HP ... - bSufferDown_Etc = false; // Status - ְ迭 + bSufferDown_HP = false; // Status - HP 떨어짐... + bSufferDown_Etc = false; // Status - 저주계열 영향을 받을때 }; __InfoPartyOrForce() { this->Init(); } @@ -689,12 +689,12 @@ enum e_PartyStatus { PARTY_STATUS_DOWN_ETC = 2 }; -struct __InfoPartyBBS // Ƽ Խ ü.. +struct __InfoPartyBBS // 파티 지원 게시판 구조체.. { - std::string szID; // Ƽ ̸ ڿ - int iID; // Ƽ ID + std::string szID; // 파티 이름 문자열 + int iID; // 파티원 ID int iLevel; // Level - e_Class eClass; // + e_Class eClass; // 직업 int iMemberCount; void Init() { @@ -725,12 +725,12 @@ typedef struct __TABLE_ZONE { std::string szTerrainFN; // Terrain FileName - Terrain, Tile Map, ColorMap.... std::string szColorMapFN; std::string szLightMapFN; - std::string szObjectPostDataFN; // Object ġ - ̾ȿ 浹 üũ ͵ ִ. + std::string szObjectPostDataFN; // Object 위치 정보 - 이안에 충돌 체크 데이터도 들어 있다. std::string szMiniMapFN; - std::string szSkySetting; // ϴð .. - BOOL bIndicateEnemyPlayer; // ÷̾ ǥϳ?? - int iFixedSundDirection; // Ű.. - std::string szLightObjFN; // ġǾ ִ Ʈ.. + std::string szSkySetting; // 하늘과 분위기 조정한 세팅 정보 파일.. + BOOL bIndicateEnemyPlayer; // 적국 플레이어를 표시하나?? + int iFixedSundDirection; // 해의 방향을 고정시키는지.. + std::string szLightObjFN; // 지형에 배치되어 있는 라이트정보파일.. std::string szGevFN; // TODO: implement uint32_t iAbyssSomething; // TODO: implement @@ -740,18 +740,18 @@ typedef struct __TABLE_ZONE { } TABLE_ZONE; typedef struct __TABLE_UI_RESRC { - DWORD dwID; // ÷̾ Ҽ Ű .. + DWORD dwID; // 플레이어의 소속 국가에 따른 키로 쓴다.. std::string szLogIn; // 0 std::string szCmd; // 1 std::string szChat; // 2 std::string szMsgOutput; // 3 std::string szStateBar; // 4 - std::string szVarious; // 5 - ij , , Ʈ, ģ.. Ѱ . - std::string szState; // 6 - ij - std::string szKnights; // 7 - - std::string szQuest; // 8 - Ʈ - std::string szFriends; // 9 - ģ + std::string szVarious; // 5 - 캐릭터 상태, 기사단 관리, 퀘스트, 친구.. 등등 네페이지가 한개에 들어있음. + std::string szState; // 6 - 캐릭터 상태 + std::string szKnights; // 7 - 기사단 관리 + std::string szQuest; // 8 - 퀘스트 + std::string szFriends; // 9 - 친구 관리 std::string szInventory; // 10 std::string szTransaction; // 11 @@ -873,123 +873,123 @@ typedef struct __TABLE_UI_RESRC { std::string szRentalCount; // 115 TODO: implement } TABLE_UI_RESRC; -typedef struct __TABLE_ITEM_BASIC // ۿ ҽ ڵ... +typedef struct __TABLE_ITEM_BASIC // 장착 아이템에 관한 리소스 레코드... { - DWORD dwID; // 00 ڵȭ ۹ȣ - BYTE byExtIndex; // 01 Ȯ ε - std::string szName; // 02 ̸ - std::string szRemark; // 03 + DWORD dwID; // 00 코드화된 아이템번호 + BYTE byExtIndex; // 01 확장 인덱스 + std::string szName; // 02 이름 + std::string szRemark; // 03 아이템 설명 DWORD dwTODO1; // TODO: implement introduced in 1264 BYTE byTODO2; // TODO: implement introduced in 1264 - DWORD dwIDResrc; // 04 ڵȭ ҽ d - DWORD dwIDIcon; // 05 ڵȭ ҽ d - DWORD dwSoundID0; // 06 Sound ID - 0 ̸ ~.. - DWORD dwSoundID1; // 07 Sound ID - 0 ̸ ~.. - - BYTE byClass; // 08 b enum e_ItemClass .... - BYTE byIsRobeType; // 09 Ʒ ° κŸ ..... - BYTE byAttachPoint; // 10 ġ b - BYTE byNeedRace; // 11 b - BYTE byNeedClass; // 12 b - - short siDamage; // 13 Ÿ b - short siAttackInterval; // 14 ð 100 1 - short siAttackRange; // 15 ȿ Ÿ .1 meter - short siWeight; // 16 .1 ߷ - short siMaxDurability; // 17 - int iPrice; // 18 ż - int iPriceSale; // 19 ŵ - short siDefense; // 20 - BYTE byContable; // 21 ڰ ִ ΰ?? - - DWORD dwEffectID1; // 22 ȿ ID1 - DWORD dwEffectID2; // 23 ȿ ID1 - - char cNeedLevel; // 24 䱸 ÷̾ iLeve.. - ִ.. + DWORD dwIDResrc; // 04 코드화된 아이템 리소스 d + DWORD dwIDIcon; // 05 코드화된 아이템 아이콘 리소스 d + DWORD dwSoundID0; // 06 Sound ID - 0 이면 사운드 없다~.. + DWORD dwSoundID1; // 07 Sound ID - 0 이면 사운드 없다~.. + + BYTE byClass; // 08 아이템 형태 b enum e_ItemClass 참조.... + BYTE byIsRobeType; // 09 위아래가 통째로 된 로브타입의 아이템..... + BYTE byAttachPoint; // 10 장착 위치 b + BYTE byNeedRace; // 11 종족 b + BYTE byNeedClass; // 12 직업 b + + short siDamage; // 13 무기타격 b + short siAttackInterval; // 14 공격 시간 100 은 1 초 + short siAttackRange; // 15 유효 거리 .1 meter 단위 + short siWeight; // 16 무게 .1 중량단위 + short siMaxDurability; // 17 내구력 + int iPrice; // 18 매수가 + int iPriceSale; // 19 매도가 + short siDefense; // 20 방어력 + BYTE byContable; // 21 숫자가 있는 아이템인가?? + + DWORD dwEffectID1; // 22 마법 효과 ID1 + DWORD dwEffectID2; // 23 마법 효과 ID1 + + char cNeedLevel; // 24 요구 레벨 플레이어의 iLeve.. - 음수값이 있을수도 있다.. BYTE byTODO3; // TODO: implement introduced in 1264 - BYTE byNeedRank; // 25 䱸 ÷̾ iRank.. - BYTE byNeedTitle; // 26 䱸 ŸƲ ÷̾ iTitle.. - BYTE byNeedStrength; // 27 䱸 ÷̾ iStrength.. - BYTE byNeedStamina; // 28 䱸 ÷̾ iStamina.. - BYTE byNeedDexterity; // 29 䱸 ø ÷̾ iDexterity.. - BYTE byNeedInteli; // 30 䱸 ÷̾ iIntelligence.. - BYTE byNeedMagicAttack; // 31 䱸 ÷̾ iMagicAttak.. + BYTE byNeedRank; // 25 요구 작위 플레이어의 iRank.. + BYTE byNeedTitle; // 26 요구 타이틀 플레이어의 iTitle.. + BYTE byNeedStrength; // 27 요구 힘 플레이어의 iStrength.. + BYTE byNeedStamina; // 28 요구 정력 플레이어의 iStamina.. + BYTE byNeedDexterity; // 29 요구 민첩 플레이어의 iDexterity.. + BYTE byNeedInteli; // 30 요구 지능 플레이어의 iIntelligence.. + BYTE byNeedMagicAttack; // 31 요구 마력 플레이어의 iMagicAttak.. - BYTE bySellGroup; // 32 Ĵµ ׷.. + BYTE bySellGroup; // 32 상인이 파는데에 대한 그룹.. } TABLE_ITEM_BASIC; -const int MAX_ITEM_EXTENSION = 23; // Ȯ ̺ . +const int MAX_ITEM_EXTENSION = 23; // 확장 아이템 테이블 갯수. const int LIMIT_FX_DAMAGE = 64; const int ITEM_UNIQUE = 4; const int ITEM_LIMITED_EXHAUST = 17; -typedef struct __TABLE_ITEM_EXT // ۿ ҽ ڵ... +typedef struct __TABLE_ITEM_EXT // 장착 아이템에 관한 리소스 레코드... { - DWORD dwID; // 00 ڵȭ ۹ȣ - std::string szHeader; // 01 λ + DWORD dwID; // 00 코드화된 아이템번호 + std::string szHeader; // 01 접두사 DWORD dwTODO1; // TODO: implement introduced in 1264 BaseID - std::string szRemark; // 02 + std::string szRemark; // 02 아이템 설명 DWORD dwTODO2; // TODO: implement introduced in 1097 DWORD dwTODO3; // TODO: implement introduced in 1264 ResrcID DWORD dwTODO4; // TODO: implement introduced in 1264 IconID - BYTE byMagicOrRare; // 03 Ȥ ... - - short siDamage; // 04 Ÿ - short siAttackIntervalPercentage; // 05 ð - short siHitRate; // 06 Ÿݷ - ۼƮ - short siEvationRate; // 07 ȸ - " - - short siMaxDurability; // 08 - short siPriceMultiply; // 09 ż - short siDefense; // 10 - - short siDefenseRateDagger; // 11 ܰ˹ - ۼƮ - short siDefenseRateSword; // 12 ˹ - ۼƮ - short siDefenseRateBlow; // 13 Ÿݹ - ۼƮ - short siDefenseRateAxe; // 14 - ۼƮ - short siDefenseRateSpear; // 15 â - ۼƮ - short siDefenseRateArrow; // 16 ȭ - ۼƮ - - BYTE byDamageFire; // 17 ߰ - - BYTE byDamageIce; // 18 ߰ - - BYTE byDamageThuner; // 19 ߰ - - BYTE byDamagePoison; // 20 ߰ - - - BYTE byStillHP; // 21 HP + BYTE byMagicOrRare; // 03 매직 혹은 레어 아이템인지... + + short siDamage; // 04 무기타격 + short siAttackIntervalPercentage; // 05 공격 시간 비율 + short siHitRate; // 06 타격률 - 퍼센트 + short siEvationRate; // 07 회피율 - " + + short siMaxDurability; // 08 내구력 + short siPriceMultiply; // 09 매수가 배율 + short siDefense; // 10 방어력 + + short siDefenseRateDagger; // 11 단검방어 - 퍼센트 + short siDefenseRateSword; // 12 검방어 - 퍼센트 + short siDefenseRateBlow; // 13 타격방어 - 퍼센트 + short siDefenseRateAxe; // 14 도끼방어 - 퍼센트 + short siDefenseRateSpear; // 15 창방어 - 퍼센트 + short siDefenseRateArrow; // 16 화살방어 - 퍼센트 + + BYTE byDamageFire; // 17 추가데미지 - 불 + BYTE byDamageIce; // 18 추가데미지 - 얼음 + BYTE byDamageThuner; // 19 추가데미지 - 전격 + BYTE byDamagePoison; // 20 추가데미지 - 독 + + BYTE byStillHP; // 21 HP 흡수 BYTE byDamageMP; // 22 MP Damage - BYTE byStillMP; // 23 MP - BYTE byReturnPhysicalDamage; // 24 Ÿ ݻ - - BYTE bySoulBind; // 25ҿ ε - ϴϽ - ۼƮ - Ⱦ. - - short siBonusStr; // 26 ʽ - short siBonusSta; // 27 ü ʽ - short siBonusDex; // 28 ø ʽ - short siBonusInt; // 29 ʽ - short siBonusMagicAttak; // 30 ʽ - short siBonusHP; // 31 HP ʽ - short siBonusMSP; // 32 MSP ʽ - - short siRegistFire; // 33 - short siRegistIce; // 34 ñ - short siRegistElec; // 35 - short siRegistMagic; // 36 - short siRegistPoison; // 37 - short siRegistCurse; // 38 - - DWORD dwEffectID1; // 39 ȿ ID1 - DWORD dwEffectID2; // 40 ȿ ID2 - - short siNeedLevel; // 41 䱸 ÷̾ iLeve.. - short siNeedRank; // 42 䱸 ÷̾ iRank.. - short siNeedTitle; // 43 䱸 ŸƲ ÷̾ iTitle.. - short siNeedStrength; // 44 䱸 ÷̾ iStrength.. - short siNeedStamina; // 45 䱸 ÷̾ iStamina.. - short siNeedDexterity; // 46 䱸 ø ÷̾ iDexterity.. - short siNeedInteli; // 47 䱸 ÷̾ iIntelligence.. - short siNeedMagicAttack; // 48 䱸 ÷̾ iMagicAttak.. + BYTE byStillMP; // 23 MP 흡수 + BYTE byReturnPhysicalDamage; // 24 물리타격 반사 + + BYTE bySoulBind; // 25소울 바인드 - 일대일시 아이템을 떨구는 정도 - 퍼센트 - 현재는 안쓴다. + + short siBonusStr; // 26 힘 보너스 + short siBonusSta; // 27 체력 보너스 + short siBonusDex; // 28 민첩성 보너스 + short siBonusInt; // 29 지능 보너스 + short siBonusMagicAttak; // 30 마력 보너스 + short siBonusHP; // 31 HP 보너스 + short siBonusMSP; // 32 MSP 보너스 + + short siRegistFire; // 33 불 저항 + short siRegistIce; // 34 냉기 저항 + short siRegistElec; // 35 전기 저항 + short siRegistMagic; // 36 마법 저항 + short siRegistPoison; // 37 독 저항 + short siRegistCurse; // 38 저주 저항 + + DWORD dwEffectID1; // 39 마법 효과 ID1 + DWORD dwEffectID2; // 40 마법 효과 ID2 + + short siNeedLevel; // 41 요구 레벨 플레이어의 iLeve.. + short siNeedRank; // 42 요구 작위 플레이어의 iRank.. + short siNeedTitle; // 43 요구 타이틀 플레이어의 iTitle.. + short siNeedStrength; // 44 요구 힘 플레이어의 iStrength.. + short siNeedStamina; // 45 요구 정력 플레이어의 iStamina.. + short siNeedDexterity; // 46 요구 민첩 플레이어의 iDexterity.. + short siNeedInteli; // 47 요구 지능 플레이어의 iIntelligence.. + short siNeedMagicAttack; // 48 요구 마력 플레이어의 iMagicAttak.. } TABLE_ITEM_EXT; const int MAX_NPC_SHOP_ITEM = 30; @@ -1049,18 +1049,18 @@ enum e_ItemSlot { ITEM_SLOT_UNKNOWN = 0xffffffff }; -typedef struct __TABLE_PLAYER_LOOKS // NPC, Mob ҽ ڵ... +typedef struct __TABLE_PLAYER_LOOKS // NPC, Mob 모습 관한 리소스 레코드... { - DWORD dwID; // NPC ID - std::string szName; // ij ̸ - std::string szJointFN; // ̸ - std::string szAniFN; // ϸ̼ ̸ - std::string szPartFNs[7]; // Character Part - ü, ü, Ӹ, , ٸ, Ӹī, + DWORD dwID; // NPC 고유 ID + std::string szName; // 캐릭터 이름 + std::string szJointFN; // 관절 파일 이름 + std::string szAniFN; // 에니메이션 파일 이름 + std::string szPartFNs[7]; // 각 Character Part - 상체, 하체, 머리, 팔, 다리, 머리카락, 망토 - int iJointRH; // ȣ - int iJointLH; // ޼ ȣ - int iJointLH2; // ޼ ȶ ȣ - int iJointCloak; // ȣ + int iJointRH; // 오른손 끝 관절번호 + int iJointLH; // 왼손 끝 관절번호 + int iJointLH2; // 왼손 팔뚝 관절번호 + int iJointCloak; // 망토 붙을 관절 번호 int iSndID_Move; int iSndID_Attack0; @@ -1076,212 +1076,212 @@ enum e_ItemSlot { } TABLE_PLAYER; typedef struct __TABLE_EXCHANGE_QUEST { - DWORD dwID; // Ʈ ȣ.. 0 - DWORD dwNpcNum; // npc ȣ.. 1 - std::string szDesc; // .. 2 - int iCondition0; // 1.. 3 - int iCondition1; // 2.. 4 - int iCondition2; // 3.. 5 - int iCondition3; // 4.. 6 - int iNeedGold; // 䱸 .. 7 - BYTE bNeedLevel; // 䱸 8 - BYTE bNeedClass; // 䱸 9 - BYTE bNeedRank; // 䱸 10 - BYTE bNeedExtra1; // 䱸 1 11 - BYTE bNeedExtra2; // 䱸 2 12 - BYTE bCreatePercentage; // Ȯ 13 - int iArkTuarek; // ũ Ʒ.. 14 - int iTuarek; // Ʒ.. 15 - int iRinkleTuarek; // Ŭ Ʒ.. 16 - int iBabarian; // ٹٸ.. 17 - int iMan; // .. 18 - int iWoman; // .. 19 + DWORD dwID; // 퀘스트 번호.. 0 + DWORD dwNpcNum; // npc 번호.. 1 + std::string szDesc; // 설명.. 2 + int iCondition0; // 조건 1.. 3 + int iCondition1; // 조건 2.. 4 + int iCondition2; // 조건 3.. 5 + int iCondition3; // 조건 4.. 6 + int iNeedGold; // 요구 노아.. 7 + BYTE bNeedLevel; // 요구 레벨 8 + BYTE bNeedClass; // 요구 직업 9 + BYTE bNeedRank; // 요구 작위 10 + BYTE bNeedExtra1; // 요구 여분1 11 + BYTE bNeedExtra2; // 요구 여분2 12 + BYTE bCreatePercentage; // 생성 확률 13 + int iArkTuarek; // 아크 투아렉.. 14 + int iTuarek; // 투아렉.. 15 + int iRinkleTuarek; // 링클 투아렉.. 16 + int iBabarian; // 바바리안.. 17 + int iMan; // 남자.. 18 + int iWoman; // 여자.. 19 } TABLE_EXCHANGE_QUEST; /////////////////////////////////////////////////////////////////////////////////////////////////////////// -//̺... +//마법테이블... typedef struct __TABLE_UPC_SKILL { - DWORD dwID; // SKILL ID - std::string szEngName; // ų ̸ - std::string szName; // ų ѱ ̸ - std::string szDesc; // ų ̸ - int iSelfAnimID1; // ۽ - int iSelfAnimID2; // ۳ - - int idwTargetAnimID; // Ÿ - int iSelfFX1; // ȿ 1 - int iSelfPart1; // ȿ Ͼ ġ 1 - int iSelfFX2; // ȿ 2 - int iSelfPart2; // ȿ Ͼ ġ 2 - int iFlyingFX; // ȿ - int iTargetFX; // Ÿ ȿ - - int iTargetPart; // ȿ Ͼ ġ. - int iTarget; // Ÿ - int iNeedLevel; // 䱸 - int iNeedSkill; // 䱸 ų - int iExhaustMSP; // Ҹ MSP - - int iExhaustHP; // Ҹ HP - DWORD dwNeedItem; // 䱸 e_ItemClass .. 10 ̴.. + DWORD dwID; // SKILL 고유 ID + std::string szEngName; // 스킬 영어 이름 + std::string szName; // 스킬 한글 이름 + std::string szDesc; // 스킬 이름 + int iSelfAnimID1; // 시전자 동작시작 + int iSelfAnimID2; // 시전자 동작끝 + + int idwTargetAnimID; // 타겟 동작 + int iSelfFX1; // 시전자 효과 1 + int iSelfPart1; // 시전자 효과 일어나는 위치 1 + int iSelfFX2; // 시전자 효과 2 + int iSelfPart2; // 시전자 효과 일어나는 위치 2 + int iFlyingFX; // 비행 효과 + int iTargetFX; // 타겟 효과 + + int iTargetPart; // 효과가 일어날 위치. + int iTarget; // 타겟 + int iNeedLevel; // 요구 레벨 + int iNeedSkill; // 요구 스킬 + int iExhaustMSP; // 소모 MSP + + int iExhaustHP; // 소모 HP + DWORD dwNeedItem; // 요구 아이템 e_ItemClass 참조.. 10을 나눈값이다.. DWORD dwExhaustItem; - int iCastTime; // ij ð - int iReCastTime; // ٽ ijҶ ɸ ð. + int iCastTime; // 캐스팅 시간 + int iReCastTime; // 다시 캐스팅할때까지 걸리는 시간. float fUnkown1; // TODO: implement - int iPercentSuccess; // - DWORD dw1stTableType; // ù° Ÿ. - DWORD dw2ndTableType; // ι° Ÿ. - int iValidDist; // ȿŸ + int iPercentSuccess; // 성공률 + DWORD dw1stTableType; // 첫번째 타입. + DWORD dw2ndTableType; // 두번째 타입. + int iValidDist; // 유효거리 } TABLE_UPC_ATTACK_B; typedef struct __TABLE_UPC_SKILL_TYPE_1 { - DWORD dwID; // SKILL ID - int iSuccessType; // Ÿ. - int iSuccessRatio; // - int iPower; // ݷ - int iDelay; // - int iComboType; // ޺Ÿ - int iNumCombo; // ޺ȸ - int iComboDamage; // ޺ - int iValidAngle; // ݹݰ + DWORD dwID; // SKILL 고유 ID + int iSuccessType; // 성공타입. + int iSuccessRatio; // 성공률 + int iPower; // 공격력 + int iDelay; // 딜레이 + int iComboType; // 콤보타입 + int iNumCombo; // 콤보회수 + int iComboDamage; // 콤보대미지 + int iValidAngle; // 공격반경 int iAct[3]; } TABLE_UPC_SKILL_TYPE_1; typedef struct __TABLE_UPC_SKILL_TYPE_2 { - DWORD dwID; // SKILL ID - int iSuccessType; // Ÿ. - int iPower; // ݷ - int iAddDist; // Ÿ - int iNumArrow; // ȭ䱸 + DWORD dwID; // SKILL 고유 ID + int iSuccessType; // 성공타입. + int iPower; // 공격력 + int iAddDist; // 거리증가 + int iNumArrow; // 화살요구수 } TABLE_UPC_SKILL_TYPE_2; typedef struct __TABLE_UPC_SKILL_TYPE_3 { - DWORD dwID; // SKILL ID + DWORD dwID; // SKILL 고유 ID int iDDType; int iStartDamage; int iDuraDamage; - int iDurationTime; // ӽð + int iDurationTime; // 지속시간 int iAttribute; } TABLE_UPC_SKILL_TYPE_3; typedef struct __TABLE_UPC_SKILL_TYPE_4 { - DWORD dwID; // Ϸùȣ - int iBuffType; // Ÿ + DWORD dwID; // 일련번호 + int iBuffType; // 버프타입 int iDuration; - int iAttackSpeed; // ݼӵ - int iMoveSpeed; // ̵ӵ - int iAC; // - int iAttack; // ݷ + int iAttackSpeed; // 공격속도 + int iMoveSpeed; // 이동속도 + int iAC; // 방어력 + int iAttack; // 공격력 int iMaxHP; // MAXHP int iMaxHPPct; // TODO: implement int iMaxMP; // TODO: implement - int iStr; // - int iSta; // ü - int iDex; // ø - int iInt; // - int iMAP; // - int iFireResist; // - int iColdResist; // ñ - int iLightningResist; // - int iMagicResist; // - int iDeseaseResist; // - int iPoisonResist; // + int iStr; // 힘 + int iSta; // 체력 + int iDex; // 민첩 + int iInt; // 지능 + int iMAP; // 마력 + int iFireResist; // 불저항 + int iColdResist; // 냉기저항 + int iLightningResist; // 전기저항 + int iMagicResist; // 마법저항 + int iDeseaseResist; // 저주저항 + int iPoisonResist; // 독저항 } TABLE_UPC_SKILL_TYPE_4; typedef struct __TABLE_UPC_SKILL_TYPE_5 { - DWORD dwID; // Ϸùȣ - DWORD dwTarget; // Ÿ - int iSuccessRatio; // - int iValidDist; // ȿŸ - int iRadius; // ݰ - float fCastTime; // ijŸ - float fRecastTime; // ijŸ - int iDurationTime; // ӽð - DWORD dwExhaustItem; // Ҹ - DWORD dwFX; // ȿ + DWORD dwID; // 일련번호 + DWORD dwTarget; // 타겟 + int iSuccessRatio; // 성공률 + int iValidDist; // 유효거리 + int iRadius; // 반경 + float fCastTime; // 캐스팅타임 + float fRecastTime; // 리캐스팅타임 + int iDurationTime; // 지속시간 + DWORD dwExhaustItem; // 소모아이템 + DWORD dwFX; // 마법효과 } TABLE_UPC_SKILL_TYPE_5; typedef struct __TABLE_UPC_SKILL_TYPE_6 { - DWORD dwID; // Ϸùȣ - DWORD dwTarget; // Ÿ - int iSuccessRatio; // - int iValidDist; // ȿŸ - int iRadius; // ݰ - float fCastTime; // ijŸ - float fRecastTime; // ijŸ - int iDurationTime; // ӽð - DWORD dwExhaustItem; // Ҹ - DWORD dwFX; // ȿ - DWORD dwTranform; // + DWORD dwID; // 일련번호 + DWORD dwTarget; // 타겟 + int iSuccessRatio; // 성공률 + int iValidDist; // 유효거리 + int iRadius; // 반경 + float fCastTime; // 캐스팅타임 + float fRecastTime; // 리캐스팅타임 + int iDurationTime; // 지속시간 + DWORD dwExhaustItem; // 소모아이템 + DWORD dwFX; // 마법효과 + DWORD dwTranform; // 변신 } TABLE_UPC_SKILL_TYPE_6; typedef struct __TABLE_UPC_SKILL_TYPE_7 { - DWORD dwID; // Ϸùȣ - DWORD dwTarget; // Ÿ - DWORD dwValidGroup; // ȿ׷ - int iSuccessRatio; // - int iValidDist; // ȿŸ - int iRadius; // ݰ - float fCastTime; // ijŸ - float fRecastTime; // ijŸ - int iDurationTime; // ӽð - DWORD dwExhaustItem; // Ҹ - DWORD dwFX; // ȿ + DWORD dwID; // 일련번호 + DWORD dwTarget; // 타겟 + DWORD dwValidGroup; // 유효그룹 + int iSuccessRatio; // 성공률 + int iValidDist; // 유효거리 + int iRadius; // 반경 + float fCastTime; // 캐스팅타임 + float fRecastTime; // 리캐스팅타임 + int iDurationTime; // 지속시간 + DWORD dwExhaustItem; // 소모아이템 + DWORD dwFX; // 마법효과 } TABLE_UPC_SKILL_TYPE_7; typedef struct __TABLE_UPC_SKILL_TYPE_8 { - DWORD dwID; // Ϸùȣ - DWORD dwTarget; // Ÿ - int iRadius; // ݰ - DWORD dwWarpType; // ̵Ÿ - float fRefillEXP; // ġȸ - DWORD dwZone1; // ѹ1 - DWORD dwZone2; // ѹ2 - DWORD dwZone3; // ѹ3 - DWORD dwZone4; // ѹ4 - DWORD dwZone5; // ѹ5 + DWORD dwID; // 일련번호 + DWORD dwTarget; // 타겟 + int iRadius; // 반경 + DWORD dwWarpType; // 순간이동타임 + float fRefillEXP; // 경험치회복 + DWORD dwZone1; // 존넘버1 + DWORD dwZone2; // 존넘버2 + DWORD dwZone3; // 존넘버3 + DWORD dwZone4; // 존넘버4 + DWORD dwZone5; // 존넘버5 } TABLE_UPC_SKILL_TYPE_8; typedef struct __TABLE_UPC_SKILL_TYPE_9 { - DWORD dwID; // Ϸùȣ - DWORD dwTarget; // Ÿ - int iSuccessRatio; // - int iValidDist; // ȿŸ - int iRadius; // ݰ - float fCastTime; // ijŸ - float fRecastTime; // ijŸ - int iDurationTime; // ӽð - DWORD dwExhaustItem; // Ҹ - DWORD dwAttr; // Ӽ - int iDamage; // + DWORD dwID; // 일련번호 + DWORD dwTarget; // 타겟 + int iSuccessRatio; // 성공률 + int iValidDist; // 유효거리 + int iRadius; // 반경 + float fCastTime; // 캐스팅타임 + float fRecastTime; // 리캐스팅타임 + int iDurationTime; // 지속시간 + DWORD dwExhaustItem; // 소모아이템 + DWORD dwAttr; // 속성 + int iDamage; // 대미지 } TABLE_UPC_SKILL_TYPE_9; typedef struct __TABLE_UPC_SKILL_TYPE_10 { - DWORD dwID; // Ϸùȣ - DWORD dwTarget; // Ÿ - int iSuccessRatio; // - int iValidDist; // ȿŸ - int iRadius; // ݰ - float fCastTime; // ijŸ - float fRecastTime; // ijŸ - DWORD dwExhaustItem; // Ҹ - DWORD dwRemoveAttr; // żӼ + DWORD dwID; // 일련번호 + DWORD dwTarget; // 타겟 + int iSuccessRatio; // 성공률 + int iValidDist; // 유효거리 + int iRadius; // 반경 + float fCastTime; // 캐스팅타임 + float fRecastTime; // 리캐스팅타임 + DWORD dwExhaustItem; // 소모아이템 + DWORD dwRemoveAttr; // 제거속성 } TABLE_UPC_SKILL_TYPE_10; -//̺... +//마법테이블... /////////////////////////////////////////////////////////////////////////////////////////////////////////// typedef struct __TABLE_QUEST_MENU { - DWORD dwID; // Ϸùȣ - std::string szMenu; // ޴ + DWORD dwID; // 일련번호 + std::string szMenu; // 선택 메뉴 } TABLE_QUEST_MENU; typedef struct __TABLE_QUEST_TALK { - DWORD dwID; // Ϸùȣ - std::string szTalk; // Ʈ + DWORD dwID; // 일련번호 + std::string szTalk; // 퀘스트 지문 } TABLE_QUEST_TALK; typedef struct __TABLE_HELP { @@ -1299,27 +1299,27 @@ typedef struct __TABLE_TEXTS { } TABLE_TEXTS; const int MAX_ITEM_SLOT_OPC = - 8; // - ٸ ÷̾(NPC ) 0 ~ 4 ü,ü,,, 5 6 7 ޼ -const int MAX_ITEM_INVENTORY = 28; // MAX (κ丮â) -const int MAX_ITEM_TRADE = 24; // ΰ ŷ.. + 8; // 착용 아이템 - 다른 플레이어(NPC 포함) 0 ~ 4 상체,하체,헬멧,팔,발 5 망토 6 오른손 7 왼손 +const int MAX_ITEM_INVENTORY = 28; // 소유 아템 MAX (인벤토리창) +const int MAX_ITEM_TRADE = 24; // 상인과 거래.. const int MAX_ITEM_TRADE_PAGE = 12; const int MAX_ITEM_WARE_PAGE = 8; -const int MAX_ITEM_PER_TRADE = 12; // ΰ ŷ.. +const int MAX_ITEM_PER_TRADE = 12; // 개인과 거래.. const int MAX_ITEM_BUNDLE_DROP_PIECE = 6; -const int MAX_ITEM_EX_RE_NPC = 4; // ȯ, â NPC .. +const int MAX_ITEM_EX_RE_NPC = 4; // 교환, 수리창 NPC 영역.. -const int MAX_SKILL_FROM_SERVER = 9; // Լ ޴ .. +const int MAX_SKILL_FROM_SERVER = 9; // 서버에게서 받는 정보 슬롯 갯수.. -const int MAX_SKILL_KIND_OF = 5; // Base Skill 1, ų 4.. -const int MAX_SKILL_IN_PAGE = 6; // .. -const int MAX_SKILL_PAGE_NUM = 3; // ų Ѱ ִ .. +const int MAX_SKILL_KIND_OF = 5; // Base Skill 1개, 전문 스킬 4개.. +const int MAX_SKILL_IN_PAGE = 6; // 한 페이지 내의 아이콘 갯수.. +const int MAX_SKILL_PAGE_NUM = 3; // 스킬 한개가 가지는 최대 페이지수.. -const int MAX_SKILL_HOTKEY_PAGE = 8; // Hot Key .. -const int MAX_SKILL_IN_HOTKEY = 8; // Hot Key .. +const int MAX_SKILL_HOTKEY_PAGE = 8; // Hot Key의 총 페이지 수.. +const int MAX_SKILL_IN_HOTKEY = 8; // Hot Key의 현 페이지내의 갯수.. -const int MAX_AVAILABLE_CHARACTER = 3; // Ҽ ִ ִ ij .. +const int MAX_AVAILABLE_CHARACTER = 3; // 한 서버당 선택할수 있는 최대 캐릭터 수.. -// ο.... By ecli666 +// 싸운도.... By ecli666 const int ID_SOUND_ITEM_ETC_IN_INVENTORY = 2000; const int ID_SOUND_ITEM_IN_REPAIR = 2001; const int ID_SOUND_ITEM_WEAPON_IN_INVENTORY = 2002; @@ -1339,64 +1339,64 @@ const float STUN_TIME = 3.0f; enum e_Behavior { BEHAVIOR_NOTHING = 0, - BEHAVIOR_EXIT, // α׷ .. - BEHAVIOR_RESTART_GAME, // ٽ ϱ(ij ) - BEHAVIOR_REGENERATION, // Ȱ - BEHAVIOR_CANCEL, // .. ŷ û Ҹ .. + BEHAVIOR_EXIT, // 프로그램 끝내기.. + BEHAVIOR_RESTART_GAME, // 게임 다시 시작하기(캐릭터 선택) + BEHAVIOR_REGENERATION, // 부활 + BEHAVIOR_CANCEL, // 취소.. 현재는 아이템 거래 신청시 유저가 취소를 눌렀을때.. - BEHAVIOR_PARTY_PERMIT, // Ƽ û ° . - BEHAVIOR_PARTY_DISBAND, // Ƽ Ż.. - BEHAVIOR_FORCE_PERMIT, // δ밡 û ° . - BEHAVIOR_FORCE_DISBAND, // δ Ż.. + BEHAVIOR_PARTY_PERMIT, // 상대방이 파티가입 요청시 들어가는것을 허락. + BEHAVIOR_PARTY_DISBAND, // 파티 탈퇴.. + BEHAVIOR_FORCE_PERMIT, // 상대방이 부대가입 요청시 들어가는것을 허락. + BEHAVIOR_FORCE_DISBAND, // 부대 탈퇴.. - BEHAVIOR_REQUEST_BINDPOINT, // ε Ʈ ... + BEHAVIOR_REQUEST_BINDPOINT, // 바인딩 포인트로 ... BEHAVIOR_DELETE_CHR, BEHAVIOR_KNIGHTS_CREATE, - BEHAVIOR_KNIGHTS_DESTROY, // ü.. - BEHAVIOR_KNIGHTS_WITHDRAW, // ü.. + BEHAVIOR_KNIGHTS_DESTROY, // 기사단 해체.. + BEHAVIOR_KNIGHTS_WITHDRAW, // 기사단 해체.. - BEHAVIOR_PERSONAL_TRADE_FMT_WAIT, // ΰŷ.. û .. - BEHAVIOR_PERSONAL_TRADE_PERMIT, // ΰŷ.. û .. + BEHAVIOR_PERSONAL_TRADE_FMT_WAIT, // 개인거래.. 내가 신청한 경우.. + BEHAVIOR_PERSONAL_TRADE_PERMIT, // 개인거래.. 내가 신청받은 경우.. BEHAVIOR_MGAME_LOGIN, BEHAVIOR_CLAN_JOIN, - BEHAVIOR_PARTY_BBS_REGISTER, // Ƽ Խǿ - BEHAVIOR_PARTY_BBS_REGISTER_CANCEL, // Ƽ Խǿ + BEHAVIOR_PARTY_BBS_REGISTER, // 파티 게시판에 등록 + BEHAVIOR_PARTY_BBS_REGISTER_CANCEL, // 파티 게시판에 등록 해제 - BEHAVIOR_EXECUTE_OPTION, // ϰ ɼ .. + BEHAVIOR_EXECUTE_OPTION, // 게임 종료하고 옵션 실행.. BEHAVIOR_UNKNOWN = 0xffffffff }; enum e_SkillMagicTaget { - SKILLMAGIC_TARGET_SELF = 1, // ڽ.. - SKILLMAGIC_TARGET_FRIEND_WITHME = 2, // 츮() ϳ .. - SKILLMAGIC_TARGET_FRIEND_ONLY = 3, // 츮 ϳ - SKILLMAGIC_TARGET_PARTY = 4, // 츮Ƽ ϳ.. - SKILLMAGIC_TARGET_NPC_ONLY = 5, // NPC ϳ. - SKILLMAGIC_TARGET_PARTY_ALL = 6, // ȣ 츮Ƽ .. - SKILLMAGIC_TARGET_ENEMY_ONLY = 7, // ϳ(NPC) - SKILLMAGIC_TARGET_ALL = 8, // ׻ ϴ ϳ. - - SKILLMAGIC_TARGET_AREA_ENEMY = 10, // ִ ... - SKILLMAGIC_TARGET_AREA_FRIEND = 11, // ִ . - SKILLMAGIC_TARGET_AREA_ALL = 12, // ִ ε. - SKILLMAGIC_TARGET_AREA = 13, // ߽ - SKILLMAGIC_TARGET_DEAD_FRIEND_ONLY = 25, // 츮 ϳ. + SKILLMAGIC_TARGET_SELF = 1, // 나 자신.. + SKILLMAGIC_TARGET_FRIEND_WITHME = 2, // 나를 포함한 우리편(국가) 중 하나 .. + SKILLMAGIC_TARGET_FRIEND_ONLY = 3, // 나를 뺀 우리편 중 하나 + SKILLMAGIC_TARGET_PARTY = 4, // 나를 포함한 우리파티 중 하나.. + SKILLMAGIC_TARGET_NPC_ONLY = 5, // NPC중 하나. + SKILLMAGIC_TARGET_PARTY_ALL = 6, // 나를 호함한 우리파티 모두.. + SKILLMAGIC_TARGET_ENEMY_ONLY = 7, // 울편을 제외한 모든 적중 하나(NPC포함) + SKILLMAGIC_TARGET_ALL = 8, // 겜상에 존재하는 모든 것중 하나. + + SKILLMAGIC_TARGET_AREA_ENEMY = 10, // 그 지역에 있는 적들... + SKILLMAGIC_TARGET_AREA_FRIEND = 11, // 그 지역에 있는 울편. + SKILLMAGIC_TARGET_AREA_ALL = 12, // 그 지역에 있는 모두들. + SKILLMAGIC_TARGET_AREA = 13, // 나를 중심으로 한 지역 + SKILLMAGIC_TARGET_DEAD_FRIEND_ONLY = 25, //죽은 사람중 나를 뺀 우리편 중 하나. SKILLMAGIC_TARGET_UNKNOWN = 0xffffffff }; //define fx... -typedef struct __TABLE_FX // FX ҽ ڵ... +typedef struct __TABLE_FX // FX 리소스 레코드... { - DWORD dwID; // ID + DWORD dwID; // 고유 ID std::string szName; // TODO: implement std::string szFN; // file name - DWORD dwSoundID; // ȿ Ƶ. + DWORD dwSoundID; // 효과에 쓰는 사운드 아디. } TABLE_FX; const int MAX_COMBO = 3; @@ -1430,18 +1430,18 @@ const int FXID_REGION_POISON = 10100; //define skillmagic_type4_bufftype enum e_SkillMagicType4 { - BUFFTYPE_MAXHP = 1, //MaxHPȭ.. - BUFFTYPE_AC = 2, //ACȭ.. - BUFFTYPE_RESIZE = 3, //ij ũ .. - BUFFTYPE_ATTACK = 4, //ݷ.. - BUFFTYPE_ATTACKSPEED = 5, //ݽǵ.. - BUFFTYPE_SPEED = 6, //̵ӵ.. - BUFFTYPE_ABILITY = 7, //ټ ɷ(str, sta, cha, dex int) - BUFFTYPE_RESIST = 8, //ټ ׷.. + BUFFTYPE_MAXHP = 1, //MaxHP변화.. + BUFFTYPE_AC = 2, //AC변화.. + BUFFTYPE_RESIZE = 3, //캐릭터 크기 조정.. + BUFFTYPE_ATTACK = 4, //공격력.. + BUFFTYPE_ATTACKSPEED = 5, //공격스피드.. + BUFFTYPE_SPEED = 6, //이동속도.. + BUFFTYPE_ABILITY = 7, //다섯가지 능력(str, sta, cha, dex int) + BUFFTYPE_RESIST = 8, //다섯가지 저항력.. BUFFTYPE_HITRATE_AVOIDRATE = 9, //hitrate n avoidrate - BUFFTYPE_TRANS = 10, //, .. - BUFFTYPE_SLEEP = 11, //.. - BUFFTYPE_EYE = 12 //÷°... + BUFFTYPE_TRANS = 10, //변신, 투명.. + BUFFTYPE_SLEEP = 11, //잠재우기.. + BUFFTYPE_EYE = 12 //시력관련... }; enum e_SkillMagicType3 { @@ -1450,11 +1450,11 @@ enum e_SkillMagicType3 { }; enum e_SkillMagicFailMsg { - SKILLMAGIC_FAIL_CASTING = -100, //ij .. - SKILLMAGIC_FAIL_KILLFLYING = -101, //Flyingü ׿.. - SKILLMAGIC_FAIL_ENDCOMBO = -102, //combo . - SKILLMAGIC_FAIL_NOEFFECT = -103, //Effecting ... - SKILLMAGIC_FAIL_ATTACKZERO = -104, //Ÿġ 0...(mp Ҹϰ Ÿݽ..) + SKILLMAGIC_FAIL_CASTING = -100, //캐스팅 실패.. + SKILLMAGIC_FAIL_KILLFLYING = -101, //Flying객체 죽여.. + SKILLMAGIC_FAIL_ENDCOMBO = -102, //combo 동작 끝났다. + SKILLMAGIC_FAIL_NOEFFECT = -103, //Effecting 무산... + SKILLMAGIC_FAIL_ATTACKZERO = -104, //타격치 0...(mp는 소모하고 타격실패..) SKILLMAGIC_FAIL_UNKNOWN = 0xffffffff }; @@ -1472,7 +1472,7 @@ enum e_ObjectType { //definitions related clan.... const int CLAN_LEVEL_LIMIT = 20; const int CLAN_COST = 500000; -const DWORD KNIGHTS_FONT_COLOR = 0xffff0000; // (Ŭ)̸ Ʈ ÷.. +const DWORD KNIGHTS_FONT_COLOR = 0xffff0000; // 기사단(클랜)이름 폰트 컬러.. enum e_Cursor { CURSOR_ATTACK, diff --git a/src/game/GameEng.cpp b/src/game/GameEng.cpp index 54a62b54..0a728c69 100644 --- a/src/game/GameEng.cpp +++ b/src/game/GameEng.cpp @@ -18,7 +18,7 @@ const float LIGHTNING_DURATION = 2.0f; CGameEng::CGameEng() { m_pActiveCam = NULL; - // α׷ .. + // 프로그램이 실행된 경로.. char szBuf[_MAX_PATH]; char szDrive[_MAX_DRIVE], szDir[_MAX_DIR]; ::GetModuleFileName(NULL, szBuf, _MAX_PATH); @@ -26,7 +26,7 @@ CGameEng::CGameEng() { _makepath(szBuf, szDrive, szDir, NULL, NULL); /////////////////////////////////////////////////////////////// - // ⺻ ī޶ .. + // 기본 카메라 세팅.. CN3Camera * pCamera = new CN3Camera(); pCamera->m_bFogUse = TRUE; pCamera->m_Data.fFOV = D3DXToRadian(70); @@ -38,51 +38,51 @@ CGameEng::CGameEng() { m_vEyeToReach = pCamera->EyePos(); m_vAtToReach = pCamera->AtPos(); - // m_eViewPoint = VP_BACKWARD; // ⺻ 1.5Ī(÷̾ ڿ ٶ ) . - m_eViewPoint = VP_THIRD_PERSON; // ⺻ 3Ī . - m_fRotPitchFirstPerson = 0.0f; // Ī ϶ ī޶ ġ . - m_fRotPitchBackward = 0.0f; // Ī ϶ ī޶ ġ . - m_fRotPitchFoward = 0.0f; // տ ϶ ī޶ ġ . + // m_eViewPoint = VP_BACKWARD; // 기본은 1.5인칭(플레이어 뒤에서 바라본 모습)으로 시작. + m_eViewPoint = VP_THIRD_PERSON; // 기본은 3인칭으로 시작. + m_fRotPitchFirstPerson = 0.0f; // 일인칭 시점일때 카메라 피치 각도. + m_fRotPitchBackward = 0.0f; // 삼인칭 시점일때 카메라 피치 각도. + m_fRotPitchFoward = 0.0f; // 앞에서 본 시점일때 카메라 피치 각도. m_fRotPitchThirdFirson = D3DXToRadian(25.0f); - m_fOffsetVPGod = 7.0f; // ϶ ī޶ Ÿ.. - m_fRotYawVPGod = 0.0f; // ٶ 쿡 ī޶ ȸ.. - m_fZoomBackwardOrFoward = 1.0f; // 1.5Ī, տ ϶ ī޶ Zoom 1.0f ̴. - // ⺻ ī޶ .. + m_fOffsetVPGod = 7.0f; // 위에서 본시점일때 카메라 거리.. + m_fRotYawVPGod = 0.0f; // 위에서 바라본 시점일 경우에 카메라 회전각도.. + m_fZoomBackwardOrFoward = 1.0f; // 1.5인칭, 앞에서 본 시점일때 카메라 Zoom 1.0f 가 기준이다. + // 기본 카메라 세팅.. /////////////////////////////////////////////////////////////// - m_fLightningTimeRemain = 0.0f; // ĥ Ÿ̸.. + m_fLightningTimeRemain = 0.0f; // 번개 칠때 타이머.. /////////////////////////////////////////////////////////////// - // ⺻ Ʈ + // 기본 라이트 세팅 /* D3DCOLORVALUE crLgt; crLgt.a = 0.0f, crLgt.r = crLgt.g = crLgt.b = 0.8f; - CN3Light* pLightGlobal = new CN3Light(); // ü Ʈ.. + CN3Light* pLightGlobal = new CN3Light(); // 전체를 비출 라이트.. pLightGlobal->m_Data.InitDirection(0, __Vector3(0,-1,0), crLgt); this->LightAdd(pLightGlobal); crLgt.a = 0.0f, crLgt.r = crLgt.g = crLgt.b = 0.5f; - CN3Light* pLightGlobal2 = new CN3Light(); // ݴ ü Ʈ.. + CN3Light* pLightGlobal2 = new CN3Light(); // 반대 편에서 전체를 비출 라이트.. pLightGlobal2->m_Data.InitDirection(1, __Vector3(0,1,0), crLgt); this->LightAdd(pLightGlobal2); crLgt.a = 0.0f, crLgt.r = crLgt.g = crLgt.b = 0.3f; - CN3Light* pLight = new CN3Light(); // ī޶ پ ٴѴ... + CN3Light* pLight = new CN3Light(); // 카메라와 붙어 다닌다... pLight->m_Data.InitPoint(2, __Vector3(0,0,0), crLgt, 32.0f); this->LightAdd(pLight); */ - // ⺻ Ʈ + // 기본 라이트 세팅 /////////////////////////////////////////////////////////////// m_pRefLightSun = NULL; m_pRefLightSupport = NULL; m_pRefLightCam = NULL; - m_fFPDeltaCur = 1.0f; // - m_fFPDeltaToReach = 1.0f; // ̰ ǥ ؼ Ѵ. + m_fFPDeltaCur = 1.0f; // 현재 + m_fFPDeltaToReach = 1.0f; // 이값을 목표로 해서 변한다. // m_fLightDeltaCur = 1.0f; - // m_fLightDeltaToReach = 1.0f; // ̰ ǥ ؼ Ѵ. + // m_fLightDeltaToReach = 1.0f; // 이값을 목표로 해서 변한다. } CGameEng::~CGameEng() { @@ -144,13 +144,13 @@ void CGameEng::SetDefaultLight(CN3Light * pSun, CN3Light * pSupport, CN3Light * // ////////////////////////////////////////////////////////////////////// -void CGameEng::Tick(const D3DCOLOR * crDiffuses, // Diffuse Ʈ .. 3 . - const D3DCOLOR * crAmbients, // Ambient Ʈ .. 3 . - const D3DCOLOR crFog, // Ȱ .. - const __Vector3 & vPosPlayer, // ÷̾ ġ - const __Quaternion & qtPlayer, // ȸ ʹϾ - float fHeightPlayer, // Ű μ ī޶ Ʈ ó.. - float fSunRadianZ) // Z .. +void CGameEng::Tick(const D3DCOLOR * crDiffuses, // Diffuse 라이트 색깔.. 3 개 쓴다. + const D3DCOLOR * crAmbients, // Ambient 라이트 색깔.. 3 개 쓴다. + const D3DCOLOR crFog, // 안개 색깔.. + const __Vector3 & vPosPlayer, // 플레이어 위치 + const __Quaternion & qtPlayer, // 회전 쿼터니언 + float fHeightPlayer, // 키를 인수로 넣으면 카메라와 라이트 처리.. + float fSunRadianZ) // 해의 Z 각도.. { if (NULL == m_pActiveCam) { return; @@ -162,7 +162,7 @@ void CGameEng::SetDefaultLight(CN3Light * pSun, CN3Light * pSupport, CN3Light * __Vector3 vAxis(0, 1, 0); qtRot.AxisAngle(vAxis, fYaw); - if (vAxis.y < 0) // ȸ ̸. + if (vAxis.y < 0) // 회전축이 음수이면. { vAxis.y *= -1.0f; fYaw *= -1.0f; @@ -208,24 +208,24 @@ void CGameEng::SetDefaultLight(CN3Light * pSun, CN3Light * pSupport, CN3Light * } //////////////////////////////////////////////////////////////////////////////////// - // ī޶ 浹 üũ... - if (VP_FIRST_PERSON == m_eViewPoint) // Ī 浹üũ Ѵ. + // 카메라 충돌 체크... + if (VP_FIRST_PERSON == m_eViewPoint) // 일인칭때는 충돌체크 안한다. { - m_pActiveCam->LookAt(m_vEyeToReach, m_vAtToReach, __Vector3(0, 1, 0)); // óٺ.. + m_pActiveCam->LookAt(m_vEyeToReach, m_vAtToReach, __Vector3(0, 1, 0)); // 처다본다.. } else { __Vector3 vEyeResult = m_vEyeToReach; float fNP = m_pActiveCam->m_Data.fNP; - CGameBase::ACT_WORLD->CheckCollisionCameraWithTerrain(vEyeResult, m_vAtToReach, fNP); // 浹üũ - CGameBase::ACT_WORLD->CheckCollisionCameraWithShape(vEyeResult, m_vAtToReach, fNP); // Ʈ 浹üũ.. - m_pActiveCam->LookAt(vEyeResult, m_vAtToReach, __Vector3(0, 1, 0)); // óٺ.. + CGameBase::ACT_WORLD->CheckCollisionCameraWithTerrain(vEyeResult, m_vAtToReach, fNP); // 지형과 충돌체크 + CGameBase::ACT_WORLD->CheckCollisionCameraWithShape(vEyeResult, m_vAtToReach, fNP); // 오브젝트와 충돌체크.. + m_pActiveCam->LookAt(vEyeResult, m_vAtToReach, __Vector3(0, 1, 0)); // 처다본다.. } - // ī޶ 浹 üũ... + // 카메라 충돌 체크... //////////////////////////////////////////////////////////////////////////////////// - // ÷ .. - // ApplyCameraAndLight Ȱ Ѵ. + // 파 플레인 값을 조정.. + // ApplyCameraAndLight 에서 실제로 안개등의 값을 조절한다. if (m_fFPDeltaCur != m_fFPDeltaToReach) { - float fFPChange = (m_fFPDeltaToReach - m_fFPDeltaCur) * s_fSecPerFrm / 5.0f; // 5ʵ ϰ Ѵ. + float fFPChange = (m_fFPDeltaToReach - m_fFPDeltaCur) * s_fSecPerFrm / 5.0f; // 5초동안 변하게 한다. m_fFPDeltaCur += fFPChange; if (fFPChange < 0 && m_fFPDeltaCur < m_fFPDeltaToReach) { @@ -238,11 +238,11 @@ void CGameEng::SetDefaultLight(CN3Light * pSun, CN3Light * pSupport, CN3Light * float fFPToRestore = m_pActiveCam->m_Data.fFP; m_pActiveCam->m_Data.fFP = s_Options.iViewDist * m_fFPDeltaCur; - m_pActiveCam->m_FogColor = crFog; // Ȱ .. - m_pActiveCam->Tick(); // ü .. + m_pActiveCam->m_FogColor = crFog; // 안개색을 맞춘다.. + m_pActiveCam->Tick(); // 적용및 사면체등등의 값들을 계산.. __Matrix44 mtxRotSun; - mtxRotSun.RotationZ(fSunRadianZ); // .. + mtxRotSun.RotationZ(fSunRadianZ); // 해의 각도에 맞춘다.. /* it_Light itLgt = m_Lights.begin(); @@ -252,33 +252,33 @@ void CGameEng::SetDefaultLight(CN3Light * pSun, CN3Light * pSupport, CN3Light * CN3Light* pLight = *itLgt; __ASSERT(pLight, "Light pointer is NULL!!!"); - if(0 == pLight->m_Data.nNumber) // ⺻ 𷺼ų Ʈ + if(0 == pLight->m_Data.nNumber) // 기본 디렉셔널 라이트 { - // View Matrix .. + // View Matrix 각도와 방향을 맞춘다.. // __Vector3 vDir(0.0f,-1.5f,1.0f); // vDir.Normalize(); // __Matrix44 mtxVI = s_CameraData.mtxViewInverse; // mtxVI.PosSet(0,0,0); // pLight->m_Data.Direction = vDir * mtxVI; - // ؿ .. + // 해와 방향을 맞춘다.. __Matrix44 mtxRot; mtxRot.RotationZ(fSunRadianZ); __Vector3 vDir(-1,0,1); vDir *= mtxRot; vDir.Normalize(); pLight->m_Data.Direction = vDir; - // Ʈ ÷ .. + // 라이트 컬러 적용.. pLight->m_Data.Diffuse = ::_D3DCOLOR_To_D3DCOLORVALUE(crDiffuses[0]); pLight->m_Data.Ambient = ::_D3DCOLOR_To_D3DCOLORVALUE(crAmbients[0]); } else if(1 == pLight->m_Data.nNumber) { - __Vector3 vDir(2,-3, 2); // Ʒ ... + __Vector3 vDir(2,-3, 2); // 위에서 아래로 ... vDir.Normalize(); pLight->m_Data.Direction = vDir; - // Ʈ ÷ .. + // 라이트 컬러 적용.. pLight->m_Data.Diffuse = ::_D3DCOLOR_To_D3DCOLORVALUE(crDiffuses[1]); pLight->m_Data.Ambient = ::_D3DCOLOR_To_D3DCOLORVALUE(crAmbients[1]); } @@ -286,15 +286,15 @@ void CGameEng::SetDefaultLight(CN3Light * pSun, CN3Light * pSupport, CN3Light * { __Vector3 vPos = s_CameraData.vEye; vPos.y += 16.0f; - pLight->PosSet(vPos); // ī޶ Ѵ.. + pLight->PosSet(vPos); // 카메라 위에 가게 한다.. - // Ʈ ÷ .. + // 라이트 컬러 적용.. pLight->m_Data.Diffuse = ::_D3DCOLOR_To_D3DCOLORVALUE(crDiffuses[2]); pLight->m_Data.Ambient = ::_D3DCOLOR_To_D3DCOLORVALUE(crAmbients[2]); } - // ó.. + // 번개 처리.. if(m_fLightningTimeRemain > 0) { float fLightningDelta = 0; @@ -316,7 +316,7 @@ void CGameEng::SetDefaultLight(CN3Light * pSun, CN3Light * pSupport, CN3Light * } */ if (m_pRefLightSun) { - // ؿ .. + // 해와 방향을 맞춘다.. __Matrix44 mtxRot; mtxRot.RotationZ(fSunRadianZ); __Vector3 vDir(-1, 0, 1); @@ -324,11 +324,11 @@ void CGameEng::SetDefaultLight(CN3Light * pSun, CN3Light * pSupport, CN3Light * vDir.Normalize(); m_pRefLightSun->m_Data.Direction = vDir; - // Ʈ ÷ .. + // 라이트 컬러 적용.. m_pRefLightSun->m_Data.Diffuse = ::_D3DCOLOR_To_D3DCOLORVALUE(crDiffuses[0]); m_pRefLightSun->m_Data.Ambient = ::_D3DCOLOR_To_D3DCOLORVALUE(crAmbients[0]); - // ó.. + // 번개 처리.. if (m_fLightningTimeRemain > 0) { float fLightningDelta = 0; @@ -349,15 +349,15 @@ void CGameEng::SetDefaultLight(CN3Light * pSun, CN3Light * pSupport, CN3Light * } } if (m_pRefLightSupport) { - __Vector3 vDir(2, -3, 2); // Ʒ ... + __Vector3 vDir(2, -3, 2); // 위에서 아래로 ... vDir.Normalize(); m_pRefLightSupport->m_Data.Direction = vDir; - // Ʈ ÷ .. + // 라이트 컬러 적용.. m_pRefLightSupport->m_Data.Diffuse = ::_D3DCOLOR_To_D3DCOLORVALUE(crDiffuses[1]); m_pRefLightSupport->m_Data.Ambient = ::_D3DCOLOR_To_D3DCOLORVALUE(crAmbients[1]); - // ó.. + // 번개 처리.. if (m_fLightningTimeRemain > 0) { float fLightningDelta = 0; @@ -382,13 +382,13 @@ void CGameEng::SetDefaultLight(CN3Light * pSun, CN3Light * pSupport, CN3Light * if (m_pRefLightCam) { __Vector3 vPos = s_CameraData.vEye; vPos.y += 16.0f; - m_pRefLightCam->PosSet(vPos); // ī޶ Ѵ.. + m_pRefLightCam->PosSet(vPos); // 카메라 위에 가게 한다.. - // Ʈ ÷ .. + // 라이트 컬러 적용.. m_pRefLightCam->m_Data.Diffuse = ::_D3DCOLOR_To_D3DCOLORVALUE(crDiffuses[2]); m_pRefLightCam->m_Data.Ambient = ::_D3DCOLOR_To_D3DCOLORVALUE(crAmbients[2]); - // ó.. + // 번개 처리.. if (m_fLightningTimeRemain > 0) { float fLightningDelta = 0; @@ -412,7 +412,7 @@ void CGameEng::SetDefaultLight(CN3Light * pSun, CN3Light * pSupport, CN3Light * void CGameEng::ApplyCameraAndLight() { if (m_pActiveCam) { - m_pActiveCam->Apply(); // ſ ϳ ... + m_pActiveCam->Apply(); // 위의 거 대신에 하나만 쓴다... } /* for(it_Light it = m_Lights.begin(), itEnd = m_Lights.end(); it != itEnd; it++) @@ -438,9 +438,9 @@ void CGameEng::ViewPointChange(e_ViewPoint eVP) { if (iVP > (VP_THIRD_PERSON)) { iVP = VP_BACKWARD; } - m_eViewPoint = (e_ViewPoint)iVP; // .. + m_eViewPoint = (e_ViewPoint)iVP; // 시점 증가.. } else { - m_eViewPoint = eVP; // .. + m_eViewPoint = eVP; // 시점 증가.. } } @@ -453,42 +453,42 @@ void CGameEng::CameraPitchAdd(float fRotXPerSec) { if (VP_BACKWARD == m_eViewPoint) { m_fRotPitchBackward += fRotXPerSec * s_fSecPerFrm; if (m_fRotPitchBackward > fPitchMax) { - m_fRotPitchBackward = fPitchMax; // Ʒ ° + m_fRotPitchBackward = fPitchMax; // 아래 보는값 } else if (m_fRotPitchBackward < fPitchMin) { - m_fRotPitchBackward = fPitchMin; // .. + m_fRotPitchBackward = fPitchMin; // 위보는 값.. } } else if (VP_FIRST_PERSON == m_eViewPoint) { m_fRotPitchFirstPerson += fRotXPerSec * s_fSecPerFrm; if (m_fRotPitchFirstPerson > fPitchMax) { - m_fRotPitchFirstPerson = fPitchMax; // Ʒ ° + m_fRotPitchFirstPerson = fPitchMax; // 아래 보는값 } else if (m_fRotPitchFirstPerson < fPitchMin) { - m_fRotPitchFirstPerson = fPitchMin; // .. + m_fRotPitchFirstPerson = fPitchMin; // 위보는 값.. } } else if (VP_FOWARD == m_eViewPoint) { m_fRotPitchFoward += fRotXPerSec * s_fSecPerFrm; if (m_fRotPitchFoward > fPitchMax) { - m_fRotPitchFoward = fPitchMax; // Ʒ ° + m_fRotPitchFoward = fPitchMax; // 아래 보는값 } else if (m_fRotPitchFoward < fPitchMin) { - m_fRotPitchFoward = fPitchMin; // .. + m_fRotPitchFoward = fPitchMin; // 위보는 값.. } - } else if (VP_THIRD_PERSON == m_eViewPoint) // Ÿ ÿ ٿ Ѵ.. + } else if (VP_THIRD_PERSON == m_eViewPoint) // 위에서 보는 건 거리만 늘였다 줄였다 한다.. { - fPitchMin = D3DXToRadian(10.0f); // ؿ Ѱ + fPitchMin = D3DXToRadian(10.0f); // 젤 밑에값 한계 m_fRotPitchThirdFirson += fRotXPerSec * s_fSecPerFrm; if (m_fRotPitchThirdFirson > fPitchMax) { - m_fRotPitchThirdFirson = fPitchMax; // Ʒ ° + m_fRotPitchThirdFirson = fPitchMax; // 아래 보는값 } else if (m_fRotPitchThirdFirson < fPitchMin) { - m_fRotPitchThirdFirson = fPitchMin; // .. + m_fRotPitchThirdFirson = fPitchMin; // 위보는 값.. } } } void CGameEng::CameraYawAdd(float fRotYPerSec) { - if (VP_THIRD_PERSON == m_eViewPoint) // .. + if (VP_THIRD_PERSON == m_eViewPoint) // 위에서 보는 건 .. { - m_fRotYawVPGod += fRotYPerSec * s_fSecPerFrm; // ٶ 쿡 ī޶ ȸ.. - return; // ư! + m_fRotYawVPGod += fRotYPerSec * s_fSecPerFrm; // 위에서 바라본 시점일 경우에 카메라 회전각도.. + return; // 돌아간다! } } @@ -497,21 +497,21 @@ void CGameEng::CameraZoom(float fDelta) { return; } if (VP_BACKWARD == m_eViewPoint || VP_FOWARD == m_eViewPoint) { - m_fZoomBackwardOrFoward -= fDelta * s_fSecPerFrm; // 1.5Ī, տ ϶ ī޶ Zoom 1.0f ̴. + m_fZoomBackwardOrFoward -= fDelta * s_fSecPerFrm; // 1.5인칭, 앞에서 본 시점일때 카메라 Zoom 1.0f 가 기준이다. if (m_fZoomBackwardOrFoward < 0.4f) { - m_fZoomBackwardOrFoward = 0.4f; // Ʒ ° + m_fZoomBackwardOrFoward = 0.4f; // 아래 보는값 } else if (m_fZoomBackwardOrFoward >= 1.6f) { m_fZoomBackwardOrFoward = 1.6f; } - } else if (VP_THIRD_PERSON == m_eViewPoint) // Ÿ ÿ ٿ Ѵ.. + } else if (VP_THIRD_PERSON == m_eViewPoint) // 위에서 보는 건 거리만 늘였다 줄였다 한다.. { m_fOffsetVPGod -= 4.0f * fDelta * s_fSecPerFrm; if (m_fOffsetVPGod < 2.0f) { - m_fOffsetVPGod = 2.0f; // ʹ۾ ߰.. + m_fOffsetVPGod = 2.0f; // 너무작아지면 멈추고.. } else if (m_fOffsetVPGod > 10.0f) { - m_fOffsetVPGod = 10.0f; // ʹ Ŀ ߰.. + m_fOffsetVPGod = 10.0f; // 너무 커져도 멈추고.. } - return; // ư! + return; // 돌아간다! } } @@ -539,5 +539,5 @@ void CGameEng::FarPlaneDeltaSet(float fFPDelta, bool bUpdateImmediately) { //} void CGameEng::Lightning() { - m_fLightningTimeRemain = LIGHTNING_DURATION; // ĥ Ÿ̸.. + m_fLightningTimeRemain = LIGHTNING_DURATION; // 번개 칠때 타이머.. } diff --git a/src/game/GameEng.h b/src/game/GameEng.h index cbb7fb71..be9da3a6 100644 --- a/src/game/GameEng.h +++ b/src/game/GameEng.h @@ -10,14 +10,14 @@ typedef typename std::list::iterator it_Light; typedef std::list::iterator it_Camera; -// ī޶ +// 카메라 시점 enum e_ViewPoint { - VP_BACKWARD = 0, // ÷̾ ڿ ٶ 1.5Ī - VP_FIRST_PERSON = 1, // Ī - VP_FOWARD = 2, // ÷̾ տ ٶ.. - VP_THIRD_PERSON = 3, // Ī .. 콺 .. + VP_BACKWARD = 0, // 플레이어 등 뒤에서 바라본 모습 1.5인칭 + VP_FIRST_PERSON = 1, // 일인칭 + VP_FOWARD = 2, // 플레이어 앞에서 바라봄.. + VP_THIRD_PERSON = 3, // 삼인칭 모드 .. 마우스도 동작함.. VP_UNKNOWN = 0xffffffff -}; // ī޶ .... +}; // 개발을 위해 카메라만 빠르게.... const float CAMERA_MOVE_SPEED = 5.0f; @@ -34,37 +34,37 @@ class CGameEng : public CN3Eng { __Vector3 m_vEyeToReach; __Vector3 m_vAtToReach; - float m_fFPDeltaCur; // - float m_fFPDeltaToReach; // ̰ ǥ ؼ Ѵ. + float m_fFPDeltaCur; // 현재 + float m_fFPDeltaToReach; // 이값을 목표로 해서 변한다. - float m_fRotPitchBackward; // 1.5Ī ϶ ī޶ ġ . - float m_fRotPitchFirstPerson; // Ī ϶ ī޶ ġ . - float m_fRotPitchFoward; // տ ϶ ī޶ ġ . - float m_fRotPitchThirdFirson; // Ī ī޶ ġ + float m_fRotPitchBackward; // 1.5인칭 시점일때 카메라 피치 각도. + float m_fRotPitchFirstPerson; // 일인칭 시점일때 카메라 피치 각도. + float m_fRotPitchFoward; // 앞에서 본 시점일때 카메라 피치 각도. + float m_fRotPitchThirdFirson; // 삼인칭 시점 카메라 피치 각도 - float m_fOffsetVPGod; // ٶ 쿡 Ÿ.. - float m_fRotYawVPGod; // ٶ 쿡 ī޶ ȸ.. + float m_fOffsetVPGod; // 위에서 바라본 시점일 경우에 거리.. + float m_fRotYawVPGod; // 위에서 바라본 시점일 경우에 카메라 회전각도.. - float m_fZoomBackwardOrFoward; // 1.5Ī, տ ϶ ī޶ Zoom 1.0f ̴. - float m_fLightningTimeRemain; // ĥ Ÿ̸.. + float m_fZoomBackwardOrFoward; // 1.5인칭, 앞에서 본 시점일때 카메라 Zoom 1.0f 가 기준이다. + float m_fLightningTimeRemain; // 번개 칠때 타이머.. - e_ViewPoint m_eViewPoint; // ī޶ . + e_ViewPoint m_eViewPoint; // 카메라 시점. public: void SetDefaultLight(CN3Light * pSun, CN3Light * pSupport, CN3Light * pCam); void RestoreLighting(); void BackupReleaseLighting(); - void Lightning(); // ġ Ʈ ϱ. + void Lightning(); // 번개 치며 라이트 조절하기. float FarPlaneDeltaCur() { return m_fFPDeltaCur; } float FarPlaneDeltaToReach() { return m_fFPDeltaToReach; } void FarPlaneDeltaSet(float fFPDelta, bool bUpdateImmediately); - // Light Լ + // Light 함수들 //void LightAdd(CN3Light* pLight) { m_Lights.push_back(pLight); } //int LightCount() { return m_Lights.size(); } //CN3Light* Light(int index); - // Camera Լ + // Camera 함수들 void CameraAdd(CN3Camera * pCamera) { m_Cameras.push_back(pCamera); } int CameraCount() { return m_Cameras.size(); } CN3Camera * Camera(int index); @@ -76,22 +76,22 @@ class CGameEng : public CN3Eng { } CN3Camera * CameraGetActive() { return m_pActiveCam; } - // ߰Ѱ.. + // 추가한것.. void ViewPointChange(e_ViewPoint eVP = VP_UNKNOWN); - e_ViewPoint ViewPoint() { return m_eViewPoint; } // .. + e_ViewPoint ViewPoint() { return m_eViewPoint; } // 시점.. void CameraPitchAdd(float fRotXPerSec); void CameraYawAdd(float fRotYPerSec); void CameraZoom(float fDelta); - float CameraYaw() { return m_fRotYawVPGod; } // ٶ 쿡 ī޶ ȸ.. + float CameraYaw() { return m_fRotYawVPGod; } // 위에서 바라본 시점일 경우에 카메라 회전각도.. void SetActiveCamera(CN3Camera * pCamera) { m_pActiveCam = pCamera; } - void Tick(const D3DCOLOR * crDiffuses, // Diffuse Ʈ .. - const D3DCOLOR * crAmbients, // Ambient Ʈ .. - const D3DCOLOR crFog, // Ȱ .. - const __Vector3 & vPosPlayer, // ÷̾ ġ - const __Quaternion & qtPlayer, // ȸ ʹϾ - float fHeightPlayer, // Ű μ ī޶ Ʈ ó.. - float fSunRadianZ); // Z .. - void ApplyCameraAndLight(); // ī޶ Ʈ õ . Ʈ ٸ Ѵ. + void Tick(const D3DCOLOR * crDiffuses, // Diffuse 라이트 색깔.. + const D3DCOLOR * crAmbients, // Ambient 라이트 색깔.. + const D3DCOLOR crFog, // 안개 색깔.. + const __Vector3 & vPosPlayer, // 플레이어 위치 + const __Quaternion & qtPlayer, // 회전 쿼터니언 + float fHeightPlayer, // 키를 인수로 넣으면 카메라와 라이트 처리.. + float fSunRadianZ); // 해의 Z 각도.. + void ApplyCameraAndLight(); // 카메라와 라이트에 세팅된 값 적용. 라이트는 해의 각도에 따라 다르게 한다. CGameEng(); virtual ~CGameEng(); diff --git a/src/game/GameProcCharacterCreate.cpp b/src/game/GameProcCharacterCreate.cpp index 113f9bea..31e28e26 100644 --- a/src/game/GameProcCharacterCreate.cpp +++ b/src/game/GameProcCharacterCreate.cpp @@ -67,19 +67,19 @@ void CGameProcCharacterCreate::Init() { } void CGameProcCharacterCreate::Render() { - s_pEng->Clear(0); // Ŭ.. - s_pEng->BeginScene(); // ... + s_pEng->Clear(0); // 클리어.. + s_pEng->BeginScene(); // 씬 렌더 ㅅ작... s_pUIMgr->Render(); - s_pPlayer->InventoryChrRender(m_rcChr); // ij ׸.. + s_pPlayer->InventoryChrRender(m_rcChr); // 캐릭터 그리기.. - s_pMsgBoxMgr->Render(); //MessageBox ׷ش. + s_pMsgBoxMgr->Render(); //MessageBox를 그려준다. if (s_pGameCursor) { s_pGameCursor->Render(); } - s_pEng->EndScene(); // ... + s_pEng->EndScene(); // 씬 렌더 시작... s_pEng->Present(CN3Base::s_hWndBase); } @@ -99,15 +99,15 @@ void CGameProcCharacterCreate::SetChr() { } __TABLE_PLAYER_LOOKS * pLooks = - s_pTbl_UPC_Looks->Find(s_pPlayer->m_InfoBase.eRace); // User Player Character Skin ü ..; + s_pTbl_UPC_Looks->Find(s_pPlayer->m_InfoBase.eRace); // User Player Character Skin 구조체 포인터..; if (NULL == pLooks) { return; } s_pPlayer->InitChr(pLooks); - s_pPlayer->m_ChrInv.ScaleSet(1, 1, 1); // . + s_pPlayer->m_ChrInv.ScaleSet(1, 1, 1); // 스케일을 원래대로 돌린다. - if (pLooks) // Ʈ .. + if (pLooks) // 파트 세팅.. { for (int i = 0; i < PART_POS_COUNT; i++) { if (i == PART_POS_FACE) { @@ -131,7 +131,7 @@ void CGameProcCharacterCreate::SetChr() { } void CGameProcCharacterCreate::Tick() { - // s_pLocalInput->Tick(); // Ű 콺κ Է ޴´. + // s_pLocalInput->Tick(); // 키보드와 마우스로부터 입력을 받는다. // if(dwMouseFlags & MOUSE_LBDOWN) SetCursor(s_hCursorClick); // else SetCursor(s_hCursorNormal); @@ -143,17 +143,17 @@ void CGameProcCharacterCreate::Tick() { s_pEng->s_SndMgr.Tick(); // Sound Engine... - // Network Msg óϱ + // Network Msg 처리하기 DataPack * pDataPack = NULL; - while (s_pSocket->PktQueueSize() > 0) // Ŷ Ʈ Ŷ ֳ???? + while (s_pSocket->PktQueueSize() > 0) // 패킷 리스트에 패킷이 있냐???? { int iOffset = 0; - pDataPack = s_pSocket->PktQueueFront(); // ť ù° .. + pDataPack = s_pSocket->PktQueueFront(); // 큐의 첫번째 것을 복사.. if (false == ProcessPacket(pDataPack, iOffset)) { - break; // Ŷ ó Ȳ ƴϴ. + break; // 패킷을 처리할 상황이 아니다. } delete pDataPack; - s_pSocket->PktQueuePop(); // Ŷ ť .. + s_pSocket->PktQueuePop(); // 패킷을 큐에서 꺼냄.. } s_pPlayer->InventoryChrTick(); @@ -169,7 +169,7 @@ bool CGameProcCharacterCreate::MsgSendCharacterCreate() { } else if (RACE_UNKNOWN == s_pPlayer->m_InfoBase.eRace) { eErrCode = ERROR_CHARACTER_CREATE_INVALID_RACE; } - // else if(RACE_KA_WRINKLETUAREK == s_pPlayer->m_InfoBase.eRace) // Ұ.. + // else if(RACE_KA_WRINKLETUAREK == s_pPlayer->m_InfoBase.eRace) // 마법사는 선택 불가능.. // { // eErrCode = ERROR_CHARACTER_CREATE_NOT_SUPPORTED_RACE; // } @@ -178,7 +178,7 @@ bool CGameProcCharacterCreate::MsgSendCharacterCreate() { } else if (m_pUICharacterCreate->m_iBonusPoint > 0) { eErrCode = ERROR_CHARACTER_CREATE_REMAIN_BONUS_POINT; } else { - // ̸ ĭ̳ Ưڰ ִ Ȯ + // 이름에 빈칸이나 특수문자가 들어 있는지 확인 bool bHasSpecialLetter = false; for (int i = 0; i < iIDLength; i++) { // CompadmreString(LOCALE_USER_DEFAULT, NORM_IGNOREWIDTH, id, strlen(id), pUser->m_UserId, strlen(pUser->m_UserId) ) == CSTR_EQUAL ) @@ -202,29 +202,29 @@ bool CGameProcCharacterCreate::MsgSendCharacterCreate() { BYTE byBuff[64]; int iOffset = 0; - CAPISocket::MP_AddByte(byBuff, iOffset, N3_NEW_CHARACTER); // Ŀ. - CAPISocket::MP_AddByte(byBuff, iOffset, CGameProcedure::s_iChrSelectIndex); // ij ε b - CAPISocket::MP_AddShort(byBuff, iOffset, iIDLength); // Id s - CAPISocket::MP_AddString(byBuff, iOffset, s_pPlayer->IDString()); // ID ڿ str - CAPISocket::MP_AddByte(byBuff, iOffset, s_pPlayer->m_InfoBase.eRace); // b - CAPISocket::MP_AddShort(byBuff, iOffset, s_pPlayer->m_InfoBase.eClass); // b - CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iFace); // 󱼸 b - CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iHair); // Ӹ b - CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iStrength); // b - CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iStamina); // b - CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iDexterity); // ø b - CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iIntelligence); // b - CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iMagicAttak); // b - - s_pSocket->Send(byBuff, iOffset); // - - s_pUIMgr->EnableOperationSet(false); // Ŷ ö UI Disable Ų... + CAPISocket::MP_AddByte(byBuff, iOffset, N3_NEW_CHARACTER); // 커멘드. + CAPISocket::MP_AddByte(byBuff, iOffset, CGameProcedure::s_iChrSelectIndex); // 캐릭터 인덱스 b + CAPISocket::MP_AddShort(byBuff, iOffset, iIDLength); // Id 길이 s + CAPISocket::MP_AddString(byBuff, iOffset, s_pPlayer->IDString()); // ID 문자열 str + CAPISocket::MP_AddByte(byBuff, iOffset, s_pPlayer->m_InfoBase.eRace); // 종족 b + CAPISocket::MP_AddShort(byBuff, iOffset, s_pPlayer->m_InfoBase.eClass); // 직업 b + CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iFace); // 얼굴모양 b + CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iHair); // 머리모양 b + CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iStrength); // 힘 b + CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iStamina); // 지구력 b + CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iDexterity); // 민첩 b + CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iIntelligence); // 지능 b + CAPISocket::MP_AddByte(byBuff, iOffset, pInfoExt->iMagicAttak); // 마력 b + + s_pSocket->Send(byBuff, iOffset); // 보낸다 + + s_pUIMgr->EnableOperationSet(false); // 패킷이 들어올때까지 UI 를 Disable 시킨다... return true; } } - ReportErrorCharacterCreate(eErrCode); // ... + ReportErrorCharacterCreate(eErrCode); // 에러 보고... return false; } @@ -259,7 +259,7 @@ void CGameProcCharacterCreate::ReportErrorCharacterCreate(e_ErrorCharacterCreate } /// - // ߸ Էؼ ߴٴ ޽ ... + // 정보를 잘못 입력해서 실패했다는 메시지를 받을 때... std::string szTitle; ::_LoadStringFromResource(IDS_ERR_CHARACTER_CREATE, szTitle); MessageBoxPost(szErr, szTitle, MB_OK); @@ -273,20 +273,20 @@ bool CGameProcCharacterCreate::ProcessPacket(DataPack * pDataPack, int & iOffset return true; } - int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ŀ Ľ.. - switch (iCmd) // Ŀ忡 ٶ б.. + int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 커멘드 파싱.. + switch (iCmd) // 커멘드에 다라서 분기.. { - case N3_NEW_CHARACTER: // ij ޽.. + case N3_NEW_CHARACTER: // 캐릭터 선택 메시지.. { - BYTE bySuccess = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ŀ Ľ.. + BYTE bySuccess = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 커멘드 파싱.. if (0 == bySuccess) { - ProcActiveSet((CGameProcedure *)s_pProcCharacterSelect); // ij â .. - } else // ϸ.. 0 ƴ ´.. + ProcActiveSet((CGameProcedure *)s_pProcCharacterSelect); // 캐릭터 선택창으로 가기.. + } else // 실패하면.. 이유가 0 이 아닌 값으로 온다.. { - this->ReportErrorCharacterCreate((e_ErrorCharacterCreate)bySuccess); // ޽ .. - s_pUIMgr->EnableOperationSet(false); // UI ϰ Ѵ... ٽ ij Ѵ.. + this->ReportErrorCharacterCreate((e_ErrorCharacterCreate)bySuccess); // 에러 메시지 띄움.. + s_pUIMgr->EnableOperationSet(false); // UI 조작 가능하게 한다... 다시 캐릭터 만들어야 한다.. } - s_pUIMgr->EnableOperationSet(false); // Ŷ ö UI Disable Ų... + s_pUIMgr->EnableOperationSet(false); // 패킷이 들어올때까지 UI 를 Disable 시킨다... } return true; } diff --git a/src/game/GameProcCharacterCreate.h b/src/game/GameProcCharacterCreate.h index 33be1ad9..ee6a7e62 100644 --- a/src/game/GameProcCharacterCreate.h +++ b/src/game/GameProcCharacterCreate.h @@ -32,13 +32,13 @@ enum e_ErrorCharacterCreate { }; typedef struct __TABLE_NEW_CHR { - DWORD dwID; // NPC ID - std::string szName; // ̸.. + DWORD dwID; // NPC 고유 ID + std::string szName; // 종족이름.. int iStr; int iSta; int iDex; int iInt; - int iMAP; // ݷ Magic Attack Point + int iMAP; // 마법 공격력 Magic Attack Point int iBonus; } TABLE_NEW_CHR; @@ -48,7 +48,7 @@ class CGameProcCharacterCreate : public CGameProcedure { public: class CUICharacterCreate * m_pUICharacterCreate; RECT m_rcChr; - CN3TableBase<__TABLE_NEW_CHR> m_Tbl_InitValue; // ҽ ̺.. + CN3TableBase<__TABLE_NEW_CHR> m_Tbl_InitValue; // 사운드 소스 정보 테이블.. // int m_InitValue[TRIBE_NUM][CVAL_NUM]; diff --git a/src/game/GameProcCharacterSelect.cpp b/src/game/GameProcCharacterSelect.cpp index 95fbd44c..70cc160d 100644 --- a/src/game/GameProcCharacterSelect.cpp +++ b/src/game/GameProcCharacterSelect.cpp @@ -116,7 +116,7 @@ void CGameProcCharacterSelect::Init() { CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Rotate); m_pSnd_Rotate = CN3Base::s_SndMgr.CreateObj(ID_SOUND_CHR_SELECT_ROTATE); - s_pUIMgr->EnableOperationSet(false); // ij Ŷ ö UI Disable Ų... + s_pUIMgr->EnableOperationSet(false); // 기존의 캐릭터 정보 패킷이 들어올때까지 UI 를 Disable 시킨다... m_pCamera = new CN3Camera(); for (int i = 0; i < 8; i++) { @@ -139,7 +139,7 @@ void CGameProcCharacterSelect::Init() { m_pUICharacterSelect = new CUICharacterSelect(); m_pUICharacterSelect->Init(s_pUIMgr); m_pUICharacterSelect->LoadFromFile( - pTbl->szCharacterSelect); // UI Manager ʰ óѴ... ִ.. + pTbl->szCharacterSelect); // UI Manager 에 넣지 않고 따로 처리한다... 이유가 있다.. m_pUICharacterSelect->SetPos(0, 0); s_pUIMgr->SetFocusedUI((CN3UIBase *)m_pUICharacterSelect); @@ -157,13 +157,13 @@ void CGameProcCharacterSelect::Init() { m_vEyeBackup = m_vEye; - // .. + // 배경.. m_pActiveBg = new CN3Shape; memset(&m_lgt[0], 0, sizeof(D3DLIGHT9)); memset(&m_lgt[1], 0, sizeof(D3DLIGHT9)); memset(&m_lgt[2], 0, sizeof(D3DLIGHT9)); - // 0.. 1.. + // 0가운데.. 1왼쪽.. m_lgt[2].Type = m_lgt[1].Type = m_lgt[0].Type = D3DLIGHT_SPOT; m_lgt[2].Attenuation0 = m_lgt[1].Attenuation0 = m_lgt[0].Attenuation0 = 0.1f; m_lgt[2].Attenuation1 = m_lgt[1].Attenuation1 = m_lgt[0].Attenuation1 = 0.0f; @@ -184,20 +184,20 @@ void CGameProcCharacterSelect::Init() { m_pLights[1]->LoadFromFile("ChrSelect\\ka_light_1.n3light"); m_pLights[2]->LoadFromFile("ChrSelect\\ka_light_2.n3light"); - m_lgt[0].Position = m_vEye; // ī罺 - m_lgt[0].Position.y += 2.0f; // ī罺 + m_lgt[0].Position = m_vEye; // 카루스 + m_lgt[0].Position.y += 2.0f; // 카루스 vTemp.Set(0.0f, 0.0f, 3.5f); vTemp -= m_lgt[0].Position; m_lgt[0].Direction = vTemp; m_lgt[0].Phi = 0.6f; - m_lgt[1].Position = __Vector3(5.87f, 2.4f, 4.73f); // ī罺 + m_lgt[1].Position = __Vector3(5.87f, 2.4f, 4.73f); // 카루스 vTemp.Set(2.32f, 0.0f, 2.54f); vTemp -= m_lgt[1].Position; m_lgt[1].Direction = vTemp; m_lgt[1].Phi = 0.6f; - m_lgt[2].Position = __Vector3(-5.87f, 2.4f, 4.73f); // ī罺 + m_lgt[2].Position = __Vector3(-5.87f, 2.4f, 4.73f); // 카루스 vTemp.Set(-2.32f, 0.0f, 2.54f); vTemp -= m_lgt[2].Position; m_lgt[2].Direction = vTemp; @@ -212,20 +212,20 @@ void CGameProcCharacterSelect::Init() { m_pLights[1]->LoadFromFile("ChrSelect\\el_light_1.n3light"); m_pLights[2]->LoadFromFile("ChrSelect\\el_light_2.n3light"); - m_lgt[0].Position = m_vEye; // ī罺 - m_lgt[0].Position.y += 2.0f; // ī罺 + m_lgt[0].Position = m_vEye; // 카루스 + m_lgt[0].Position.y += 2.0f; // 카루스 vTemp.Set(0.0f, -0.1f, 3.0f); vTemp -= m_lgt[0].Position; m_lgt[0].Direction = vTemp; m_lgt[0].Phi = 0.45f; - m_lgt[1].Position = __Vector3(5.6f, 2.4f, 4.68f); // ī罺 + m_lgt[1].Position = __Vector3(5.6f, 2.4f, 4.68f); // 카루스 vTemp.Set(2.2f, -0.1f, 2.36f); vTemp -= m_lgt[1].Position; m_lgt[1].Direction = vTemp; m_lgt[1].Phi = 0.45f; - m_lgt[2].Position = __Vector3(-5.6f, 2.4f, 4.68f); // ī罺 + m_lgt[2].Position = __Vector3(-5.6f, 2.4f, 4.68f); // 카루스 vTemp.Set(-2.4f, -0.1f, 2.23f); vTemp -= m_lgt[2].Position; m_lgt[2].Direction = vTemp; @@ -241,7 +241,7 @@ void CGameProcCharacterSelect::Init() { } void CGameProcCharacterSelect::Tick() { - CGameProcedure::Tick(); // Ű, 콺 Է .. + CGameProcedure::Tick(); // 키, 마우스 입력 등등.. __Vector3 vDir = CN3Base::s_CameraData.vAt - CN3Base::s_CameraData.vEye; vDir.Normalize(); @@ -250,14 +250,14 @@ void CGameProcCharacterSelect::Tick() { CN3SndObj::SetListenerPos(&vEye); CN3SndObj::SetListenerOrientation(&vDir, &vUp); - // .. + // 배경.. m_pActiveBg->Tick(); - if (s_pUIMgr->m_bDoneSomething == false && s_pUIMgr->EnableOperation()) // Ŷ ޱ ƹ ϰ Ѵ. + if (s_pUIMgr->m_bDoneSomething == false && s_pUIMgr->EnableOperation()) // 패킷을 받기 전에 아무짓도 못하게 한다. { s_pUIMgr->SetFocusedUI(m_pUICharacterSelect); - int nMFlags = s_pLocalInput->MouseGetFlag(); // Mouse ÷.. - if (nMFlags & MOUSE_LBCLICK) // .. + int nMFlags = s_pLocalInput->MouseGetFlag(); // Mouse 상태 플래그.. + if (nMFlags & MOUSE_LBCLICK) // 누르는 순간.. { if (m_eCurProcess == PROCESS_ROTATEING) { goto NowRotating; @@ -277,14 +277,14 @@ void CGameProcCharacterSelect::Tick() { NowRotating: - // Ʈ.. + // 라이트.. for (int i = 0; i < 8; i++) { - s_pEng->s_lpD3DDev->LightEnable(i, FALSE); // ϴ Ʈ .. + s_pEng->s_lpD3DDev->LightEnable(i, FALSE); // 일단 라이트 다 끄고.. } for (int i = 0; i < 2; i++) { m_pLights[i]->Tick(m_pLights[i]->m_fFrmCur); - m_pLights[i]->Apply(); // Ʈ + m_pLights[i]->Apply(); // 라이트 적용 } CheckJobState(); @@ -298,8 +298,8 @@ void CGameProcCharacterSelect::Tick() { void CGameProcCharacterSelect::Render() { D3DCOLOR crEnv = 0x00000000; - s_pEng->Clear(crEnv); // - s_pEng->BeginScene(); // ... + s_pEng->Clear(crEnv); // 배경은 검은색 + s_pEng->BeginScene(); // 씬 렌더 ㅅ작... __Matrix44 mtxWorld; mtxWorld.Identity(); @@ -315,10 +315,10 @@ void CGameProcCharacterSelect::Render() { m_pCamera->Tick(); m_pCamera->Apply(); - // .. + // 배경.. m_pActiveBg->Render(); - // ij.. + // 캐릭터.. if (m_pChrs[0]) { m_pChrs[0]->m_nLOD = 0; m_pChrs[0]->Render(); @@ -336,13 +336,13 @@ void CGameProcCharacterSelect::Render() { m_pUICharacterSelect->Render(); CUIManager::RenderStateRestore(); - CGameProcedure::Render(); // UI ׹ ⺻ ͵ .. + CGameProcedure::Render(); // UI 나 그밖의 기본적인 것들 렌더링.. if (m_bFadeOutRender) { FadeOutRender(); } - s_pEng->EndScene(); // ... + s_pEng->EndScene(); // 씬 렌더 시작... s_pEng->Present(CN3Base::s_hWndBase); } @@ -368,8 +368,8 @@ void CGameProcCharacterSelect::AddChr(e_ChrPos eCP, __CharacterSelectInfo * pInf m_pChrs[iPosIndex]->Release(); } - __TABLE_PLAYER_LOOKS * pLooks = s_pTbl_UPC_Looks->Find(pInfo->eRace); // User Player Character Skin ü .. - __ASSERT(pLooks, "Table ⺻ ҽ ã ."); + __TABLE_PLAYER_LOOKS * pLooks = s_pTbl_UPC_Looks->Find(pInfo->eRace); // User Player Character Skin 구조체 포인터.. + __ASSERT(pLooks, "Table 에서 기본 리소스 찾기 실패."); m_pChrs[iPosIndex]->PartAlloc(PART_POS_COUNT); m_pChrs[iPosIndex]->PlugAlloc(PLUG_POS_COUNT); @@ -377,51 +377,51 @@ void CGameProcCharacterSelect::AddChr(e_ChrPos eCP, __CharacterSelectInfo * pInf switch (pInfo->eRace) { case RACE_EL_BABARIAN: - // ٹٸ ϳ.. - szJointFN = "ChrSelect\\upc_el_ba_wa.n3joint"; // .. - szAniFN = "ChrSelect\\upc_el_ba_wa.n3anim"; // ϸ̼ ̸.. :-D; + // 남자 바바리안은 직업이 하나.. + szJointFN = "ChrSelect\\upc_el_ba_wa.n3joint"; // 관절 세팅.. + szAniFN = "ChrSelect\\upc_el_ba_wa.n3anim"; // 에니메이션 파일 이름.. :-D; szPlug0FN = "ChrSelect\\wea_el_great_sword.n3cplug"; szPlug1FN = ""; break; case RACE_EL_WOMEN: - // ڴ (, α, ).. ڴ ׷ .. + // 엘모 여자는 직업이 현재 세개(전사, 로그, 성직자).. 성직자는 그래픽이 없다.. switch (pInfo->eClass) { case CLASS_EL_WARRIOR: case CLASS_EL_BLADE: case CLASS_EL_PROTECTOR: szJointFN = "ChrSelect\\upc_el_rf_wa.n3joint"; - szAniFN = "ChrSelect\\upc_el_rf_wa.n3anim"; // ϸ̼ ̸.. :-D; - szPlug0FN = "ChrSelect\\wea_el_long_sword_left.n3cplug"; // ޼տ .. + szAniFN = "ChrSelect\\upc_el_rf_wa.n3anim"; // 에니메이션 파일 이름.. :-D; + szPlug0FN = "ChrSelect\\wea_el_long_sword_left.n3cplug"; // 왼손에 검을 찬다.. szPlug1FN = ""; break; case CLASS_EL_ROGUE: case CLASS_EL_RANGER: case CLASS_EL_ASSASIN: - szJointFN = "ChrSelect\\upc_el_rf_rog.n3joint"; // .. - szAniFN = "ChrSelect\\upc_el_rf_wa.n3anim"; // ϸ̼ ̸.. :-D; + szJointFN = "ChrSelect\\upc_el_rf_rog.n3joint"; // 관절 세팅.. + szAniFN = "ChrSelect\\upc_el_rf_wa.n3anim"; // 에니메이션 파일 이름.. :-D; szPlug0FN = "ChrSelect\\wea_el_rf_rog_bow.n3cplug"; szPlug1FN = "ChrSelect\\wea_el_quiver.n3cplug"; break; case CLASS_EL_WIZARD: case CLASS_EL_MAGE: case CLASS_EL_ENCHANTER: - szJointFN = "ChrSelect\\upc_el_rf_wiz.n3joint"; // .. - szAniFN = "ChrSelect\\upc_el_rf_wa.n3anim"; // ϸ̼ ̸.. :-D; + szJointFN = "ChrSelect\\upc_el_rf_wiz.n3joint"; // 관절 세팅.. + szAniFN = "ChrSelect\\upc_el_rf_wa.n3anim"; // 에니메이션 파일 이름.. :-D; szPlug0FN = "ChrSelect\\upc_el_rf_wiz.n3cplug"; szPlug1FN = ""; break; case CLASS_EL_PRIEST: case CLASS_EL_CLERIC: case CLASS_EL_DRUID: - szJointFN = "ChrSelect\\upc_el_rf_pri.n3joint"; // .. - szAniFN = "ChrSelect\\upc_el_rf_wa.n3anim"; // ϸ̼ ̸.. :-D; + szJointFN = "ChrSelect\\upc_el_rf_pri.n3joint"; // 관절 세팅.. + szAniFN = "ChrSelect\\upc_el_rf_wa.n3anim"; // 에니메이션 파일 이름.. :-D; szPlug0FN = "ChrSelect\\wea_el_wand.n3cplug"; szPlug1FN = ""; break; } break; case RACE_EL_MAN: - // ڴ ..(α, , ) + // 엘모 남자는 현재 직업이 세개..(로그, 성직자, 전사) switch (pInfo->eClass) { case CLASS_EL_WARRIOR: case CLASS_EL_BLADE: @@ -457,7 +457,7 @@ void CGameProcCharacterSelect::AddChr(e_ChrPos eCP, __CharacterSelectInfo * pInf } break; case RACE_KA_ARKTUAREK: - // ī罺 ϳ.. ¸ .. + // 카루스 직업 하나.. 온리 전사.. szJointFN = "ChrSelect\\upc_ka_at_wa.n3joint"; szAniFN = "ChrSelect\\upc_ka_at_wa.n3anim"; szPlug0FN = "ChrSelect\\wea_ka_great_axe.n3cplug"; @@ -490,8 +490,8 @@ void CGameProcCharacterSelect::AddChr(e_ChrPos eCP, __CharacterSelectInfo * pInf szPlug1FN = ""; break; case RACE_KA_PURITUAREK: - szJointFN = "ChrSelect\\upc_el_rf_pri.n3joint"; // .. - szAniFN = "ChrSelect\\upc_el_rf_wa.n3anim"; // ϸ̼ ̸.. :-D; + szJointFN = "ChrSelect\\upc_el_rf_pri.n3joint"; // 관절 세팅.. + szAniFN = "ChrSelect\\upc_el_rf_wa.n3anim"; // 에니메이션 파일 이름.. :-D; szPlug0FN = "ChrSelect\\wea_ka_mace.n3cplug"; szPlug1FN = ""; break; @@ -499,30 +499,30 @@ void CGameProcCharacterSelect::AddChr(e_ChrPos eCP, __CharacterSelectInfo * pInf return; } - m_pChrs[iPosIndex]->JointSet(szJointFN); // .. - m_pChrs[iPosIndex]->AniCtrlSet(szAniFN); // ϸ̼ ̸.. :-D; + m_pChrs[iPosIndex]->JointSet(szJointFN); // 관절 세팅.. + m_pChrs[iPosIndex]->AniCtrlSet(szAniFN); // 에니메이션 파일 이름.. :-D; m_pChrs[iPosIndex]->PlugSet(0, szPlug0FN); m_pChrs[iPosIndex]->PlugSet(1, szPlug1FN); - // ü.. + // 상체.. this->AddChrPart(m_pChrs[iPosIndex], pLooks, PART_POS_UPPER, pInfo->dwItemUpper, pInfo->iItemUpperDurability); - // ü + // 하체 __TABLE_ITEM_BASIC * pItemUpper = this->s_pTbl_Items_Basic->Find(pInfo->dwItemUpper); if (pItemUpper && pItemUpper->byIsRobeType) { - m_pChrs[iPosIndex]->PartSet(PART_POS_LOWER, ""); // ü ü κ긦 Ծ .. + m_pChrs[iPosIndex]->PartSet(PART_POS_LOWER, ""); // 하체일 경우 상체에 로브를 입었으면 .. } else { this->AddChrPart(m_pChrs[iPosIndex], pLooks, PART_POS_LOWER, pInfo->dwItemLower, - pInfo->iItemLowerDurability); //ƴ ... + pInfo->iItemLowerDurability); //아님 입히고... } - // + // 팔 this->AddChrPart(m_pChrs[iPosIndex], pLooks, PART_POS_HANDS, pInfo->dwItemGloves, pInfo->iItemGlovesDurability); - // ٸ + // 다리 this->AddChrPart(m_pChrs[iPosIndex], pLooks, PART_POS_FEET, pInfo->dwItemShoes, pInfo->iItemShoesDurability); char szBuff[256] = ""; std::string szResrcFN; - // - + // 얼굴 - if (!pLooks->szPartFNs[PART_POS_FACE].empty()) { char szBuff[256] = "", szDir[128] = "", szFName[128] = "", szExt[16] = ""; ::_splitpath(pLooks->szPartFNs[PART_POS_FACE].c_str(), NULL, szDir, szFName, szExt); @@ -530,20 +530,20 @@ void CGameProcCharacterSelect::AddChr(e_ChrPos eCP, __CharacterSelectInfo * pInf m_pChrs[iPosIndex]->PartSet(PART_POS_FACE, szBuff); } - // Ӹī Ȥ - + // 머리카락 혹은 헬멧 - __TABLE_ITEM_BASIC * pItemHelmet = this->s_pTbl_Items_Basic->Find(pInfo->dwItemHelmet); - if (pItemHelmet && pItemHelmet->dwIDResrc) // ҽ(׸ ִ°Ÿ..) + if (pItemHelmet && pItemHelmet->dwIDResrc) // 헬멧아이템의 리소스(그림이 있는거면..) { this->AddChrPart(m_pChrs[iPosIndex], pLooks, PART_POS_HAIR_HELMET, pInfo->dwItemHelmet, pInfo->iItemHelmetDurability); - } else if (!pLooks->szPartFNs[PART_POS_HAIR_HELMET].empty()) // ⺻ Ӹ.. + } else if (!pLooks->szPartFNs[PART_POS_HAIR_HELMET].empty()) // 아이템이 없으면 기본 머리.. { char szBuff[256] = "", szDir[128] = "", szFName[128] = "", szExt[16] = ""; ::_splitpath(pLooks->szPartFNs[PART_POS_HAIR_HELMET].c_str(), NULL, szDir, szFName, szExt); sprintf(szBuff, "%s%s%.2d%s", szDir, szFName, pInfo->iHair, szExt); m_pChrs[iPosIndex]->PartSet(PART_POS_HAIR_HELMET, szBuff); } else { - m_pChrs[iPosIndex]->PartSet(PART_POS_HAIR_HELMET, ""); // 䵵 ƴϰ Ӹī .. Ӹ! + m_pChrs[iPosIndex]->PartSet(PART_POS_HAIR_HELMET, ""); // 헬멧도 아니고 머리카락도 없으면.. 대머리다! } __Quaternion qt; @@ -622,7 +622,7 @@ void CGameProcCharacterSelect::AddChrPart(CN3Chr * pChr, const __TABLE_PLAYER_LO CGameProcedure::MakeResrcFileNameForUPC(pItem, &szResrcFN, NULL, ePartPosTmp, ePlugPosTmp); if (szResrcFN.empty()) { - pPart = pChr->PartSet(ePartPos, pLooks->szPartFNs[ePartPos]); // ⺻ Ʈ + pPart = pChr->PartSet(ePartPos, pLooks->szPartFNs[ePartPos]); // 기본 파트 } else { pPart = pChr->PartSet(ePartPos, szResrcFN); } @@ -652,7 +652,7 @@ void CGameProcCharacterSelect::MsgRecv_DeleteChr(DataPack * pDataPack, int & iOf } if ((m_pChrs[0] == NULL) && (m_pChrs[1] == NULL) && (m_pChrs[2] == NULL)) { - CGameProcedure::ProcActiveSet((CGameProcedure *)s_pProcNationSelect); // .. + CGameProcedure::ProcActiveSet((CGameProcedure *)s_pProcNationSelect); // 국가 선택으로 간다.. } } } @@ -664,7 +664,7 @@ int CGameProcCharacterSelect::MsgRecv_VersionCheck(DataPack * pDataPack, int & i if (s_bNeedReportVersionCheck) { CGameProcedure::MsgSend_GameServerLogIn(); } else { - MsgSend_CharacterSelect(); // α.. + MsgSend_CharacterSelect(); // 게임 서버에 로그인.. } } @@ -692,7 +692,7 @@ bool CGameProcCharacterSelect::MsgRecv_CharacterSelect(DataPack * pDataPack, int bool bSuccess = CGameProcedure::MsgRecv_CharacterSelect(pDataPack, iOffset); s_bNeedReportVersionCheck = false; if (bSuccess) { - this->CharacterSelect(); // ij͸ Ų.. + this->CharacterSelect(); // 캐릭터를 일으킨다.. } else { this->CharacterSelectFailed(); } @@ -704,7 +704,7 @@ void CGameProcCharacterSelect::ProcessOnReturn() { if (!m_bReceivedCharacterSelect) { return; } - //Ű Ʈ ̴° ֱ ... + //엔터키 눌렸을때 라이트 때문에 깜빡이는것 없애기 위해... if (m_eCurProcess != PROCESS_ROTATEING) { int iIndex; @@ -740,7 +740,7 @@ void CGameProcCharacterSelect::ProcessOnReturn() { } s_SndMgr.ReleaseStreamObj(&(CGameProcedure::s_pSnd_BGM)); - CGameProcedure::ProcActiveSet((CGameProcedure *)s_pProcMain); // ij ⿡ ϸ.. !! + CGameProcedure::ProcActiveSet((CGameProcedure *)s_pProcMain); // 캐릭터 고르기에 성공하면.. 메인으로 가자!! // CGameProcedure::s_pEng->RestoreLighting(); this->s_pUILoading->Render("Loading data...", 0); } @@ -897,7 +897,7 @@ void CGameProcCharacterSelect::MsgSend_DeleteChr(const std::string & szKey) { return; } - // ° ij͸ .. + // 현재 상태가 캐릭터를 선택하지 않은 상태.. if (m_eCurProcess != PROCESS_PRESELECT) { return; } @@ -919,14 +919,14 @@ void CGameProcCharacterSelect::MsgSend_DeleteChr(const std::string & szKey) { BYTE byBuff[64]; int iOffset = 0; - CAPISocket::MP_AddByte(byBuff, iOffset, N3_DELETE_CHARACTER); // Ŀ. - CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)iIndex); // ε - b - CAPISocket::MP_AddShort(byBuff, iOffset, (BYTE)m_InfoChrs[iIndex].szID.size()); // ̵ - CAPISocket::MP_AddString(byBuff, iOffset, m_InfoChrs[iIndex].szID); // ̵ ڿ - CAPISocket::MP_AddShort(byBuff, iOffset, szKey.size()); // ֹεϹȣ - CAPISocket::MP_AddString(byBuff, iOffset, szKey); // ֹεϹȣ ڿ - - s_pSocket->Send(byBuff, iOffset); // + CAPISocket::MP_AddByte(byBuff, iOffset, N3_DELETE_CHARACTER); // 커멘드. + CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)iIndex); // 인덱스 - b + CAPISocket::MP_AddShort(byBuff, iOffset, (BYTE)m_InfoChrs[iIndex].szID.size()); // 아이디 길이 + CAPISocket::MP_AddString(byBuff, iOffset, m_InfoChrs[iIndex].szID); // 아이디 문자열 + CAPISocket::MP_AddShort(byBuff, iOffset, szKey.size()); // 주민등록번호 길이 + CAPISocket::MP_AddString(byBuff, iOffset, szKey); // 주민등록번호 문자열 + + s_pSocket->Send(byBuff, iOffset); // 보낸다 } void CGameProcCharacterSelect::CheckJobState() { @@ -1053,12 +1053,12 @@ void CGameProcCharacterSelect::CharacterSelect() { } } - m_bReceivedCharacterSelect = true; // ij Ϸ.. - s_pUIMgr->EnableOperationSet(false); // ϴ UI ȵǰ Ѵ... + m_bReceivedCharacterSelect = true; // 캐릭터 고르기 완료.. + s_pUIMgr->EnableOperationSet(false); // 일단 고르면 UI 안되게 한다... } void CGameProcCharacterSelect::CharacterSelectFailed() { - m_bReceivedCharacterSelect = false; // ij .. + m_bReceivedCharacterSelect = false; // 캐릭터 고르기 실패.. std::string szErr; ::_LoadStringFromResource(IDS_ERR_CHARACTER_SELECT, szErr); CGameProcedure::MessageBoxPost(szErr, "", MB_OK, BEHAVIOR_EXIT); @@ -1102,7 +1102,7 @@ void CGameProcCharacterSelect::DoSelectedChrProc() { } else { s_SndMgr.ReleaseStreamObj(&(CGameProcedure::s_pSnd_BGM)); CGameProcedure::ProcActiveSet( - (CGameProcedure *)s_pProcMain); // ij ޾Ұ.. ϸ̼ǵ Ѿ..!! + (CGameProcedure *)s_pProcMain); // 캐릭터 받았고.. 에니메이션도 끝났으면 메인으로 넘어가자..!! // CGameProcedure::s_pEng->RestoreLighting(); } } @@ -1308,35 +1308,35 @@ void CGameProcCharacterSelect::DecreseLightFactor() { } void CGameProcCharacterSelect::MsgRecv_AllCharacterInfo(DataPack * pDataPack, int & iOffset) { - int iResult = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // .. + int iResult = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 결과.. if (0x1 == iResult) { for (int i = 0; i < MAX_AVAILABLE_CHARACTER; i++) { - int iIDLength = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ij ̵ s, + int iIDLength = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 캐릭터 아이디 길이 s, CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, m_InfoChrs[i].szID, - iIDLength); // ij ̵ ڿ str + iIDLength); // 캐릭터 아이디 문자열 str - m_InfoChrs[i].eRace = (e_Race)(CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset)); // b - m_InfoChrs[i].eClass = (e_Class)(CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)); // b - m_InfoChrs[i].iLevel = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // b - m_InfoChrs[i].iFace = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 󱼸 b - m_InfoChrs[i].iHair = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ӹ b + m_InfoChrs[i].eRace = (e_Race)(CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset)); // 종족 b + m_InfoChrs[i].eClass = (e_Class)(CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)); // 직업 b + m_InfoChrs[i].iLevel = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 레벨 b + m_InfoChrs[i].iFace = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 얼굴모양 b + m_InfoChrs[i].iHair = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 머리모양 b m_InfoChrs[i].iZone = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // zone number - m_InfoChrs[i].dwItemHelmet = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // dw - m_InfoChrs[i].iItemHelmetDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // - m_InfoChrs[i].dwItemUpper = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // ü dw - m_InfoChrs[i].iItemUpperDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // - m_InfoChrs[i].dwItemCloak = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // () dw - m_InfoChrs[i].iItemCloakDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // - m_InfoChrs[i].dwItemLower = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // ü dw - m_InfoChrs[i].iItemLowerDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // - m_InfoChrs[i].dwItemGloves = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 尩 dw - m_InfoChrs[i].iItemGlovesDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // - m_InfoChrs[i].dwItemShoes = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // Ź dw - m_InfoChrs[i].iItemShoesDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // + m_InfoChrs[i].dwItemHelmet = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 투구 dw + m_InfoChrs[i].iItemHelmetDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 + m_InfoChrs[i].dwItemUpper = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 상체 dw + m_InfoChrs[i].iItemUpperDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 + m_InfoChrs[i].dwItemCloak = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 어깨(망토) dw + m_InfoChrs[i].iItemCloakDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 + m_InfoChrs[i].dwItemLower = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 하체 dw + m_InfoChrs[i].iItemLowerDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 + m_InfoChrs[i].dwItemGloves = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 장갑 dw + m_InfoChrs[i].iItemGlovesDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 + m_InfoChrs[i].dwItemShoes = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 신발 dw + m_InfoChrs[i].iItemShoesDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 } - // ij ߰.. + // 캐릭터 추가.. if (m_InfoChrs[0].szID.size() > 0) { AddChr(POS_CENTER, &(m_InfoChrs[0])); } @@ -1347,7 +1347,7 @@ void CGameProcCharacterSelect::MsgRecv_AllCharacterInfo(DataPack * pDataPack, in AddChr(POS_RIGHT, &(m_InfoChrs[2])); } } else { - this->MsgSend_RequestAllCharacterInfo(); // ٽ û.. + this->MsgSend_RequestAllCharacterInfo(); // 다시 정보 요청.. return; } } @@ -1355,14 +1355,14 @@ void CGameProcCharacterSelect::MsgRecv_AllCharacterInfo(DataPack * pDataPack, in void CGameProcCharacterSelect::MsgSend_RequestAllCharacterInfo() { BYTE byBuff[4]; int iOffset = 0; - CAPISocket::MP_AddByte(byBuff, iOffset, N3_ALL_CHARACTER_INFO_REQUEST); // Ŀ. - s_pSocket->Send(byBuff, iOffset); // + CAPISocket::MP_AddByte(byBuff, iOffset, N3_ALL_CHARACTER_INFO_REQUEST); // 커멘드. + s_pSocket->Send(byBuff, iOffset); // 보낸다 } void CGameProcCharacterSelect::MsgSend_CharacterSelect() // virtual { CGameProcedure::MsgSend_CharacterSelect(); - s_pUIMgr->EnableOperationSet(false); // UI ϰ Ѵ.. + s_pUIMgr->EnableOperationSet(false); // UI 를 조작 못하게 한다.. } bool CGameProcCharacterSelect::ProcessPacket(DataPack * pDataPack, int & iOffset) { @@ -1373,12 +1373,12 @@ bool CGameProcCharacterSelect::ProcessPacket(DataPack * pDataPack, int & iOffset return true; } - int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ŀ Ľ.. - switch (iCmd) // Ŀ忡 ٶ б.. + int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 커멘드 파싱.. + switch (iCmd) // 커멘드에 다라서 분기.. { - case N3_ALL_CHARACTER_INFO_REQUEST: // ij ޽.. + case N3_ALL_CHARACTER_INFO_REQUEST: // 캐릭터 선택 메시지.. this->MsgRecv_AllCharacterInfo(pDataPack, iOffset); - s_pUIMgr->EnableOperationSet(true); // ij ٿ UI ϰ Ѵ.. + s_pUIMgr->EnableOperationSet(true); // 캐릭터 정보가 다오면 UI 조작하게 한다.. return true; case N3_DELETE_CHARACTER: this->MsgRecv_DeleteChr(pDataPack, iOffset); @@ -1392,9 +1392,9 @@ void CGameProcCharacterSelect::CharacterSelectOrCreate() { CGameProcedure::MessageBoxClose(-1); int iIndex = CGameProcedure::s_iChrSelectIndex; - if (NULL == m_pChrs[iIndex]) // ijͰ .. + if (NULL == m_pChrs[iIndex]) // 캐릭터가 없으면.. { - CGameProcedure::ProcActiveSet((CGameProcedure *)s_pProcCharacterCreate); // ij ν ȣѴ.. + CGameProcedure::ProcActiveSet((CGameProcedure *)s_pProcCharacterCreate); // 캐릭터 생성 프로시저를 호출한다.. } else { s_pPlayer->m_InfoExt.iZoneInit = 0x01; s_pPlayer->m_InfoExt.iZoneCur = m_InfoChrs[iIndex].iZone; diff --git a/src/game/GameProcCharacterSelect.h b/src/game/GameProcCharacterSelect.h index cc6fe6cd..abbb5b56 100644 --- a/src/game/GameProcCharacterSelect.h +++ b/src/game/GameProcCharacterSelect.h @@ -38,40 +38,40 @@ class CUIManager; class CUICharacterSelect; struct __CharacterSelectInfo { - std::string szID; // ij ̵ ڿ str - e_Race eRace; // b - e_Class eClass; // b - int iLevel; // b - int iFace; // 󱼸 b - int iHair; // Ӹ b + std::string szID; // 캐릭터 아이디 문자열 str + e_Race eRace; // 종족 b + e_Class eClass; // 직업 b + int iLevel; // 레벨 b + int iFace; // 얼굴모양 b + int iHair; // 머리모양 b int iZone; //zone number - DWORD dwItemUpper; // ü dw + DWORD dwItemUpper; // 상체 dw int iItemUpperDurability; - DWORD dwItemLower; // ü dw + DWORD dwItemLower; // 하체 dw int iItemLowerDurability; - DWORD dwItemHelmet; // dw + DWORD dwItemHelmet; // 투구 dw int iItemHelmetDurability; - DWORD dwItemCloak; // () dw + DWORD dwItemCloak; // 어깨(망토) dw int iItemCloakDurability; - DWORD dwItemGloves; // 尩 dw + DWORD dwItemGloves; // 장갑 dw int iItemGlovesDurability; - DWORD dwItemShoes; // Ź dw + DWORD dwItemShoes; // 신발 dw int iItemShoesDurability; void clear() { szID = ""; - eRace = RACE_UNKNOWN; // b - eClass = CLASS_UNKNOWN; // b - iLevel = 0; // b - iFace = 0; // 󱼸 b - iHair = 0; // Ӹ b + eRace = RACE_UNKNOWN; // 종족 b + eClass = CLASS_UNKNOWN; // 직업 b + iLevel = 0; // 레벨 b + iFace = 0; // 얼굴모양 b + iHair = 0; // 머리모양 b iZone = 0; //zone number - dwItemUpper = 0; // ü dw - dwItemLower = 0; // ü dw - dwItemHelmet = 0; // dw - dwItemCloak = 0; // () dw - dwItemGloves = 0; // 尩 dw - dwItemShoes = 0; // Ź dw + dwItemUpper = 0; // 상체 dw + dwItemLower = 0; // 하체 dw + dwItemHelmet = 0; // 투구 dw + dwItemCloak = 0; // 어깨(망토) dw + dwItemGloves = 0; // 장갑 dw + dwItemShoes = 0; // 신발 dw } __CharacterSelectInfo() { clear(); } @@ -85,7 +85,7 @@ class CGameProcCharacterSelect : public CGameProcedure { class CN3Shape * m_pActiveBg; class CN3Chr * m_pChrs[MAX_AVAILABLE_CHARACTER]; - __CharacterSelectInfo m_InfoChrs[MAX_AVAILABLE_CHARACTER]; // ̹ ij .. + __CharacterSelectInfo m_InfoChrs[MAX_AVAILABLE_CHARACTER]; // 이미 만들어진 캐릭터 정보.. class CN3Camera * m_pCamera; class CN3Light * m_pLights[8]; diff --git a/src/game/GameProcLogIn.cpp b/src/game/GameProcLogIn.cpp index f82b4ec9..4f71a072 100644 --- a/src/game/GameProcLogIn.cpp +++ b/src/game/GameProcLogIn.cpp @@ -34,7 +34,7 @@ CGameProcLogIn::CGameProcLogIn() { m_pLights[i] = NULL; } - m_bLogIn = false; // α ߺ .. + m_bLogIn = false; // 로그인 중복 방지.. m_fCurAudioFrm = 0.0f; } @@ -78,7 +78,7 @@ void CGameProcLogIn::Init() { m_pChr = new CN3Chr(); m_pChr->LoadFromFile("Intro\\Intro.N3Chr"); - m_pChr->AniCurSet(0); // ϸ̼.. + m_pChr->AniCurSet(0); // 루핑 에니메이션.. m_pCamera = new CN3Camera(); m_pCamera->EyePosSet(0.22f, 0.91f, -1.63f); @@ -96,12 +96,12 @@ void CGameProcLogIn::Init() { m_fCurAudioFrm = 0.0f; s_pEng->s_SndMgr.ReleaseStreamObj(&(CGameProcedure::s_pSnd_BGM)); - CGameProcedure::s_pSnd_BGM = s_pEng->s_SndMgr.CreateStreamObj(ID_SOUND_BGM_LOGIN); // ¢ 26¥ Ҹ.. + CGameProcedure::s_pSnd_BGM = s_pEng->s_SndMgr.CreateStreamObj(ID_SOUND_BGM_LOGIN); //몬스터 울부짖는 26초짜리 소리.. m_pUILogIn = new CUILogIn(); m_pUILogIn->Init(s_pUIMgr); - __TABLE_UI_RESRC * pTbl = s_pTbl_UI->GetIndexedData(0); // ̴... + __TABLE_UI_RESRC * pTbl = s_pTbl_UI->GetIndexedData(0); // 국가 기준이 없기 때문이다... if (pTbl) { m_pUILogIn->LoadFromFile(pTbl->szLogIn); } @@ -114,10 +114,10 @@ void CGameProcLogIn::Init() { rc.top = 0; rc.right = CN3Base::s_CameraData.vp.Width; rc.bottom = CN3Base::s_CameraData.vp.Height; - m_pUILogIn->SetRegion(rc); // ̰ UI ó ȴ.. + m_pUILogIn->SetRegion(rc); // 이걸 꼭 해줘야 UI 처리가 제대로 된다.. s_pUIMgr->SetFocusedUI((CN3UIBase *)m_pUILogIn); - // .. + // 소켓 접속.. char szIniPath[_MAX_PATH] = ""; lstrcpy(szIniPath, CN3Base::PathGet().c_str()); lstrcat(szIniPath, "Server.Ini"); @@ -136,33 +136,33 @@ void CGameProcLogIn::Init() { } if (iServer >= 0 && lstrlen(szIPs[iServer])) { - s_bNeedReportConnectionClosed = false; // ؾ ϴ.. + s_bNeedReportConnectionClosed = false; // 서버접속이 끊어진걸 보고해야 하는지.. int iErr = s_pSocket->Connect(s_hWndBase, szIPs[iServer], SOCKET_PORT_LOGIN); - s_bNeedReportConnectionClosed = true; // ؾ ϴ.. + s_bNeedReportConnectionClosed = true; // 서버접속이 끊어진걸 보고해야 하는지.. if (iErr) { this->ReportServerConnectionFailed("LogIn Server", iErr, true); } else { - m_pUILogIn->FocusToID(); // ̵ Էâ Ŀ ߰.. + m_pUILogIn->FocusToID(); // 아이디 입력창에 포커스를 맞추고.. - // Ʈ û.. + // 게임 서버 리스트 요청.. int iOffset = 0; BYTE byBuffs[4]; - CAPISocket::MP_AddByte(byBuffs, iOffset, N3_GAMESERVER_GROUP_LIST); // Ŀ. - s_pSocket->Send(byBuffs, iOffset); // + CAPISocket::MP_AddByte(byBuffs, iOffset, N3_GAMESERVER_GROUP_LIST); // 커멘드. + s_pSocket->Send(byBuffs, iOffset); // 보낸다 } } else { - this->MessageBoxPost("No server list", "LogIn Server fail", MB_OK, BEHAVIOR_EXIT); // . + this->MessageBoxPost("No server list", "LogIn Server fail", MB_OK, BEHAVIOR_EXIT); // 끝낸다. } - // .. + // 게임 계정으로 들어 왔으면.. if (LIC_KNIGHTONLINE != s_eLogInClassification) { - this->MsgSend_AccountLogIn(s_eLogInClassification); // α.. + this->MsgSend_AccountLogIn(s_eLogInClassification); // 로그인.. } } -void CGameProcLogIn::Tick() // ν ε Ѵ. 0 ̸ ״ +void CGameProcLogIn::Tick() // 프로시져 인덱스를 리턴한다. 0 이면 그대로 진행 { - CGameProcedure::Tick(); // Ű, 콺 Է .. + CGameProcedure::Tick(); // 키, 마우스 입력 등등.. for (int i = 0; i < 3; i++) { m_pLights[i]->Tick(); @@ -171,7 +171,7 @@ void CGameProcLogIn::Init() { if (m_fCurAudioFrm == 0.0f) { if (CGameProcedure::s_pSnd_BGM) { - CGameProcedure::s_pSnd_BGM->Play(); // .. + CGameProcedure::s_pSnd_BGM->Play(); // 음악 시작.. } } m_fCurAudioFrm += CN3Base::s_fSecPerFrm; @@ -184,14 +184,14 @@ void CGameProcLogIn::Init() { } void CGameProcLogIn::Render() { - s_pEng->Clear(0); // - s_pEng->BeginScene(); // ... + s_pEng->Clear(0); // 배경은 검은색 + s_pEng->BeginScene(); // 씬 렌더 ㅅ작... // __Vector3 vEye(0.22f, 0.91f, -1.63f), vAt(-0.19f, 1.1048f, 0.0975f), vUp(0,1,0); // __Matrix44 mtxView, mtxPrj, mtxWorld; // mtxWorld.Identity(); - // ī޶ .. + // 카메라 잡기.. m_pCamera->Tick(); m_pCamera->Apply(); /* D3DVIEWPORT9 vp; @@ -215,7 +215,7 @@ void CGameProcLogIn::Render() { m_pLights[i]->Apply(); } - // Ʈ .. + // 라이트 잡기.. /* D3DLIGHT9 lgt0, lgt1, lgt2; memset(&lgt0, 0, sizeof(D3DLIGHT9)); @@ -253,7 +253,7 @@ void CGameProcLogIn::Render() { */ //////////////////////////////////////////// - // ޱ׸.. + // 달그리기.. D3DVIEWPORT9 vp; CN3Base::s_lpD3DDev->GetViewport(&vp); @@ -280,32 +280,32 @@ void CGameProcLogIn::Render() { CN3Base::s_lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vMoon, sizeof(__VertexTransformed)); CN3Base::s_lpD3DDev->SetRenderState(D3DRS_ZWRITEENABLE, dwZWrite); - // ޱ׸.. + // 달그리기.. //////////////////////////////////////////// - m_pChr->Render(); // ij ׸... + m_pChr->Render(); // 캐릭터 그리기... - CGameProcedure::Render(); // UI ׹ ⺻ ͵ .. + CGameProcedure::Render(); // UI 나 그밖의 기본적인 것들 렌더링.. - s_pEng->EndScene(); // ... + s_pEng->EndScene(); // 씬 렌더 시작... s_pEng->Present(CN3Base::s_hWndBase); } bool CGameProcLogIn::MsgSend_AccountLogIn(e_LogInClassification eLIC) { if (LIC_KNIGHTONLINE == eLIC) { - m_pUILogIn->AccountIDGet(s_szAccount); // .. - m_pUILogIn->AccountPWGet(s_szPassWord); // йȣ .. + m_pUILogIn->AccountIDGet(s_szAccount); // 계정 기억.. + m_pUILogIn->AccountPWGet(s_szPassWord); // 비밀번호 기억.. } if (s_szAccount.empty() || s_szPassWord.empty() || s_szAccount.size() >= 20 || s_szPassWord.size() >= 12) { return false; } - m_pUILogIn->SetVisibleLogInUIs(false); // Ŷ ö UI Disable Ų... + m_pUILogIn->SetVisibleLogInUIs(false); // 패킷이 들어올때까지 UI 를 Disable 시킨다... m_pUILogIn->SetRequestedLogIn(true); - m_bLogIn = true; // α õ.. + m_bLogIn = true; // 로그인 시도.. - BYTE byBuff[256]; // Ŷ .. - int iOffset = 0; // .. + BYTE byBuff[256]; // 패킷 버퍼.. + int iOffset = 0; // 버퍼의 오프셋.. BYTE byCmd = N3_ACCOUNT_LOGIN; if (LIC_KNIGHTONLINE == eLIC) { @@ -315,19 +315,19 @@ bool CGameProcLogIn::MsgSend_AccountLogIn(e_LogInClassification eLIC) { } // else if(LIC_DAUM == eLIC) byCmd = N3_ACCOUNT_LOGIN_DAUM; - CAPISocket::MP_AddByte(byBuff, iOffset, byCmd); // Ŀ. - CAPISocket::MP_AddShort(byBuff, iOffset, s_szAccount.size()); // ̵ .. - CAPISocket::MP_AddString(byBuff, iOffset, s_szAccount); // ̵.. - CAPISocket::MP_AddShort(byBuff, iOffset, s_szPassWord.size()); // н - CAPISocket::MP_AddString(byBuff, iOffset, s_szPassWord); // н + CAPISocket::MP_AddByte(byBuff, iOffset, byCmd); // 커멘드. + CAPISocket::MP_AddShort(byBuff, iOffset, s_szAccount.size()); // 아이디 길이.. + CAPISocket::MP_AddString(byBuff, iOffset, s_szAccount); // 실제 아이디.. + CAPISocket::MP_AddShort(byBuff, iOffset, s_szPassWord.size()); // 패스워드 길이 + CAPISocket::MP_AddString(byBuff, iOffset, s_szPassWord); // 실제 패스워드 - s_pSocket->Send(byBuff, iOffset); // + s_pSocket->Send(byBuff, iOffset); // 보낸다 return true; } void CGameProcLogIn::MsgRecv_GameServerGroupList(DataPack * pDataPack, int & iOffset) { - int iServerCount = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // + int iServerCount = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 서버 갯수 for (int i = 0; i < iServerCount; i++) { int iLen = 0; __GameServerInfo GSI; @@ -335,7 +335,7 @@ void CGameProcLogIn::MsgRecv_GameServerGroupList(DataPack * pDataPack, int & iOf CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, GSI.szIP, iLen); iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, GSI.szName, iLen); - GSI.iConcurrentUserCount = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ڼ.. + GSI.iConcurrentUserCount = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 현재 동시 접속자수.. m_pUILogIn->ServerInfoAdd(GSI); // ServerList } @@ -345,13 +345,13 @@ void CGameProcLogIn::MsgRecv_GameServerGroupList(DataPack * pDataPack, int & iOf void CGameProcLogIn::MsgRecv_AccountLogIn(int iCmd, DataPack * pDataPack, int & iOffset) { int iResult = CAPISocket::Parse_GetByte(pDataPack->m_pData, - iOffset); // Recv - b1(0: 1: 2:ID 3:PWƲ 4:) - if (1 == iResult) // .. + iOffset); // Recv - b1(0:실패 1:성공 2:ID없음 3:PW틀림 4:서버점검중) + if (1 == iResult) // 접속 성공.. { - // ޽ ڽ ݱ.. + // 모든 메시지 박스 닫기.. this->MessageBoxClose(-1); - m_pUILogIn->OpenServerList(); // Ʈ б.. - } else if (2 == iResult) // ID  ѰŸ.. + m_pUILogIn->OpenServerList(); // 서버 리스트 읽기.. + } else if (2 == iResult) // ID 가 없어서 실패한거면.. { if (N3_ACCOUNT_LOGIN == iCmd) { std::string szMsg; @@ -359,30 +359,30 @@ void CGameProcLogIn::MsgRecv_AccountLogIn(int iCmd, DataPack * pDataPack, int & ::_LoadStringFromResource(IDS_NOACCOUNT_RETRY_MGAMEID, szMsg); ::_LoadStringFromResource(IDS_CONNECT_FAIL, szTmp); - this->MessageBoxPost(szMsg, szTmp, MB_YESNO, BEHAVIOR_MGAME_LOGIN); // MGame ID Ұųİ . + this->MessageBoxPost(szMsg, szTmp, MB_YESNO, BEHAVIOR_MGAME_LOGIN); // MGame ID 로 접속할거냐고 물어본다. } else { std::string szMsg; std::string szTmp; ::_LoadStringFromResource(IDS_NO_MGAME_ACCOUNT, szMsg); ::_LoadStringFromResource(IDS_CONNECT_FAIL, szTmp); - this->MessageBoxPost(szMsg, szTmp, MB_OK); // MGame ID Ұųİ . + this->MessageBoxPost(szMsg, szTmp, MB_OK); // MGame ID 로 접속할거냐고 물어본다. } - } else if (3 == iResult) // PassWord + } else if (3 == iResult) // PassWord 실패 { std::string szMsg; std::string szTmp; ::_LoadStringFromResource(IDS_WRONG_PASSWORD, szMsg); ::_LoadStringFromResource(IDS_CONNECT_FAIL, szTmp); - this->MessageBoxPost(szMsg, szTmp, MB_OK); // MGame ID Ұųİ . - } else if (4 == iResult) // ?? + this->MessageBoxPost(szMsg, szTmp, MB_OK); // MGame ID 로 접속할거냐고 물어본다. + } else if (4 == iResult) // 서버 점검 중?? { std::string szMsg; std::string szTmp; ::_LoadStringFromResource(IDS_SERVER_CONNECT_FAIL, szMsg); ::_LoadStringFromResource(IDS_CONNECT_FAIL, szTmp); - this->MessageBoxPost(szMsg, szTmp, MB_OK); // MGame ID Ұųİ . - } else if (5 == iResult) //  ִ. .. + this->MessageBoxPost(szMsg, szTmp, MB_OK); // MGame ID 로 접속할거냐고 물어본다. + } else if (5 == iResult) // 어떤 넘이 접속해 있다. 서버에게 끊어버리라고 하자.. { int iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); if (iOffset > 0) { @@ -391,9 +391,9 @@ void CGameProcLogIn::MsgRecv_AccountLogIn(int iCmd, DataPack * pDataPack, int & DWORD dwPort = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); CAPISocket socketTmp; - s_bNeedReportConnectionClosed = false; // ؾ ϴ.. + s_bNeedReportConnectionClosed = false; // 서버접속이 끊어진걸 보고해야 하는지.. if (0 == socketTmp.Connect(s_hWndBase, szIP.c_str(), dwPort)) { - // α ׼ ּҷ ؼ © . + // 로그인 서버에서 받은 겜서버 주소로 접속해서 짤르라고 꼰지른다. int iOffset2 = 0; BYTE Buff[32]; CAPISocket::MP_AddByte(Buff, iOffset2, N3_KICK_OUT); // Recv s1, str1(IP) s1(port) | Send s1, str1(ID) @@ -401,29 +401,29 @@ void CGameProcLogIn::MsgRecv_AccountLogIn(int iCmd, DataPack * pDataPack, int & CAPISocket::MP_AddString(Buff, iOffset2, s_szAccount); // Recv s1, str1(IP) s1(port) | Send s1, str1(ID) socketTmp.Send(Buff, iOffset2); - socketTmp.Disconnect(); // ¥.. + socketTmp.Disconnect(); // 짜른다.. } - s_bNeedReportConnectionClosed = true; // ؾ ϴ.. + s_bNeedReportConnectionClosed = true; // 서버접속이 끊어진걸 보고해야 하는지.. std::string szMsg; std::string szTmp; ::_LoadStringFromResource(IDS_LOGIN_ERR_ALREADY_CONNECTED_ACCOUNT, szMsg); ::_LoadStringFromResource(IDS_CONNECT_FAIL, szTmp); - this->MessageBoxPost(szMsg, szTmp, MB_OK); // ٽ Ұųİ . + this->MessageBoxPost(szMsg, szTmp, MB_OK); // 다시 접속 할거냐고 물어본다. } } else { std::string szMsg; std::string szTmp; ::_LoadStringFromResource(IDS_CURRENT_SERVER_ERROR, szMsg); ::_LoadStringFromResource(IDS_CONNECT_FAIL, szTmp); - this->MessageBoxPost(szMsg, szTmp, MB_OK); // MGame ID Ұųİ . + this->MessageBoxPost(szMsg, szTmp, MB_OK); // MGame ID 로 접속할거냐고 물어본다. } - if (1 != iResult) // α .. + if (1 != iResult) // 로그인 실패.. { - m_pUILogIn->SetVisibleLogInUIs(true); // ..UI Ұ.. + m_pUILogIn->SetVisibleLogInUIs(true); // 접속 성공..UI 조작 불가능.. m_pUILogIn->SetRequestedLogIn(false); - m_bLogIn = false; // α õ.. + m_bLogIn = false; // 로그인 시도.. } } @@ -431,7 +431,7 @@ int CGameProcLogIn::MsgRecv_VersionCheck(DataPack * pDataPack, int & iOffset) // { int iVersion = CGameProcedure::MsgRecv_VersionCheck(pDataPack, iOffset); if (iVersion == CURRENT_VERSION) { - CGameProcedure::MsgSend_GameServerLogIn(); // α.. + CGameProcedure::MsgSend_GameServerLogIn(); // 게임 서버에 로그인.. m_pUILogIn->ConnectButtonSetEnable(false); } @@ -440,9 +440,9 @@ int CGameProcLogIn::MsgRecv_VersionCheck(DataPack * pDataPack, int & iOffset) // return iVersion; } -int CGameProcLogIn::MsgRecv_GameServerLogIn(DataPack * pDataPack, int & iOffset) // virtual - ȣ Ѵ. +int CGameProcLogIn::MsgRecv_GameServerLogIn(DataPack * pDataPack, int & iOffset) // virtual - 국가번호를 리턴한다. { - int iNation = CGameProcedure::MsgRecv_GameServerLogIn(pDataPack, iOffset); // - 0 0xff - .. + int iNation = CGameProcedure::MsgRecv_GameServerLogIn(pDataPack, iOffset); // 국가 - 0 없음 0xff - 실패.. if (0xff == iNation) { __GameServerInfo GSI; @@ -452,7 +452,7 @@ int CGameProcLogIn::MsgRecv_VersionCheck(DataPack * pDataPack, int & iOffset) // char szErr[256]; sprintf(szErr, szFmt.c_str(), GSI.szName.c_str(), iNation); this->MessageBoxPost(szErr, "", MB_OK); - m_pUILogIn->ConnectButtonSetEnable(true); // + m_pUILogIn->ConnectButtonSetEnable(true); // 실패 } else { if (0 == iNation) { s_pPlayer->m_InfoBase.eNation = NATION_NOTSELECTED; @@ -489,16 +489,16 @@ bool CGameProcLogIn::ProcessPacket(DataPack * pDataPack, int & iOffset) { } s_pPlayer->m_InfoBase.eNation = NATION_UNKNOWN; - int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ŀ Ľ.. + int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 커멘드 파싱.. s_pPlayer->m_InfoBase.eNation = NATION_UNKNOWN; - switch (iCmd) // Ŀ忡 ٶ б.. + switch (iCmd) // 커멘드에 다라서 분기.. { - case N3_GAMESERVER_GROUP_LIST: // ϸ ٷ ش.. + case N3_GAMESERVER_GROUP_LIST: // 접속하면 바로 보내준다.. this->MsgRecv_GameServerGroupList(pDataPack, iOffset); return true; - case N3_ACCOUNT_LOGIN: // .. - case N3_ACCOUNT_LOGIN_MGAME: // MGame .. + case N3_ACCOUNT_LOGIN: // 계정 접속 성공.. + case N3_ACCOUNT_LOGIN_MGAME: // MGame 계정 접속 성공.. this->MsgRecv_AccountLogIn(iCmd, pDataPack, iOffset); return true; } @@ -506,16 +506,16 @@ bool CGameProcLogIn::ProcessPacket(DataPack * pDataPack, int & iOffset) { return false; } -void CGameProcLogIn::ConnectToGameServer() // +void CGameProcLogIn::ConnectToGameServer() // 고른 게임 서버에 접속 { __GameServerInfo GSI; if (false == m_pUILogIn->ServerInfoGetCur(GSI)) { - return; // .. + return; // 서버를 고른다음.. } - s_bNeedReportConnectionClosed = false; // ؾ ϴ.. - int iErr = s_pSocket->Connect(s_hWndBase, GSI.szIP.c_str(), SOCKET_PORT_GAME); // Ӽ - s_bNeedReportConnectionClosed = true; // ؾ ϴ.. + s_bNeedReportConnectionClosed = false; // 서버접속이 끊어진걸 보고해야 하는지.. + int iErr = s_pSocket->Connect(s_hWndBase, GSI.szIP.c_str(), SOCKET_PORT_GAME); // 게임서버 소켓 연결 + s_bNeedReportConnectionClosed = true; // 서버접속이 끊어진걸 보고해야 하는지.. if (iErr) { this->ReportServerConnectionFailed(GSI.szName, iErr, false); m_pUILogIn->ConnectButtonSetEnable(true); @@ -524,14 +524,14 @@ bool CGameProcLogIn::ProcessPacket(DataPack * pDataPack, int & iOffset) { this->MsgSend_VersionCheck(); } } -// By : Ecli666 ( On 2002-07-15 7:35:16 ) +// By : Ecli666 ( On 2002-07-15 오후 7:35:16 ) // /* void CGameProcLogIn::PacketSend_MGameLogin() { if(m_szID.size() >= 20 || m_szPW.size() >= 12) { -// MessageBox("ID 20 PassWord 12 ̸̾ մϴ.", "LogIn Error"); +// MessageBox("ID는 20 자 PassWord 는 12 자 미만이어야 합니다.", "LogIn Error"); return; } @@ -539,7 +539,7 @@ void CGameProcLogIn::PacketSend_MGameLogin() BYTE send_buff[128]; memset( send_buff, NULL, 128 ); - CAPISocket::MP_AddByte( send_buff, send_index, N3_ACCOUNT_LOGIN_MGAME); // Send - s1(ID) str1(IDڿ:20Ʈ) s1(PW) str1(PWڿ:12Ʈ) | Recv - b1(0: 1: 2:ID 3:PWƲ 4:) + CAPISocket::MP_AddByte( send_buff, send_index, N3_ACCOUNT_LOGIN_MGAME); // Send - s1(ID길이) str1(ID문자열:20바이트이하) s1(PW길이) str1(PW문자열:12바이트이하) | Recv - b1(0:실패 1:성공 2:ID없음 3:PW틀림 4:서버점검중) CAPISocket::MP_AddShort( send_buff, send_index, (short)(m_szID.size())); CAPISocket::MP_AddString( send_buff, send_index, m_szID); CAPISocket::MP_AddShort( send_buff, send_index, (short)(m_szPW.size())); @@ -548,4 +548,4 @@ void CGameProcLogIn::PacketSend_MGameLogin() s_pSocket->Send( send_buff, send_index ); }*/ -// ~(By Ecli666 On 2002-07-15 7:35:16 ) +// ~(By Ecli666 On 2002-07-15 오후 7:35:16 ) diff --git a/src/game/GameProcLogIn.h b/src/game/GameProcLogIn.h index c32fec5e..2aa7f2b9 100644 --- a/src/game/GameProcLogIn.h +++ b/src/game/GameProcLogIn.h @@ -15,7 +15,7 @@ class CGameProcLogIn : public CGameProcedure { class CN3Camera * m_pCamera; class CN3Light * m_pLights[3]; - bool m_bLogIn; // α ߺ .. + bool m_bLogIn; // 로그인 중복 방지.. float m_fCurAudioFrm; @@ -23,7 +23,7 @@ class CGameProcLogIn : public CGameProcedure { void MsgRecv_GameServerGroupList(DataPack * pDataPack, int & iOffset); void MsgRecv_AccountLogIn(int iCmd, DataPack * pDataPack, int & iOffset); int MsgRecv_VersionCheck(DataPack * pDataPack, int & iOffset); // virtual - int MsgRecv_GameServerLogIn(DataPack * pDataPack, int & iOffset); // virtual - ȣ Ѵ. + int MsgRecv_GameServerLogIn(DataPack * pDataPack, int & iOffset); // virtual - 국가 번호를 리턴한다. bool MsgSend_AccountLogIn(enum e_LogInClassification eLIC); @@ -36,7 +36,7 @@ class CGameProcLogIn : public CGameProcedure { virtual bool ProcessPacket(DataPack * pDataPack, int & iOffset); public: - void ConnectToGameServer(); // + void ConnectToGameServer(); // 고른 게임 서버에 접속 CGameProcLogIn(); virtual ~CGameProcLogIn(); // void PacketSend_MGameLogin(); diff --git a/src/game/GameProcMain.cpp b/src/game/GameProcMain.cpp index 2e6bb4b0..aef56a3a 100644 --- a/src/game/GameProcMain.cpp +++ b/src/game/GameProcMain.cpp @@ -107,13 +107,13 @@ enum e_ChatCmd { CMD_COUNT, CMD_UNKNOWN = 0xffffffff }; -static std::string s_szCmdMsg[CMD_COUNT]; // ӻ ɾ +static std::string s_szCmdMsg[CMD_COUNT]; // 게임상 명령어 ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// -CGameProcMain::CGameProcMain() // r⺻ .. Ȱ .. +CGameProcMain::CGameProcMain() // r기본 생성자.. 각 변수의 역활은 헤더 참조.. { m_fLBClickTime = 0.0f; m_bLoadComplete = FALSE; @@ -153,8 +153,8 @@ enum e_ChatCmd { m_pUISkillTreeDlg = new CUISkillTreeDlg(); m_pUIHotKeyDlg = new CUIHotKeyDlg(); m_pUINpcTalk = new CUINpcTalk(); - m_pUIKnightsOp = new CUIKnightsOperation(); // Ʈ , , ... - m_pUIPartyBBS = new CUIPartyBBS(); // Ƽ ý Խ??.. + m_pUIKnightsOp = new CUIKnightsOperation(); // 기사단 리스트 보기, 가입, 등... + m_pUIPartyBBS = new CUIPartyBBS(); // 파티 지원 시스템 게시판??.. m_pUIWareHouseDlg = new CUIWareHouseDlg(); m_pUINpcChange = new CUINPCChangeEvent(); m_pUIWarp = new CUIWarp(); @@ -172,7 +172,7 @@ enum e_ChatCmd { m_pSubProcPerTrade = new CSubProcPerTrade(); m_pMagicSkillMng = new CMagicSkillMng(this); - m_pTargetSymbol = new CN3Shape(); // ÷̾ Ÿ ij ġ ׸ ȴ.. + m_pTargetSymbol = new CN3Shape(); // 플레이어가 타겟으로 잡은 캐릭터의 위치위에 그리면 된다.. m_pWarMessage = new CWarMessage; m_pLightMgr = new CLightMgr; @@ -221,7 +221,7 @@ CGameProcMain::~CGameProcMain() { delete m_pSubProcPerTrade; delete m_pMagicSkillMng; delete m_pWarMessage; - delete m_pTargetSymbol; // ÷̾ Ÿ ij ġ ׸ ȴ.. + delete m_pTargetSymbol; // 플레이어가 타겟으로 잡은 캐릭터의 위치위에 그리면 된다.. delete m_pLightMgr; } @@ -259,7 +259,7 @@ void CGameProcMain::ReleaseUIs() { m_pUIHotKeyDlg->Release(); m_pUINpcTalk->Release(); // m_pUITradeList->Release(); - m_pUIKnightsOp->Release(); // Ʈ , , ... + m_pUIKnightsOp->Release(); // 기사단 리스트 보기, 가입, 등... m_pUIPartyBBS->Release(); m_pUIWareHouseDlg->Release(); m_pUINpcChange->Release(); @@ -277,7 +277,7 @@ void CGameProcMain::Init() { m_pLightMgr->Release(); s_pEng->SetDefaultLight(m_pLightMgr->Light(0), m_pLightMgr->Light(1), m_pLightMgr->Light(2)); - for (int i = IDS_CMD_WHISPER; i <= IDS_CMD_GAME_SAVE; i++) //ɾ ε... + for (int i = IDS_CMD_WHISPER; i <= IDS_CMD_GAME_SAVE; i++) //명령어 로딩... { ::_LoadStringFromResource(i, s_szCmdMsg[i - IDS_CMD_WHISPER]); } @@ -287,21 +287,21 @@ void CGameProcMain::Init() { if (m_pWarMessage) { m_pWarMessage->InitFont(); } - this->InitUI(); // ٸ UI ε... - this->InitZone(s_pPlayer->m_InfoExt.iZoneCur, s_pPlayer->Position()); // ε.. + this->InitUI(); // 국가에 따라 다른 UI 로딩... + this->InitZone(s_pPlayer->m_InfoExt.iZoneCur, s_pPlayer->Position()); // 존 로딩.. //sound obj... if (m_pSnd_Battle == NULL) { int iIDSndBattle = ((NATION_KARUS == s_pPlayer->m_InfoBase.eNation) ? ID_SOUND_BGM_KA_BATTLE : ID_SOUND_BGM_EL_BATTLE); - m_pSnd_Battle = s_pEng->s_SndMgr.CreateStreamObj(iIDSndBattle); // ID + m_pSnd_Battle = s_pEng->s_SndMgr.CreateStreamObj(iIDSndBattle); // 전투음악 ID if (m_pSnd_Battle) { m_pSnd_Battle->Looping(true); m_pSnd_Battle->Stop(); } } if (m_pSnd_Town == NULL) { - m_pSnd_Town = s_pEng->s_SndMgr.CreateStreamObj(ID_SOUND_BGM_TOWN); // ID + m_pSnd_Town = s_pEng->s_SndMgr.CreateStreamObj(ID_SOUND_BGM_TOWN); // 마을음악 ID if (m_pSnd_Town) { m_pSnd_Town->Looping(true); m_pSnd_Town->Play(NULL, 3.0f); @@ -312,15 +312,15 @@ void CGameProcMain::Init() { s_pUILoading->Render("Loading Character Data...", 0); } - // .. + // 경로 기억.. char szPathOld[_MAX_PATH], szPathFind[_MAX_PATH]; ::GetCurrentDirectory(_MAX_PATH, szPathOld); _finddata_t fi; long hFind = -1; - // ҽ б.. - // ϸ̼ б.. + // 리소스 다 읽기.. + // 에니메이션 다 읽기.. lstrcpy(szPathFind, szPathOld); lstrcat(szPathFind, "\\Chr"); ::SetCurrentDirectory(szPathFind); @@ -341,8 +341,8 @@ void CGameProcMain::Init() { s_pUILoading->Render("Loading Character Data... 10 %", 10); } - // ҽ б.. - // ؽó б.. + // 리소스 다 읽기.. + // 텍스처 다 읽기.. lstrcpy(szPathFind, szPathOld); lstrcat(szPathFind, "\\Item"); ::SetCurrentDirectory(szPathFind); @@ -363,8 +363,8 @@ void CGameProcMain::Init() { s_pUILoading->Render("Loading Character Data... 25 %", 25); } - // ҽ б.. - // Ʈ б.. + // 리소스 다 읽기.. + // 조인트 다 읽기.. lstrcpy(szPathFind, szPathOld); lstrcat(szPathFind, "\\Chr"); ::SetCurrentDirectory(szPathFind); @@ -385,8 +385,8 @@ void CGameProcMain::Init() { s_pUILoading->Render("Loading Character Data... 50 %", 50); } - // ҽ б.. - // Ų б.. + // 리소스 다 읽기.. + // 스킨 읽기.. lstrcpy(szPathFind, szPathOld); lstrcat(szPathFind, "\\Item"); ::SetCurrentDirectory(szPathFind); @@ -407,8 +407,8 @@ void CGameProcMain::Init() { s_pUILoading->Render("Loading Character Data... 75 %", 75); } - // ҽ б.. - // PMesh б.. + // 리소스 다 읽기.. + // PMesh 읽기.. lstrcpy(szPathFind, szPathOld); lstrcat(szPathFind, "\\Item"); ::SetCurrentDirectory(szPathFind); @@ -430,19 +430,19 @@ void CGameProcMain::Init() { } this->MsgSend_GameStart(); - // .. + // 경로 돌리기.. ::SetCurrentDirectory(szPathOld); } void CGameProcMain::InitPlayerPosition( - const __Vector3 & vPos) // ÷̾ ġ ʱȭ.. , ⺻ ϰ Ѵ. + const __Vector3 & vPos) // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. { __Vector3 vPosFinal = vPos; - float fYTerrain = ACT_WORLD->GetHeightWithTerrain(vPos.x, vPos.z); // ̰ .. - float fYObject = ACT_WORLD->GetHeightNearstPosWithShape(vPos, 1.0f); // Ʈ ̰ .. + float fYTerrain = ACT_WORLD->GetHeightWithTerrain(vPos.x, vPos.z); // 지형의 높이값 얻기.. + float fYObject = ACT_WORLD->GetHeightNearstPosWithShape(vPos, 1.0f); // 오브젝트에서 가장 가까운 높이값 얻기.. if (!s_pWorldMgr->IsIndoor()) { if (T_Abs(vPos.y - fYObject) < T_Abs(vPos.y - fYTerrain)) { - vPosFinal.y = fYObject; // ´.. + vPosFinal.y = fYObject; // 좀더 가까운 곳에 놓는다.. } else { vPosFinal.y = fYTerrain; } @@ -454,23 +454,23 @@ void CGameProcMain::InitPlayerPosition( } } - s_pPlayer->PositionSet(vPosFinal, true); // ij ġ .. + s_pPlayer->PositionSet(vPosFinal, true); // 캐릭터 위치 셋팅.. s_pPlayer->m_vPosFromServer = vPos; - m_vPlayerPosSended = vPos; // ֱٿ ġ .. - m_fMsgSendTimeMove = 0; // ð Ѵ.. + m_vPlayerPosSended = vPos; // 최근에 보낸 위치 세팅.. + m_fMsgSendTimeMove = 0; // 시간을 기록한다.. - this->CommandSitDown(false, false, true); // .. ɾִ ¿ ϸ.. װ ִ.. - this->TargetSelect(-1, false); // Ÿ .. - this->UpdateCameraAndLight(); // ī޶ Ʈ ٽ .. + this->CommandSitDown(false, false, true); // 일으켜 세운다.. 앉아있는 상태에서 워프하면.. 버그가 있다.. + this->TargetSelect(-1, false); // 타겟 해제.. + this->UpdateCameraAndLight(); // 카메라와 라이트 다시 계산.. - s_pPlayer->Action(PSA_BASIC, true, NULL, true); // ⺻ ڼ.. + s_pPlayer->Action(PSA_BASIC, true, NULL, true); // 강제로 기본 자세.. } void CGameProcMain::Tick() { - CGameProcedure::Tick(); // Ű, 콺 Է .. + CGameProcedure::Tick(); // 키, 마우스 입력 등등.. if (FALSE == m_bLoadComplete) { - return; // ε ȵǾ.. ư. + return; // 로딩이 안되었으면.. 돌아간다. } if (!s_pSocket->IsConnected()) { return; @@ -498,15 +498,15 @@ void CGameProcMain::Tick() { } #endif - DWORD dwMouseFlags = s_pLocalInput->MouseGetFlag(); // 콺 ư ÷ - LocalInput.h - this->ProcessLocalInput(dwMouseFlags); // Ű峪 콺 Է UI ó... + DWORD dwMouseFlags = s_pLocalInput->MouseGetFlag(); // 마우스 버튼 플래그 - LocalInput.h 참조 + this->ProcessLocalInput(dwMouseFlags); // 키보드나 마우스 입력은 UI 다음에 처리... - MsgSend_Continous(); // ð Ӱ ȸ, ݵ üũؼ Ŷ .. + MsgSend_Continous(); // 일정 시간마다 움직임과 회전값, 공격등을 체크해서 패킷 만들어 보냄.. - s_pPlayer->Tick(); // ÷̾ ƽ() + s_pPlayer->Tick(); // 플레이어 틱(갱신) s_pWorldMgr->Tick(); - s_pOPMgr->Tick(s_pPlayer->Position()); // ٸ ƽ() - // s_pFX->Tick(); //ο ī޶ ġ Render()Լ ű... + s_pOPMgr->Tick(s_pPlayer->Position()); // 다른 유저 관리자 틱(갱신) + // s_pFX->Tick(); //내부에서 카메라 값을 쓸 경우 위치가 오차가 생겨 Render()함수 안으로 옮김... __Vector3 ListenerPos = s_pPlayer->Position(); __Vector3 ListenerDir = s_pPlayer->Direction(); @@ -516,17 +516,17 @@ void CGameProcMain::Tick() { CN3SndObj::SetListenerPos(&ListenerPos); CN3SndObj::SetListenerOrientation(&ListenerDir, &ListenerUp); - this->UpdateUI_MiniMap(); // ̴ϸ Ʈ.. - this->UpdateUI_TargetBar(); // Ÿٹ ó.. - this->UpdateBGM(); // Ȳ ó.. - this->UpdateCameraAndLight(); // ī޶ Ʈ ó.. + this->UpdateUI_MiniMap(); // 미니맵 업데이트.. + this->UpdateUI_TargetBar(); // 타겟바 처리.. + this->UpdateBGM(); // 배경음악을 상황에 따라 처리.. + this->UpdateCameraAndLight(); // 카메라와 라이트 처리.. -// ProcessPlayerInclination(); // ó..( ־ 簡 ϸ ̲..). +// ProcessPlayerInclination(); // 경사 처리..(가만히 있어도 경사가 급하면 미끄러짐..). #ifdef _N3_64GRID_ - m_SMesh.Tick(s_pPlayer, &m_Terrain); // ޽ ƽ.() + m_SMesh.Tick(s_pPlayer, &m_Terrain); // 서버 메시 틱.(갱신) #endif - m_pUIStateBarAndMiniMap->UpdatePosition(s_pPlayer->Position(), s_pPlayer->Yaw()); // ġ Ʈ. + m_pUIStateBarAndMiniMap->UpdatePosition(s_pPlayer->Position(), s_pPlayer->Yaw()); // 위치 업데이트. if (m_pMagicSkillMng) { m_pMagicSkillMng->Tick(); @@ -539,7 +539,7 @@ void CGameProcMain::Tick() { } //////////////////////////////////////////////////////////////////////////////////// - // ƹ Ŷ Ⱥ 2ʿ ѹ N3_TIME_NOTIFY .. + // 아무 패킷도 안보냈으면 2초에 한번 N3_TIME_NOTIFY 보낸다.. float fTime = CN3Base::TimeGet(); static float fTimePrev = fTime; @@ -556,48 +556,48 @@ void CGameProcMain::Tick() { s_pSocket->m_iSendByteCount = 0; fTimeInterval1 = 0; } - // ƹ Ŷ Ⱥ 2ʿ ѹ N3_TIME_NOTIFY .. + // 아무 패킷도 안보냈으면 2초에 한번 N3_TIME_NOTIFY 보낸다.. //////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////// - // Ÿ̸ ƾ.. + // 타이머 비슷한 루틴.. static float fInterval2 = 0, fInterval3 = 0, fInterval4 = 0, fInterval5 = 0; fInterval2 += fTime - fTimePrev; fInterval3 += fTime - fTimePrev; fInterval4 += fTime - fTimePrev; fInterval5 += fTime - fTimePrev; m_fRequestGameSave += fTime - fTimePrev; - if (fInterval2 > 1200.0f) // û.. + if (fInterval2 > 1200.0f) // 저장 요청.. { - BYTE byBuff[4]; // .. - int iOffset = 0; // ɼ.. - s_pSocket->MP_AddByte(byBuff, iOffset, N3_REQUEST_GAME_SAVE); // û Ŀ.. - s_pSocket->Send(byBuff, iOffset); // .. + BYTE byBuff[4]; // 버퍼.. + int iOffset = 0; // 옵셋.. + s_pSocket->MP_AddByte(byBuff, iOffset, N3_REQUEST_GAME_SAVE); // 저장 요청 커멘드.. + s_pSocket->Send(byBuff, iOffset); // 보냄.. fInterval2 = 0.0f; } - if (fInterval3 > 10.0f) // ǵ üũ.. + if (fInterval3 > 10.0f) // 스피드핵 체크.. { - MsgSend_SpeedCheck(); // ǵ üũ ϱ + MsgSend_SpeedCheck(); // 스피드핵 체크 하기 fInterval3 = 0.0f; } - if (s_pPlayer->m_InfoBase.iLevel < 12 && fInterval4 > 20.0f) // ð ϳ ǥ.. + if (s_pPlayer->m_InfoBase.iLevel < 12 && fInterval4 > 20.0f) // 시간이 지나면 팁 하나씩 표시.. { std::string szMsg; ::_LoadStringFromResource(IDS_HELP_TIP_ALL, szMsg); - this->m_pUIMsgDlg->AddMsg(szMsg, 0xffffff00); // ǥ.. + this->m_pUIMsgDlg->AddMsg(szMsg, 0xffffff00); // 헬프 표시.. ::_LoadStringFromResource(IDS_HELP_TIP1 + rand() % 30, szMsg); - this->m_pUIMsgDlg->AddMsg(szMsg, 0xffffff00); // ǥ.. + this->m_pUIMsgDlg->AddMsg(szMsg, 0xffffff00); // 헬프 표시.. fInterval4 = 0; } - if (fInterval5 > 5.0f) // ð ϳ ǥ.. + if (fInterval5 > 5.0f) // 시간이 지나면 팁 하나씩 표시.. { - // m_pUIChatDlg->ChangeChattingMode(N3_CHAT_CONTINUE); // äø ٲٱ... + // m_pUIChatDlg->ChangeChattingMode(N3_CHAT_CONTINUE); // 채팅모드 강제로 바꾸기... m_pUIChatDlg->ShowContinueMsg(); fInterval5 = 0; } - // Ÿ̸ ƾ.. + // 타이머 비슷한 루틴.. //////////////////////////////////////////////////////////////////////////////////// // Exit Menu @@ -679,55 +679,55 @@ void CGameProcMain::Tick() { void CGameProcMain::Render() { if (FALSE == m_bLoadComplete) { - return; // ε ?? + return; // 로딩이 끝났냐?? } D3DCOLOR crSky = ACT_WORLD->GetSkyColorWithSky(); - s_pEng->Clear(crSky); // Ȱ ־ Ŭ.. -> ϴû Ŭ ؾ ϴ ´.. - s_pEng->BeginScene(); // ... + s_pEng->Clear(crSky); // 안개 색깔을 넣어서 클리어.. -> 하늘색깔로 클리어 해야 하늘이 제대로 나온다.. + s_pEng->BeginScene(); // 씬 렌더 ㅅ작... - ACT_WORLD->RenderSky(); // ϴ .. - float fSunAngle = ACT_WORLD->GetSunAngleByRadinWithSky(); // .. + ACT_WORLD->RenderSky(); // 하늘 렌더링.. + float fSunAngle = ACT_WORLD->GetSunAngleByRadinWithSky(); // 해의 각도를 가져오고.. DWORD dwFilter = D3DTEXF_LINEAR; CN3Base::s_lpD3DDev->SetSamplerState(0, D3DSAMP_MINFILTER, - dwFilter); // ؽĸ ٿ ȼ ó ̴ + dwFilter); // 텍스쳐를 줄여서 찍었을 경우 픽셀이 깨진것처럼 보이는 것 방지 CN3Base::s_lpD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, - dwFilter); // ؽĸ ÿ ȼ ó ̴ + dwFilter); // 텍스쳐를 늘여서 찍었을 경우 픽셀이 깨진것처럼 보이는 것 방지 CN3Base::s_lpD3DDev->SetSamplerState(0, D3DSAMP_MIPFILTER, - dwFilter); // ؽĸ ٿ ȼ ó ̴ + dwFilter); // 텍스쳐를 줄여서 찍었을 경우 픽셀이 깨진것처럼 보이는 것 방지 CN3Base::s_lpD3DDev->SetSamplerState(1, D3DSAMP_MINFILTER, - dwFilter); // ؽĸ ٿ ȼ ó ̴ + dwFilter); // 텍스쳐를 줄여서 찍었을 경우 픽셀이 깨진것처럼 보이는 것 방지 CN3Base::s_lpD3DDev->SetSamplerState(1, D3DSAMP_MAGFILTER, - dwFilter); // ؽĸ ÿ ȼ ó ̴ + dwFilter); // 텍스쳐를 늘여서 찍었을 경우 픽셀이 깨진것처럼 보이는 것 방지 CN3Base::s_lpD3DDev->SetSamplerState(1, D3DSAMP_MIPFILTER, - dwFilter); // ؽĸ ٿ ȼ ó ̴ + dwFilter); // 텍스쳐를 줄여서 찍었을 경우 픽셀이 깨진것처럼 보이는 것 방지 - ACT_WORLD->RenderTerrain(); // .. - ACT_WORLD->RenderShape(); // ü .. - s_pOPMgr->Render(fSunAngle); // ٸ ÷̾ .. - s_pPlayer->Render(fSunAngle); // ÷̾ .. + ACT_WORLD->RenderTerrain(); // 지형 렌더.. + ACT_WORLD->RenderShape(); // 물체 렌더.. + s_pOPMgr->Render(fSunAngle); // 다른 플레이어 렌더.. + s_pPlayer->Render(fSunAngle); // 플레이어 렌더.. #ifdef _DEBUG - ACT_WORLD->RenderCollisionWithShape(s_pPlayer->Position()); // 浹 ޽ .. + ACT_WORLD->RenderCollisionWithShape(s_pPlayer->Position()); // 충돌 메쉬 렌더.. #endif #ifdef _N3_64GRID_ - m_SMesh.Render(); // ޽ .. + m_SMesh.Render(); // 서버 메쉬 렌더.. #endif - this->RenderTarget(); // Ÿ ij Ȥ Ʈ .. + this->RenderTarget(); // 타겟으로 잡은 캐릭터 혹은 오브젝트 렌더링.. - ACT_WORLD->RenderGrass(); // Ǯ (asm) + ACT_WORLD->RenderGrass(); // 풀 렌더 (asm) s_pFX->Tick(); s_pFX->Render(); ACT_WORLD->RenderBirdMgr(); - CN3Base::s_AlphaMgr.Render(); // ĵ .. + CN3Base::s_AlphaMgr.Render(); // 알파 정렬된 폴리곤들 렌더링.. - ACT_WORLD->RenderSkyWeather(); // ϴ .. + ACT_WORLD->RenderSkyWeather(); // 하늘 렌더링.. - CGameProcedure::Render(); // UI ׹ ⺻ ͵ .. + CGameProcedure::Render(); // UI 나 그밖의 기본적인 것들 렌더링.. if (m_pWarMessage) { m_pWarMessage->RenderMessage(); } @@ -744,9 +744,9 @@ void CGameProcMain::RenderTarget() { return; } - // ÷̾ Ÿ ij ġ ׸ ȴ.. + // 플레이어가 타겟으로 잡은 캐릭터의 위치위에 그리면 된다.. CPlayerBase * pTarget = - s_pOPMgr->CharacterGetByID(s_pPlayer->m_iIDTarget, false); //ü DZ ij Ŀ ش. + s_pOPMgr->CharacterGetByID(s_pPlayer->m_iIDTarget, false); //시체로 판정되기 전까지의 캐릭은 포커스를 준다. if (NULL == pTarget && NULL == s_pPlayer->m_pObjectTarget) { return; } @@ -770,7 +770,7 @@ void CGameProcMain::RenderTarget() { m_pTargetSymbol->ScaleSet(fScale, fYScale, fScale); m_pTargetSymbol->PosSet(vPos); m_pTargetSymbol->Tick(); - if (m_pTargetSymbol->Part(1)) // ٴ ɹ ٴ .. + if (m_pTargetSymbol->Part(1)) // 바닥의 심벌을 땅바닥 위로 맞춘다.. { CN3PMesh * pPMesh = m_pTargetSymbol->Part(1)->Mesh(); if (pPMesh && pPMesh->GetMaxNumVertices() == 4) { @@ -804,9 +804,9 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { return true; } - int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ŀ Ľ.. + int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 커멘드 파싱.. - switch (iCmd) // Ŀ忡 ٶ б.. + switch (iCmd) // 커멘드에 다라서 분기.. { #ifdef _DEBUG case N3_TEMP_TEST: { @@ -824,7 +824,7 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { return true; #endif - case N3_MYINFO: // ޽.. + case N3_MYINFO: // 나의 정보 메시지.. this->MsgRecv_MyInfo_All(pDataPack, iOffset); return true; case N3_HP_CHANGE: @@ -836,7 +836,7 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { case N3_EXP_CHANGE: this->MsgRecv_MyInfo_EXP(pDataPack, iOffset); return true; - case N3_REALM_POINT_CHANGE: // ⿩.. + case N3_REALM_POINT_CHANGE: // 국가 기여도.. this->MsgRecv_MyInfo_RealmPoint(pDataPack, iOffset); return true; case N3_LEVEL_CHANGE: @@ -845,7 +845,7 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { case N3_POINT_CHANGE: this->MsgRecv_MyInfo_PointChange(pDataPack, iOffset); return true; - case N3_CHAT: // ä ޽.. + case N3_CHAT: // 채팅 메시지.. this->MsgRecv_Chat(pDataPack, iOffset); return true; case N3_WARP: { @@ -859,13 +859,13 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { } this->InitPlayerPosition( - __Vector3(fX, fY, fZ)); // ÷̾ ġ ʱȭ.. , ⺻ ϰ Ѵ. + __Vector3(fX, fY, fZ)); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. } return true; case N3_MOVE: this->MsgRecv_UserMove(pDataPack, iOffset); return true; - case N3_ROTATE: // ȸ Ŀ.. + case N3_ROTATE: // 회전 커멘드.. this->MsgRecv_Rotation(pDataPack, iOffset); return true; case N3_REGENE: { @@ -886,35 +886,35 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { case N3_WEATHER: this->MsgRecv_Weather(pDataPack, iOffset); return true; - case N3_USER_INOUT: // ٸ /ƿ.. + case N3_USER_INOUT: // 다른 유저 인/아웃.. this->MsgRecv_UserInOut(pDataPack, iOffset); return true; - case N3_UPDATE_REGION_UPC: // ÷ α׿ϸ ֺ ij͵ Ʈ... + case N3_UPDATE_REGION_UPC: // 첨에 로그온하면 그 주변 지역의 캐릭터들 업데이트... this->MsgRecv_UserInAndRequest(pDataPack, iOffset); return true; - case N3_REQUEST_USER_IN: // û UserIn ڼ ޱ.. + case N3_REQUEST_USER_IN: // 서버에 요청한 UserIn 에 대한 자세한 정보 받기.. this->MsgRecv_UserInRequested(pDataPack, iOffset); // return true; - case N3_UPDATE_REGION_NPC: // ÷ α׿ϸ ֺ ij͵ Ʈ... + case N3_UPDATE_REGION_NPC: // 첨에 로그온하면 그 주변 지역의 캐릭터들 업데이트... this->MsgRecv_NPCInAndRequest(pDataPack, iOffset); return true; - case N3_REQUEST_NPC_IN: // û UserIn ڼ ޱ.. + case N3_REQUEST_NPC_IN: // 서버에 요청한 UserIn 에 대한 자세한 정보 받기.. this->MsgRecv_NPCInRequested(pDataPack, iOffset); // return true; - case N3_NPC_INOUT: // NPC /ƿ.. + case N3_NPC_INOUT: // NPC 인/아웃.. this->MsgRecv_NPCInOut(pDataPack, iOffset); return true; case N3_ATTACK: this->MsgRecv_Attack(pDataPack, iOffset); return true; - case N3_NPC_MOVE: // NPC Ŷ.. + case N3_NPC_MOVE: // NPC 움직임 패킷.. this->MsgRecv_NPCMove(pDataPack, iOffset); return true; case N3_TARGET_HP: this->MsgRecv_TargetHP(pDataPack, iOffset); return true; case N3_ITEM_MOVE: - this->MsgRecv_ItemMove(pDataPack, iOffset); // Item Move .. + this->MsgRecv_ItemMove(pDataPack, iOffset); // Item Move에 대한 응답.. return true; case N3_ITEM_BUNDLE_DROP: this->MsgRecv_ItemBundleDrop(pDataPack, iOffset); @@ -929,7 +929,7 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { this->MsgRecv_ItemTradeResult(pDataPack, iOffset); return true; case N3_ITEM_DROPPED_GET: - this->MsgRecv_ItemDroppedGetResult(pDataPack, iOffset); // Ա .. + this->MsgRecv_ItemDroppedGetResult(pDataPack, iOffset); // 땅에 떨어진 아이템 먹기 결과.. return true; case N3_ITEM_TRADE_REPAIR: this->MsgRecv_NpcEvent(pDataPack, iOffset); @@ -951,7 +951,7 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { return true; case N3_ZONE_CHANGE: this->MsgRecv_ZoneChange(pDataPack, iOffset); - this->MsgSend_ZoneChangeComplete(); // Zone Loading Ϸ Ŷ .. + this->MsgSend_ZoneChangeComplete(); // Zone Loading 완료 패킷 보냄.. return true; case N3_STATE_CHANGE: this->MsgRecv_UserState(pDataPack, iOffset); @@ -979,8 +979,8 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { return true; case N3_CHAT_SELECT_TARGET: { std::string szID, szMsg; - int iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID ڿ .. - CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szID, iLen); // ID ڿ.. + int iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID 문자열 길이.. + CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szID, iLen); // ID 문자열.. e_ChatMode eCM = N3_CHAT_UNKNOWN; if (szID.empty()) { @@ -992,12 +992,12 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { } this->MsgOutput(szID + szMsg, 0xffffff00); - m_pUIChatDlg->ChangeChattingMode(eCM); // ڵ ӼӸ ٲپ ش.. + m_pUIChatDlg->ChangeChattingMode(eCM); // 자동으로 귓속말 모드로 바꾸어 준다.. } return true; - case N3_CONCURRENT_USER_COUNT: // ڼ ... + case N3_CONCURRENT_USER_COUNT: // 동시 접속자수 ... { - int iUserCount = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID ڿ .. + int iUserCount = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID 문자열 길이.. std::string szFmt; ::_LoadStringFromResource(IDS_FMT_CONCURRENT_USER_COUNT, szFmt); @@ -1015,14 +1015,14 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { case N3_KNIGHTS_LIST_BASIC: this->MsgRecv_KnightsListBasic(pDataPack, iOffset); return true; - case N3_COMPRESSED_PACKET: // ̴... ѹ Ľؾ Ѵ!!! + case N3_COMPRESSED_PACKET: // 압축된 데이터 이다... 한번 더 파싱해야 한다!!! this->MsgRecv_CompressedPacket(pDataPack, iOffset); return true; - case N3_CONTINOUS_PACKET: // ̴... ѹ Ľؾ Ѵ!!! + case N3_CONTINOUS_PACKET: // 압축된 데이터 이다... 한번 더 파싱해야 한다!!! this->MsgRecv_ContinousPacket(pDataPack, iOffset); return true; - case N3_WAREHOUSE: // .. - this->MsgRecv_WareHouse(pDataPack, iOffset); // Ŷ.. + case N3_WAREHOUSE: // 보관함.. + this->MsgRecv_WareHouse(pDataPack, iOffset); // 보관함 관련 패킷.. return true; case N3_FRIEND_INFO: if (m_pUIVar->m_pPageFriends) { @@ -1041,7 +1041,7 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { // case N3_SERVER_CONCURRENT_CONNECT: // this->MsgRecv_ConcurrentUserCountAndSendServerCheck(pDataPack, iOffset); // return true; - case N3_CORPSE_CHAR: //regen Ͽ ü ˸. + case N3_CORPSE_CHAR: //regen을 하여 주위 유저에게 시체임을 알린다. this->MsgRecv_Corpse(pDataPack, iOffset); return true; case N3_PARTY_BBS: @@ -1072,20 +1072,20 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { return false; } -// Ű 콺 óѴ.. +// 키보드와 마우스 눌린것을 처리한다.. void CGameProcMain::ProcessLocalInput(DWORD dwMouseFlags) { - // Loading .. + // Loading이 된 후.. if (FALSE == m_bLoadComplete) { return; } - if (m_pSubProcPerTrade->m_ePerTradeState != PER_TRADE_STATE_NONE) { /* ΰ ŷ ̸.. */ + if (m_pSubProcPerTrade->m_ePerTradeState != PER_TRADE_STATE_NONE) { /* 개인간 상거래 중이면.. */ return; } ////////////////////////////////////////// // - // 콺 ó. + // 마우스 처리. // POINT ptPrev = s_pLocalInput->MouseGetPosOld(); POINT ptCur = s_pLocalInput->MouseGetPos(); @@ -1120,7 +1120,7 @@ void CGameProcMain::ProcessLocalInput(DWORD dwMouseFlags) { m_fRotateValue = 0.0f; } - // 콺 ī޶ ȸ... + // 마우스에 따른 카메라 회전... float fRotY = 0, fRotX = 0; if (0 == ptCur.x) { fRotY = -2.0f; @@ -1144,12 +1144,12 @@ void CGameProcMain::ProcessLocalInput(DWORD dwMouseFlags) { } // - // 콺 ó. + // 마우스 처리. // ////////////////////////////////////////// ////////////////////////////////////////// - // Ű + // 핫키 int iHotKey = -1; if (s_pLocalInput->IsKeyPress(KM_HOTKEY1)) { iHotKey = 0; @@ -1173,62 +1173,62 @@ void CGameProcMain::ProcessLocalInput(DWORD dwMouseFlags) { m_pSubProcPerTrade->m_ePerTradeState == PER_TRADE_STATE_NONE) { m_pUIHotKeyDlg->EffectTriggerByHotKey(iHotKey); } - // Ű + // 핫키 ////////////////////////////////////////// - if (s_pLocalInput->IsKeyPress(KM_CAMERA_CHANGE)) // ȯ.. + if (s_pLocalInput->IsKeyPress(KM_CAMERA_CHANGE)) // 시점 변환.. { - this->CommandCameraChange(); // ī޶ ٲٱ.. + this->CommandCameraChange(); // 카메라 시점 바꾸기.. } - // Ī϶ Ȩ, Ű ī޷ ø .. + // 삼인칭일때 홈, 엔드키로 카메로 올리고 내리기.. if (s_pEng->ViewPoint() == VP_THIRD_PERSON) { float fPitch = 0; if (s_pLocalInput->IsKeyDown(DIK_HOME)) { - fPitch = D3DXToRadian(45.0f); // home Ű .. + fPitch = D3DXToRadian(45.0f); // home 키가 눌리면.. } else if (s_pLocalInput->IsKeyDown(DIK_END)) { - fPitch = D3DXToRadian(-45.0f); // End Ű .. + fPitch = D3DXToRadian(-45.0f); // End 키가 눌리면.. } if (fPitch) { s_pEng->CameraPitchAdd(fPitch); } } - if (!IsUIKeyOperated() && NULL == CN3UIBase::GetFocusedEdit()) // äø尡 ƴҶ + if (!IsUIKeyOperated() && NULL == CN3UIBase::GetFocusedEdit()) // 채팅모드가 아닐때 { #ifdef _DEBUG if (s_pLocalInput->IsKeyDown(DIK_Q)) { - s_pPlayer->m_bTempMoveTurbo = true; // û ̰ Ѵ.. // ӽ Լ.. ߿ .. + s_pPlayer->m_bTempMoveTurbo = true; // 엄청 빨리 움직이게 한다.. // 임시 함수.. 나중에 없애자.. } else { - s_pPlayer->m_bTempMoveTurbo = false; // û ̰ Ѵ.. // ӽ Լ.. ߿ .. + s_pPlayer->m_bTempMoveTurbo = false; // 엄청 빨리 움직이게 한다.. // 임시 함수.. 나중에 없애자.. } #endif - if (s_pPlayer->m_InfoBase.iAuthority == AUTHORITY_MANAGER) // ڴ Ҽ ִ. + if (s_pPlayer->m_InfoBase.iAuthority == AUTHORITY_MANAGER) //게임 운영자는 이 기능을 사용할수 있다. { if (s_pLocalInput->IsKeyDown(DIK_Q)) { - s_pPlayer->m_bTempMoveTurbo = true; // û ̰ Ѵ.. // ӽ Լ.. ߿ .. + s_pPlayer->m_bTempMoveTurbo = true; // 엄청 빨리 움직이게 한다.. // 임시 함수.. 나중에 없애자.. } else { - s_pPlayer->m_bTempMoveTurbo = false; // û ̰ Ѵ.. // ӽ Լ.. ߿ .. + s_pPlayer->m_bTempMoveTurbo = false; // 엄청 빨리 움직이게 한다.. // 임시 함수.. 나중에 없애자.. } } if (s_pLocalInput->IsKeyPress(KM_TOGGLE_ATTACK)) { - this->CommandToggleAttackContinous(); // ڵ ..} + this->CommandToggleAttackContinous(); // 자동 공격..} } if (s_pLocalInput->IsKeyPress(KM_TOGGLE_RUN)) { - this->CommandToggleWalkRun(); // ȱ / ٱ + this->CommandToggleWalkRun(); // 걷기 / 뛰기 토글 } if (s_pLocalInput->IsKeyPress(KM_TARGET_NEARST_ENEMY)) { - this->CommandTargetSelect_NearstEnemy(); // Ÿ .. + this->CommandTargetSelect_NearstEnemy(); // 가장 가까운 적 타겟 잡기.. } if (s_pLocalInput->IsKeyPress(KM_TARGET_NEARST_PARTY)) { - this->CommandTargetSelect_NearstOurForce(); // Ƽ Ÿ.. + this->CommandTargetSelect_NearstOurForce(); // 가장 가까운 파티 타겟잡기.. } - float fRotKeyDelta = D3DXToRadian(60); // ʴ 60 .. + float fRotKeyDelta = D3DXToRadian(60); // 초당 60 도 돌기.. if (s_pLocalInput->IsKeyDown(KM_ROTATE_LEFT) || s_pLocalInput->IsKeyDown(DIK_LEFT)) { if (s_pPlayer->IsAlive()) { - s_pPlayer->RotAdd(-fRotKeyDelta); // ʴ 180 . + s_pPlayer->RotAdd(-fRotKeyDelta); // 초당 180 도 왼쪽으로 돌기. } if (m_pUIDroppedItemDlg->IsVisible()) { m_pUIDroppedItemDlg->LeaveDroppedState(); @@ -1236,7 +1236,7 @@ void CGameProcMain::ProcessLocalInput(DWORD dwMouseFlags) { } if (s_pLocalInput->IsKeyDown(KM_ROTATE_RIGHT) || s_pLocalInput->IsKeyDown(DIK_RIGHT)) { if (s_pPlayer->IsAlive()) { - s_pPlayer->RotAdd(fRotKeyDelta); // ʴ 180 . + s_pPlayer->RotAdd(fRotKeyDelta); // 초당 180 도 오른쪽으로 돌기. } if (m_pUIDroppedItemDlg->IsVisible()) { m_pUIDroppedItemDlg->LeaveDroppedState(); @@ -1255,10 +1255,10 @@ void CGameProcMain::ProcessLocalInput(DWORD dwMouseFlags) { CommandToggleAttackContinous(); } } else { - bStart = true; // ̸ + bStart = true; // 누르는 순간이면 } } - this->CommandMove(MD_FOWARD, bStart); // ̵.. + this->CommandMove(MD_FOWARD, bStart); // 앞으로 이동.. } else if (s_pLocalInput->IsKeyDown(KM_MOVE_BACKWARD) || s_pLocalInput->IsKeyDown(DIK_DOWN)) { bool bStart = false; if (s_pLocalInput->IsKeyPress(KM_MOVE_BACKWARD) || s_pLocalInput->IsKeyPress(DIK_DOWN)) { @@ -1271,17 +1271,17 @@ void CGameProcMain::ProcessLocalInput(DWORD dwMouseFlags) { CommandToggleAttackContinous(); } } else { - bStart = true; // ̸ + bStart = true; // 누르는 순간이면 } } - this->CommandMove(MD_BACKWARD, bStart); // ڷ ̵.. + this->CommandMove(MD_BACKWARD, bStart); // 뒤로 이동.. } else if (s_pLocalInput->IsKeyPress(KM_TOGGLE_MOVE_CONTINOUS)) { this->CommandToggleMoveContinous(); } if (s_pLocalInput->IsKeyPressed(KM_MOVE_FOWARD) || s_pLocalInput->IsKeyPressed(DIK_UP) || s_pLocalInput->IsKeyPressed(KM_MOVE_BACKWARD) || - s_pLocalInput->IsKeyPressed(DIK_DOWN)) // / Ű . + s_pLocalInput->IsKeyPressed(DIK_DOWN)) // 전진/후진 키를 떼는 순간. { this->CommandMove(MD_STOP, true); } @@ -1325,15 +1325,15 @@ void CGameProcMain::ProcessLocalInput(DWORD dwMouseFlags) { } // end of if ( !m_UIChatDlg.IsChatMode() ) - // ..... Ű ó.. + // ..... 나머지 키보드 처리.. #if _DEBUG - if (s_pLocalInput->IsKeyPress(DIK_F12)) { // ׽Ʈ.. - s_pEng->Lightning(); // ġ.. + if (s_pLocalInput->IsKeyPress(DIK_F12)) { // 디버깅 테스트.. + s_pEng->Lightning(); // 번개 치기.. } #endif } -void CGameProcMain::ProcessPlayerInclination() // 翡 .. +void CGameProcMain::ProcessPlayerInclination() // 경사에 서 있을때.. { /* float fFrm = GetIndepTimeFrame(); @@ -1356,24 +1356,24 @@ void CGameProcMain::ProcessLocalInput(DWORD dwMouseFlags) { // ////////////////////////////////////////////////////////////////////// -void CGameProcMain::MsgSend_Continous() // Ư (?)Ͽ ޽ .. +void CGameProcMain::MsgSend_Continous() // 특정 조건(?)하에서 서버에게 정기적으로 메시지를 보냄.. { float fTime = s_pEng->TimeGet(); - if (fTime >= m_fMsgSendTimeMove + PACKET_INTERVAL_MOVE) // 1ʰ .. + if (fTime >= m_fMsgSendTimeMove + PACKET_INTERVAL_MOVE) // 1초가 지났으면.. { __Vector3 vPos = s_pPlayer->Position(); if (m_vPlayerPosSended != vPos) { - this->MsgSend_Move(true, true); // ̶ Ŷ .. + this->MsgSend_Move(true, true); // 조금이라도 움직였으면 움직임 패킷 보냄.. } } if (false == s_pPlayer->m_bMoveContinous && - fTime >= m_fMsgSendTimeRot + PACKET_INTERVAL_ROTATE) // ÷̾ ְ.. 2ʰ .. + fTime >= m_fMsgSendTimeRot + PACKET_INTERVAL_ROTATE) // 플레이어가 정지해 있고.. 2초가 지났으면.. { float fYaw = s_pPlayer->Yaw(); if (fYaw != m_fPlayerYawSended) { - MsgSend_Rotation(); // ̶ ȸ ȸ Ŷ + MsgSend_Rotation(); // 조금이라도 회전했으면 회전 패킷 보냄 } } } @@ -1383,28 +1383,28 @@ void CGameProcMain::ProcessLocalInput(DWORD dwMouseFlags) { ////////////////////////////////////////////////////////////////////// void CGameProcMain::MsgSend_Attack(int iTargetID, float fInterval, - float fDistance) // Ŷ - ̺ ֱ⸦ ༭ ŷ ´. + float fDistance) // 공격 패킷 날리기 - 테이블의 공격 주기를 같이 줘서 해킹을 막는다. { if (s_pPlayer->m_fTimeAfterDeath > 0 || s_pPlayer->IsDead()) { - return; // ̴.. + return; // 죽은 넘이다.. } - BYTE byBuff[32]; // .. - int iOffset = 0; // ɼ.. + BYTE byBuff[32]; // 버퍼.. + int iOffset = 0; // 옵셋.. BYTE bySuccess = true; - CAPISocket::MP_AddByte(byBuff, iOffset, N3_ATTACK); // Ŀ.. - CAPISocket::MP_AddByte(byBuff, iOffset, 0x01); // ??? ?? - CAPISocket::MP_AddByte(byBuff, iOffset, bySuccess); // .. - ϴ . + CAPISocket::MP_AddByte(byBuff, iOffset, N3_ATTACK); // 공격 커멘드.. + CAPISocket::MP_AddByte(byBuff, iOffset, 0x01); // ??? 데미지?? + CAPISocket::MP_AddByte(byBuff, iOffset, bySuccess); // 성공 여부.. - 일단 성공으로 보낸다. fInterval += 0.1f; - CAPISocket::MP_AddShort(byBuff, iOffset, iTargetID); // ̵.. - CAPISocket::MP_AddShort(byBuff, iOffset, (int)(fInterval * 100)); // ð - CAPISocket::MP_AddShort(byBuff, iOffset, (int)(fDistance * 10)); // Ÿ + CAPISocket::MP_AddShort(byBuff, iOffset, iTargetID); // 상대방 아이디.. + CAPISocket::MP_AddShort(byBuff, iOffset, (int)(fInterval * 100)); // 공격한 시간 + CAPISocket::MP_AddShort(byBuff, iOffset, (int)(fDistance * 10)); // 공격한 거리 - s_pSocket->Send(byBuff, iOffset); // .. + s_pSocket->Send(byBuff, iOffset); // 보냄.. } void CGameProcMain::MsgSend_Move(bool bMove, bool bContinous) { @@ -1413,15 +1413,15 @@ void CGameProcMain::MsgSend_Move(bool bMove, bool bContinous) { BYTE byMoveFlag = 0; - if (true == bMove) // ̱ Ҷ ϶ + if (true == bMove) // 움직이기 시작할때나 움직일때는 { if (s_pPlayer->m_fTimeAfterDeath > 0 || s_pPlayer->IsDead()) { - return; // ̴.. + return; // 죽은 넘이다.. } - vPos = s_pPlayer->NextPos(PACKET_INTERVAL_MOVE); // 1 ġ ؼ. + vPos = s_pPlayer->NextPos(PACKET_INTERVAL_MOVE); // 다음 1초후의 위치를 계산해서. byMoveFlag |= 0x01; - } else // ÿ + } else // 정지시에는 { s_pPlayer->m_bTargetOrPosMove = false; s_pPlayer->m_iMoveTarget = -1; @@ -1429,46 +1429,46 @@ void CGameProcMain::MsgSend_Move(bool bMove, bool bContinous) { fSpeed = 0; } - if (true == bContinous) // ̴ Ŷ.. + if (true == bContinous) // 정기적으로 움직이는 거라면.. { byMoveFlag |= 0x02; } - BYTE byBuff[64]; // .. - int iOffset = 0; // ɼ.. + BYTE byBuff[64]; // 버퍼 설정.. + int iOffset = 0; // 옵셋.. - CAPISocket::MP_AddByte(byBuff, iOffset, N3_MOVE); // Ŀ.. - CAPISocket::MP_AddWord(byBuff, iOffset, vPos.x * 10); // ġ + CAPISocket::MP_AddByte(byBuff, iOffset, N3_MOVE); // 커멘드.. + CAPISocket::MP_AddWord(byBuff, iOffset, vPos.x * 10); // 다음 위치 CAPISocket::MP_AddWord(byBuff, iOffset, vPos.z * 10); CAPISocket::MP_AddShort(byBuff, iOffset, vPos.y * 10); - CAPISocket::MP_AddWord(byBuff, iOffset, fSpeed * 10); // ӵ - CAPISocket::MP_AddByte(byBuff, iOffset, byMoveFlag); // ÷.. - s_pSocket->Send(byBuff, iOffset); // Ŷ .. + CAPISocket::MP_AddWord(byBuff, iOffset, fSpeed * 10); // 속도 + CAPISocket::MP_AddByte(byBuff, iOffset, byMoveFlag); // 움직임 플래그.. + s_pSocket->Send(byBuff, iOffset); // 패킷을 보냄.. - m_vPlayerPosSended = s_pPlayer->Position(); // ֱٿ ġ .. + m_vPlayerPosSended = s_pPlayer->Position(); // 최근에 보낸 위치 세팅.. if (true == bMove) { - m_fMsgSendTimeMove = CN3Base::TimeGet(); // ð Ѵ.. + m_fMsgSendTimeMove = CN3Base::TimeGet(); // 시간을 기록한다.. } } void CGameProcMain::MsgSend_Rotation() { if (s_pPlayer->IsDead()) { - return; // !! + return; // 죽은 넘이 어딜 감히!! } BYTE byBuff[8]; int iOffset = 0; - float fYaw = s_pPlayer->Yaw(); // .. + float fYaw = s_pPlayer->Yaw(); // 방향.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_ROTATE); CAPISocket::MP_AddShort(byBuff, iOffset, fYaw * 100); s_pSocket->Send(byBuff, iOffset); - m_fPlayerYawSended = fYaw; // ȸ - m_fMsgSendTimeRot = CN3Base::TimeGet(); // ð Ѵ.. + m_fPlayerYawSended = fYaw; // 회전값을 기록 + m_fMsgSendTimeRot = CN3Base::TimeGet(); // 시간을 기록한다.. } void CGameProcMain::MsgSend_Chat(e_ChatMode eMode, const std::string & szChat) { @@ -1488,7 +1488,7 @@ void CGameProcMain::MsgSend_Chat(e_ChatMode eMode, const std::string & szChat) { CAPISocket::MP_AddString(byBuff, iOffset, szChat); __ASSERT(iOffset < 512, "Send Buffer OverFlow"); - s_pSocket->Send(byBuff, iOffset); // .. + s_pSocket->Send(byBuff, iOffset); // 보낸다.. } void CGameProcMain::MsgSend_ChatSelectTarget(const std::string & szTargetID) { @@ -1508,21 +1508,21 @@ void CGameProcMain::MsgSend_ChatSelectTarget(const std::string & szTargetID) { void CGameProcMain::MsgSend_Regen() { if (s_pPlayer->m_iSendRegeneration >= 2) { - return; // ѹ ٽ Ⱥ ÷ + return; // 한번 보내면 다시 죽을때까지 안보내는 플래그 } BYTE byBuff[4]; int iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, N3_REGENE); - CAPISocket::MP_AddByte(byBuff, iOffset, 1); //1: Ƴ.. + CAPISocket::MP_AddByte(byBuff, iOffset, 1); //1: 마을로 살아나기.. CLogWriter::Write("Send Regeneration"); - s_pSocket->Send(byBuff, iOffset); // .. + s_pSocket->Send(byBuff, iOffset); // 보낸다.. - s_pPlayer->m_iSendRegeneration = 2; // ѹ ٽ Ⱥ ÷ - TRACE(" - ٽ Ƴ\n"); + s_pPlayer->m_iSendRegeneration = 2; // 한번 보내면 다시 죽을때까지 안보내는 플래그 + TRACE("보냄 - 다시 살아나기\n"); } bool CGameProcMain::MsgSend_RequestItemBundleOpen(CPlayerNPC * pCorpse) { @@ -1538,7 +1538,7 @@ bool CGameProcMain::MsgSend_RequestItemBundleOpen(CPlayerNPC * pCorpse) { int iItemBundleID = pCorpse->m_iDroppedItemID; m_pUIDroppedItemDlg->m_iItemBundleID = pCorpse->m_iDroppedItemID; - s_pOPMgr->CorpseRemove(pCorpse, false); // ϰ ش.. + s_pOPMgr->CorpseRemove(pCorpse, false); // 점점 투명하게 없앤다.. BYTE byBuff[8]; int iOffset = 0; @@ -1546,7 +1546,7 @@ bool CGameProcMain::MsgSend_RequestItemBundleOpen(CPlayerNPC * pCorpse) { CAPISocket::MP_AddByte(byBuff, iOffset, N3_ITEM_BUNDLE_OPEN_REQUEST); CAPISocket::MP_AddDword(byBuff, iOffset, iItemBundleID); - s_pSocket->Send(byBuff, iOffset); // .. + s_pSocket->Send(byBuff, iOffset); // 보낸다.. return true; } @@ -1560,7 +1560,7 @@ void CGameProcMain::MsgSend_PartyOrForcePermit(int iPartyOrForce, bool bYesNo) { CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_PARTY_OR_FORCE_PERMIT); CAPISocket::MP_AddByte(byBuff, iOffset, bYesNo); - s_pSocket->Send(byBuff, iOffset); // .. + s_pSocket->Send(byBuff, iOffset); // 보낸다.. } bool CGameProcMain::MsgSend_PartyOrForceCreate(int iPartyOrForce, const std::string & szID) { @@ -1573,7 +1573,7 @@ bool CGameProcMain::MsgSend_PartyOrForceCreate(int iPartyOrForce, const std::str CPlayerBase * pTarget = NULL; this->PartyOrForceConditionGet(bIAmLeader, bIAmMember, iMemberIndex, pTarget); if (true == bIAmMember && false == bIAmLeader) { - return false; // Ƽ ְ ƴϸ .. + return false; // 내가 파티에 들어 있고 리더가 아니면 실패.. } BYTE byBuff[32]; @@ -1592,23 +1592,23 @@ bool CGameProcMain::MsgSend_PartyOrForceCreate(int iPartyOrForce, const std::str CAPISocket::MP_AddShort(byBuff, iOffset, szID.size()); CAPISocket::MP_AddString(byBuff, iOffset, szID); - s_pSocket->Send(byBuff, iOffset); // .. + s_pSocket->Send(byBuff, iOffset); // 보낸다.. - if (m_pUIPartyOrForce->MemberCount() <= 0) // ó ϴ ... + if (m_pUIPartyOrForce->MemberCount() <= 0) // 처음 생성하는 경우... { m_pUIPartyOrForce->MemberAdd(s_pPlayer->IDNumber(), s_pPlayer->IDString(), s_pPlayer->m_InfoBase.iLevel, s_pPlayer->m_InfoBase.eClass, s_pPlayer->m_InfoBase.iHP, - s_pPlayer->m_InfoBase.iHPMax); // ̸ ־ ´.. + s_pPlayer->m_InfoBase.iHPMax); // 내건 미리 넣어 놓는다.. } - TRACE("Party or Force û - Target ID(%s)\n", szID.c_str()); + TRACE("Party or Force 생성 신청 - Target ID(%s)\n", szID.c_str()); return true; } void CGameProcMain::MsgSend_PartyOrForceLeave(int iPartyOrForce) { if (m_pUIPartyOrForce->MemberCount() <= 0) { - return; // Ƽ .. + return; // 파티원이 없다.. } CPlayerBase * pTarget = NULL; @@ -1621,22 +1621,22 @@ void CGameProcMain::MsgSend_PartyOrForceLeave(int iPartyOrForce) { CAPISocket::MP_AddByte(byBuff, iOffset, N3_PARTY_OR_FORCE); // CAPISocket::MP_AddByte(byBuff, iOffset, iPartyOrForce); - if (bIAmLeader) // ϰ.. + if (bIAmLeader) // 내가 리더일경우.. { - if (iMemberIndex > 0 && pTarget) // Ƽ̴.. ѾƳ.. + if (iMemberIndex > 0 && pTarget) // 파티원이다.. 쫓아내자.. { CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_PARTY_OR_FORCE_REMOVE); CAPISocket::MP_AddShort(byBuff, iOffset, pTarget->IDNumber()); - } else // Ÿ Ƽ ƴϸ Ƽ ǰ.. + } else // 타겟이 파티원이 아니면 파티 뽀개기.. { CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_PARTY_OR_FORCE_DESTROY); } - } else if (bIAmMember) // ƴϸ Ż ޽ .. + } else if (bIAmMember) // 리더가 아니면 탈퇴 메시지를 보낸다.. { CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_PARTY_OR_FORCE_REMOVE); CAPISocket::MP_AddShort(byBuff, iOffset, s_pPlayer->IDNumber()); } - s_pSocket->Send(byBuff, iOffset); // .. + s_pSocket->Send(byBuff, iOffset); // 보낸다.. } void CGameProcMain::MsgSend_ObjectEvent(int iEventID, int iNPCID) { @@ -1647,7 +1647,7 @@ void CGameProcMain::MsgSend_ObjectEvent(int iEventID, int iNPCID) { CAPISocket::MP_AddShort(byBuff, iOffset, iEventID); // Index CAPISocket::MP_AddShort(byBuff, iOffset, iNPCID); // Parameter - s_pSocket->Send(byBuff, iOffset); // .. + s_pSocket->Send(byBuff, iOffset); // 보낸다.. } void CGameProcMain::MsgSend_Weather(int iWeather, int iPercent) { @@ -1661,9 +1661,9 @@ void CGameProcMain::MsgSend_Weather(int iWeather, int iPercent) { BYTE byBuff[8]; int iOffset = 0; - CAPISocket::MP_AddByte(byBuff, iOffset, N3_WEATHER); // -> byte - .... 0x01 - .. 0x02 - 0x03 - CAPISocket::MP_AddByte(byBuff, iOffset, iWeather); // -> byte - .... 0x01 - .. 0x02 - 0x03 - CAPISocket::MP_AddShort(byBuff, iOffset, (short)iPercent); // short -> Ȱ, , ۼƮ + CAPISocket::MP_AddByte(byBuff, iOffset, N3_WEATHER); // -> byte - 기후.... 0x01 - 맑음.. 0x02 - 비 0x03 + CAPISocket::MP_AddByte(byBuff, iOffset, iWeather); // -> byte - 기후.... 0x01 - 맑음.. 0x02 - 비 0x03 + CAPISocket::MP_AddShort(byBuff, iOffset, (short)iPercent); // short -> 맑은날 안개, 비, 눈 의 양 퍼센트로 s_pSocket->Send(byBuff, iOffset); } @@ -1690,7 +1690,7 @@ void CGameProcMain::MsgSend_Administrator(e_SubPacket_Administrator eSP, const s BYTE byBuff[64]; int iOffset = 0; - CAPISocket::MP_AddByte(byBuff, iOffset, N3_ADMINISTRATOR); // Ŷ.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_ADMINISTRATOR); // 관리자 전용패킷.. CAPISocket::MP_AddByte(byBuff, iOffset, eSP); CAPISocket::MP_AddShort(byBuff, iOffset, szID.size()); CAPISocket::MP_AddString(byBuff, iOffset, szID); @@ -1702,7 +1702,7 @@ void CGameProcMain::MsgSend_KnightsJoinReq(bool bJoin) { BYTE byBuff[8]; int iOffset = 0; - CAPISocket::MP_AddByte(byBuff, iOffset, N3_KNIGHTS); // Ŷ.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_KNIGHTS); // 관리자 전용패킷.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_KNIGHTS_JOIN_REQ); CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)bJoin); CAPISocket::MP_AddShort(byBuff, iOffset, (short)m_iJoinReqClanRequierID); @@ -1715,7 +1715,7 @@ void CGameProcMain::MsgSend_KnightsJoin(int iTargetID) { BYTE byBuff[4]; int iOffset = 0; - CAPISocket::MP_AddByte(byBuff, iOffset, N3_KNIGHTS); // Ŷ.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_KNIGHTS); // 관리자 전용패킷.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_KNIGHTS_JOIN); CAPISocket::MP_AddShort(byBuff, iOffset, (short)iTargetID); @@ -1728,10 +1728,10 @@ void CGameProcMain::MsgSend_KnightsLeave(std::string & szName) { int iLen = szName.size(); - CAPISocket::MP_AddByte(byBuff, iOffset, N3_KNIGHTS); // Ŷ.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_KNIGHTS); // 관리자 전용패킷.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_KNIGHTS_MEMBER_REMOVE); CAPISocket::MP_AddShort(byBuff, iOffset, (short)iLen); - CAPISocket::MP_AddString(byBuff, iOffset, szName); // ̵ ڿ Ŷ ֱ.. + CAPISocket::MP_AddString(byBuff, iOffset, szName); // 아이디 문자열 패킷에 넣기.. s_pSocket->Send(byBuff, iOffset); } @@ -1750,23 +1750,23 @@ void CGameProcMain::MsgSend_KnightsAppointViceChief(std::string & szName) { int iLen = szName.size(); - CAPISocket::MP_AddByte(byBuff, iOffset, N3_KNIGHTS); // Ŷ.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_KNIGHTS); // 관리자 전용패킷.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_KNIGHTS_APPOINT_VICECHIEF); CAPISocket::MP_AddShort(byBuff, iOffset, (short)iLen); - CAPISocket::MP_AddString(byBuff, iOffset, szName); // ̵ ڿ Ŷ ֱ.. + CAPISocket::MP_AddString(byBuff, iOffset, szName); // 아이디 문자열 패킷에 넣기.. s_pSocket->Send(byBuff, iOffset); } bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { int iZone = s_pPlayer->m_InfoExt.iZoneCur; - s_pPlayer->Release(); // ϴ â ϰ.... + s_pPlayer->Release(); // 일단 몽창 다 해제 하고.... s_pPlayer->m_InfoExt.iZoneCur = iZone; int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); int iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); std::string szID; CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szID, iLen); - s_pPlayer->IDSet(iID, szID, D3DCOLOR_XRGB(100, 210, 255)); // Ķ ϴû ߰.. + s_pPlayer->IDSet(iID, szID, D3DCOLOR_XRGB(100, 210, 255)); // 밝은 파란색과 하늘색 중간.. float fX = (CAPISocket::Parse_GetWord(pDataPack->m_pData, iOffset)) / 10.0f; float fZ = (CAPISocket::Parse_GetWord(pDataPack->m_pData, iOffset)) / 10.0f; @@ -1775,24 +1775,24 @@ bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { s_pPlayer->m_InfoBase.eNation = (e_Nation)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); s_pPlayer->m_InfoBase.eRace = (e_Race)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); s_pPlayer->m_InfoBase.eClass = (e_Class)CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); - s_pPlayer->m_InfoExt.iFace = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // .. - s_pPlayer->m_InfoExt.iHair = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ӹī + s_pPlayer->m_InfoExt.iFace = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 얼굴 모양.. + s_pPlayer->m_InfoExt.iHair = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 머리카락 __TABLE_PLAYER_LOOKS * pLooks = - s_pTbl_UPC_Looks->Find(s_pPlayer->m_InfoBase.eRace); // User Player Character Skin ü .. + s_pTbl_UPC_Looks->Find(s_pPlayer->m_InfoBase.eRace); // User Player Character Skin 구조체 포인터.. if (NULL == pLooks) { CLogWriter::Write("CGameProcMain::MsgRecv_MyInfo_All : failed find character resource data (Race : %d)", s_pPlayer->m_InfoBase.eRace); } __ASSERT(pLooks, "failed find character resource data"); - s_pPlayer->InitChr(pLooks); // .. + s_pPlayer->InitChr(pLooks); // 관절 세팅.. s_pPlayer->m_InfoExt.iRank = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); s_pPlayer->m_InfoExt.iTitle = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); s_pPlayer->m_InfoBase.iLevel = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); s_pPlayer->m_InfoExt.iLevelPrev = s_pPlayer->m_InfoBase.iLevel; s_pPlayer->m_InfoExt.iBonusPointRemain = - CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // ʽ Ʈ.. + CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 남은 보너스 포인트.. s_pPlayer->m_InfoExt.iExpNext = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); s_pPlayer->m_InfoExt.iExp = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); @@ -1800,16 +1800,16 @@ bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { s_pPlayer->m_InfoExt.iCity = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); std::string szKnightsName; - int iKnightsID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Ҽ ID + int iKnightsID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 소속 기사단 ID e_KnightsDuty eKnightsDuty = - (e_KnightsDuty)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // ܿ .. - int iKnightNameLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Ҽ ̸ . + (e_KnightsDuty)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 기사단에서의 권한.. + int iKnightNameLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 소속 기사단 이름 길이. CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szKnightsName, iKnightNameLen); - int iKnightsGrade = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ҽ - int iKnightsRank = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ҽ + int iKnightsGrade = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 소속 기사단 등급 + int iKnightsRank = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 소속 기사단 순위 - // .. - s_pPlayer->m_InfoExt.eKnightsDuty = eKnightsDuty; // ܿ .. + // 기사단 관련 세팅.. + s_pPlayer->m_InfoExt.eKnightsDuty = eKnightsDuty; // 기사단에서의 권한.. s_pPlayer->KnightsInfoSet(iKnightsID, szKnightsName, iKnightsGrade, iKnightsRank); m_pUIVar->UpdateKnightsInfo(); @@ -1843,17 +1843,17 @@ bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { s_pPlayer->m_InfoExt.iRegistPoison = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); s_pPlayer->m_InfoExt.iGold = CAPISocket::Parse_GetInt64(pDataPack->m_pData, iOffset); - s_pPlayer->m_InfoBase.iAuthority = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); //.. + s_pPlayer->m_InfoBase.iAuthority = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); //권한.. - // ų UI .. + // 스킬 UI 갱신.. for (int i = 0; i < 9; i++) { m_pUISkillTreeDlg->m_iSkillInfo[i] = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); } m_pUISkillTreeDlg->InitIconUpdate(); m_pUIHotKeyDlg->ReleaseItem(); - m_pUIHotKeyDlg->InitIconUpdate(); // Ű ȿ ˻ϰ ȿϸ Ʈ о´.. + m_pUIHotKeyDlg->InitIconUpdate(); // 핫키가 유효한지 검사하고 유효하면 레지스트리에서 읽어온다.. - // ϰ ִ .. + // 장착하고 있는 거.. int iItemIDInSlots[ITEM_SLOT_COUNT]; memset(iItemIDInSlots, -1, sizeof(iItemIDInSlots)); int iItemDurabilityInSlots[ITEM_SLOT_COUNT]; @@ -1861,36 +1861,36 @@ bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { int iItemCountInSlots[ITEM_SLOT_COUNT]; memset(iItemCountInSlots, -1, sizeof(iItemCountInSlots)); - for (int i = 0; i < ITEM_SLOT_COUNT; i++) // ŭ.. + for (int i = 0; i < ITEM_SLOT_COUNT; i++) // 슬롯 갯수마큼.. { iItemIDInSlots[i] = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); iItemDurabilityInSlots[i] = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); iItemCountInSlots[i] = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); } - m_fMsgSendTimeMove = 0; // Network ReQuest Ÿ̸ ʱȭ.. + m_fMsgSendTimeMove = 0; // Network ReQuest 타이머 초기화.. m_fMsgSendTimeRot = 0; - m_fPlayerYawSended = 0; // ֱٿ ޽ ÷̾ y ȸ. - m_vPlayerPosSended = s_pPlayer->Position(); // ֱٿ ޽ ÷̾ ġ. + m_fPlayerYawSended = 0; // 최근에 메시지를 보낸 시점의 플레이어 y 축 회전값. + m_vPlayerPosSended = s_pPlayer->Position(); // 최근에 메시지를 보낸 시점의 플레이어 위치. - // â ġ + // 상태창 수치를 모두 적용 if (m_pUIVar->m_pPageState) { - m_pUIVar->m_pPageState->UpdateID(szID); // ̸ . + m_pUIVar->m_pPageState->UpdateID(szID); // 이름 적용. } m_pUIVar->UpdateAllStates(&(s_pPlayer->m_InfoBase), &(s_pPlayer->m_InfoExt)); //__KnightsInfoBase* pKIB = m_pUIKnightsOp->KnightsInfoFind(s_pPlayer->m_InfoExt.iKnightsID); //if(pKIB) m_pUIVar->m_pPageKnights->UpdateKnightsName(pKIB->szName); - // + // 상태 바 갱신 m_pUIStateBarAndMiniMap->UpdateExp(s_pPlayer->m_InfoExt.iExp, s_pPlayer->m_InfoExt.iExpNext, true); m_pUIStateBarAndMiniMap->UpdateHP(s_pPlayer->m_InfoBase.iHP, s_pPlayer->m_InfoBase.iHPMax, true); m_pUIStateBarAndMiniMap->UpdateMSP(s_pPlayer->m_InfoExt.iMSP, s_pPlayer->m_InfoExt.iMSPMax, true); - m_pUIPartyOrForce->MemberInfoReInit(); // Ƽ â.. .. + m_pUIPartyOrForce->MemberInfoReInit(); // 파티 창.. 갱신.. - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. - __TABLE_ITEM_EXT * pItemExt = NULL; // ̺ ü .. + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. + __TABLE_ITEM_EXT * pItemExt = NULL; // 아이템 테이블 구조체 포인터.. int iItemIDInInventorys[MAX_ITEM_INVENTORY]; memset(iItemIDInInventorys, -1, sizeof(iItemIDInInventorys)); @@ -1899,7 +1899,7 @@ bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { int iItemDurabilityInInventorys[MAX_ITEM_INVENTORY]; memset(iItemDurabilityInInventorys, -1, sizeof(iItemDurabilityInInventorys)); - for (int i = 0; i < MAX_ITEM_INVENTORY; i++) // ŭ.. + for (int i = 0; i < MAX_ITEM_INVENTORY; i++) // 슬롯 갯수마큼.. { iItemIDInInventorys[i] = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); iItemDurabilityInInventorys[i] = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); @@ -1909,15 +1909,15 @@ bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { m_pUIInventory->ReleaseItem(); std::string szResrcFN, szIconFN; - for (int i = 0; i < ITEM_SLOT_COUNT; i++) // ŭ.. + for (int i = 0; i < ITEM_SLOT_COUNT; i++) // 슬롯 갯수마큼.. { if (0 == iItemIDInSlots[i]) { continue; } - pItem = s_pTbl_Items_Basic->Find(iItemIDInSlots[i] / 1000 * 1000); // .. + pItem = s_pTbl_Items_Basic->Find(iItemIDInSlots[i] / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { - pItemExt = s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iItemIDInSlots[i] % 1000); // .. + pItemExt = s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iItemIDInSlots[i] % 1000); // 열 데이터 얻기.. } else { pItemExt = NULL; } @@ -1925,13 +1925,13 @@ bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { if (NULL == pItem || NULL == pItemExt) { N3_WARN("NULL slot Item!!!"); CLogWriter::Write("MyInfo - slot - Unknown Item %d, IDNumber", iItemIDInSlots[i]); - continue; // .. + continue; // 아이템이 없으면.. } e_PartPosition ePart; e_PlugPosition ePlug; e_ItemType eType = CGameProcedure::MakeResrcFileNameForUPC(pItem, &szResrcFN, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { CLogWriter::Write("MyInfo - slot - Unknown Item"); } @@ -1949,20 +1949,20 @@ bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { } __ASSERT(ITEM_TYPE_ICONONLY == eType, "Invalid Item"); } break; - case ITEM_SLOT_UPPER: // Parts - ü - case ITEM_SLOT_LOWER: // Parts - ü - case ITEM_SLOT_GLOVES: // 尩 - case ITEM_SLOT_SHOES: // Ź - case ITEM_SLOT_HEAD: // Ӹī ?? -> ?? + case ITEM_SLOT_UPPER: // Parts - 상체 + case ITEM_SLOT_LOWER: // Parts - 하체 + case ITEM_SLOT_GLOVES: // 장갑 + case ITEM_SLOT_SHOES: // 신발 + case ITEM_SLOT_HEAD: // 머리카락 ?? -> 투구 ?? { if (ITEM_TYPE_PART != eType) { CLogWriter::Write("MyInfo - slot - Invalid Item"); } __ASSERT(ITEM_TYPE_PART == eType, "Invalid Item"); - s_pPlayer->PartSet(ePart, szResrcFN, pItem, pItemExt); // Ʈ .. + s_pPlayer->PartSet(ePart, szResrcFN, pItem, pItemExt); // 파트를 셋팅.. } break; - case ITEM_SLOT_HAND_RIGHT: // - case ITEM_SLOT_HAND_LEFT: // ޼ + case ITEM_SLOT_HAND_RIGHT: // 오른손 + case ITEM_SLOT_HAND_LEFT: // 왼손 { if (ITEM_TYPE_PLUG != eType) { CLogWriter::Write("MyInfo - slot - Invalid Item"); @@ -1975,52 +1975,52 @@ bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { } else { ePlugPos = PLUG_POS_LEFTHAND; } - s_pPlayer->PlugSet(ePlugPos, szResrcFN, pItem, pItemExt); // Ʈ .. + s_pPlayer->PlugSet(ePlugPos, szResrcFN, pItem, pItemExt); // 파트를 셋팅.. } break; - case ITEM_SLOT_SHOULDER: // + case ITEM_SLOT_SHOULDER: // 망토 { } break; case ITEM_SLOT_BELT: { } break; } - s_pPlayer->DurabilitySet(eSlot, iItemDurabilityInSlots[eSlot]); // ó.. + s_pPlayer->DurabilitySet(eSlot, iItemDurabilityInSlots[eSlot]); // 무기 낡음 처리.. __IconItemSkill * spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = iItemCountInSlots[i]; spItem->iDurability = iItemDurabilityInSlots[i]; - // κ丮 Կ ִ´. + // 인벤토리 슬롯에 넣는다. m_pUIInventory->m_pMySlot[i] = spItem; TRACE("Init Inv Msg Slot %d \n", iItemIDInSlots[i]); } - // κ丮.. + // 인벤토리.. int iItemCount = 0; - for (int i = 0; i < MAX_ITEM_INVENTORY; i++) // κ丮 ŭ.. + for (int i = 0; i < MAX_ITEM_INVENTORY; i++) // 인벤토리 갯수만큼.. { if (!iItemIDInInventorys[i]) { continue; } - pItem = s_pTbl_Items_Basic->Find(iItemIDInInventorys[i] / 1000 * 1000); // .. + pItem = s_pTbl_Items_Basic->Find(iItemIDInInventorys[i] / 1000 * 1000); // 열 데이터 얻기.. pItemExt = NULL; if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { - pItemExt = s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iItemIDInInventorys[i] % 1000); // .. + pItemExt = s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iItemIDInInventorys[i] % 1000); // 열 데이터 얻기.. } if (NULL == pItem || NULL == pItemExt) { N3_WARN("NULL Inv Item"); CLogWriter::Write("MyInfo - Inv - Unknown Item %d, IDNumber", iItemIDInInventorys[i]); - continue; // .. + continue; // 아이템이 없으면.. } e_PartPosition ePart; e_PlugPosition ePlug; e_ItemType eType = CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { CLogWriter::Write("MyInfo - slot - Unknown Item"); } @@ -2029,7 +2029,7 @@ bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { __IconItemSkill * spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = iItemCountInInventorys[i]; spItem->iDurability = iItemDurabilityInInventorys[i]; @@ -2047,22 +2047,22 @@ bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { m_pUIHotKeyDlg->UpdateDisableCheck(); } - if (s_pPlayer->Part(PART_POS_UPPER)->FileName().empty()) { // ƹ͵ þȵǾ ̸ .. - s_pPlayer->PartSet(PART_POS_UPPER, pLooks->szPartFNs[PART_POS_UPPER], NULL, NULL); // ü.. + if (s_pPlayer->Part(PART_POS_UPPER)->FileName().empty()) { // 아무것도 세팅안되어 있으면 파일 이름이 없다.. + s_pPlayer->PartSet(PART_POS_UPPER, pLooks->szPartFNs[PART_POS_UPPER], NULL, NULL); // 상체.. } - if (s_pPlayer->Part(PART_POS_LOWER)->FileName().empty()) { // ƹ͵ þȵǾ ̸ .. - s_pPlayer->PartSet(PART_POS_LOWER, pLooks->szPartFNs[PART_POS_LOWER], NULL, NULL); // ü.. + if (s_pPlayer->Part(PART_POS_LOWER)->FileName().empty()) { // 아무것도 세팅안되어 있으면 파일 이름이 없다.. + s_pPlayer->PartSet(PART_POS_LOWER, pLooks->szPartFNs[PART_POS_LOWER], NULL, NULL); // 하체.. } - if (s_pPlayer->Part(PART_POS_HANDS)->FileName().empty()) { // ƹ͵ þȵǾ ̸ .. - s_pPlayer->PartSet(PART_POS_HANDS, pLooks->szPartFNs[PART_POS_HANDS], NULL, NULL); // .. + if (s_pPlayer->Part(PART_POS_HANDS)->FileName().empty()) { // 아무것도 세팅안되어 있으면 파일 이름이 없다.. + s_pPlayer->PartSet(PART_POS_HANDS, pLooks->szPartFNs[PART_POS_HANDS], NULL, NULL); // 팔.. } - if (s_pPlayer->Part(PART_POS_FEET)->FileName().empty()) { // ƹ͵ þȵǾ ̸ .. - s_pPlayer->PartSet(PART_POS_FEET, pLooks->szPartFNs[PART_POS_FEET], NULL, NULL); // ٸ.. + if (s_pPlayer->Part(PART_POS_FEET)->FileName().empty()) { // 아무것도 세팅안되어 있으면 파일 이름이 없다.. + s_pPlayer->PartSet(PART_POS_FEET, pLooks->szPartFNs[PART_POS_FEET], NULL, NULL); // 다리.. } - if (s_pPlayer->Part(PART_POS_FACE)->FileName().empty()) { // ƹ͵ þȵǾ ̸ .. + if (s_pPlayer->Part(PART_POS_FACE)->FileName().empty()) { // 아무것도 세팅안되어 있으면 파일 이름이 없다.. s_pPlayer->InitFace(); } - if (s_pPlayer->Part(PART_POS_HAIR_HELMET)->FileName().empty()) { // ƹ͵ þȵǾ ̸ .. + if (s_pPlayer->Part(PART_POS_HAIR_HELMET)->FileName().empty()) { // 아무것도 세팅안되어 있으면 파일 이름이 없다.. s_pPlayer->InitHair(); } @@ -2072,49 +2072,49 @@ bool CGameProcMain::MsgRecv_MyInfo_All(DataPack * pDataPack, int & iOffset) { // s_pPlayer->SettingCollisionCheckPoint(); //////////////////////////////////////////////////////////// - // ⺻ б.. + // 기본값 읽기.. int iRun = 1; - // if(false == CGameProcedure::RegGetSetting("UserRun", &iRun, 4)) iRun = 1; // Ȱ ٴ ¸ Ʈ а.. ⺻ ٴ ̴.. + // if(false == CGameProcedure::RegGetSetting("UserRun", &iRun, 4)) iRun = 1; // 걷고 뛰는 상태를 레지스트리에서 읽고.. 기본값은 뛰는 상태이다.. // if(1 == iRun) - this->CommandToggleWalkRun(); // ٰ .. + this->CommandToggleWalkRun(); // 뛰게 만든다.. e_ViewPoint eVP = VP_THIRD_PERSON; if (false == CGameProcedure::RegGetSetting("CameraMode", &eVP, 4)) { - eVP = VP_THIRD_PERSON; // ī޶ + eVP = VP_THIRD_PERSON; // 카메라 상태 기록 } s_pEng->ViewPointChange(eVP); - // ⺻ б.. + // 기본값 읽기.. //////////////////////////////////////////////////////////// - this->InitPlayerPosition(__Vector3(fX, fY, fZ)); // ÷̾ ġ ʱȭ.. , ⺻ ϰ Ѵ. + this->InitPlayerPosition(__Vector3(fX, fY, fZ)); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. // berserk temp - //s_pPlayer->PlugSet(PLUG_POS_BACK, "item/babacloak.n3cplug_cloak", NULL); // Ʈ .. + //s_pPlayer->PlugSet(PLUG_POS_BACK, "item/babacloak.n3cplug_cloak", NULL); // 파트를 셋팅.. // end berserk temp // berserk //s_pPlayer->AttachCloak(); //.. - s_pOPMgr->Release(); // ٸ Ŭ ʱȭ.. + s_pOPMgr->Release(); // 다른 유저 관리 클래스 초기화.. - m_bLoadComplete = TRUE; // ε .. + m_bLoadComplete = TRUE; // 로딩 끝.. return true; } bool CGameProcMain::MsgRecv_Chat(DataPack * pDataPack, int & iOffset) { - std::string szChat; // .. - e_ChatMode eCM = (e_ChatMode)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // ä Ÿ - e_Nation eNation = (e_Nation)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // - int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // - int iChatLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ä ڿ .. + std::string szChat; // 버퍼.. + e_ChatMode eCM = (e_ChatMode)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 채팅 타입 + e_Nation eNation = (e_Nation)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 보낸사람 국가 + int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 보낸사람 + int iChatLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 채팅 문자열 길이.. CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szChat, iChatLen); - if (eCM == N3_CHAT_CONTINUE_DELETE) { // ... + if (eCM == N3_CHAT_CONTINUE_DELETE) { //지속 공지 삭제... m_pUIChatDlg->DeleteContinueMsg(); return true; - } else if (eCM == N3_CHAT_TITLE_DELETE) { //ŸƲ ... + } else if (eCM == N3_CHAT_TITLE_DELETE) { //타이틀 공지 삭제... m_pUIChatDlg->SetNoticeTitle("", 0xffffffff); return true; } @@ -2167,26 +2167,26 @@ bool CGameProcMain::MsgRecv_Chat(DataPack * pDataPack, int & iOffset) { return true; } - // 뿪 ... ,. a + // 통역 서비스... ㅡ,.ㅡ a if (N3_CHAT_NORMAL == eCM || N3_CHAT_PRIVATE == eCM || N3_CHAT_SHOUT == eCM) { if (eNation != s_pPlayer->m_InfoBase.eNation) { CPlayerBase * pTalker = s_pOPMgr->UPCGetByID(iID, false); bool bIamManager = (0 == s_pPlayer->m_InfoBase.iAuthority) ? true : false; bool bTalkerIsManager = (pTalker && 0 == pTalker->m_InfoBase.iAuthority) ? true : false; - if (!(bIamManager || bTalkerIsManager)) // ڰ ƴϰ 浵 ڰ ƴϸ + if (!(bIamManager || bTalkerIsManager)) // 내가 운영자가 아니고 상대방도 운영자가 아니면 { int i = szChat.find(':'); if (i >= 0) { for (; i < iChatLen; i++) { - szChat[i] = '!' + rand() % 10; // ̻ ٲ۴.. + szChat[i] = '!' + rand() % 10; // 이상한 말로 바꾼다.. } } } } } - // dz ֱ.. + // 풍선말 넣기.. CPlayerBase * pBPC = NULL; if (iID == s_pPlayer->IDNumber()) { pBPC = s_pPlayer; @@ -2194,11 +2194,11 @@ bool CGameProcMain::MsgRecv_Chat(DataPack * pDataPack, int & iOffset) { pBPC = s_pOPMgr->CharacterGetByID(iID, false); } if (pBPC && s_pPlayer->Distance(pBPC->Position()) < 4.0f && - (N3_CHAT_NORMAL == eCM || N3_CHAT_SHOUT == eCM)) { // ä Ȥ ġ϶.. + (N3_CHAT_NORMAL == eCM || N3_CHAT_SHOUT == eCM)) { // 보통 채팅 혹은 외치기일때만.. pBPC->BalloonStringSet(szChat, crChat); } - // äâ ֱ.. + // 채팅창에 넣기.. m_pUIChatDlg->AddChatMsg(eCM, szChat, crChat); return true; @@ -2207,54 +2207,54 @@ bool CGameProcMain::MsgRecv_Chat(DataPack * pDataPack, int & iOffset) { bool CGameProcMain::MsgRecv_UserMove(DataPack * pDataPack, int & iOffset) { int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); float fX = (CAPISocket::Parse_GetWord(pDataPack->m_pData, iOffset)) / - 10.0f; // ϰų ̵϶ ġ. Ҷ ġ ޴´. + 10.0f; // 출발하거나 이동중일때에는 다음 위치. 정지할때는 현재 위치를 받는다. float fZ = (CAPISocket::Parse_GetWord(pDataPack->m_pData, iOffset)) / 10.0f; float fY = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; float fSpeed = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / - 10.0f; // ϰų ̵϶ ̴ ӵ. Ҷ 0 ´. + 10.0f; // 출발하거나 이동중일때에는 움직이는 속도. 정지할때는 0 이 온다. BYTE byMoveFlag = - CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // ̴ ÷.. 0 1 , 2 + CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 움직이는 플래그.. 0 정지 1 출발, 2 계속 움직임 - // Լ ; κ.. ^^ - // ̵, ÷̾ 1, ÷̾ 2, xzy ġ, xzy , 1ʵ x, z, y dnlcl.. + // 함수가 와야 할 부분.. ^^ + // 아이디, 플레이어 상태 1, 플레이어 상태 2, 현재 xzy 위치, 현재 xzy 방향, 1초뒤 x, z, y dnlcl.. - if (0xff == byMoveFlag) // ġ Ʈ Ŷ̴.. + if (0xff == byMoveFlag) // 강제위치 업데이트 패킷이다.. { - if (iID == s_pPlayer->IDNumber()) // Ž.. + if (iID == s_pPlayer->IDNumber()) // 내 매시지면.. { this->InitPlayerPosition( - __Vector3(fX, fY, fZ)); // ÷̾ ġ ʱȭ.. , ⺻ ϰ Ѵ. + __Vector3(fX, fY, fZ)); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. } else { - CPlayerNPC * pBPC = s_pOPMgr->CharacterGetByID(iID, true); // ٸ ÷̾ .. + CPlayerNPC * pBPC = s_pOPMgr->CharacterGetByID(iID, true); // 다른 플레이어를 얻어서.. if (NULL == pBPC) { - this->MsgSend_UserInRequest(iID); // User ûѴ.. + this->MsgSend_UserInRequest(iID); // User 정보가 없을 경우 요청한다.. return false; } else if (pBPC->IsDead()) { return false; } - pBPC->MoveTo(fX, fY, fZ, 0, 0); // ġ.. + pBPC->MoveTo(fX, fY, fZ, 0, 0); // 현재 위치.. pBPC->PositionSet(__Vector3(fX, fY, fZ), true); } return false; } - if (iID == s_pPlayer->IDNumber()) // Ž.. + if (iID == s_pPlayer->IDNumber()) // 내 매시지면.. { s_pPlayer->m_vPosFromServer.Set(fX, fY, fZ); return false; } - CPlayerOther * pUPC = s_pOPMgr->UPCGetByID(iID, true); // ٸ ÷̾ .. + CPlayerOther * pUPC = s_pOPMgr->UPCGetByID(iID, true); // 다른 플레이어를 얻어서.. if (NULL == pUPC) { return false; } - // if(0.0f != fSpeed) TRACE("Move - %4.1f ( %d : Mode %d ) %.2f\n", fSpeed, iID, byMoveFlag, CN3Base::TimeGet()); - // else TRACE("Stop - %4.1f ( %d : Mode %d ) %.2f\n", fSpeed, iID, byMoveFlag, CN3Base::TimeGet()); + // if(0.0f != fSpeed) TRACE("Move - %4.1f ( %d : Mode %d ) %.2f초\n", fSpeed, iID, byMoveFlag, CN3Base::TimeGet()); + // else TRACE("Stop - %4.1f ( %d : Mode %d ) %.2f초\n", fSpeed, iID, byMoveFlag, CN3Base::TimeGet()); - // Ʈ.. - pUPC->MoveTo(fX, fY, fZ, fSpeed, byMoveFlag); // ġ.. + // 서버로 부터터 받은 정보로 업데이트.. + pUPC->MoveTo(fX, fY, fZ, fSpeed, byMoveFlag); // 현재 위치.. return true; } @@ -2268,12 +2268,12 @@ bool CGameProcMain::MsgRecv_Rotation(DataPack * pDataPack, int & iOffset) { } CPlayerNPC * pBPC = NULL; - pBPC = s_pOPMgr->CharacterGetByID(iID, true); // ٸ .. + pBPC = s_pOPMgr->CharacterGetByID(iID, true); // 다른 유저 얻어서.. if (NULL == pBPC) { return false; } - pBPC->RotateTo(fYaw, false); // x, y, z + pBPC->RotateTo(fYaw, false); // 서버로 부터 받은 x, y, z값으로 return true; } @@ -2286,12 +2286,12 @@ bool CGameProcMain::MsgRecv_Dead(DataPack* pDataPack, int& iOffset) if ( iID == s_pPlayer->IDNumber() ) { - s_pPlayer->Action(PSA_PRE_DYING, true, NULL, true); // ÷̾ ̱. + s_pPlayer->Action(PSA_PRE_DYING, true, NULL, true); // 플레이어 죽이기. } else { - CPlayerOther* pReadyToDead = s_pOPMgr->PlayerGetByID(iID, true); // ִ ѵ߿ ˻غ.. - if(pReadyToDead) // ױ . + CPlayerOther* pReadyToDead = s_pOPMgr->PlayerGetByID(iID, true); // 살아 있는 넘들중에서 검색해보고.. + if(pReadyToDead) // 있으면 죽기직전으로 만든다. { pReadyToDead->Acttion(PSA_PRE_DYING, true, NULL, true); } @@ -2307,15 +2307,15 @@ bool CGameProcMain::MsgRecv_Regen(DataPack * pDataPack, int & iOffset) { vPosPlayer.z = (CAPISocket::Parse_GetWord(pDataPack->m_pData, iOffset)) / 10.0f; vPosPlayer.y = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; - this->InitPlayerPosition(vPosPlayer); // ÷̾ ġ ʱȭ.. , ⺻ ϰ Ѵ. - s_pPlayer->RegenerateCollisionMesh(); // 浹 ޽ø ٽ .. + this->InitPlayerPosition(vPosPlayer); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. + s_pPlayer->RegenerateCollisionMesh(); // 충돌 메시를 다시 만든다.. - s_pPlayer->m_iSendRegeneration = 0; // ѹ ٽ Ⱥ ÷ - s_pPlayer->m_fTimeAfterDeath = 0; // ѹ ٽ Ⱥ ÷ - TRACE(" - ٽ Ƴ(%.1f, %.1f)\n", vPosPlayer.x, vPosPlayer.z); + s_pPlayer->m_iSendRegeneration = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 + s_pPlayer->m_fTimeAfterDeath = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 + TRACE("받음 - 다시 살아나기(%.1f, %.1f)\n", vPosPlayer.x, vPosPlayer.z); // - // & ȿ ʱȭ.. + //마법 & 효과 초기화.. if (m_pUIStateBarAndMiniMap) { m_pUIStateBarAndMiniMap->ClearMagic(); } @@ -2351,13 +2351,13 @@ bool CGameProcMain::MsgRecv_Time(DataPack * pDataPack, int & iOffset) { bool CGameProcMain::MsgRecv_Weather(DataPack * pDataPack, int & iOffset) { int iWeather = - CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // -> byte - .... 0x01 - .. 0x02 - 0x03 + CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // -> byte - 기후.... 0x01 - 맑음.. 0x02 - 비 0x03 int iPercent = - CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // short -> Ȱ, , ۼƮ + CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // short -> 맑은날 안개, 비, 눈 의 양 퍼센트로 //////////////////////////////////////////////////// - // ǵ üũ ð.... - /* float fTimeFromServer = CAPISocket::Parse_GetFloat(pDataPack->m_pData, iOffset); // float -> ִ ð... + // 스피드 핵 체크용 시간.... + /* float fTimeFromServer = CAPISocket::Parse_GetFloat(pDataPack->m_pData, iOffset); // float -> 정기적으로 주는 시간... float fTimeLocal = CN3Base::TimeGet(); static float fTimeFromServerPrev = fTimeFromServer; @@ -2366,10 +2366,10 @@ bool CGameProcMain::MsgRecv_Weather(DataPack * pDataPack, int & iOffset) { if(fTimeFromServer != 0.0f) { float fTDS = fTimeFromServer - fTimeFromServerPrev; - if(fTDS > 355.0f && fTDS < 365.0f) // 6п ѹ ְԲ Ǿ ִ.. + if(fTDS > 355.0f && fTDS < 365.0f) // 6분에 한번 주게끔 되어 있다.. { float fTDL = fTimeLocal - fTimeLocalPrev; - if(fTDL < (fTDS * 0.8f) || fTDL > (fTDS * 1.2f)) // Ÿ ŸӺ 20ۼƮ ̻ ũ.. + if(fTDL < (fTDS * 0.8f) || fTDL > (fTDS * 1.2f)) // 로컬 타임이 서버 타임보다 20퍼센트 이상 크면.. { iTSH++; // Try Speed Hacking ... ++ } @@ -2378,13 +2378,13 @@ bool CGameProcMain::MsgRecv_Weather(DataPack * pDataPack, int & iOffset) { iTSH = 0; } - if(iTSH >= 3) CGameProcedure::s_bUseSpeedHack = true; // ǵ ŷ.... + if(iTSH >= 3) CGameProcedure::s_bUseSpeedHack = true; // 스피드 해킹.... } fTimeFromServerPrev = fTimeFromServer; fTimeLocalPrev = fTimeLocal; } - // ǵ üũ ð.... + // 스피드 핵 체크용 시간.... //////////////////////////////////////////////////// */ @@ -2396,23 +2396,23 @@ bool CGameProcMain::MsgRecv_Weather(DataPack * pDataPack, int & iOffset) { } float fPercent = iPercent / 100.0f; - //enum { GEW_CLEAR=0, // - // GEW_DRIZZLE_RAIN=1, // - // GEW_RAINY=2, // 緮 - // GEW_HEAVY_RAIN=3, // - // GEW_SNOW1=11, // - // GEW_SNOW2=12, // - // GEW_HEAVY_SNOW=13 // - TRACE(" - (%d - %d)\n", iWeather, iPercent); + //enum { GEW_CLEAR=0, // 맑음 + // GEW_DRIZZLE_RAIN=1, // 가랑비 + // GEW_RAINY=2, // 적당량의 비 + // GEW_HEAVY_RAIN=3, // 폭우 + // GEW_SNOW1=11, // 포근한 눈 + // GEW_SNOW2=12, // 적당한 눈 + // GEW_HEAVY_SNOW=13 // 폭설 + TRACE("받음 - 날씨(%d - %d)\n", iWeather, iPercent); - ACT_WORLD->SetWeatherWithSky((CN3SkyMng::eSKY_WEATHER)iWeather, iPercent); // ϴ ȭϱ + ACT_WORLD->SetWeatherWithSky((CN3SkyMng::eSKY_WEATHER)iWeather, iPercent); // 하늘 변화하기 float fDelta = 1.0f; if (0x1 == iWeather) { - fDelta = 0.5f + (1.0f - fPercent) * 0.5f; // . ۼƮ Ȱ... + fDelta = 0.5f + (1.0f - fPercent) * 0.5f; // 맑은 날씨. 퍼센트는 안개... } else if (0x02 == iWeather) { - fDelta = 0.25f + (1.0f - fPercent) * 0.75f; // . + fDelta = 0.25f + (1.0f - fPercent) * 0.75f; // 비옴 . } else if (0x03 == iWeather) { - fDelta = 0.25f + (1.0f - fPercent) * 0.75f; // .. + fDelta = 0.25f + (1.0f - fPercent) * 0.75f; // 눈옴.. } s_pEng->FarPlaneDeltaSet(fDelta, false); @@ -2422,13 +2422,13 @@ bool CGameProcMain::MsgRecv_Weather(DataPack * pDataPack, int & iOffset) { bool CGameProcMain::MsgRecv_UserInOut(DataPack * pDataPack, int & iOffset) { int iType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); - if (0x01 == iType) { // ö.( ӻ ϸ鼭 ..) + if (0x01 == iType) { // 유저 들어올때.(원래 게임상의 유저 지역 업뎃하면서 갱신..) this->MsgRecv_UserIn(pDataPack, iOffset, false); - } else if (0x02 == iType) { // User . + } else if (0x02 == iType) { // User 나갈때. this->MsgRecv_UserOut(pDataPack, iOffset); - } else if (0x03 == iType) { // ö (׾ Ƴų, game startϴ .) + } else if (0x03 == iType) { // 유저 들어올때 (죽었다 살아나거나, game start하는 유저들.) this->MsgRecv_UserIn(pDataPack, iOffset, true); - } else if (0x04 == iType) { // ö (warp) + } else if (0x04 == iType) { // 유저 들어올때 (warp) this->MsgRecv_UserIn(pDataPack, iOffset, false); } @@ -2442,66 +2442,66 @@ bool CGameProcMain::MsgRecv_UserIn(DataPack * pDataPack, int & iOffset, bool bWi int iNameLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szName, iNameLen); - e_Nation eNation = (e_Nation)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ҽ . 0 ̸ . 1 + e_Nation eNation = (e_Nation)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 소속 국가. 0 이면 없다. 1 - // - int iKnightsID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID + // 기사단 관련 + int iKnightsID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 기사단 ID e_KnightsDuty eKnightsDuty = - (e_KnightsDuty)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ҽ . 0 ̸ . 1 - int iKnightNameLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Ҽ ̸ . + (e_KnightsDuty)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 소속 국가. 0 이면 없다. 1 + int iKnightNameLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 소속 기사단 이름 길이. std::string szKnightsName; CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szKnightsName, iKnightNameLen); - int iKnightsGrade = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // - int iKnightsRank = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // + int iKnightsGrade = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 등급 + int iKnightsRank = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 순위 - int iLevel = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // ... + int iLevel = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 레벨... e_Race eRace = (e_Race)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); e_Class eClass = (e_Class)CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); float fXPos = (CAPISocket::Parse_GetWord(pDataPack->m_pData, iOffset)) / 10.0f; float fZPos = (CAPISocket::Parse_GetWord(pDataPack->m_pData, iOffset)) / 10.0f; float fYPos = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; - float fYTerrain = ACT_WORLD->GetHeightWithTerrain(fXPos, fZPos); // ̰ .. + float fYTerrain = ACT_WORLD->GetHeightWithTerrain(fXPos, fZPos); // 지형의 높이값 얻기.. float fYObject = ACT_WORLD->GetHeightNearstPosWithShape(__Vector3(fXPos, fYPos, fZPos), - 1.0f); // Ʈ ̰ .. + 1.0f); // 오브젝트에서 가장 가까운 높이값 얻기.. if (fYObject > fYTerrain) { fYPos = fYObject; } else { fYPos = fYTerrain; } - int iFace = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ӹī.. - int iHair = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // + int iFace = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 머리카락.. + int iHair = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 얼굴 모양 int iStatus = - CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 1 - ֱ.. 2 - ɾֱ.. 3 ... ׾ִ.. + CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 1 - 서있기.. 2 - 앉아있기.. 3 ... 죽어있다.. int iStatusSize = - CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 0 - ũ, 1 - Ŀ ִ. 2 - ۾.. + CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 0 - 보통 크기, 1 - 커져 있다. 2 - 작아졌다.. - int iRecruitParty = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 1 - . 2 - Ƽ .. - BYTE byAuthority = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // ... + int iRecruitParty = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 1 - 보통. 2 - 파티 구함.. + BYTE byAuthority = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 권한... DWORD dwItemIDs - [MAX_ITEM_SLOT_OPC]; // - ٸ ÷̾(NPC ) 0 ~ 4 ü,ü,,, 5 6 7 ޼ - int iItemDurabilities[MAX_ITEM_SLOT_OPC]; // .. + [MAX_ITEM_SLOT_OPC]; // 착용 아이템 - 다른 플레이어(NPC 포함) 0 ~ 4 상체,하체,헬멧,팔,발 5 망토 6 오른손 7 왼손 + int iItemDurabilities[MAX_ITEM_SLOT_OPC]; // 착용 아이템의 내구력.. for (int i = 0; i < MAX_ITEM_SLOT_OPC; i++) { - dwItemIDs[i] = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // ϰ ִ ۵ ID + dwItemIDs[i] = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 착용하고 있는 아이템들의 ID iItemDurabilities[i] = - CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ϰ ִ ۵ + CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 착용하고 있는 아이템들의 현재 내구력 } if (iID == s_pPlayer->IDNumber()) { - return false; // Ŷ̸ .. // Ѵ.. + return false; // 내 패킷이면 .. // 무시한다.. } CPlayerOther * pUPC = s_pOPMgr->UPCGetByID(iID, false); - if (pUPC) // ̹ ̵ ij .. + if (pUPC) // 이미 아이디 같은 캐릭이 있으면.. { CLogWriter::Write("User In - Duplicated ID (%d, %s) Pos(%.2f,%.2f,%.2f)", iID, szName.c_str(), fXPos, fYPos, fZPos); TRACE("User In - Duplicated ID (%d, %s) Pos(%.2f,%.2f,%.2f)\n", iID, szName.c_str(), fXPos, fYPos, fZPos); - pUPC->Action(PSA_BASIC, true, NULL, true); // 츮.. + pUPC->Action(PSA_BASIC, true, NULL, true); // 강제로 살리고.. pUPC->m_fTimeAfterDeath = 0; pUPC->PositionSet(__Vector3(fXPos, fYPos, fZPos), true); return false; @@ -2509,7 +2509,7 @@ bool CGameProcMain::MsgRecv_UserIn(DataPack * pDataPack, int & iOffset, bool bWi D3DCOLOR crID = (eNation != s_pPlayer->m_InfoBase.eNation) ? D3DCOLOR_XRGB(255, 96, 96) - : D3DCOLOR_XRGB(128, 128, 255); // ٸ + : D3DCOLOR_XRGB(128, 128, 255); // 국가에 따라 다른색 적용 pUPC = new CPlayerOther(); pUPC->IDSet(iID, szName, crID); @@ -2524,10 +2524,10 @@ bool CGameProcMain::MsgRecv_UserIn(DataPack * pDataPack, int & iOffset, bool bWi //__KnightsInfoBase* pKIB = m_pUIKnightsOp->KnightsInfoFind(iKightsID); //if(pKIB) pUPC->KnightsNameSet(pKIB->szName, 0xffff0000); - pUPC->PositionSet(__Vector3(fXPos, fYPos, fZPos), true); // ٸ ÷̾ ġ .. - pUPC->MoveTo(fXPos, fYPos, fZPos, 0, 0); // ġ.. + pUPC->PositionSet(__Vector3(fXPos, fYPos, fZPos), true); // 다른 플레이어 현재 위치 셋팅.. + pUPC->MoveTo(fXPos, fYPos, fZPos, 0, 0); // 현재 위치.. pUPC->RotateTo(D3DXToRadian(rand() % 360), true); - s_pOPMgr->UPCAdd(pUPC); // ij ߰... + s_pOPMgr->UPCAdd(pUPC); // 캐릭터 추가... //if(bWithFX) if (bWithFX && pUPC->m_InfoBase.iAuthority != AUTHORITY_MANAGER) { @@ -2538,34 +2538,34 @@ bool CGameProcMain::MsgRecv_UserIn(DataPack * pDataPack, int & iOffset, bool bWi } } - // ɾ ֱ.., ֱ .. - if (1 == iStatus) // ֱ.. + // 앉아 있기.., 서있기 결정.. + if (1 == iStatus) // 서있기.. { pUPC->Action(PSA_BASIC, true, NULL, true); pUPC->ActionMove(PSM_STOP); - } else if (2 == iStatus) // ɾ ֱ.. + } else if (2 == iStatus) // 앉아 있기.. { pUPC->Action(PSA_SITDOWN, true, NULL, true); pUPC->ActionMove(PSM_STOP); - } else if (3 == iStatus) // ׾ ִ.. + } else if (3 == iStatus) // 죽어 있다.. { - s_pOPMgr->MoveToCorpsesForcely(pUPC, false); // ü ű.. + s_pOPMgr->MoveToCorpsesForcely(pUPC, false); // 시체로 옮긴다.. } if (0x01 == iStatusSize) { - pUPC->ScaleSetGradually(1.0f); // ũ.. - pUPC->FlickerFactorSet(1.0f); // ȰǼ .. ڰŸ.. + pUPC->ScaleSetGradually(1.0f); // 보통 크기.. + pUPC->FlickerFactorSet(1.0f); // 부활되서 반투명.. 깜박거린다.. } else if (0x02 == iStatusSize) { - pUPC->ScaleSetGradually(2.0f); // Ŀ.. + pUPC->ScaleSetGradually(2.0f); // 커졌다.. } else if (0x03 == iStatusSize) { - pUPC->ScaleSetGradually(0.5f); // ۾. + pUPC->ScaleSetGradually(0.5f); // 작아졌다. } else if (0x04 == iStatusSize) { - pUPC->FlickerFactorSet(0.7f); // ȰǼ .. ڰŸ.. + pUPC->FlickerFactorSet(0.7f); // 부활되서 반투명.. 깜박거린다.. } if (1 == iRecruitParty) { pUPC->InfoStringSet("", 0); - } else if (2 == iRecruitParty) // Ƽ .. + } else if (2 == iRecruitParty) // 파티 구함.. { int iLevel = pUPC->m_InfoBase.iLevel; int iLMin = iLevel - 8; @@ -2590,20 +2590,20 @@ bool CGameProcMain::MsgRecv_UserIn(DataPack * pDataPack, int & iOffset, bool bWi bool CGameProcMain::MsgRecv_UserOut(DataPack * pDataPack, int & iOffset) { int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); - // ij͸ ü . + //죽은 상태의 캐릭터를 시체로 만든다. CPlayerNPC * pUPC = s_pOPMgr->UPCGetByID(iID, false); if (pUPC == NULL) { return false; } - if (pUPC->IsDead()) { //ijͰ ¿ UserOut ϰ Ǹ ü ٲش. + if (pUPC->IsDead()) { //캐릭터가 죽은 상태에서 UserOut을 하게 되면 시체로 바꿔준다. s_pOPMgr->CorpseAdd(iID); return true; } - return s_pOPMgr->UPCDelete(iID); // ij ... + return s_pOPMgr->UPCDelete(iID); // 캐릭터 제거... } -// ̵ īƮŭ ޴´... ۱.. Ʈ ʿ ͸ û.. +// 주위 영역의 모든 아이디를 카운트만큼 받는다... 글구.. 업데이트가 필요한 것만 서버에게 요청.. bool CGameProcMain::MsgRecv_UserInAndRequest(DataPack * pDataPack, int & iOffset) { int iUPCCountReceived = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // TRACE("UPC region update : %d\n", iUPCCountReceived); @@ -2613,14 +2613,14 @@ bool CGameProcMain::MsgRecv_UserInAndRequest(DataPack * pDataPack, int & iOffset } if (iUPCCountReceived < 0 || iUPCCountReceived >= 1000) { char szErr[256]; - sprintf(szErr, " û - ÷̾ %d", iUPCCountReceived); + sprintf(szErr, "영역 요청 오류 - 플레이어 갯수 %d", iUPCCountReceived); CGameProcedure::ReportDebugStringAndSendToServer(szErr); __ASSERT(0, szErr); return false; } int iID = 0; - m_SetUPCID.clear(); // ... + m_SetUPCID.clear(); // 싹 지우고... it_ID itID, itIDEnd = m_SetUPCID.end(); pair_ID pairID; @@ -2628,19 +2628,19 @@ bool CGameProcMain::MsgRecv_UserInAndRequest(DataPack * pDataPack, int & iOffset iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // TRACE(" ID : %d\n", iID); if (iID == s_pPlayer->IDNumber()) { - continue; // ̵̴.. ȵȴ. + continue; // 내 아이디이다.. 고로 넣으면 안된다. } pairID = m_SetUPCID.insert(iID); } - if (m_SetUPCID.empty()) // Ѱ ٸ .. + if (m_SetUPCID.empty()) // 새로 받은게 한개도 없다면 몽땅 날린다.. { s_pOPMgr->ReleaseUPCs(); return false; } - // ̵ Ʈ ִ UPC ID ˻ؼ.. + // 새로 받은 아이디와 리스트에 있는 UPC ID 를 검색해서.. CPlayerOther * pUPC = NULL; it_UPC itUPC = s_pOPMgr->m_UPCs.begin(), itUPCEnd = s_pOPMgr->m_UPCs.end(); for (; itUPC != itUPCEnd;) { @@ -2648,11 +2648,11 @@ bool CGameProcMain::MsgRecv_UserInAndRequest(DataPack * pDataPack, int & iOffset iID = pUPC->IDNumber(); itID = m_SetUPCID.find(iID); - if (itID != itIDEnd) // Ʈ .. + if (itID != itIDEnd) // 새로 들어온 리스트에 있으면.. { - m_SetUPCID.erase(itID); // û Ʈ .. + m_SetUPCID.erase(itID); // 요청할 리스트에서 빼고.. itUPC++; - } else // ° .. + } else // 새로 들어온곳에 없으면 지운다.. { // TRACE(" delete : %d\n", iID); @@ -2667,23 +2667,23 @@ bool CGameProcMain::MsgRecv_UserInAndRequest(DataPack * pDataPack, int & iOffset } //////////////////////////////////////////////////////////////////////////// - // ٷ û Ŷ .. + // 바로 요청 패킷을 만들어 보낸다.. int iNewUPCCount = m_SetUPCID.size(); if (iNewUPCCount > 0) { - int iOffset = 0; // .. - std::vector byBuff(iNewUPCCount * 2 + 10, 0); // Ŷ .. - CAPISocket::MP_AddByte(&(byBuff[0]), iOffset, N3_REQUEST_USER_IN); // Ŀ. - CAPISocket::MP_AddShort(&(byBuff[0]), iOffset, iNewUPCCount); // ̵ .. + int iOffset = 0; // 버퍼의 오프셋.. + std::vector byBuff(iNewUPCCount * 2 + 10, 0); // 패킷 버퍼.. + CAPISocket::MP_AddByte(&(byBuff[0]), iOffset, N3_REQUEST_USER_IN); // 커멘드. + CAPISocket::MP_AddShort(&(byBuff[0]), iOffset, iNewUPCCount); // 아이디 갯수.. itID = m_SetUPCID.begin(); itIDEnd = m_SetUPCID.end(); for (int i = 0; itID != itIDEnd; itID++, i++) { iID = *itID; - CAPISocket::MP_AddShort(&(byBuff[0]), iOffset, iID); // ڼ ʿ ̵.. + CAPISocket::MP_AddShort(&(byBuff[0]), iOffset, iID); // 자세한 정보가 필요한 아이디들.. } - s_pSocket->Send(&(byBuff[0]), iOffset); // + s_pSocket->Send(&(byBuff[0]), iOffset); // 보낸다 } - // ٷ û Ŷ .. + // 바로 요청 패킷을 만들어 보낸다.. //////////////////////////////////////////////////////////////////////////// return true; @@ -2697,7 +2697,7 @@ bool CGameProcMain::MsgRecv_UserInRequested(DataPack * pDataPack, int & iOffset) } if (iPlayerCount < 0 || iPlayerCount >= 1000) { char szErr[256]; - sprintf(szErr, " ޱ - ÷̾ %d", iPlayerCount); + sprintf(szErr, "영역정보 받기 오류 - 플레이어 갯수 %d", iPlayerCount); CGameProcedure::ReportDebugStringAndSendToServer(szErr); __ASSERT(0, szErr); return false; @@ -2709,7 +2709,7 @@ bool CGameProcMain::MsgRecv_UserInRequested(DataPack * pDataPack, int & iOffset) // int iOffset2 = iOffset; for (int i = 0; i < iPlayerCount; i++) { - this->MsgRecv_UserIn(pDataPack, iOffset); // ÷̾ ŭ ... + this->MsgRecv_UserIn(pDataPack, iOffset); // 플레이어 갯수 만큼 유저 인... } #ifdef _DEBUG @@ -2722,10 +2722,10 @@ bool CGameProcMain::MsgRecv_UserInRequested(DataPack * pDataPack, int & iOffset) bool CGameProcMain::MsgRecv_NPCInOut(DataPack * pDataPack, int & iOffset) { BYTE byType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); - if (byType == 0x01) // NPC ö + if (byType == 0x01) // NPC 들어올때 { - return this->MsgRecv_NPCIn(pDataPack, iOffset); // NPC In ó - } else // NPC . + return this->MsgRecv_NPCIn(pDataPack, iOffset); // NPC In 처리 + } else // NPC 나갈때. { return this->MsgRecv_NPCOut(pDataPack, iOffset); } @@ -2734,15 +2734,15 @@ bool CGameProcMain::MsgRecv_NPCInOut(DataPack * pDataPack, int & iOffset) { } bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { - int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Server ϴ ID - int iIDResrc = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ҽ ID - int iType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // NPC Type - 0x05 : - int iItemTrdeID = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // ŷ ׷ ID û ID - int iScale = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 100 1.0 - int iItemID0 = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // ҽ ID - int iItemID1 = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // ҽ ID + int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Server에서 관리하는 고유 ID + int iIDResrc = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 리소스 ID + int iType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // NPC Type - 0x05 : 상인 + int iItemTrdeID = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 아이템 거래할 그룹 ID 서버에 요청할 ID + int iScale = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 스케일 100 은 1.0 + int iItemID0 = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 리소스 ID + int iItemID1 = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 리소스 ID int iNameLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); - std::string szName; // NPC ̵.. + std::string szName; // NPC 아이디.. if (iNameLen > 0) { CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szName, iNameLen); } else { @@ -2750,19 +2750,19 @@ bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { } //#ifdef _DEBUG - // CLogWriter::Write("NPC In - ID(%d) Name(%s) Time(%.1f)", iID, szName.c_str(), CN3Base::TimeGet()); // ij .. + // CLogWriter::Write("NPC In - ID(%d) Name(%s) Time(%.1f)", iID, szName.c_str(), CN3Base::TimeGet()); // 캐릭 세팅.. //#endif - e_Nation eNation = (e_Nation)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ҽ . 0 ̸ . 1 + e_Nation eNation = (e_Nation)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 소속 국가. 0 이면 없다. 1 int iLevel = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); float fXPos = (CAPISocket::Parse_GetWord(pDataPack->m_pData, iOffset)) / 10.0f; float fZPos = (CAPISocket::Parse_GetWord(pDataPack->m_pData, iOffset)) / 10.0f; float fYPos = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; - float fYTerrain = ACT_WORLD->GetHeightWithTerrain(fXPos, fZPos); // ̰ .. + float fYTerrain = ACT_WORLD->GetHeightWithTerrain(fXPos, fZPos); // 지형의 높이값 얻기.. float fYObject = ACT_WORLD->GetHeightNearstPosWithShape(__Vector3(fXPos, fYPos, fZPos), - 1.0f); // Ʈ ̰ .. + 1.0f); // 오브젝트에서 가장 가까운 높이값 얻기.. if (fYObject > fYTerrain) { fYPos = fYObject; } else { @@ -2770,17 +2770,17 @@ bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { } DWORD dwStatus = CAPISocket::Parse_GetDword( - pDataPack->m_pData, iOffset); // ... or ؼ . 0 , 1 . 2, 4, 8, 16 .... + pDataPack->m_pData, iOffset); // 상태... 여러가지로 or 연산해서 쓴다. 0 문 열림, 1 닫힘. 2, 4, 8, 16 .... DWORD dwType = CAPISocket::Parse_GetByte(pDataPack->m_pData, - iOffset); // Ÿ... 0 ̸ ij Ÿ NPC, 1 ̸ Ʈ Ÿ NPC + iOffset); // 타입... 0 이면 캐릭터 타입 NPC, 1 이면 오브젝트 타입 NPC CPlayerNPC * pNPC = s_pOPMgr->NPCGetByID(iID, false); - if (pNPC) // ̹ ̵ ij .. + if (pNPC) // 이미 아이디 같은 캐릭이 있으면.. { CLogWriter::Write("NPC In - Duplicated ID (%d, %s) Pos(%.2f,%.2f,%.2f)", iID, szName.c_str(), fXPos, fYPos, fZPos); TRACE("NPC In - Duplicated ID (%d, %s) Pos(%.2f,%.2f,%.2f)\n", iID, szName.c_str(), fXPos, fYPos, fZPos); - pNPC->Action(PSA_BASIC, true, NULL, true); // 츮.. + pNPC->Action(PSA_BASIC, true, NULL, true); // 강제로 살리고.. pNPC->m_fTimeAfterDeath = 0; pNPC->PositionSet(__Vector3(fXPos, fYPos, fZPos), true); return false; @@ -2790,20 +2790,20 @@ bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { (eNation != s_pPlayer->m_InfoBase.eNation) ? D3DCOLOR_XRGB(255, 128, 128) : D3DCOLOR_XRGB(192, 192, 255); pNPC = new CPlayerNPC(); - pNPC->IDSet(iID, szName, crID); // ʱȭ.. ID . + pNPC->IDSet(iID, szName, crID); // 초기화.. 및 ID 세팅. pNPC->m_InfoBase.eNation = eNation; - pNPC->m_InfoBase.eRace = RACE_NPC; // NPC ˸. + pNPC->m_InfoBase.eRace = RACE_NPC; // NPC 라는 걸 알린다. pNPC->m_InfoBase.iLevel = iLevel; - pNPC->m_InfoBase.iAuthority = AUTHORITY_NPC; // NPC .. + pNPC->m_InfoBase.iAuthority = AUTHORITY_NPC; // 권한 NPC는 권한이 없고.. - s_pOPMgr->NPCAdd(pNPC); // ij ߰... + s_pOPMgr->NPCAdd(pNPC); // 캐릭터 추가... - // Ŷ ij͸ ġ..(?) ش.. , ... + // 이제 패킷에 따라 캐릭터를 치장..(?) 시켜준다.. 아이템장착, 무기 장착등... CN3Shape * pShape = NULL; __TABLE_PLAYER_LOOKS * pLooks = NULL; if (0 == dwType) { - pLooks = s_pTbl_NPC_Looks->Find(iIDResrc); // ⺻ Ų.. - if (NULL == pLooks) // ij ⺻ ̺ ... + pLooks = s_pTbl_NPC_Looks->Find(iIDResrc); // 기본 스킨.. + if (NULL == pLooks) // 캐릭터 기본 모습 테이블이 없으면... { pLooks = s_pTbl_NPC_Looks->GetIndexedData(0); char szBuff[256]; @@ -2812,7 +2812,7 @@ bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { CLogWriter::Write(szBuff); } } else { - pShape = ACT_WORLD->ShapeGetByIDWithShape(iIDResrc); // Object NPC ã ... + pShape = ACT_WORLD->ShapeGetByIDWithShape(iIDResrc); // Object NPC 에서 찾아 본다... if (NULL == pShape) { char szBuff[256]; sprintf(szBuff, "Object NPC In : [Name(%s), ResourceID(%d)]", szName.c_str(), iIDResrc); @@ -2823,7 +2823,7 @@ bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { } if (pLooks) { - pNPC->InitChr(pLooks); // .. + pNPC->InitChr(pLooks); // 관절 세팅.. pNPC->ScaleSet(iScale / 100.0f); std::string szPartFN; @@ -2837,7 +2837,7 @@ bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { __TABLE_ITEM_BASIC * pItem0 = s_pTbl_Items_Basic->Find(iItemID0 / 1000 * 1000); __TABLE_ITEM_EXT * pItemExt0 = NULL; if (pItem0 && pItem0->byExtIndex >= 0 && pItem0->byExtIndex < MAX_ITEM_EXTENSION) { - pItemExt0 = s_pTbl_Items_Exts[pItem0->byExtIndex]->Find(iItemID0 % 1000); // .. + pItemExt0 = s_pTbl_Items_Exts[pItem0->byExtIndex]->Find(iItemID0 % 1000); // 열 데이터 얻기.. } if (pItem0 && pItemExt0) { e_PartPosition ePart; @@ -2854,7 +2854,7 @@ bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { __TABLE_ITEM_BASIC * pItem1 = s_pTbl_Items_Basic->Find(iItemID1 / 1000 * 1000); __TABLE_ITEM_EXT * pItemExt1 = NULL; if (pItem1 && pItem1->byExtIndex >= 0 && pItem1->byExtIndex < MAX_ITEM_EXTENSION) { - pItemExt1 = s_pTbl_Items_Exts[pItem1->byExtIndex]->Find(iItemID1 % 1000); // .. + pItemExt1 = s_pTbl_Items_Exts[pItem1->byExtIndex]->Find(iItemID1 % 1000); // 열 데이터 얻기.. } if (pItem1 && pItemExt1) { e_PartPosition ePart; @@ -2868,15 +2868,15 @@ bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { } } else if (pShape && (pShape->Type() & OBJ_SHAPE_EXTRA)) { CN3ShapeExtra * pSE = (CN3ShapeExtra *)pShape; - pNPC->m_pShapeExtraRef = pSE; // Ʈ .. - pSE->m_bVisible = true; // ʰ ϴ ÷ .. + pNPC->m_pShapeExtraRef = pSE; // 참조 오브젝트 세팅.. + pSE->m_bVisible = true; // 강제로 렌더링하지 않게 하는 플래그 해제.. bool bShouldBeRotate = true; __Vector3 vAxis(0, 1, 0); float fRadian = 0, fRadian2 = 0; bool bVisible = false; - if (OBJECT_TYPE_DOOR_LEFTRIGHT == pSE->m_iEventType) // ¿쿭 + if (OBJECT_TYPE_DOOR_LEFTRIGHT == pSE->m_iEventType) // 좌우열림 성문 { vAxis.Set(0, 1, 0); fRadian = D3DXToRadian(80); @@ -2885,33 +2885,33 @@ bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { vAxis.Set(0, 0, 1); fRadian = D3DXToRadian(90); fRadian2 = 0; - } // Ͽ + } // 상하열림 성문 else if (OBJECT_TYPE_LEVER_TOPDOWN == pSE->m_iEventType) { vAxis.Set(1, 0, 0); fRadian = D3DXToRadian(45); fRadian2 = D3DXToRadian(-45); - } // + } // 상하 레버 else if (OBJECT_TYPE_FLAG == pSE->m_iEventType) { bShouldBeRotate = false; } - if (0x01 == dwStatus) // ̰ ų ¿ ִ .. + if (0x01 == dwStatus) // 보이게 만들거나 좌우로 열려 있는 경우.. { - if (bShouldBeRotate) // + if (bShouldBeRotate) // 열기 { - pSE->RotateTo(0, vAxis, fRadian, 1, true); // ٷ . - pSE->RotateTo(1, vAxis, -fRadian, 1, true); // ٷ . - } else // ̱ + pSE->RotateTo(0, vAxis, fRadian, 1, true); // 바로 열기. + pSE->RotateTo(1, vAxis, -fRadian, 1, true); // 바로 열기. + } else // 보이기 { pSE->m_bVisible = true; } - } else if (0x00 == dwStatus) // Ⱥ̰ ų ִ.. + } else if (0x00 == dwStatus) // 안보이게 만들거나 닫혀있다.. { - if (bShouldBeRotate) // ݱ + if (bShouldBeRotate) // 닫기 { - pSE->RotateTo(0, vAxis, fRadian2, 1, true); // ٷ . - pSE->RotateTo(1, vAxis, -fRadian2, 1, true); // ٷ . - } else // Ⱥ̱. + pSE->RotateTo(0, vAxis, fRadian2, 1, true); // 바로 열기. + pSE->RotateTo(1, vAxis, -fRadian2, 1, true); // 바로 열기. + } else // 안보이기. { pSE->m_bVisible = false; } @@ -2922,8 +2922,8 @@ bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { CLogWriter::Write(szBuff); } - pNPC->PositionSet(__Vector3(fXPos, fYPos, fZPos), true); // ġ .. - pNPC->MoveTo(fXPos, fYPos, fZPos, 0, 0); // ġ.. + pNPC->PositionSet(__Vector3(fXPos, fYPos, fZPos), true); // 현재 위치 셋팅.. + pNPC->MoveTo(fXPos, fYPos, fZPos, 0, 0); // 현재 위치.. pNPC->RotateTo(D3DXToRadian(rand() % 360), false); pNPC->Action(PSA_BASIC, true, NULL, true); pNPC->ActionMove(PSM_STOP); @@ -2932,11 +2932,11 @@ bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { } bool CGameProcMain::MsgRecv_NPCOut(DataPack * pDataPack, int & iOffset) { - int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Server ϴ ID - return s_pOPMgr->NPCDelete(iID); // ij ... + int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Server에서 관리하는 고유 ID + return s_pOPMgr->NPCDelete(iID); // 캐릭터 제거... } -// ̵ īƮŭ ޴´... ۱.. Ʈ ʿ ͸ û.. +// 주위 영역의 모든 아이디를 카운트만큼 받는다... 글구.. 업데이트가 필요한 것만 서버에게 요청.. bool CGameProcMain::MsgRecv_NPCInAndRequest(DataPack * pDataPack, int & iOffset) { int iNPCCountReceived = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); TRACE("NPC region update : %d\n", iNPCCountReceived); @@ -2946,14 +2946,14 @@ bool CGameProcMain::MsgRecv_NPCInAndRequest(DataPack * pDataPack, int & iOffset) } if (iNPCCountReceived < 0 || iNPCCountReceived >= 1000) { char szErr[256]; - sprintf(szErr, " û - NPC %d", iNPCCountReceived); + sprintf(szErr, "영역정보 요청 오류 - NPC 갯수 %d", iNPCCountReceived); CGameProcedure::ReportDebugStringAndSendToServer(szErr); __ASSERT(0, szErr); return false; } int iID = 0; - m_SetNPCID.clear(); // ... + m_SetNPCID.clear(); // 싹 지우고... it_ID itID, itIDEnd = m_SetNPCID.end(); pair_ID pairID; @@ -2963,13 +2963,13 @@ bool CGameProcMain::MsgRecv_NPCInAndRequest(DataPack * pDataPack, int & iOffset) TRACE(" ID : %d\n", iID); } - if (m_SetNPCID.empty()) // Ѱ ٸ .. + if (m_SetNPCID.empty()) // 새로 받은게 한개도 없다면 몽땅 날린다.. { s_pOPMgr->ReleaseNPCs(); return false; } - // ̵ Ʈ ִ NPC ID ˻ؼ.. + // 새로 받은 아이디와 리스트에 있는 NPC ID 를 검색해서.. CPlayerNPC * pNPC = NULL; it_NPC itNPC = s_pOPMgr->m_NPCs.begin(), itNPCEnd = s_pOPMgr->m_NPCs.end(); for (; itNPC != itNPCEnd;) { @@ -2977,11 +2977,11 @@ bool CGameProcMain::MsgRecv_NPCInAndRequest(DataPack * pDataPack, int & iOffset) iID = pNPC->IDNumber(); itID = m_SetNPCID.find(iID); - if (itID != itIDEnd) // Ʈ .. + if (itID != itIDEnd) // 새로 들어온 리스트에 있으면.. { - m_SetNPCID.erase(itID); // û Ʈ .. + m_SetNPCID.erase(itID); // 요청할 리스트에서 빼고.. itNPC++; - } else // ° .. + } else // 새로 들어온곳에 없으면 지운다.. { TRACE(" delete : %d\n", iID); @@ -2996,23 +2996,23 @@ bool CGameProcMain::MsgRecv_NPCInAndRequest(DataPack * pDataPack, int & iOffset) } //////////////////////////////////////////////////////////////////////////// - // ٷ û Ŷ .. + // 바로 요청 패킷을 만들어 보낸다.. int iNewNPCCount = m_SetNPCID.size(); if (iNewNPCCount > 0) { - int iOffset = 0; // .. - std::vector byBuff(iNewNPCCount * 2 + 10, 0); // Ŷ .. - CAPISocket::MP_AddByte(&(byBuff[0]), iOffset, N3_REQUEST_NPC_IN); // Ŀ. - CAPISocket::MP_AddShort(&(byBuff[0]), iOffset, iNewNPCCount); // ̵ .. + int iOffset = 0; // 버퍼의 오프셋.. + std::vector byBuff(iNewNPCCount * 2 + 10, 0); // 패킷 버퍼.. + CAPISocket::MP_AddByte(&(byBuff[0]), iOffset, N3_REQUEST_NPC_IN); // 커멘드. + CAPISocket::MP_AddShort(&(byBuff[0]), iOffset, iNewNPCCount); // 아이디 갯수.. itID = m_SetNPCID.begin(); itIDEnd = m_SetNPCID.end(); for (int i = 0; itID != itIDEnd; itID++, i++) { iID = *itID; - CAPISocket::MP_AddShort(&(byBuff[0]), iOffset, iID); // ڼ ʿ ̵.. + CAPISocket::MP_AddShort(&(byBuff[0]), iOffset, iID); // 자세한 정보가 필요한 아이디들.. } - s_pSocket->Send(&(byBuff[0]), iOffset); // + s_pSocket->Send(&(byBuff[0]), iOffset); // 보낸다 } - // ٷ û Ŷ .. + // 바로 요청 패킷을 만들어 보낸다.. //////////////////////////////////////////////////////////////////////////// return true; @@ -3026,7 +3026,7 @@ bool CGameProcMain::MsgRecv_NPCInRequested(DataPack * pDataPack, int & iOffset) } if (iNPCCount < 0 || iNPCCount >= 1000) { char szErr[256]; - sprintf(szErr, " ޱ - NPC %d", iNPCCount); + sprintf(szErr, "영역정보 받기오류 - NPC 갯수 %d", iNPCCount); CGameProcedure::ReportDebugStringAndSendToServer(szErr); __ASSERT(0, szErr); return false; @@ -3037,7 +3037,7 @@ bool CGameProcMain::MsgRecv_NPCInRequested(DataPack * pDataPack, int & iOffset) #endif for (int i = 0; i < iNPCCount; i++) { - this->MsgRecv_NPCIn(pDataPack, iOffset); // ÷̾ ŭ ... + this->MsgRecv_NPCIn(pDataPack, iOffset); // 플레이어 갯수 만큼 유저 인... } #ifdef _DEBUG @@ -3054,17 +3054,17 @@ bool CGameProcMain::MsgRecv_NPCMove(DataPack * pDataPack, int & iOffset) { float fYPos = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; float fSpeed = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; - // Լ ; κ.. ^^ + // 함수가 와야 할 부분.. ^^ CPlayerNPC * pNPC = NULL; - pNPC = s_pOPMgr->NPCGetByID(iID, true); // NPC IDμ .. + pNPC = s_pOPMgr->NPCGetByID(iID, true); // NPC을 ID로서 얻고.. if (NULL == pNPC) { this->MsgSend_NPCInRequest(iID); - return false; // ִ NPC .. + return false; // 살아있는 NPC가 있으면.. } - float fY = ACT_WORLD->GetHeightWithTerrain(fXPos, fZPos); // ̰.. + float fY = ACT_WORLD->GetHeightWithTerrain(fXPos, fZPos); // 지형 높이값.. int iMoveMode = (fSpeed > 0) ? 2 : 0; - pNPC->MoveTo(fXPos, fY, fZPos, fSpeed, iMoveMode); // NPC ġ .. + pNPC->MoveTo(fXPos, fY, fZPos, fSpeed, iMoveMode); // NPC 위치 갱신.. __ASSERT(!(iMoveMode && fSpeed == 0), "Invalid NPC Move Packet"); @@ -3073,13 +3073,13 @@ bool CGameProcMain::MsgRecv_NPCMove(DataPack * pDataPack, int & iOffset) { bool CGameProcMain::MsgRecv_Attack(DataPack * pDataPack, int & iOffset) { int iType = CAPISocket::Parse_GetByte(pDataPack->m_pData, - iOffset); // 0x01 - , 0x02 0x03, - int iResult = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 0x00 , 0x01 - int iIDAttacker = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // - int iIDTarget = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Ÿ Ǽ ݴѳ. + iOffset); // 0x01 - 물리적인 공격, 0x02 마법 공격 0x03, 지속 마법 공격 + int iResult = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 0x00 실패, 0x01 성공 + int iIDAttacker = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 공격한 넘 + int iIDTarget = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 타겟이 되서 공격당한넘. if (iIDAttacker == iIDTarget) { - return false; // ڿ ڰ ???? + return false; // 공격자와 피해자가 같은 경우???? } bool bIAmTarget = (iIDTarget == s_pPlayer->IDNumber()) ? true : false; @@ -3087,58 +3087,58 @@ bool CGameProcMain::MsgRecv_Attack(DataPack * pDataPack, int & iOffset) { CPlayerBase * pAttacker = NULL; if (bIAmAttacker) { - pAttacker = s_pPlayer; // ϴ ڽ̸ + pAttacker = s_pPlayer; // 공격하는 넘이 내 자신이면 } else { pAttacker = s_pOPMgr->CharacterGetByID(iIDAttacker, true); } - if (NULL == pAttacker) // ϴ ?? + if (NULL == pAttacker) // 어라 공격하는 넘이 없네?? { - if (iIDAttacker > 10000) { // NPC 1000 ̴̻. - this->MsgSend_NPCInRequest(iIDAttacker); // NPC ûѴ.. + if (iIDAttacker > 10000) { // NPC 는 1000 이상이다. + this->MsgSend_NPCInRequest(iIDAttacker); // NPC 정보가 없을 경우 요청한다.. } else if (iIDAttacker < 3000) { - this->MsgSend_UserInRequest(iIDAttacker); // NPC ûѴ.. + this->MsgSend_UserInRequest(iIDAttacker); // NPC 정보가 없을 경우 요청한다.. } - return false; // ϴ ư. + return false; // 공격하는 넘이 없으면 돌아간다. } CPlayerBase * pTarget = NULL; - if (bIAmTarget) // Ÿ .. + if (bIAmTarget) // 타겟이 나라면.. { - this->CommandSitDown(false, false); // . + this->CommandSitDown(false, false); // 일으켜 세운다. if (m_pMagicSkillMng->IsCasting()) { __TABLE_UPC_SKILL * pSkill = s_pTbl_Skill->Find(s_pPlayer->m_dwMagicID); if (pSkill) { int SuccessValue = rand() % 100; - if (SuccessValue >= pSkill->iPercentSuccess) { // ų ̺ ִ Ȯ Ѵ.. - s_pPlayer->Action(PSA_BASIC, false, NULL, true); // ij , ⺻ .. + if (SuccessValue >= pSkill->iPercentSuccess) { // 스킬 테이블에 있는 확률대로 실패한다.. + s_pPlayer->Action(PSA_BASIC, false, NULL, true); // 캐스팅 취소, 기본동작으로 강제 세팅.. } } } pTarget = s_pPlayer; - } else // Ÿ ٸ̸.. + } else // 타겟이 다른넘이면.. { - pTarget = s_pOPMgr->CharacterGetByID(iIDTarget, true); // ϴ ִ ѵ߿ ͺ.. + pTarget = s_pOPMgr->CharacterGetByID(iIDTarget, true); // 일단 살아있는 넘들중에서 가져와보고.. if (NULL == pTarget) { - pTarget = s_pOPMgr->CharacterGetByID(iIDTarget, false); // ٸ ׾ ѵ Ÿ + pTarget = s_pOPMgr->CharacterGetByID(iIDTarget, false); // 없다면 죽어가는 넘도 상관없이 타겟으로 잡고 } } if (NULL == pTarget) { - return false; // Ÿ !!!! + return false; // 타겟이 없다!!!! } - // pTarget->m_iIDTargetMe = iIDAttacker; //  ϴ ž?? + // pTarget->m_iIDTargetMe = iIDAttacker; // 어떤 놈이 공격하는 거야?? - if (pAttacker != s_pPlayer && pAttacker && pAttacker->IsAlive()) // ϴ ƴϰ ٸ ִ ϶.. + if (pAttacker != s_pPlayer && pAttacker && pAttacker->IsAlive()) // 공격하는 넘이 내가 아니고 다른 살아있는 넘일때.. { - ((CPlayerNPC *)pAttacker)->RotateTo(pTarget); // Ÿ ؼ - pAttacker->m_iIDTarget = iIDTarget; // Ÿ ID .. + ((CPlayerNPC *)pAttacker)->RotateTo(pTarget); // 타겟을 향해서 방향 계산 + pAttacker->m_iIDTarget = iIDTarget; // 타겟 ID 설정.. if (0x01 == iType) { - pAttacker->Action(PSA_ATTACK, false, pTarget); // .. + pAttacker->Action(PSA_ATTACK, false, pTarget); // 물리적인 직접 공격.. } else if (0x02 == iType) { - pAttacker->Action(PSA_SPELLMAGIC, false, pTarget); // .. + pAttacker->Action(PSA_SPELLMAGIC, false, pTarget); // 마법 공격.. } - // else if(0x03 == iType) pAttacker->Action(PSA_SPELLMAGIC, false, pTarget); // .. + // else if(0x03 == iType) pAttacker->Action(PSA_SPELLMAGIC, false, pTarget); // 지속 마법 공격.. } if (bIAmTarget || bIAmAttacker) { @@ -3155,17 +3155,17 @@ bool CGameProcMain::MsgRecv_Attack(DataPack * pDataPack, int & iOffset) { } } - pTarget->m_bGuardSuccess = false; //  ߴ ÷.. - if (0x0 == iResult) // + pTarget->m_bGuardSuccess = false; // 방어에 성공했는지에 대한 플래그.. + if (0x0 == iResult) // 공격 실패 { if (pTarget->IsAlive() && - 0 == pTarget->m_iSkillStep) // ƴϰ ų ƴϸ Ѵ.. + 0 == pTarget->m_iSkillStep) // 죽은 넘이 아니고 스킬을 쓰즌 중이 아니면 막는 동작을 한다.. { - pTarget->m_bGuardSuccess = true; //  ߴ ÷.. + pTarget->m_bGuardSuccess = true; // 방어에 성공했는지에 대한 플래그.. pTarget->Action(PSA_GUARD, false); } - if (pAttacker == s_pPlayer) // ϴ ÷̾ ڽ̸.. + if (pAttacker == s_pPlayer) // 공격하는 사람이 플레이어 자신이면.. { char szBuf[128] = ""; std::string szFmt; @@ -3173,18 +3173,18 @@ bool CGameProcMain::MsgRecv_Attack(DataPack * pDataPack, int & iOffset) { sprintf(szBuf, szFmt.c_str(), pTarget->IDString().c_str()); MsgOutput(szBuf, 0xffffffff); } - } else if (0x2 == iResult) // Attack And Dead - ̹ ״´!!! + } else if (0x2 == iResult) // Attack And Dead - 이번 공격으로 죽는다!!! { if (pTarget == s_pPlayer) { // if(m_pUIDead) m_pUIDead->SetVisible(true); std::string szMsg; ::_LoadStringFromResource(IDS_REGENERATION, szMsg); - CGameProcedure::MessageBoxPost(szMsg, "", MB_OK, BEHAVIOR_REGENERATION); // ٽ ޽ .. + CGameProcedure::MessageBoxPost(szMsg, "", MB_OK, BEHAVIOR_REGENERATION); // 다시 생성 메시지 보냄.. } - pTarget->m_fTimeAfterDeath = 0.1f; // ױ.. + pTarget->m_fTimeAfterDeath = 0.1f; // 죽기직전.. if (pTarget->m_pShapeExtraRef) { - s_pOPMgr->CharacterDelete(pTarget->IDNumber()); // Ʈ ϶ ֹ..!! + s_pOPMgr->CharacterDelete(pTarget->IDNumber()); // 오브젝트 일때는 없애버린다..!! } } @@ -3196,7 +3196,7 @@ bool CGameProcMain::MsgRecv_Attack(DataPack * pDataPack, int & iOffset) { } bool CGameProcMain::MsgRecv_Dead(DataPack * pDataPack, int & iOffset) { - int iIDTarget = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Ÿ Ǽ ݴѳ. + int iIDTarget = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 타겟이 되서 공격당한넘. CPlayerBase * pTarget = NULL; if (iIDTarget == s_pPlayer->IDNumber()) { @@ -3205,7 +3205,7 @@ bool CGameProcMain::MsgRecv_Dead(DataPack * pDataPack, int & iOffset) { // if(m_pUIDead) m_pUIDead->SetVisible(true); std::string szMsg; ::_LoadStringFromResource(IDS_REGENERATION, szMsg); - CGameProcedure::MessageBoxPost(szMsg, "", MB_OK, BEHAVIOR_REGENERATION); // ٽ ޽ .. + CGameProcedure::MessageBoxPost(szMsg, "", MB_OK, BEHAVIOR_REGENERATION); // 다시 생성 메시지 보냄.. CLogWriter::Write("Dead!!!"); } else { pTarget = this->CharacterGetByID(iIDTarget, false); @@ -3215,7 +3215,7 @@ bool CGameProcMain::MsgRecv_Dead(DataPack * pDataPack, int & iOffset) { if (pTarget->m_pShapeExtraRef) { s_pOPMgr->CharacterDelete(pTarget->IDNumber()); } else { - pTarget->m_fTimeAfterDeath = 0.1f; // ױ.. + pTarget->m_fTimeAfterDeath = 0.1f; // 죽기직전.. pTarget->ActionDying(PSD_KEEP_POSITION, __Vector3(0, 0, 1)); } @@ -3238,7 +3238,7 @@ bool CGameProcMain::MsgRecv_ItemMove(DataPack * pDataPack, int & iOffset) { pInfoBase->iHPMax = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); pInfoExt->iMSPMax = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); - // ۿ Ȱ̴.. + // 아이템에 의해 가감된값이다.. pInfoExt->iStrength_Delta = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); pInfoExt->iStamina_Delta = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); pInfoExt->iDexterity_Delta = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); @@ -3253,10 +3253,10 @@ bool CGameProcMain::MsgRecv_ItemMove(DataPack * pDataPack, int & iOffset) { pInfoExt->iRegistPoison = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); if (pInfoBase->iHP > pInfoBase->iHPMax) { - pInfoBase->iHP = pInfoBase->iHPMax; // ˻.. + pInfoBase->iHP = pInfoBase->iHPMax; // 범위검사.. } if (pInfoExt->iMSP > pInfoExt->iMSPMax) { - pInfoExt->iMSP = pInfoExt->iMSPMax; // ˻.. + pInfoExt->iMSP = pInfoExt->iMSPMax; // 범위검사.. } m_pUIVar->m_pPageState->UpdateHP(pInfoBase->iHP, pInfoBase->iHPMax); @@ -3289,7 +3289,7 @@ bool CGameProcMain::MsgRecv_ItemMove(DataPack * pDataPack, int & iOffset) { return true; } -bool CGameProcMain::MsgRecv_ItemWeightChange(DataPack * pDataPack, int & iOffset) // ȭ.. +bool CGameProcMain::MsgRecv_ItemWeightChange(DataPack * pDataPack, int & iOffset) // 아이템 무게 변화.. { __InfoPlayerMySelf * pInfoExt = &(s_pPlayer->m_InfoExt); pInfoExt->iWeight = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); @@ -3317,7 +3317,7 @@ bool CGameProcMain::MsgRecv_UserLookChange(DataPack * pDataPack, int & iOffset) __TABLE_ITEM_EXT * pItemExt = NULL; if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { - pItemExt = s_pTbl_Items_Exts[pItem->byExtIndex]->Find(dwItemID % 1000); // .. + pItemExt = s_pTbl_Items_Exts[pItem->byExtIndex]->Find(dwItemID % 1000); // 열 데이터 얻기.. } if (dwItemID && (NULL == pItem || NULL == pItemExt)) { N3_WARN("NULL Item!!!"); @@ -3344,22 +3344,22 @@ bool CGameProcMain::MsgRecv_UserLookChange(DataPack * pDataPack, int & iOffset) } if (ePartPos != PART_POS_UNKNOWN) { - if (dwItemID) // ִ + if (dwItemID) // 아이템이 있는 경우 { std::string szItemFN; CGameProcedure::MakeResrcFileNameForUPC(pItem, &szItemFN, NULL, ePartPos2, ePlugPos2); - pUPC->PartSet(ePartPos, szItemFN, pItem, pItemExt); // ̱.. + pUPC->PartSet(ePartPos, szItemFN, pItem, pItemExt); // 아이템 붙이기.. pUPC->DurabilitySet(eSlot, iDurability); } else { __TABLE_PLAYER_LOOKS * pLooks = - s_pTbl_UPC_Looks->Find(pUPC->m_InfoBase.eRace); // User Player Character Skin ü .. + s_pTbl_UPC_Looks->Find(pUPC->m_InfoBase.eRace); // User Player Character Skin 구조체 포인터.. if (NULL == pLooks) { CLogWriter::Write("CGameProcMain::MsgRecv_UserLookChange() - failed find table : Race (%d)", pUPC->m_InfoBase.eRace); __ASSERT(pLooks, "failed find table"); } else { if (PART_POS_HAIR_HELMET == ePartPos) { - pUPC->InitHair(); // Ӹε .. + pUPC->InitHair(); // 머리인데 없는 경우는.. } else { pUPC->PartSet(ePartPos, pLooks->szPartFNs[ePartPos], NULL, NULL); } @@ -3378,11 +3378,11 @@ bool CGameProcMain::MsgRecv_UserLookChange(DataPack * pDataPack, int & iOffset) pUPC->DurabilitySet(eSlot, 0); } - // Sound Range ̸ 带 ٲپش.. + // Sound Range 안쪽이면 사운드를 바꾸어준다.. __Vector3 vPosPlayer = s_pPlayer->Position(); float fDist = pUPC->Distance(vPosPlayer); if (fDist < SOUND_RANGE_TO_SET) { - pUPC->SetSoundPlug(pItem); // SOUND_RANGE ȿ . + pUPC->SetSoundPlug(pItem); // SOUND_RANGE 안에 있으면. } return true; @@ -3394,7 +3394,7 @@ bool CGameProcMain::MsgRecv_UserLookChange(DataPack * pDataPack, int & iOffset) return false; } -bool CGameProcMain::MsgRecv_ItemBundleDrop(DataPack * pDataPack, int & iOffset) // Item ʵ忡 Ÿµ +bool CGameProcMain::MsgRecv_ItemBundleDrop(DataPack * pDataPack, int & iOffset) // Item 이 필드에 나타나는데에 대한 응답 { int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); int iItemID = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); @@ -3405,26 +3405,26 @@ bool CGameProcMain::MsgRecv_UserLookChange(DataPack * pDataPack, int & iOffset) } if (pCorpse) { - pCorpse->m_iDroppedItemID = iItemID; // Ʈ ̵ ġ + pCorpse->m_iDroppedItemID = iItemID; // 떨어트린 아이템 아이디 뭉치 } return true; } -bool CGameProcMain::MsgRecv_ItemBundleOpen(DataPack * pDataPack, int & iOffset) // ڸ ų ü .. +bool CGameProcMain::MsgRecv_ItemBundleOpen(DataPack * pDataPack, int & iOffset) // 아이템 상자를 열거나 시체를 뒤진다.. { DWORD dwItemID = 0; int iItemCount = 0; POINT ptCur = s_pLocalInput->MouseGetPos(); m_pUIDroppedItemDlg->EnterDroppedState(ptCur.x, ptCur.y); - TRACE(" Ʈ .. \n"); + TRACE("아이템 리스트 도착.. \n"); for (int i = 0; i < MAX_ITEM_BUNDLE_DROP_PIECE; i++) { dwItemID = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); iItemCount = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); - // ̺κп â غѴ.. + // 이부분에 몬스터 아이템창을 열고 준비한다.. if (dwItemID) { m_pUIDroppedItemDlg->AddToItemTable(dwItemID, iItemCount, i); } @@ -3570,20 +3570,20 @@ bool CGameProcMain::MsgRecv_MyInfo_LevelChange(DataPack * pDataPack, int & iOffs int iLevelPrev = pInfoBase->iLevel; pInfoBase->iLevel = iLevel; - pInfoExt->iBonusPointRemain = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // ʽ Ʈ.. + pInfoExt->iBonusPointRemain = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 남은 보너스 포인트.. - BYTE bExtraSkillPoint = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ż Ʈ + BYTE bExtraSkillPoint = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 토탈 포인트 TRACE("Skill change Extra value %d\n", bExtraSkillPoint); int iExpNext = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); int iExp = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); - // ġ ش.. + // 새로 얻은 경험치를 계산해준다.. int iExpChange = 0; if (iLevel > iLevelPrev) { - iExpChange = (pInfoExt->iExpNext - pInfoExt->iExp) + iExp; // Ѱ.. + iExpChange = (pInfoExt->iExpNext - pInfoExt->iExp) + iExp; // 레벨업 한경우.. } else { - iExpChange = -(pInfoExt->iExp + iExpNext - iExp); // ٿ Ѱ.. + iExpChange = -(pInfoExt->iExp + iExpNext - iExp); // 레벨다운 한경우.. } char szBuf[256] = ""; if (iExpChange > 0) { @@ -3609,16 +3609,16 @@ bool CGameProcMain::MsgRecv_MyInfo_LevelChange(DataPack * pDataPack, int & iOffs pInfoExt->iWeightMax = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); pInfoExt->iWeight = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); - m_pUIVar->UpdateAllStates(&(s_pPlayer->m_InfoBase), &(s_pPlayer->m_InfoExt)); // Ʈ.. + m_pUIVar->UpdateAllStates(&(s_pPlayer->m_InfoBase), &(s_pPlayer->m_InfoExt)); // 모든 정보 업데이트.. m_pUIStateBarAndMiniMap->UpdateExp(pInfoExt->iExp, pInfoExt->iExpNext, true); m_pUIStateBarAndMiniMap->UpdateHP(pInfoBase->iHP, pInfoBase->iHPMax, false); m_pUIStateBarAndMiniMap->UpdateMSP(pInfoExt->iMSP, pInfoExt->iMSPMax, false); m_pUISkillTreeDlg->m_iSkillInfo[0] = bExtraSkillPoint; - m_pUISkillTreeDlg->InitIconUpdate(); // ȭǾǷ .. ų ߰ ִ.. + m_pUISkillTreeDlg->InitIconUpdate(); // 레벨이 변화되었으므로 .. 스킬도 추가될 수 있다.. - if (iLevel > iLevelPrev) // ̰ Level Up ȿ ־ش.. + if (iLevel > iLevelPrev) // 이곳에 Level Up 효과를 넣어준다.. { if (s_pPlayer->Nation() == NATION_KARUS) { CGameProcedure::s_pFX->TriggerBundle(iID, -1, FXID_LEVELUP_KARUS, iID, -1); @@ -3626,7 +3626,7 @@ bool CGameProcMain::MsgRecv_MyInfo_LevelChange(DataPack * pDataPack, int & iOffs CGameProcedure::s_pFX->TriggerBundle(iID, -1, FXID_LEVELUP_ELMORAD, iID, -1); } } - } else // ٸ ̴.. + } else // 다른 넘이다.. { CPlayerOther * pUPC = s_pOPMgr->UPCGetByID(iID, false); if (pUPC) { @@ -3647,7 +3647,7 @@ bool CGameProcMain::MsgRecv_MyInfo_LevelChange(DataPack * pDataPack, int & iOffs void CGameProcMain::MsgRecv_MyInfo_RealmPoint(DataPack * pDataPack, int & iOffset) { s_pPlayer->m_InfoExt.iRealmPoint = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); if (m_pUIVar->m_pPageState) { - m_pUIVar->m_pPageState->UpdateRealmPoint(s_pPlayer->m_InfoExt.iRealmPoint); // ⿩ 10  ǥ + m_pUIVar->m_pPageState->UpdateRealmPoint(s_pPlayer->m_InfoExt.iRealmPoint); // 국가 기여도는 10을 나누어서 표시 } } @@ -3669,8 +3669,8 @@ void CGameProcMain::MsgRecv_MyInfo_PointChange(DataPack * pDataPack, int & iOffs m_pUIVar->m_pPageState->UpdateAttackPoint(s_pPlayer->m_InfoExt.iAttack, s_pPlayer->m_InfoExt.iAttack_Delta); m_pUIVar->m_pPageState->UpdateWeight(s_pPlayer->m_InfoExt.iWeight, s_pPlayer->m_InfoExt.iWeightMax); - // Ʈ ü - b1(1 2ü 3ø 4 5) s(-1 +1) - // b1(1 2ü 3ø 4 5) s(ġ) + // 포인트 체인지 - 보낼때 b1(1힘 2체력 3민첩 4지능 5마력) s(-1 +1) + // 받을때 b1(1힘 2체력 3민첩 4지능 5마력) s(절대수치) if (0x01 == iType) // Strength { @@ -3699,7 +3699,7 @@ void CGameProcMain::MsgRecv_MyInfo_PointChange(DataPack * pDataPack, int & iOffs if (iType >= 1 && iType <= 5) { s_pPlayer->m_InfoExt.iBonusPointRemain--; m_pUIVar->m_pPageState->UpdateBonusPointAndButtons( - s_pPlayer->m_InfoExt.iBonusPointRemain); // ʽ Ʈ Ѱ?? + s_pPlayer->m_InfoExt.iBonusPointRemain); // 보너스 포인트 적용이 가능한가?? } } @@ -3710,7 +3710,7 @@ void CGameProcMain::InitUI() { RECT rc; int iX = 0, iY = 0; - e_Nation eNation = s_pPlayer->m_InfoBase.eNation; // .... + e_Nation eNation = s_pPlayer->m_InfoBase.eNation; // 국가.... __TABLE_UI_RESRC * pTbl = s_pTbl_UI->Find(eNation); if (NULL == pTbl) { @@ -3723,11 +3723,11 @@ void CGameProcMain::InitUI() { m_pUICmd->SetPos((iW - (rc.right - rc.left)) / 2, iH - (rc.bottom - rc.top)); m_pUICmd->SetStyle(UISTYLE_FOCUS_UNABLE | UISTYLE_HIDE_UNABLE); - m_pUIChatDlg->Init(s_pUIMgr); //Manager ڽ Ʈ ߰ + m_pUIChatDlg->Init(s_pUIMgr); //Manager 자식으로 리스트에 추가 m_pUIChatDlg->LoadFromFile(pTbl->szChat); rc = m_pUIChatDlg->GetRegion(); RECT rcCmd = m_pUICmd->GetRegion(); - rcCmd.top += 5; // .. ϵ ڵ.. + rcCmd.top += 5; // .. 하드 코딩.. iX = 0; iY = iH - ((rc.bottom - rc.top) + (rcCmd.bottom - rcCmd.top)); CGameProcedure::UIPostData_Read(UI_POST_WND_CHAT, m_pUIChatDlg, iX, iY); @@ -3738,7 +3738,7 @@ void CGameProcMain::InitUI() { m_pUIMsgDlg->LoadFromFile(pTbl->szMsgOutput); m_pUIMsgDlg->SetStyle(UISTYLE_FOCUS_UNABLE | UISTYLE_HIDE_UNABLE); - // äâ ޽ â ġ ߱.. + // 채팅창과 메시지 창 위치 맞추기.. m_pUIChatDlg->MoveOffset(0, -1); m_pUIStateBarAndMiniMap->Init(s_pUIMgr); @@ -3746,7 +3746,7 @@ void CGameProcMain::InitUI() { m_pUIStateBarAndMiniMap->SetStyle(UISTYLE_FOCUS_UNABLE | UISTYLE_HIDE_UNABLE); m_pUIStateBarAndMiniMap->SetPos(0, 0); - // ٿ뵵 UI - , ܰ, Ʈ, ģ ... + // 다용도 UI - 상태, 기사단관리, 퀘스트, 친구 관리등... m_pUIVar->Init(s_pUIMgr); m_pUIVar->LoadFromFile(pTbl->szVarious); m_pUIVar->SetVisibleWithNoSound(false); @@ -3776,7 +3776,7 @@ void CGameProcMain::InitUI() { m_pUIHelp->SetPos(iX, iY); // m_pUIHelp->SetStyle(UISTYLE_SHOW_ME_ALONE); - // .. + // 공지사항.. m_pUINotice->Init(s_pUIMgr); m_pUINotice->LoadFromFile(pTbl->szNotice); m_pUINotice->SetVisibleWithNoSound(false); @@ -3857,7 +3857,7 @@ void CGameProcMain::InitUI() { rc = m_pUIPartyOrForce->GetRegion(); iX = iW - (rc.right - rc.left); m_pUIPartyOrForce->SetPos(iX, 0); - m_pUIPartyOrForce->SetVisible(false); // Ⱥ̱~ + m_pUIPartyOrForce->SetVisible(false); // 강제로 안보이기~ // CGameProcedure::UIPostData_Read(UI_POST_WND_PARTY, m_pUIPartyOrForce, iX, 0); // Dropped Item Dlg.. @@ -3895,7 +3895,7 @@ void CGameProcMain::InitUI() { CN3UIWndBase::m_pCountableItemEdit->Init(s_pUIMgr); CN3UIWndBase::m_pCountableItemEdit->LoadFromFile(pTbl->szPersonalTradeEdit); CN3UIWndBase::m_pCountableItemEdit->SetStyle(UISTYLE_ALWAYSTOP); - // ġ .. + // 위치 계산 .. rc = CN3UIWndBase::m_pCountableItemEdit->GetRegion(); iX = (iW - (rc.right - rc.left)) / 2; iY = (iH - (rc.bottom - rc.top)) / 2; @@ -3914,22 +3914,22 @@ void CGameProcMain::InitUI() { m_pUISkillTreeDlg->SetState(UI_STATE_COMMON_NONE); m_pUISkillTreeDlg->SetStyle(m_pUISkillTreeDlg->GetStyle() | UISTYLE_POS_RIGHT); - // default ui pos .. ػ󵵰 Ǹ.. ġ ؾ Ѵ.. by ecli666 + // default ui pos .. 해상도가 변경되면.. 상대 위치를 구해야 한다.. by ecli666 rc = m_pUIStateBarAndMiniMap->GetRegion(); m_pUIHotKeyDlg->Init(s_pUIMgr); m_pUIHotKeyDlg->LoadFromFile(pTbl->szHotKey); m_pUIHotKeyDlg->SetStyle(UISTYLE_HIDE_UNABLE); CGameProcedure::UIPostData_Read(UI_POST_WND_HOTKEY, m_pUIHotKeyDlg, rc.left, rc.bottom); - m_pUIHotKeyDlg->SetVisibleWithNoSound(true); // δ!!! + m_pUIHotKeyDlg->SetVisibleWithNoSound(true); // 무조건 보인다!!! m_pUIHotKeyDlg->InitIconWnd(UIWND_HOTKEY); m_pUIHotKeyDlg->SetUIType(UI_TYPE_ICON_MANAGER); m_pUIHotKeyDlg->SetState(UI_STATE_COMMON_NONE); - m_pUIKnightsOp->Init(s_pUIMgr); // Ʈ , , ... + m_pUIKnightsOp->Init(s_pUIMgr); // 기사단 리스트 보기, 가입, 등... m_pUIKnightsOp->LoadFromFile(pTbl->szKnightsOperation); m_pUIKnightsOp->SetVisibleWithNoSound(false); - // Ƽ Խ.. + // 파티 지원 게시판.. m_pUIPartyBBS->Init(s_pUIMgr); m_pUIPartyBBS->LoadFromFile(pTbl->szPartyBBS); m_pUIPartyBBS->SetVisibleWithNoSound(false); @@ -3949,7 +3949,7 @@ void CGameProcMain::InitUI() { m_pUIWareHouseDlg->SetStyle(UISTYLE_USER_MOVE_HIDE | UISTYLE_POS_RIGHT); m_pTargetSymbol->LoadFromFile( - pTbl->szTargetSymbolShape); // ÷̾ Ÿ ij ġ ׸ ȴ.. + pTbl->szTargetSymbolShape); // 플레이어가 타겟으로 잡은 캐릭터의 위치위에 그리면 된다.. m_pUIInn->Init(s_pUIMgr); m_pUIInn->LoadFromFile(pTbl->szInn); @@ -4003,7 +4003,7 @@ void CGameProcMain::InitUI() { iY = (iH - (rc.bottom - rc.top)) / 2; m_pUIDead->SetPos(iX, iY); - // ŷ Խ + // 상거래 게시판 m_pUITradeBBS->Init(s_pUIMgr); m_pUITradeBBS->LoadFromFile(pTbl->szTradeBBS); m_pUITradeBBS->SetVisibleWithNoSound(false); @@ -4013,7 +4013,7 @@ void CGameProcMain::InitUI() { iY = (iH - (rc.bottom - rc.top)) / 2; m_pUITradeBBS->SetPos(iX, iY); - // ŷ + // 상거래 종류 선택 m_pUITradeBBSSelector->Init(s_pUIMgr); m_pUITradeBBSSelector->LoadFromFile(pTbl->szTradeBBSSelector); m_pUITradeBBSSelector->SetVisibleWithNoSound(false); @@ -4023,7 +4023,7 @@ void CGameProcMain::InitUI() { m_pUITradeBBSSelector->SetPos(iX, iY); m_pUITradeBBSSelector->SetStyle(UISTYLE_USER_MOVE_HIDE); - // ŷ ׸ + // 상거래 항목 내용 m_pUITradeBBSEdit->LoadFromFile(pTbl->szTradeExplanation); m_pUITradeBBSEdit->SetVisibleWithNoSound(false); rc = m_pUITradeBBSEdit->GetRegion(); @@ -4057,7 +4057,7 @@ void CGameProcMain::MsgSend_RequestTargetHP(short siIDTarget, BYTE byUpdateImmed int iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, N3_TARGET_HP); CAPISocket::MP_AddShort(byBuff, iOffset, siIDTarget); - CAPISocket::MP_AddByte(byBuff, iOffset, byUpdateImmediately); // 0x00 - þԲ.. 0x01 - Ʈ.. + CAPISocket::MP_AddByte(byBuff, iOffset, byUpdateImmediately); // 0x00 - 점차 늘어나게끔.. 0x01 - 즉시 업데이트.. s_pSocket->Send(byBuff, iOffset); } @@ -4065,7 +4065,7 @@ void CGameProcMain::MsgSend_RequestTargetHP(short siIDTarget, BYTE byUpdateImmed void CGameProcMain::MsgRecv_TargetHP(DataPack * pDataPack, int & iOffset) { int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // SID BYTE byUpdateImmediately = - CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 0x00 - þԲ.. 0x01 - Ʈ.. + CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 0x00 - 점차 늘어나게끔.. 0x01 - 즉시 업데이트.. int iTargetHPMax = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // HP int iTargetHPCur = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // HP int iTargetHPChange = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // HP @@ -4079,9 +4079,9 @@ void CGameProcMain::MsgRecv_TargetHP(DataPack * pDataPack, int & iOffset) { szBuff += ')'; CLogWriter::Write(szBuff.c_str()); } - __ASSERT(iTargetHPMax > 0, "ִ ü ġ 0̻̾ մϴ."); + __ASSERT(iTargetHPMax > 0, "최대 체력 수치는 0이상이어야 합니다."); - if (iID == s_pPlayer->m_iIDTarget) // ϴ ̸.. + if (iID == s_pPlayer->m_iIDTarget) // 내가 공격하는 넘이면.. { bool bUI = false; if (byUpdateImmediately) { @@ -4111,7 +4111,7 @@ void CGameProcMain::MsgRecv_TargetHP(DataPack * pDataPack, int & iOffset) { } } -// ŷ.................. +// 상거래.................. bool CGameProcMain::MsgSend_NPCEvent(short siIDTarget) { BYTE byBuff[4]; int iOffset = 0; @@ -4123,35 +4123,35 @@ bool CGameProcMain::MsgSend_NPCEvent(short siIDTarget) { return true; } -void CGameProcMain::MsgSend_NPCInRequest(int iID) // NPC ûѴ.. +void CGameProcMain::MsgSend_NPCInRequest(int iID) // NPC 정보가 없을 경우 요청한다.. { TRACE("found NPC ghost (ID:%d)\n", iID); - int iOffset = 0; // .. + int iOffset = 0; // 버퍼의 오프셋.. BYTE byBuff[32]; - ; // Ŷ .. - CAPISocket::MP_AddByte(byBuff, iOffset, N3_REQUEST_NPC_IN); // Ŀ. - CAPISocket::MP_AddShort(byBuff, iOffset, 1); // ̵ .. - CAPISocket::MP_AddShort(byBuff, iOffset, iID); // ڼ ʿ ̵.. + ; // 패킷 버퍼.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_REQUEST_NPC_IN); // 커멘드. + CAPISocket::MP_AddShort(byBuff, iOffset, 1); // 아이디 갯수.. + CAPISocket::MP_AddShort(byBuff, iOffset, iID); // 자세한 정보가 필요한 아이디들.. s_pSocket->Send(byBuff, iOffset); } -void CGameProcMain::MsgSend_UserInRequest(int iID) // User ûѴ.. +void CGameProcMain::MsgSend_UserInRequest(int iID) // User 정보가 없을 경우 요청한다.. { TRACE("found User ghost (ID:%d)\n", iID); - int iOffset = 0; // .. + int iOffset = 0; // 버퍼의 오프셋.. BYTE byBuff[32]; - ; // Ŷ .. - CAPISocket::MP_AddByte(byBuff, iOffset, N3_REQUEST_USER_IN); // Ŀ. - CAPISocket::MP_AddShort(byBuff, iOffset, 1); // ̵ .. - CAPISocket::MP_AddShort(byBuff, iOffset, iID); // ڼ ʿ ̵.. + ; // 패킷 버퍼.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_REQUEST_USER_IN); // 커멘드. + CAPISocket::MP_AddShort(byBuff, iOffset, 1); // 아이디 갯수.. + CAPISocket::MP_AddShort(byBuff, iOffset, iID); // 자세한 정보가 필요한 아이디들.. s_pSocket->Send(byBuff, iOffset); } -void CGameProcMain::MsgSend_Warp() // - ̵ ɼ ִ.. +void CGameProcMain::MsgSend_Warp() // 워프 - 존이동이 될수도 있다.. { __WarpInfo WI; int iSel = m_pUIWarp->InfoGetCur(WI); @@ -4173,11 +4173,11 @@ bool CGameProcMain::MsgSend_NPCEvent(short siIDTarget) { int iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, N3_WARP_LIST); - CAPISocket::MP_AddByte(byBuff, iOffset, WI.iID); // ̵ ... + CAPISocket::MP_AddByte(byBuff, iOffset, WI.iID); // 워프 아이디 보내기... s_pSocket->Send(byBuff, iOffset); } -void CGameProcMain::MsgSend_ZoneChangeComplete() // ü Ϸ.. ( ε ..) +void CGameProcMain::MsgSend_ZoneChangeComplete() // 존 체인지 완료.. (맵 로딩 끝..) { BYTE byBuff[4]; int iOffset = 0; @@ -4197,7 +4197,7 @@ void CGameProcMain::DoCommercialTransaction(int iTradeID) { m_pUITransactionDlg->SetVisible(true); } - if (m_pUIInventory->IsVisible()) { // κ丮 ȿ .. + if (m_pUIInventory->IsVisible()) { // 인벤토리가 안열려 있으면.. this->CommandToggleUIInventory(); } @@ -4208,7 +4208,7 @@ void CGameProcMain::DoCommercialTransaction(int iTradeID) { m_pUITransactionDlg->EnterTransactionState(); } -bool CGameProcMain::MsgRecv_ItemTradeStart(DataPack * pDataPack, int & iOffset) // ŷ.. +bool CGameProcMain::MsgRecv_ItemTradeStart(DataPack * pDataPack, int & iOffset) // 아이템 상거래.. { int iTradeID = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // Trade id CPlayerNPC * pNPC = s_pOPMgr->NPCGetByID(s_pPlayer->m_iIDTarget, true); @@ -4220,7 +4220,7 @@ void CGameProcMain::DoCommercialTransaction(int iTradeID) { return true; } -bool CGameProcMain::MsgRecv_ItemTradeResult(DataPack * pDataPack, int & iOffset) // ŷ .. +bool CGameProcMain::MsgRecv_ItemTradeResult(DataPack * pDataPack, int & iOffset) // 아이템 상거래 결과.. { uint8_t bfType = 0x00; int iMoney = 0; @@ -4251,34 +4251,34 @@ void CGameProcMain::DoCommercialTransaction(int iTradeID) { void CGameProcMain::InitZone(int iZone, const __Vector3 & vPosPlayer) { if (m_pSnd_Battle) { - m_pSnd_Battle->Stop(0.0f); // ߱.. + m_pSnd_Battle->Stop(0.0f); // 음악 멈추기.. } if (m_pSnd_Town) { m_pSnd_Town->Stop(0.0f); } - MsgSend_SpeedCheck(true); // ǵ üũ ؽð ϱ + MsgSend_SpeedCheck(true); // 스피드핵 체크 기준시간 정하기 static int iZonePrev = -1; - if (iZonePrev != iZone) // ٸ 쿡 ε.. + if (iZonePrev != iZone) // 다른 존일 경우에만 로딩.. { m_pLightMgr->Release(); s_pEng->SetDefaultLight(m_pLightMgr->Light(0), m_pLightMgr->Light(1), m_pLightMgr->Light(2)); if (m_pUIChatDlg) { - m_pUIChatDlg->ChangeChattingMode(N3_CHAT_NORMAL); // ̵ ϸ Ϲ äû· ٲش. + m_pUIChatDlg->ChangeChattingMode(N3_CHAT_NORMAL); //존 이동을 하면 일반 채팅상태로 바꿔준다. } if (m_pUIPartyOrForce) { - m_pUIPartyOrForce->MemberDestroy(); // ̵ Ҷ Ƽ ... + m_pUIPartyOrForce->MemberDestroy(); //존 이동을 할때 파티를 깬다... } - this->UpdateUI_PartyOrForceButtons(); // Ŀǵ ٿ ִ Ƽ ư Ȳ Ʈ ش. + this->UpdateUI_PartyOrForceButtons(); // 커맨드 줄에 있는 파티 버튼을 상황에 따라 업데이트 해준다. - s_pPlayer->m_bMoveContinous = true; // .. + s_pPlayer->m_bMoveContinous = true; // 멈춘다.. this->CommandToggleMoveContinous(); CLogWriter::Write("CGameProcMain::InitZone -> Zone Change (%d -> %d) Position(%.1f, %.1f, %.1f)", iZonePrev, iZone, vPosPlayer.x, vPosPlayer.y, vPosPlayer.z); - m_bLoadComplete = false; // ε .. + m_bLoadComplete = false; // 로딩 끝남.. CLogWriter::Write("%d->ClearDurationalMagic()", m_pMagicSkillMng); // TmpLog1122 m_pMagicSkillMng->ClearDurationalMagic(); CLogWriter::Write("%d->ClearAll()", s_pFX); // TmpLog1122 @@ -4290,7 +4290,7 @@ void CGameProcMain::InitZone(int iZone, const __Vector3 & vPosPlayer) { } s_pPlayer->m_InfoExt.iZoneCur = iZone; - iZonePrev = iZone; // ֱٿ ȣ صд. + iZonePrev = iZone; // 최근에 읽은 존 번호를 기억해둔다. CLogWriter::Write("%d->Find(s_pPlayer->m_InfoExt.iZoneCur)", s_pTbl_Zones); // TmpLog1122 __TABLE_ZONE * pZoneData = s_pTbl_Zones->Find(s_pPlayer->m_InfoExt.iZoneCur); @@ -4302,11 +4302,11 @@ void CGameProcMain::InitZone(int iZone, const __Vector3 & vPosPlayer) { CLogWriter::Write("%d->Release()", s_pOPMgr); // TmpLog1122 - s_pOPMgr->Release(); // ٸ ѵ .. + s_pOPMgr->Release(); // 다른 넘들 다 날린다.. CLogWriter::Write("%d->InitWorld()", s_pWorldMgr); // TmpLog1122 s_pWorldMgr->InitWorld(iZone, vPosPlayer); - // ̴ϸ ε.. + // 미니맵 로딩.. CLogWriter::Write("%d->GetWidthByMeterWithTerrain()", ACT_WORLD); // TmpLog1122 float fWidth = ACT_WORLD->GetWidthByMeterWithTerrain(); CLogWriter::Write("%d->LoadMap()", m_pUIStateBarAndMiniMap); // TmpLog1122 @@ -4314,11 +4314,11 @@ void CGameProcMain::InitZone(int iZone, const __Vector3 & vPosPlayer) { m_pUIStateBarAndMiniMap->LoadMap(pZoneData->szMiniMapFN, fWidth, fWidth); CLogWriter::Write("GetRepresentClass()"); // TmpLog1122 - // ϱ.. + // 줌 비율 정하기.. float fZoom = 6.0f; e_Class_Represent eCR = CGameProcedure::GetRepresentClass(s_pPlayer->m_InfoBase.eClass); if (CLASS_REPRESENT_ROGUE == eCR) { - fZoom = 3.0f; // α 迭 θ ڼ δ.. + fZoom = 3.0f; // 로그 계열은 맵이 좀더 널리 자세히 보인다.. } CLogWriter::Write("%d->ZoomSet()", m_pUIStateBarAndMiniMap); // TmpLog1122 m_pUIStateBarAndMiniMap->ZoomSet(fZoom); @@ -4334,11 +4334,11 @@ void CGameProcMain::InitZone(int iZone, const __Vector3 & vPosPlayer) { m_pLightMgr->LoadZoneLight(pZoneData->szLightObjFN.c_str()); - m_bLoadComplete = true; // ε .. + m_bLoadComplete = true; // 로딩 끝남.. } - // ī޶ .. - CN3Camera * pCamera = s_pEng->CameraGetActive(); // Ȱȭ ī޶ .. + // 카메라 세팅.. + CN3Camera * pCamera = s_pEng->CameraGetActive(); // 활성화된 카메라 얻기.. if (pCamera) { __Vector3 vPosPlayer = s_pPlayer->Position(); pCamera->m_Data.fFOV = D3DXToRadian(70); // Field of View .. @@ -4351,23 +4351,23 @@ void CGameProcMain::InitZone(int iZone, const __Vector3 & vPosPlayer) { CLogWriter::Write("pCamera->Apply()"); // TmpLog1122 pCamera->Apply(); } - // ⺻ ijġ ī޶ ġ .. + // 기본적인 캐릭터위치와 카메라 위치 잡기.. //////////////////////////////////////////////////////////////////////////////// CLogWriter::Write("InitPlayerPosition() Position(%.1f, %.1f, %.1f)", vPosPlayer.x, vPosPlayer.y, vPosPlayer.z); // TmpLog1122 - this->InitPlayerPosition(vPosPlayer); // ÷̾ ġ ʱȭ.. , ⺻ ϰ Ѵ. + this->InitPlayerPosition(vPosPlayer); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. CLogWriter::Write("%d->Release()2", s_pOPMgr); // TmpLog1122 - s_pOPMgr->Release(); // ٸ ÷̾ ... + s_pOPMgr->Release(); // 다른 플레이어 삭제... } void CGameProcMain::MsgSend_GameStart() { - BYTE byBuff[32]; // Ŷ .. - int iOffset = 0; // Ŷ .. + BYTE byBuff[32]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. - CAPISocket::MP_AddByte(byBuff, iOffset, N3_GAMESTART); // ŸƮ Ŷ Ŀ.. - CAPISocket::MP_AddByte(byBuff, iOffset, s_pPlayer->IDString().size()); // ̵ Ŷ ֱ.. - CAPISocket::MP_AddString(byBuff, iOffset, s_pPlayer->IDString()); // ̵ ڿ Ŷ ֱ.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_GAMESTART); // 게임 스타트 패킷 커멘드.. + CAPISocket::MP_AddByte(byBuff, iOffset, s_pPlayer->IDString().size()); // 아이디 길이 패킷에 넣기.. + CAPISocket::MP_AddString(byBuff, iOffset, s_pPlayer->IDString()); // 아이디 문자열 패킷에 넣기.. s_pSocket->Send(byBuff, iOffset); } @@ -4376,7 +4376,7 @@ bool CGameProcMain::CommandToggleWalkRun() { bool bRun = s_pPlayer->ToggleRunMode(); bool bMove = s_pPlayer->m_bMoveContinous; - // Ŀǵ ư Ʈ.. + // 커맨드 버튼 업데이트.. if (m_pUICmd->m_pBtn_Act_Walk) { m_pUICmd->m_pBtn_Act_Walk->SetVisible(bRun); if (bMove) { @@ -4409,7 +4409,7 @@ bool CGameProcMain::CommandToggleMoveContinous() { return false; } - s_pPlayer->ToggleMoveMode(); // ڵ .. + s_pPlayer->ToggleMoveMode(); // 자동 전진 토글.. if (s_pPlayer->m_bMoveContinous) { this->CommandMove(MD_FOWARD, true); if (m_pUICmd->m_pBtn_Act_Run) { @@ -4419,7 +4419,7 @@ bool CGameProcMain::CommandToggleMoveContinous() { m_pUICmd->m_pBtn_Act_Walk->SetState(UI_STATE_BUTTON_DOWN); } } else { - this->CommandMove(MD_STOP, true); // Ŷ .. + this->CommandMove(MD_STOP, true); // 움직임 패킷 보내기.. if (m_pUICmd->m_pBtn_Act_Run) { m_pUICmd->m_pBtn_Act_Run->SetState(UI_STATE_BUTTON_NORMAL); } @@ -4433,39 +4433,39 @@ bool CGameProcMain::CommandToggleMoveContinous() { void CGameProcMain::CommandMove(e_MoveDirection eMD, bool bStartOrEnd) { if (bStartOrEnd) { - this->CloseUIs(); // ŷ, ... UI ݱ.. + this->CloseUIs(); // 각종 상거래, 워프등등... UI 닫기.. } if (s_pPlayer->IsDead()) { - return; // !! + return; // 죽은 넘이 어딜 감히!! } if (MD_FOWARD == eMD || MD_BACKWARD == eMD) { s_pUIMgr->UserMoveHideUIs(); - this->CommandSitDown(false, false, true); // .. + this->CommandSitDown(false, false, true); // 일으켜 세우고.. if (s_pPlayer->m_bStun) { - return; // .. + return; // 기절해 있음 움직이지 못함.. } if (MD_FOWARD == eMD) { if (s_pPlayer->IsRunning()) { - s_pPlayer->ActionMove(PSM_RUN); // پ.. + s_pPlayer->ActionMove(PSM_RUN); // 뛰어가기.. } else { - s_pPlayer->ActionMove(PSM_WALK); // ɾ.. + s_pPlayer->ActionMove(PSM_WALK); // 걸어가기.. } } else { - s_pPlayer->ActionMove(PSM_WALK_BACKWARD); // .. + s_pPlayer->ActionMove(PSM_WALK_BACKWARD); // 후진.. } - if (bStartOrEnd) // ̱ Ҷ 浹üũ غ.. + if (bStartOrEnd) // 움직이기 시작할때에는 충돌체크를 먼저 해본다.. { float fSpeed = s_pPlayer - ->MoveSpeedCalculationAndCheckCollision(); // ӵ ϰ ӵ 浹 üũ Ѵ. ϰ 0 ̸ 浹̴.. - if (0 == fSpeed) // ̴ Ȳ̸.. + ->MoveSpeedCalculationAndCheckCollision(); // 속도를 구하고 그 속도로 충돌 체크를 한다. 리턴값이 0 이면 충돌이다.. + if (0 == fSpeed) // 못움직이는 상황이면.. { - s_pPlayer->ActionMove(PSM_STOP); // .. + s_pPlayer->ActionMove(PSM_STOP); // 멈춤.. } else { - this->MsgSend_Move(true, false); // ̴ ̸.. Ŷ . + this->MsgSend_Move(true, false); // 움직이는 순간이면.. 움직임 시작 패킷 보내기. } if (m_pUICmd->m_pBtn_Act_Run) { @@ -4476,7 +4476,7 @@ void CGameProcMain::CommandMove(e_MoveDirection eMD, bool bStartOrEnd) { } } } else if (MD_STOP == eMD) { - s_pPlayer->m_bMoveContinous = false; // .. + s_pPlayer->m_bMoveContinous = false; // 계속 걸음 멈춤.. s_pPlayer->ActionMove(PSM_STOP); if (m_pUICmd->m_pBtn_Act_Run) { @@ -4486,14 +4486,14 @@ void CGameProcMain::CommandMove(e_MoveDirection eMD, bool bStartOrEnd) { m_pUICmd->m_pBtn_Act_Walk->SetState(UI_STATE_BUTTON_NORMAL); } - this->MsgSend_Move(false, false); // Ŷ . + this->MsgSend_Move(false, false); // 움직임 멈춤 패킷 보내기. } - if (s_pPlayer->m_bAttackContinous) // ̸.. + if (s_pPlayer->m_bAttackContinous) // 공격중이면.. { CPlayerBase * pTarget = s_pOPMgr->CharacterGetByID(s_pPlayer->m_iIDTarget, false); - if (s_pPlayer->IsAttackableTarget(pTarget)) { // ϸ.. - s_pPlayer->Action(PSA_ATTACK, false, pTarget); // + if (s_pPlayer->IsAttackableTarget(pTarget)) { // 공격 가능하면.. + s_pPlayer->Action(PSA_ATTACK, false, pTarget); // 공격 } } } @@ -4503,21 +4503,21 @@ void CGameProcMain::CommandEnableAttackContinous(bool bEnable, CPlayerBase * pTa return; } if (bEnable) { - this->CloseUIs(); // ŷ, ... UI ݱ.. + this->CloseUIs(); // 각종 상거래, 워프등등... UI 닫기.. s_pUIMgr->UserMoveHideUIs(); if (s_pPlayer->m_bStun) { - return; // .. + return; // 기절해 있음 공격 못함.. } if (NULL == pTarget) { return; } - s_pPlayer->RotateTo(pTarget); // . + s_pPlayer->RotateTo(pTarget); // 방향을 돌린다. if (pTarget->m_InfoBase.eNation == s_pPlayer->m_InfoBase.eNation) { - return; // Ѿ.. + return; // 국가가 같으면 넘어간다.. } } - s_pPlayer->m_bAttackContinous = bEnable; // ¸ ϰ.. + s_pPlayer->m_bAttackContinous = bEnable; // 상태를 기록하고.. if (bEnable) { SetGameCursor(s_hCursorAttack); @@ -4535,7 +4535,7 @@ void CGameProcMain::CommandEnableAttackContinous(bool bEnable, CPlayerBase * pTa } std::string szMsg; - if (bEnable) // ڵ ! + if (bEnable) // 자동 공격! { ::_LoadStringFromResource(IDS_MSG_ATTACK_START, szMsg); char szBuff[260]{}; @@ -4546,7 +4546,7 @@ void CGameProcMain::CommandEnableAttackContinous(bool bEnable, CPlayerBase * pTa if (s_pPlayer->IsAttackableTarget(pTarget)) { s_pPlayer->Action(PSA_BASIC, true, pTarget); } - } else // ڵ ƴ. + } else // 자동 공격 아님. { ::_LoadStringFromResource(IDS_MSG_ATTACK_STOP, szMsg); s_pPlayer->Action(PSA_BASIC, true, pTarget); @@ -4555,7 +4555,7 @@ void CGameProcMain::CommandEnableAttackContinous(bool bEnable, CPlayerBase * pTa this->MsgOutput(szMsg, 0xff00ffff); if (bEnable && - false == s_pPlayer->IsAttackableTarget(pTarget)) // , Ÿ üũؼ Ұϸ ư.. + false == s_pPlayer->IsAttackableTarget(pTarget)) // 국가, 거리 및 각도 체크해서 공격 불가능하면 돌아가기.. { std::string szMsg; ::_LoadStringFromResource(IDS_MSG_ATTACK_DISABLE, szMsg); @@ -4573,11 +4573,11 @@ bool CGameProcMain::CommandToggleUIState() { m_pUIVar->Close(); } - // Ŀǵ ư Ʈ.. + // 커맨드 버튼 업데이트.. // if(m_pUICmd->m_pBtn_Character) // { - // if(bNeedOpen) m_pUICmd->m_pBtn_Character->SetState(UI_STATE_BUTTON_DOWN); // ư .. - // else m_pUICmd->m_pBtn_Character->SetState(UI_STATE_BUTTON_NORMAL); // ư + // if(bNeedOpen) m_pUICmd->m_pBtn_Character->SetState(UI_STATE_BUTTON_DOWN); // 버튼 누름 해제.. + // else m_pUICmd->m_pBtn_Character->SetState(UI_STATE_BUTTON_NORMAL); // 버튼 누름 // } return bNeedOpen; @@ -4586,7 +4586,7 @@ bool CGameProcMain::CommandToggleUIState() { bool CGameProcMain::CommandToggleUIInventory() { bool bNeedOpen = false; - // ŷ̸.. + // 개인 거래중이면.. if (m_pSubProcPerTrade->m_ePerTradeState != PER_TRADE_STATE_NONE) { return bNeedOpen; } @@ -4643,7 +4643,7 @@ bool CGameProcMain::CommandToggleUIInventory() { bool CGameProcMain::CommandToggleUISkillTree() { bool bNeedOpen = !(m_pUISkillTreeDlg->IsVisible()); - // ŷ̸.. + // 개인 거래중이면.. if (m_pSubProcPerTrade->m_ePerTradeState != PER_TRADE_STATE_NONE) { return bNeedOpen; } @@ -4744,7 +4744,7 @@ bool CGameProcMain::CommandToggleUIMiniMap() { return m_pUIStateBarAndMiniMap->ToggleMiniMap(); } -void CGameProcMain::CommandCameraChange() // ī޶ ٲٱ.. +void CGameProcMain::CommandCameraChange() // 카메라 시점 바꾸기.. { if (VP_THIRD_PERSON == s_pEng->ViewPoint() && s_pPlayer->m_bTargetOrPosMove) { s_pPlayer->m_bMoveContinous = false; @@ -4752,7 +4752,7 @@ bool CGameProcMain::CommandToggleUIMiniMap() { CommandToggleMoveContinous(); } - s_pEng->ViewPointChange(VP_UNKNOWN); // ٲ۴.. + s_pEng->ViewPointChange(VP_UNKNOWN); // 순서대로 시점을 바꾼다.. } void CGameProcMain::CommandExitMenu() { @@ -4765,7 +4765,7 @@ void CGameProcMain::MsgOutput(const std::string & szMsg, D3DCOLOR crMsg) { m_pUIMsgDlg->AddMsg(szMsg, crMsg); } -bool CGameProcMain::MsgRecv_ItemDroppedGetResult(DataPack * pDataPack, int & iOffset) // Ա .. +bool CGameProcMain::MsgRecv_ItemDroppedGetResult(DataPack * pDataPack, int & iOffset) // 땅에 떨어진 아이템 먹기 결과.. { BYTE bResult = 0; BYTE bPos = 0; @@ -4791,7 +4791,7 @@ void CGameProcMain::MsgOutput(const std::string & szMsg, D3DCOLOR crMsg) { CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szString, iStrLen); } - TRACE(" - Item Get %d %lld\n", bResult, iGold); + TRACE("받음 - Item Get %d %lld\n", bResult, iGold); if (m_pUIDroppedItemDlg) { m_pUIDroppedItemDlg->GetItemByIDToInventory(bResult, iItemID, iGold, bPos, sItemCount, iStrLen, szString); @@ -4811,15 +4811,15 @@ void CGameProcMain::MsgRecv_ZoneChange(DataPack * pDataPack, int & iOffset) { vPosPlayer.x = fX; vPosPlayer.y = fY; vPosPlayer.z = fZ; - this->InitPlayerPosition(vPosPlayer); // ÷̾ ġ ʱȭ.. , ⺻ ϰ Ѵ. - s_pPlayer->RegenerateCollisionMesh(); // 浹 ޽ø ٽ .. - s_pPlayer->m_iSendRegeneration = 0; // ѹ ٽ Ⱥ ÷ - s_pPlayer->m_fTimeAfterDeath = 0; // ѹ ٽ Ⱥ ÷ + this->InitPlayerPosition(vPosPlayer); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. + s_pPlayer->RegenerateCollisionMesh(); // 충돌 메시를 다시 만든다.. + s_pPlayer->m_iSendRegeneration = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 + s_pPlayer->m_fTimeAfterDeath = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 if (s_pPlayer->IsDead()) { - TRACE("ZoneChange - ٽ Ƴ(%.1f, %.1f)\n", fX, fZ); + TRACE("ZoneChange - 다시 살아나기(%.1f, %.1f)\n", fX, fZ); - // & ȿ ʱȭ.. + //마법 & 효과 초기화.. if (m_pUIStateBarAndMiniMap) { m_pUIStateBarAndMiniMap->ClearMagic(); } @@ -4858,9 +4858,9 @@ void CGameProcMain::MsgRecv_UserState(DataPack * pDataPack, int & iOffset) { return; } - if (N3_SP_STATE_CHANGE_SITDOWN == eSP) // ɱ,,... + if (N3_SP_STATE_CHANGE_SITDOWN == eSP) // 앉기,서기,죽음... { - if (pBPC != s_pPlayer) // ÷̾ ƴҶ.. + if (pBPC != s_pPlayer) // 플레이어가 아닐때.. { if (0x01 == iState) { pBPC->Action(PSA_BASIC, true); @@ -4870,7 +4870,7 @@ void CGameProcMain::MsgRecv_UserState(DataPack * pDataPack, int & iOffset) { pBPC->Action(PSA_DYING, false, NULL, true); } } - } else if (N3_SP_STATE_CHANGE_RECRUIT_PARTY == eSP) // Ƽ .. + } else if (N3_SP_STATE_CHANGE_RECRUIT_PARTY == eSP) // 파티 구함.. { if (0x01 == iState) { pBPC->InfoStringSet("", 0); @@ -4891,24 +4891,24 @@ void CGameProcMain::MsgRecv_UserState(DataPack * pDataPack, int & iOffset) { sprintf(szBuff, szMsg.c_str(), iLMin, iLMax); pBPC->InfoStringSet(szBuff, 0xff00ff00); } - } else if (N3_SP_STATE_CHANGE_SIZE == eSP) // ũ + } else if (N3_SP_STATE_CHANGE_SIZE == eSP) // 크기 변함 { if (0x01 == iState) { - pBPC->ScaleSetGradually(1.0f); // ũ.. - pBPC->FlickerFactorSet(1.0f); // ȰǼ .. ڰŸ.. + pBPC->ScaleSetGradually(1.0f); // 보통 크기.. + pBPC->FlickerFactorSet(1.0f); // 부활되서 반투명.. 깜박거린다.. } else if (0x02 == iState) { - pBPC->ScaleSetGradually(2.0f); // Ŀ.. + pBPC->ScaleSetGradually(2.0f); // 커졌다.. } else if (0x03 == iState) { - pBPC->ScaleSetGradually(0.5f); // ۾. + pBPC->ScaleSetGradually(0.5f); // 작아졌다. } else if (0x04 == iState) { - pBPC->FlickerFactorSet(0.7f); // ȰǼ .. ڰŸ.. + pBPC->FlickerFactorSet(0.7f); // 부활되서 반투명.. 깜박거린다.. } - } else if (N3_SP_STATE_CHANGE_ACTION == eSP) // ũ + } else if (N3_SP_STATE_CHANGE_ACTION == eSP) // 크기 변함 { if (1 == iState) { - pBPC->AnimationAdd(ANI_GREETING0, true); // λ + pBPC->AnimationAdd(ANI_GREETING0, true); // 인사 } else if (11 == iState) { - pBPC->AnimationAdd(ANI_WAR_CRY1, true); // + pBPC->AnimationAdd(ANI_WAR_CRY1, true); // 도발 } } } @@ -4959,7 +4959,7 @@ void CGameProcMain::MsgRecv_PartyOrForce(DataPack * pDataPack, int & iOffset) { int iSubCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); switch (iSubCmd) { - case N3_SP_PARTY_OR_FORCE_PERMIT: // 0x02 // Send - b1(YesNo) | Recv - s1(ID) û ID + case N3_SP_PARTY_OR_FORCE_PERMIT: // 0x02 // Send - b1(YesNo) | Recv - s1(ID) 요청한 사람의 ID { int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); int iStrLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); @@ -4973,7 +4973,7 @@ void CGameProcMain::MsgRecv_PartyOrForce(DataPack * pDataPack, int & iOffset) { } } break; - case N3_SP_PARTY_OR_FORCE_INSERT: // 0x02 // Send - s1(ID) | Recv - s3(ID, HPMax, HP) b2(Level, Class) - ڿ ID ˾Ƴ.. + case N3_SP_PARTY_OR_FORCE_INSERT: // 0x02 // Send - s1(ID) | Recv - s3(ID, HPMax, HP) b2(Level, Class) - 문자열은 ID 로 알아낸다.. { int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); if (iID >= 0) { @@ -4985,35 +4985,35 @@ void CGameProcMain::MsgRecv_PartyOrForce(DataPack * pDataPack, int & iOffset) { int iLevel = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); e_Class eClass = (e_Class)(CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)); - m_pUIPartyOrForce->MemberAdd(iID, szID, iLevel, eClass, iHP, iHPMax); // ٸ Ƽ߰.. - if (iID != s_pPlayer->IDNumber()) // ڱ ڽ ƴ ޽ . + m_pUIPartyOrForce->MemberAdd(iID, szID, iLevel, eClass, iHP, iHPMax); // 다른넘 파티에추가.. + if (iID != s_pPlayer->IDNumber()) // 자기 자신이 아닌 경우 메시지 출력. { std::string szMsg; ::_LoadStringFromResource(IDS_PARTY_INSERT, szMsg); this->MsgOutput(szID + szMsg, D3DCOLOR_ARGB(255, 255, 255, 255)); } - } else // Ƽ ü .. + } else // 파티에 들어올수 없다.. { std::string szMsg; if (-1 == iID) { ::_LoadStringFromResource(IDS_PARTY_INSERT_ERR_REJECTED, - szMsg); // Ƽ ⸦ Ͽ.. + szMsg); // 상대방이 파티에 들어오기를 거절 하였다.. } else if (-2 == iID) { - ::_LoadStringFromResource(IDS_PARTY_INSERT_ERR_LEVEL_DIFFERENCE, szMsg); // ̰ ʹ ... + ::_LoadStringFromResource(IDS_PARTY_INSERT_ERR_LEVEL_DIFFERENCE, szMsg); // 레벨 차이가 너무 난다... } else if (-3 == iID) { - ::_LoadStringFromResource(IDS_PARTY_INSERT_ERR_INVALID_NATION, szMsg); // Ƽ ̴. + ::_LoadStringFromResource(IDS_PARTY_INSERT_ERR_INVALID_NATION, szMsg); // 파티를 맺을 수 없는 국가이다. } else { - ::_LoadStringFromResource(IDS_PARTY_INSERT_ERR, szMsg); // Ƽ ⸦ Ͽ.. + ::_LoadStringFromResource(IDS_PARTY_INSERT_ERR, szMsg); // 상대방이 파티에 들어오기를 거절 하였다.. } this->MsgOutput(szMsg, D3DCOLOR_ARGB(255, 255, 255, 255)); if (m_pUIPartyOrForce->MemberCount() == 1) { - m_pUIPartyOrForce->MemberDestroy(); // Ѹ̸ Ƽ . + m_pUIPartyOrForce->MemberDestroy(); // 멤버가 한명이면 내가 파티를 만든 경우다. } } - this->UpdateUI_PartyOrForceButtons(); // Ŀǵ ٿ ִ Ƽ ư Ȳ Ʈ ش. + this->UpdateUI_PartyOrForceButtons(); // 커맨드 줄에 있는 파티 버튼을 상황에 따라 업데이트 해준다. } break; case N3_SP_PARTY_OR_FORCE_REMOVE: // 0x03 // Send - s1(ID) | Recv - s1(ID) - @@ -5022,35 +5022,35 @@ void CGameProcMain::MsgRecv_PartyOrForce(DataPack * pDataPack, int & iOffset) { if (iID == s_pPlayer->IDNumber()) { std::string szMsg; - ::_LoadStringFromResource(IDS_PARTY_DESTROY, szMsg); // Ƽ .. - this->MsgOutput(szMsg, D3DCOLOR_ARGB(255, 255, 255, 255)); // Ƽ ޽ - m_pUIPartyOrForce->MemberDestroy(); // ڱ ڽ̸.. Ƽ ǰ.. + ::_LoadStringFromResource(IDS_PARTY_DESTROY, szMsg); // 파티를 떠났다.. + this->MsgOutput(szMsg, D3DCOLOR_ARGB(255, 255, 255, 255)); // 파티 해제 메시지 + m_pUIPartyOrForce->MemberDestroy(); // 자기 자신이면.. 파티를 뽀갠다.. } else { int iMemberIndex = -1; const __InfoPartyOrForce * pInfo = m_pUIPartyOrForce->MemberInfoGetByID(iID, iMemberIndex); if (pInfo) { std::string szMsg; - ::_LoadStringFromResource(IDS_PARTY_LEAVE, szMsg); // Ƽ .. + ::_LoadStringFromResource(IDS_PARTY_LEAVE, szMsg); // 파티를 떠났다.. this->MsgOutput(pInfo->szID + szMsg, - D3DCOLOR_ARGB(255, 255, 255, 255)); // Ƽ ٴ ޽.. - m_pUIPartyOrForce->MemberRemove(iID); // ̸.. + D3DCOLOR_ARGB(255, 255, 255, 255)); // 누가 파티에서 떠났다는 메시지.. + m_pUIPartyOrForce->MemberRemove(iID); // 남이면.. } } - this->UpdateUI_PartyOrForceButtons(); // Ŀǵ ٿ ִ Ƽ ư Ȳ Ʈ ش. + this->UpdateUI_PartyOrForceButtons(); // 커맨드 줄에 있는 파티 버튼을 상황에 따라 업데이트 해준다. } break; case N3_SP_PARTY_OR_FORCE_DESTROY: // 0x04 // Send { - m_pUIPartyOrForce->MemberDestroy(); // Ƽ ǰ.. + m_pUIPartyOrForce->MemberDestroy(); // 파티 뽀갠다.. std::string szMsg; ::_LoadStringFromResource(IDS_PARTY_DESTROY, szMsg); this->MsgOutput(szMsg, D3DCOLOR_ARGB(255, 255, 255, 255)); - this->UpdateUI_PartyOrForceButtons(); // Ŀǵ ٿ ִ Ƽ ư Ȳ Ʈ ش. + this->UpdateUI_PartyOrForceButtons(); // 커맨드 줄에 있는 파티 버튼을 상황에 따라 업데이트 해준다. } break; - case N3_SP_PARTY_OR_FORCE_HP_CHANGE: // 0x05 // Recv - s3(ID, HPMax, HP) - ڱ ڽ̸ Ƽ Ѵ.. + case N3_SP_PARTY_OR_FORCE_HP_CHANGE: // 0x05 // Recv - s3(ID, HPMax, HP) - 자기 자신이면 파티를 깨야 한다.. { int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); int iHPMax = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); @@ -5067,7 +5067,7 @@ void CGameProcMain::MsgRecv_PartyOrForce(DataPack * pDataPack, int & iOffset) { m_pUIPartyOrForce->MemberLevelChange(iID, iLevel); } break; - case N3_SP_PARTY_OR_FORCE_CLASS_CHANGE: // 0x07 // Recv - s1(ID), b1(Class)幰 Ҷ... + case N3_SP_PARTY_OR_FORCE_CLASS_CHANGE: // 0x07 // Recv - s1(ID), b1(Class)드물지만 전직할때... { int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); e_Class eClass = (e_Class)(CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)); @@ -5075,7 +5075,7 @@ void CGameProcMain::MsgRecv_PartyOrForce(DataPack * pDataPack, int & iOffset) { m_pUIPartyOrForce->MemberClassChange(iID, eClass); } break; - case N3_SP_PARTY_OR_FORCE_STATUS_CHANGE: // 0x08 // Recv - s1(ID), b1(Status)..., , Ӽ, ູ + case N3_SP_PARTY_OR_FORCE_STATUS_CHANGE: // 0x08 // Recv - s1(ID), b1(Status)...독, 저주, 지속성마법, 축복 { int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); e_PartyStatus ePS = (e_PartyStatus)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); @@ -5089,10 +5089,10 @@ void CGameProcMain::MsgRecv_PartyOrForce(DataPack * pDataPack, int & iOffset) { void CGameProcMain::CommandSitDown(bool bLimitInterval, bool bSitDown, bool bImmediately) { if (bSitDown == s_pPlayer->m_bSitDown) { - return; // ° ư.. + return; // 상태가 같으면 돌아간다.. } - // ɱ .. + // 앉기 서기 제한.. if (bLimitInterval) { float fTime = CN3Base::TimeGet(); static float fTimePrev = fTime - 4.0f; @@ -5106,16 +5106,16 @@ void CGameProcMain::CommandSitDown(bool bLimitInterval, bool bSitDown, bool bImm e_StateMove eSM = s_pPlayer->StateMove(); if (bSitDown) { - if (eSM != PSM_STOP) { // ٴ ̸ . + if (eSM != PSM_STOP) { // 뛰던 놈이면 멈춘다. return; } - if (this->m_pMagicSkillMng->IsCasting()) { // ų ij ̸ Ѵ.. + if (this->m_pMagicSkillMng->IsCasting()) { // 스킬 캐스팅 중이면 앉지 못한다.. return; } - if (s_pPlayer->m_bAttackContinous) { // ϴ ̸.. - this->CommandEnableAttackContinous(false, NULL); // .. + if (s_pPlayer->m_bAttackContinous) { // 계속 공격하는 중이면.. + this->CommandEnableAttackContinous(false, NULL); // 계속 공격 취소.. } } @@ -5126,37 +5126,37 @@ void CGameProcMain::CommandSitDown(bool bLimitInterval, bool bSitDown, bool bImm bVBs[0] = false; bVBs[1] = true; iState = 0x02; - } // ɴ + } // 앉는 경우 else { eSA = PSA_BASIC; bVBs[0] = true; bVBs[1] = false; iState = 0x01; - } // Ͼ + } // 일어서는 경우 s_pPlayer->m_bSitDown = bSitDown; s_pPlayer->Action(eSA, true, NULL, bImmediately); if (m_pUICmd->m_pBtn_Act_SitDown) { m_pUICmd->m_pBtn_Act_SitDown->SetVisible(bVBs[0]); - m_pUICmd->m_pBtn_Act_SitDown->SetState(UI_STATE_BUTTON_DOWN); // ư + m_pUICmd->m_pBtn_Act_SitDown->SetState(UI_STATE_BUTTON_DOWN); // 버튼 누름 } if (m_pUICmd->m_pBtn_Act_StandUp) { m_pUICmd->m_pBtn_Act_StandUp->SetVisible(bVBs[1]); - m_pUICmd->m_pBtn_Act_StandUp->SetState(UI_STATE_BUTTON_DOWN); // ư + m_pUICmd->m_pBtn_Act_StandUp->SetState(UI_STATE_BUTTON_DOWN); // 버튼 누름 } - this->MsgSend_StateChange(N3_SP_STATE_CHANGE_SITDOWN, iState); // ɾҴ.. Ŷ.. + this->MsgSend_StateChange(N3_SP_STATE_CHANGE_SITDOWN, iState); // 앉았다.. 패킷.. } -void CGameProcMain::CommandTargetSelect_NearstEnemy() // Ÿ .. +void CGameProcMain::CommandTargetSelect_NearstEnemy() // 가장 가까운 적 타겟 잡기.. { CPlayerNPC * pTarget = s_pOPMgr->CharacterGetByNearstEnemy(s_pPlayer->m_InfoBase.eNation, s_pPlayer->Position()); this->TargetSelect(pTarget); s_pPlayer->RotateTo(pTarget); } -void CGameProcMain::CommandTargetSelect_NearstOurForce() // Ƽ Ÿ.. +void CGameProcMain::CommandTargetSelect_NearstOurForce() // 가장 가까운 파티 타겟잡기.. { CPlayerOther * pTarget = m_pUIPartyOrForce->MemberGetByNearst(s_pPlayer->Position()); this->TargetSelect(pTarget); @@ -5166,10 +5166,10 @@ void CGameProcMain::CommandSitDown(bool bLimitInterval, bool bSitDown, bool bImm void CGameProcMain::CloseUIs() {} void CGameProcMain::MsgSend_StateChange(e_SubPacket_State eSP, int iState) { - BYTE byBuff[4]; // Ŷ .. - int iOffset = 0; // Ŷ .. + BYTE byBuff[4]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. - CAPISocket::MP_AddByte(byBuff, iOffset, N3_STATE_CHANGE); // ȭ.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_STATE_CHANGE); // 상태 변화.. CAPISocket::MP_AddByte(byBuff, iOffset, eSP); CAPISocket::MP_AddByte(byBuff, iOffset, iState); @@ -5177,23 +5177,23 @@ void CGameProcMain::MsgSend_StateChange(e_SubPacket_State eSP, int iState) { } void CGameProcMain::MsgSend_PerTradeReq(int iDestID, bool bNear) { - BYTE byBuff[8]{}; // Ŷ .. - int iOffset = 0; // Ŷ .. + BYTE byBuff[8]{}; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_PER_TRADE); CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_PER_TRADE_REQ); - CAPISocket::MP_AddShort(byBuff, iOffset, (short)iDestID); // ̵.. + CAPISocket::MP_AddShort(byBuff, iOffset, (short)iDestID); // 상대방 아이디.. if (bNear) { CAPISocket::MP_AddByte(byBuff, iOffset, 1); } else { CAPISocket::MP_AddByte(byBuff, iOffset, 2); } - //1:Ϲ ŷ - //2:ŷ Խ ŷ + //1:일반 거래 + //2:상거래 게시판 거래 - s_pSocket->Send(byBuff, iOffset); // .. + s_pSocket->Send(byBuff, iOffset); // 보냄.. - TRACE("̵: %d, ŷ û Ŷ .. \n", iDestID); + TRACE("아이디: %d, 아이템 거래 신청 패킷 보냄.. \n", iDestID); } void CGameProcMain::MsgRecv_PerTrade(DataPack * pDataPack, int & iOffset) { @@ -5205,20 +5205,20 @@ void CGameProcMain::MsgRecv_PerTrade(DataPack * pDataPack, int & iOffset) { switch (bSubCom) { case N3_SP_PER_TRADE_REQ: - TRACE(" ŷ û Ŷ .. \n"); + TRACE("아이템 거래 신청 패킷 받음.. \n"); sOtherID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); - if (m_pUITransactionDlg->IsVisible()) /* ΰ ŷ̸.. */ + if (m_pUITransactionDlg->IsVisible()) /* 상인과 거래중이면.. */ { - // Ѵ.. + // 거절한다.. m_pUITransactionDlg->LeaveTransactionState(); m_pSubProcPerTrade->LeavePerTradeState(PER_TRADE_RESULT_MY_DISAGREE); break; } - if (m_pUIWareHouseDlg->IsVisible()) /* Կ ̸.. */ + if (m_pUIWareHouseDlg->IsVisible()) /* 보관함에 보관중이면.. */ { - // Ѵ.. + // 거절한다.. m_pUIWareHouseDlg->LeaveWareHouseState(); m_pSubProcPerTrade->LeavePerTradeState(PER_TRADE_RESULT_MY_DISAGREE); break; @@ -5281,7 +5281,7 @@ void CGameProcMain::MsgRecv_PerTrade(DataPack * pDataPack, int & iOffset) { case N3_SP_PER_TRADE_DONE: bResult = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); - if (bResult == 0x01) // ̸.. + if (bResult == 0x01) // 성공이면.. { iTotalGold = CAPISocket::Parse_GetInt64(pDataPack->m_pData, iOffset); m_pSubProcPerTrade->ReceiveMsgPerTradeDoneSuccessBegin(iTotalGold); @@ -5294,7 +5294,7 @@ void CGameProcMain::MsgRecv_PerTrade(DataPack * pDataPack, int & iOffset) { m_pSubProcPerTrade->ReceiveMsgPerTradeDoneItemMove(bItemPos, iItemID, sCount, sDurability); } m_pSubProcPerTrade->ReceiveMsgPerTradeDoneSuccessEnd(); - } else { // ̸.. + } else { // 실패이면.. m_pSubProcPerTrade->ReceiveMsgPerTradeDoneFail(); } break; @@ -5311,68 +5311,68 @@ void CGameProcMain::TargetSelect(int iID, bool bMustAlive) { } void CGameProcMain::TargetSelect(CPlayerNPC * pTarget) { - if (PSA_SPELLMAGIC == s_pPlayer->State()) { // ij ϴ ߰ Ÿ ٲ۴.. + if (PSA_SPELLMAGIC == s_pPlayer->State()) { // 마법 캐스팅을 하는 중간에는 타겟을 못 바꾼다.. return; } - int iIDTargetPrev = s_pPlayer->m_iIDTarget; // Ÿ .. + int iIDTargetPrev = s_pPlayer->m_iIDTarget; // 전의 타겟 기억.. s_pPlayer->m_iIDTarget = -1; s_pPlayer->m_pObjectTarget = NULL; - if (pTarget && pTarget->m_InfoBase.iAuthority != AUTHORITY_MANAGER) { //ڴ Ŀ ʰ ϱ ؼ... + if (pTarget && pTarget->m_InfoBase.iAuthority != AUTHORITY_MANAGER) { //운영자는 포커스를 주지 않게 하기 위해서... s_pPlayer->m_iIDTarget = pTarget->IDNumber(); - if (iIDTargetPrev != s_pPlayer->m_iIDTarget) // Ÿٰ ٸ + if (iIDTargetPrev != s_pPlayer->m_iIDTarget) // 전의 타겟과 다르면 { - this->CommandEnableAttackContinous(false, NULL); // ڵ .. + this->CommandEnableAttackContinous(false, NULL); // 자동 공격 취소.. D3DCOLOR crID = 0xffffffff; if (pTarget->PlayerType() == PLAYER_OTHER) // User.. { if (pTarget->m_InfoBase.eNation != s_pPlayer->m_InfoBase.eNation) { - crID = 0xffff4040; // ٸ ̸ + crID = 0xffff4040; // 다른 국가이면 } else { crID = 0xff6b9fff; } } else // NPC { if (pTarget->m_InfoBase.eNation != s_pPlayer->m_InfoBase.eNation) { - crID = 0xffff6060; // ٸ ̸ + crID = 0xffff6060; // 다른 국가이면 } else { crID = 0xff1064ff; } } - if (pTarget->IsAlive()) //ִ ¸ target bar ش. + if (pTarget->IsAlive()) //살아있는 상태만 target bar를 보여준다. { m_pUITargetBar->SetVisible(true); - m_pUITargetBar->SetIDString(pTarget->IDString(), crID); // ̸ ְ.. - this->MsgSend_RequestTargetHP(s_pPlayer->m_iIDTarget, 0x01); // HP ûѴ.. + m_pUITargetBar->SetIDString(pTarget->IDString(), crID); // 이름을 넣고.. + this->MsgSend_RequestTargetHP(s_pPlayer->m_iIDTarget, 0x01); // 서버에게 HP정보를 요청한다.. } else { - m_pUITargetBar->SetVisible(false); // Ÿ ֱ.. + m_pUITargetBar->SetVisible(false); // 타겟 바 없애기.. } } } else { - s_pPlayer->m_iIDTarget = -1; // Ÿ ̵ .. - m_pUITargetBar->SetVisible(false); // Ÿ ֱ.. + s_pPlayer->m_iIDTarget = -1; // 타겟 아이디를 잡고.. + m_pUITargetBar->SetVisible(false); // 타겟 바 없애기.. - this->CommandEnableAttackContinous(false, NULL); // ڵ .. + this->CommandEnableAttackContinous(false, NULL); // 자동 공격 취소.. } if (PSA_SITDOWN != s_pPlayer->State() && PSM_STOP == s_pPlayer->StateMove() && PSA_BASIC == s_pPlayer->State()) { - s_pPlayer->Action(PSA_BASIC, true); // ⺻ ڼ ٲٱ.. + s_pPlayer->Action(PSA_BASIC, true); // 기본 자세 바꾸기.. } - this->UpdateUI_PartyOrForceButtons(); // Ŀǵ ٿ ִ Ƽ ư Ȳ Ʈ ش. + this->UpdateUI_PartyOrForceButtons(); // 커맨드 줄에 있는 파티 버튼을 상황에 따라 업데이트 해준다. } -void CGameProcMain::MsgRecv_SkillChange(DataPack * pDataPack, int & iOffset) // ų ȭ.. +void CGameProcMain::MsgRecv_SkillChange(DataPack * pDataPack, int & iOffset) // 스킬 변화.. { int iType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); int iValue = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); m_pUISkillTreeDlg->m_iSkillInfo[iType] = iValue; m_pUISkillTreeDlg->m_iSkillInfo[0]++; - m_pUISkillTreeDlg->InitIconUpdate(); // ų Ʈ ȭǾǷ .. ų ȭ ִ.. + m_pUISkillTreeDlg->InitIconUpdate(); // 스킬 포인트가 변화되었으므로 .. 스킬도 변화될 수 있다.. } void CGameProcMain::MsgRecv_MagicProcess(DataPack * pDataPack, int & iOffset) { @@ -5397,7 +5397,7 @@ void CGameProcMain::MsgRecv_MagicProcess(DataPack * pDataPack, int & iOffset) { } } -void CGameProcMain::MsgRecv_ClassChange(DataPack * pDataPack, int & iOffset) // ȭ.. +void CGameProcMain::MsgRecv_ClassChange(DataPack * pDataPack, int & iOffset) // 직업 변화.. { e_SubPacket_ClassChange eSP = (e_SubPacket_ClassChange)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); @@ -5422,9 +5422,9 @@ void CGameProcMain::MsgRecv_MagicProcess(DataPack * pDataPack, int & iOffset) { void CGameProcMain::MsgRecv_ObjectEvent(DataPack * pDataPack, int & iOffset) { int iType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Event Type - int iResult = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // .. + int iResult = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 결과.. - if (OBJECT_TYPE_BINDPOINT == iType) // ε Ʈ + if (OBJECT_TYPE_BINDPOINT == iType) // 바인드 포인트 { std::string szMsg; if (0x01 == iResult) { @@ -5434,10 +5434,10 @@ void CGameProcMain::MsgRecv_ObjectEvent(DataPack * pDataPack, int & iOffset) { } this->MsgOutput(szMsg, 0xff00ff00); } else if (OBJECT_TYPE_DOOR_LEFTRIGHT == iType || OBJECT_TYPE_DOOR_TOPDOWN == iType || - OBJECT_TYPE_LEVER_TOPDOWN == iType || OBJECT_TYPE_FLAG == iType) // Ʈ ٷ.. + OBJECT_TYPE_LEVER_TOPDOWN == iType || OBJECT_TYPE_FLAG == iType) // 오브젝트 다루기.. { - int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID - int iActivate = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // .. + int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 열고 닫을 성문 ID + int iActivate = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 열고 닫음.. CPlayerNPC * pNPC = s_pOPMgr->NPCGetByID(iID, true); __ASSERT(pNPC, "Invalid NPC ID"); @@ -5447,8 +5447,8 @@ void CGameProcMain::MsgRecv_ObjectEvent(DataPack * pDataPack, int & iOffset) { if (pNPC->m_pShapeExtraRef) { __Vector3 vAxis(0, 1, 0); float fRadian = D3DXToRadian(90); - bool bShouldBeRotate = true; // ϴ?? - if (OBJECT_TYPE_DOOR_LEFTRIGHT == iType) // ¿쿭 + bool bShouldBeRotate = true; // 돌려야 하는지?? + if (OBJECT_TYPE_DOOR_LEFTRIGHT == iType) // 좌우열림 성문 { if (0x01 == iActivate) { fRadian = D3DXToRadian(80); @@ -5458,7 +5458,7 @@ void CGameProcMain::MsgRecv_ObjectEvent(DataPack * pDataPack, int & iOffset) { ::_LoadStringFromResource(IDS_DOOR_CLOSED, szMsg); } vAxis.Set(0, 1, 0); - } else if (OBJECT_TYPE_DOOR_TOPDOWN == iType) // Ͽ + } else if (OBJECT_TYPE_DOOR_TOPDOWN == iType) // 상하열림 성문 { if (0x01 == iActivate) { fRadian = D3DXToRadian(90); @@ -5468,7 +5468,7 @@ void CGameProcMain::MsgRecv_ObjectEvent(DataPack * pDataPack, int & iOffset) { ::_LoadStringFromResource(IDS_DOOR_CLOSED, szMsg); } vAxis.Set(0, 0, 1); - } else if (OBJECT_TYPE_LEVER_TOPDOWN == iType) // + } else if (OBJECT_TYPE_LEVER_TOPDOWN == iType) // 상하 레버 { if (0x01 == iActivate) { fRadian = D3DXToRadian(-45); @@ -5479,7 +5479,7 @@ void CGameProcMain::MsgRecv_ObjectEvent(DataPack * pDataPack, int & iOffset) { } vAxis.Set(1, 0, 0); } else if (OBJECT_TYPE_FLAG == iType) { - bShouldBeRotate = false; // ϴ?? + bShouldBeRotate = false; // 돌려야 하는지?? } if (0x01 == iActivate) { @@ -5542,19 +5542,19 @@ void CGameProcMain::ParseChattingCommand(const std::string & szCmd) { switch (eCmd) { case CMD_WHISPER: { - this->MsgSend_ChatSelectTarget(szCmds[1]); // ϴ ä ϱ. + this->MsgSend_ChatSelectTarget(szCmds[1]); // 일대일 채팅 상대 정하기. } break; case CMD_TOWN: { if (s_pPlayer->m_bStun) { - return; // .. + return; // 기절해 있음 못함.. } - if (s_pPlayer->m_InfoBase.iHP * 2 >= s_pPlayer->m_InfoBase.iHPMax) // HP ̻ ־ Ѵ. + if (s_pPlayer->m_InfoBase.iHP * 2 >= s_pPlayer->m_InfoBase.iHPMax) // HP가 반 이상 있어야 한다. { int iOffset = 0; - CAPISocket::MP_AddWord(byBuff, iOffset, N3_HOME); // ... + CAPISocket::MP_AddWord(byBuff, iOffset, N3_HOME); // 마을로 가기... s_pSocket->Send(byBuff, iOffset); - } else // HP ̻ ־ Ѵ. + } else // HP가 반 이상 있어야 한다. { std::string szMsg; ::_LoadStringFromResource(IDS_ERR_GOTO_TOWN_OUT_OF_HP, szMsg); @@ -5566,7 +5566,7 @@ void CGameProcMain::ParseChattingCommand(const std::string & szCmd) { CPlayerOther * pOPC = s_pOPMgr->UPCGetByID(s_pPlayer->m_iIDTarget, true); if (pOPC && (pOPC->Position() - s_pPlayer->Position()).Magnitude() < (pOPC->Height() + 5.0f) && !m_pUITransactionDlg - ->IsVisible()) // Ÿ ٸ ÷̾ ְ.. .. // ΰ ŷ.. // ŷ ƴϸ.. + ->IsVisible()) // 타겟으로 다른 플레이어가 잡혀있고.. 가까이 있으면.. // 개인간 아이템 거래.. // 상거래 중이 아니면.. { std::string szMsg; ::_LoadStringFromResource(IDS_PERSONAL_TRADE_REQUEST, szMsg); @@ -5599,16 +5599,16 @@ void CGameProcMain::ParseChattingCommand(const std::string & szCmd) { if (pTarget) { std::string szMsg; if (this->MsgSend_PartyOrForceCreate(0, pTarget->IDString())) { - ::_LoadStringFromResource(IDS_PARTY_INVITE, szMsg); // Ƽ û.. + ::_LoadStringFromResource(IDS_PARTY_INVITE, szMsg); // 파티 요청.. } else { - ::_LoadStringFromResource(IDS_PARTY_INVITE_FAILED, szMsg); // Ƽ ʴ + ::_LoadStringFromResource(IDS_PARTY_INVITE_FAILED, szMsg); // 파티 초대 실패 } this->MsgOutput(pTarget->IDString() + szMsg, 0xffffff00); } } break; case CMD_LEAVEPARTY: { - this->MsgSend_PartyOrForceLeave(0); // Ƽ û.. + this->MsgSend_PartyOrForceLeave(0); // 파티 요청.. } break; case CMD_RECRUITPARTY: { @@ -5698,33 +5698,33 @@ void CGameProcMain::ParseChattingCommand(const std::string & szCmd) { case CMD_NOTICE: { if (szCmd.size() >= 7) { - std::string szChat = szCmd.substr(6); // "/ " ڿ + std::string szChat = szCmd.substr(6); // "/공지 "를 제외한 나머지 문자열 this->MsgSend_Chat(N3_CHAT_PUBLIC, szChat); } } break; case CMD_ARREST: { - this->MsgSend_Administrator(N3_SP_ADMINISTRATOR_ARREST, szCmds[1]); // + this->MsgSend_Administrator(N3_SP_ADMINISTRATOR_ARREST, szCmds[1]); //추적 } break; case CMD_FORBIDCONNECT: { - this->MsgSend_Administrator(N3_SP_ADMINISTRATOR_FORBID_CONNECT, szCmds[1]); //ӱ + this->MsgSend_Administrator(N3_SP_ADMINISTRATOR_FORBID_CONNECT, szCmds[1]); //접속금지 } break; case CMD_FORBIDCHAT: { - this->MsgSend_Administrator(N3_SP_ADMINISTRATOR_CHAT_FORBID, szCmds[1]); //äñ + this->MsgSend_Administrator(N3_SP_ADMINISTRATOR_CHAT_FORBID, szCmds[1]); //채팅금지 } break; case CMD_PERMITCHAT: { - this->MsgSend_Administrator(N3_SP_ADMINISTRATOR_CHAT_PERMIT, szCmds[1]); //ä㰡 + this->MsgSend_Administrator(N3_SP_ADMINISTRATOR_CHAT_PERMIT, szCmds[1]); //채팅허가 } break; case CMD_GAME_SAVE: { if (m_fRequestGameSave > 300.0f) { - BYTE byBuff[4]; // .. - int iOffset = 0; // ɼ.. - s_pSocket->MP_AddByte(byBuff, iOffset, N3_REQUEST_GAME_SAVE); // û Ŀ.. - s_pSocket->Send(byBuff, iOffset); // .. + BYTE byBuff[4]; // 버퍼.. + int iOffset = 0; // 옵셋.. + s_pSocket->MP_AddByte(byBuff, iOffset, N3_REQUEST_GAME_SAVE); // 저장 요청 커멘드.. + s_pSocket->Send(byBuff, iOffset); // 보냄.. m_fRequestGameSave = 0.0f; std::string szMsg; @@ -5745,7 +5745,7 @@ void CGameProcMain::ParseChattingCommand(const std::string & szCmd) { } void CGameProcMain::UpdateUI_PartyOrForceButtons() { - // Ƽ ư ٲٱ.. + // 파티 버튼 상태 바꾸기.. CPlayerBase * pTarget = NULL; bool bIAmLeader = false, bIAmMemberOfParty = false; int iMemberIndex = -1; @@ -5757,7 +5757,7 @@ void CGameProcMain::UpdateUI_PartyOrForceButtons() { const __InfoPartyOrForce * CGameProcMain::PartyOrForceConditionGet(bool & bIAmLeader, bool & bIAmMember, int & iMemberIndex, class CPlayerBase *& pTarget) { - // Ƽ ư ٲٱ.. + // 파티 버튼 상태 바꾸기.. bIAmLeader = false; iMemberIndex = -1; bIAmMember = false; @@ -5791,9 +5791,9 @@ void CGameProcMain::UpdateUI_MiniMap() { pNPC = it->second; if (eNation != pNPC->m_InfoBase.eNation) { - crType = 0xff800000; // ٸ NPC Ȥ Ȳ + crType = 0xff800000; // 다른 국가 NPC 혹은 몬스터 주황색 } else { - crType = 0xff00a0ff; // NPC ϴû + crType = 0xff00a0ff; // 같은 국가 NPC 하늘색 } m_pUIStateBarAndMiniMap->PositionInfoAdd(pNPC->IDNumber(), pNPC->Position(), crType, false); @@ -5807,34 +5807,34 @@ void CGameProcMain::UpdateUI_MiniMap() { pUPC = it2->second; bool bDrawTop = false; - if (eNation != pUPC->m_InfoBase.eNation) // ϰ + if (eNation != pUPC->m_InfoBase.eNation) // 적국일경우 { if (pUPC->State() == PSA_SITDOWN) { - pUPC->m_InfoBase.bRenderID = false; // ̵ ǥ . - continue; // ɾ.. .. + pUPC->m_InfoBase.bRenderID = false; // 아이디 표시하지 않음. + continue; // 앉아있으면.. 지나간다.. } else { - pUPC->m_InfoBase.bRenderID = true; // ̵ ǥ. + pUPC->m_InfoBase.bRenderID = true; // 아이디 표시함. } if (pZoneInfo && FALSE == pZoneInfo->bIndicateEnemyPlayer) { - continue; // ǥ ʾƾ Ѵٸ.. .. + continue; // 적국이 표시 되지 않아야 한다면.. 지나간다.. } - crType = 0xffff4040; // ٸ - - } else // .. + crType = 0xffff4040; // 다른 국가 - 밝은 빨간색 + } else // 같은 국가면.. { int iMemberIndex = -1; const __InfoPartyOrForce * pPI = m_pUIPartyOrForce->MemberInfoGetByID(pUPC->IDNumber(), iMemberIndex); if (pPI) { - bDrawTop = true; // ׸. - crType = 0xffffff00; // Ƽ // + bDrawTop = true; // 맨 위에 그린다. + crType = 0xffffff00; // 파티 멤버면 // 노란색 } else { - crType = 0xff0040ff; // Ƽ ƴϸ Ķ + crType = 0xff0040ff; // 파티 멤버가 아니면 밝은 파란색 } } if (pUPC && - pUPC->m_InfoBase.iAuthority != AUTHORITY_MANAGER) { // ڰ ƴѰ츸 ̴ϸʿ Ʈ ش. + pUPC->m_InfoBase.iAuthority != AUTHORITY_MANAGER) { // 운영자가 아닌경우만 미니맵에 포인트를 찍어준다. m_pUIStateBarAndMiniMap->PositionInfoAdd(pUPC->IDNumber(), pUPC->Position(), crType, bDrawTop); } } @@ -5845,7 +5845,7 @@ void CGameProcMain::UpdateUI_TargetBar() { return; } - // ijͰ õǾ target bar ׷ ʴ´. + //죽은 캐릭터가 선택되었을때는 target bar를 그려주지 않는다. CPlayerNPC * t_pTarget = s_pOPMgr->CharacterGetByID(s_pPlayer->m_iIDTarget, false); if (t_pTarget && t_pTarget->State() == PSA_DEATH) { m_pUITargetBar->SetVisible(false); @@ -5853,16 +5853,16 @@ void CGameProcMain::UpdateUI_TargetBar() { } CPlayerNPC * pTarget = s_pOPMgr->CharacterGetByID(s_pPlayer->m_iIDTarget, true); - if (pTarget) // Ÿ ȿϸ.. + if (pTarget) // 타겟이 유효하면.. { float fTimeTmp = CN3Base::TimeGet(); if (fTimeTmp > - m_pUITargetBar->m_fTimeSendPacketLast + PACKET_INTERVAL_REQUEST_TARGET_HP) // 1ʰ Ÿ û + m_pUITargetBar->m_fTimeSendPacketLast + PACKET_INTERVAL_REQUEST_TARGET_HP) // 1초가 지나면 타겟 정보 요청 { this->MsgSend_RequestTargetHP(s_pPlayer->m_iIDTarget, false); m_pUITargetBar->m_fTimeSendPacketLast = fTimeTmp; } - } else // Ÿ .. + } else // 타겟이 없으면.. { s_pPlayer->m_iIDTarget = -1; m_pUITargetBar->SetVisible(false); @@ -5926,11 +5926,11 @@ void CGameProcMain::UpdateCameraAndLight() { } s_pEng->Tick(crDiffuses, crAmbients, ACT_WORLD->GetFogColorWithSky(), vPosPlayer, s_pPlayer->Rotation(), - s_pPlayer->Height(), ACT_WORLD->GetSunAngleByRadinWithSky()); // ij ġ ־ش.. - s_pEng->ApplyCameraAndLight(); // ī޶ Ʈ õ D3D Device Ѵ. + s_pPlayer->Height(), ACT_WORLD->GetSunAngleByRadinWithSky()); // 캐릭터 위치와 해의 각도를 넣어준다.. + s_pEng->ApplyCameraAndLight(); // 카메라와 라이트에 세팅된 값을 D3D Device 에 적용한다. } -void CGameProcMain::MsgRecv_DurabilityChange(DataPack * pDataPack, int & iOffset) // .. +void CGameProcMain::MsgRecv_DurabilityChange(DataPack * pDataPack, int & iOffset) // 내구력 변경.. { e_ItemSlot eSlot = (e_ItemSlot)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); int iCurValue = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); @@ -5955,19 +5955,19 @@ void CGameProcMain::MsgRecv_Knights(DataPack * pDataPack, int & iOffset) { (e_SubPacket_Knights)(CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset)); // Sub Packet switch (eSP) { - case N3_SP_KNIGHTS_CREATE: // .. + case N3_SP_KNIGHTS_CREATE: // 생성.. this->MsgRecv_Knights_Create(pDataPack, iOffset); break; - case N3_SP_KNIGHTS_WITHDRAW: //Ż + case N3_SP_KNIGHTS_WITHDRAW: //탈퇴 this->MsgRecv_Knights_Withdraw(pDataPack, iOffset); break; - case N3_SP_KNIGHTS_JOIN: // + case N3_SP_KNIGHTS_JOIN: //가입 this->MsgRecv_Knights_Join(pDataPack, iOffset); break; - case N3_SP_KNIGHTS_MEMBER_REMOVE: // - + case N3_SP_KNIGHTS_MEMBER_REMOVE: //멤버 삭제 - this->MsgRecv_Knights_Leave(pDataPack, iOffset); break; - case N3_SP_KNIGHTS_APPOINT_VICECHIEF: //δ Ӹ - 㰡 + case N3_SP_KNIGHTS_APPOINT_VICECHIEF: //부단장 임명 - 가입허가와 같음 this->MsgRecv_Knights_AppointViceChief(pDataPack, iOffset); break; case N3_SP_KNIGHTS_MEMBER_INFO_ALL: @@ -5976,113 +5976,113 @@ void CGameProcMain::MsgRecv_Knights(DataPack * pDataPack, int & iOffset) { case N3_SP_KNIGHTS_GRADE_CHANGE_ALL: this->MsgRecv_Knights_GradeChangeAll(pDataPack, iOffset); break; - case N3_SP_KNIGHTS_DESTROY: // ǰ Send - | Recv - b1(1: 0:) + case N3_SP_KNIGHTS_DESTROY: // 뽀개기 Send - | Recv - b1(1:성공 0:실패) { BYTE bSubCom = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); std::string szMsg; switch ((e_SubPacket_KNights_Common)bSubCom) { - case N3_SP_KNIGHTS_COMMON_SUCCESS: //Ŭı + case N3_SP_KNIGHTS_COMMON_SUCCESS: //클랜파괴 성공 ::_LoadStringFromResource(IDS_CLAN_WITHDRAW_SUCCESS, szMsg); m_pUIKnightsOp->KnightsInfoDelete(s_pPlayer->m_InfoExt.iKnightsID); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_DBFAIL: //DB˻ .. - case N3_SP_KNIGHTS_COMMON_FAIL_NONE_USER: // .. + case N3_SP_KNIGHTS_COMMON_DBFAIL: //DB검색 실패.. + case N3_SP_KNIGHTS_COMMON_FAIL_NONE_USER: //없는 유저.. break; } s_pPlayer->m_InfoExt.eKnightsDuty = KNIGHTS_DUTY_UNKNOWN; s_pPlayer->KnightsInfoSet(0, "", 0, 0); m_pUIVar->UpdateKnightsInfo(); } break; - case N3_SP_KNIGHTS_DUTY_CHANGE: // .. + case N3_SP_KNIGHTS_DUTY_CHANGE: // 직위 변경.. MsgRecv_Knights_Duty_Change(pDataPack, iOffset); break; case N3_SP_KNIGHTS_JOIN_REQ: MsgRecv_Knigts_Join_Req(pDataPack, iOffset); break; - /* case N3_SP_KNIGHTS_APPOINT_CHIEF: // Ӹ - 㰡 + /* case N3_SP_KNIGHTS_APPOINT_CHIEF: //단장 임명 - 가입허가와 같음 { - ::_LoadStringFromResource(IDS_KNIGHTS_APPOINT_CHIEF_SUCCESS, szMsg); // + ::_LoadStringFromResource(IDS_KNIGHTS_APPOINT_CHIEF_SUCCESS, szMsg); // 성공 } break; - case N3_SP_KNIGHTS_DESTROY: // ǰ Send - | Recv - b1(1: 0:) + case N3_SP_KNIGHTS_DESTROY: // 뽀개기 Send - | Recv - b1(1:성공 0:실패) { - ::_LoadStringFromResource(IDS_KNIGHTS_DESTROY_SUCCESS, szMsg); // + ::_LoadStringFromResource(IDS_KNIGHTS_DESTROY_SUCCESS, szMsg); // 성공 s_pPlayer->m_InfoExt.iKnightsID = 0; s_pPlayer->m_InfoExt.eKnightsDuty = KNIGHTS_DUTY_UNKNOWN; - // ܿ .. + // 기사단에서 뺀다.. m_pUIVar->m_pPageKnights->UpdateKnightsName(""); m_pUIVar->m_pPageKnights->UpdateKnightsChiefName(""); m_pUIVar->m_pPageKnights->UpdateKnightsDuty(KNIGHTS_DUTY_UNKNOWN); - m_pUIKnightsOp->MsgSend_KnightsList(0); // ٽ Ʈ ûѴ.. + m_pUIKnightsOp->MsgSend_KnightsList(0); // 다시 기사단 리스트를 요청한다.. } break; - case N3_SP_KNIGHTS_MEMBER_JOIN_ADMIT: // 㰡 Send - s1(Knights ID) | Recv - b1(1: 0:) + case N3_SP_KNIGHTS_MEMBER_JOIN_ADMIT: //멤버 가입 허가 Send - s1(Knights ID) | Recv - b1(1:성공 0:실패) { - ::_LoadStringFromResource(IDS_KNIGHTS_ADMIT_SUCCESS, szMsg); // + ::_LoadStringFromResource(IDS_KNIGHTS_ADMIT_SUCCESS, szMsg); // 성공 } break; - case N3_SP_KNIGHTS_MEMBER_JOIN_REJECT: // - 㰡 + case N3_SP_KNIGHTS_MEMBER_JOIN_REJECT: //멤버 가입 거절 - 가입허가와 같음 { - ::_LoadStringFromResource(IDS_KNIGHTS_REJECT_SUCCESS, szMsg); // + ::_LoadStringFromResource(IDS_KNIGHTS_REJECT_SUCCESS, szMsg); // 성공 } break; - case N3_SP_KNIGHTS_MEMBER_PUNISH: // ¡ - 㰡 + case N3_SP_KNIGHTS_MEMBER_PUNISH: //멤버 징계 - 가입허가와 같음 { - ::_LoadStringFromResource(IDS_KNIGHTS_PUNISH_SUCCESS, szMsg); // + ::_LoadStringFromResource(IDS_KNIGHTS_PUNISH_SUCCESS, szMsg); // 성공 } break; - case N3_SP_KNIGHTS_APPOINT_OFFICER: // 屳Ӹ - 㰡 + case N3_SP_KNIGHTS_APPOINT_OFFICER: // 장교임명 - 가입허가와 같음 { - ::_LoadStringFromResource(IDS_KNIGHTS_APPOINT_OFFICER_SUCCESS, szMsg); // + ::_LoadStringFromResource(IDS_KNIGHTS_APPOINT_OFFICER_SUCCESS, szMsg); // 성공 } break; - case N3_SP_KNIGHTS_LIST: // Ʈ û Send - | s1(Knights Count) Loop { s1(Knights ID) s1(Name Length) str1 (Name) } + case N3_SP_KNIGHTS_LIST: //모든 리스트 요청 Send - | s1(Knights Count) Loop { s1(Knights ID) s1(Name Length) str1 (Name) } { if(false == m_pUIKnightsOp->IsVisible()) { - m_pUIKnightsOp->Open(s_pPlayer->m_InfoExt.eKnightsDuty); // UI Ʈ ʱȭ.. + m_pUIKnightsOp->Open(s_pPlayer->m_InfoExt.eKnightsDuty); // UI 열고 리스트등 초기화.. } else { - m_pUIKnightsOp->ChangeUIByDuty(s_pPlayer->m_InfoExt.eKnightsDuty); // UI Ʈ ʱȭ.. + m_pUIKnightsOp->ChangeUIByDuty(s_pPlayer->m_InfoExt.eKnightsDuty); // UI 열고 리스트등 초기화.. } m_pUIKnightsOp->MsgRecv_KnightsList(pDataPack, iOffset); } break; - case N3_SP_KNIGHTS_MEMBER_INFO_ALL: // ü Send - s1(page) | s1(Member Count) Loop { s1(Name Length) str1 (Name) } + case N3_SP_KNIGHTS_MEMBER_INFO_ALL: // 전체 멤버 Send - s1(page) | s1(Member Count) Loop { s1(Name Length) str1 (Name) } { m_pUIVar->m_pPageKnights->MsgRecv_MemberInfo(pDataPack, iOffset); } break; - case N3_SP_KNIGHTS_MEMBER_INFO_ONLINE: // Ʈ Send - s1(page) | s1(Member Count) Loop { s1(Name Length) str1 (Name) } + case N3_SP_KNIGHTS_MEMBER_INFO_ONLINE: //현재 접속 리스트 Send - s1(page) | s1(Member Count) Loop { s1(Name Length) str1 (Name) } { m_pUIVar->m_pPageKnights->MsgRecv_MemberInfo(pDataPack, iOffset); } break; - case N3_SP_KNIGHTS_STASH: // â + case N3_SP_KNIGHTS_STASH: //기사단 창고 { } break; - case N3_SP_KNIGHTS_DUTY_CHANGE: // .. + case N3_SP_KNIGHTS_DUTY_CHANGE: // 직위 변경.. { int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); e_KnightsDuty eDuty = (e_KnightsDuty)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); - if(iID == s_pPlayer->IDNumber()) // .. + if(iID == s_pPlayer->IDNumber()) // 내 직위 변경.. { m_pUIVar->m_pPageKnights->UpdateKnightsDuty(eDuty); } else { CPlayerOther* pUPC = s_pOPMgr->UPCGetByID(iID, false); - if(pUPC) // ٸ .. + if(pUPC) // 다른넘 직위 변경.. { } } @@ -6095,87 +6095,87 @@ void CGameProcMain::MsgRecv_Knights(DataPack * pDataPack, int & iOffset) { } } -void CGameProcMain::MsgRecv_KnightsListBasic(DataPack * pDataPack, int & iOffset) // ⺻ ޱ.. +void CGameProcMain::MsgRecv_KnightsListBasic(DataPack * pDataPack, int & iOffset) // 기사단 기본 정보 받기.. { e_SubPacket_KnightsList eSP = (e_SubPacket_KnightsList)(CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset)); // Sub Packet switch (eSP) { - case N3_SP_KNIGHTS_LIST_BASIC_ALL: // Receive - s1(knights Count) { s21(id, ̸), str1(̸) } + case N3_SP_KNIGHTS_LIST_BASIC_ALL: // Receive - s1(knights Count) { s21(id, 이름길이), str1(이름) } { - int iCount = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // + int iCount = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 기사단 갯수 for (int i = 0; i < iCount; i++) { std::string szID; - int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID - int iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID ڿ .. - CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szID, iLen); // ID ڿ.. + int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 기사단 ID + int iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID 문자열 길이.. + CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szID, iLen); // ID 문자열.. - m_pUIKnightsOp->KnightsInfoInsert(iID, szID); // ޴´.. + m_pUIKnightsOp->KnightsInfoInsert(iID, szID); // 기사단 정보 모든 걸 받는다.. } } break; - case N3_SP_KNIGHTS_LIST_BASIC_INSERT: // Receive - s2(id, ̸), str1(̸) + case N3_SP_KNIGHTS_LIST_BASIC_INSERT: // Receive - s2(id, 이름길이), str1(이름) { std::string szID; - int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID - int iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID ڿ .. - CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szID, iLen); // ID ڿ.. + int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 기사단 ID + int iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID 문자열 길이.. + CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szID, iLen); // ID 문자열.. - m_pUIKnightsOp->KnightsInfoInsert(iID, szID); // ߰.. + m_pUIKnightsOp->KnightsInfoInsert(iID, szID); // 기사단 정보 추가.. } break; case N3_SP_KNIGHTS_LIST_BASIC_REMOVE: // Receive - s1(id) { - int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID - m_pUIKnightsOp->KnightsInfoDelete(iID); // .. + int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 기사단 ID + m_pUIKnightsOp->KnightsInfoDelete(iID); // 기사단 정보 지우기.. } break; } } void CGameProcMain::MsgRecv_CompressedPacket(DataPack * pDataPack, - int & iOffset) // ̴... ѹ Ľؾ Ѵ!!! + int & iOffset) // 압축된 데이터 이다... 한번 더 파싱해야 한다!!! { short sCompLen, sOrgLen; DWORD dwCrcValue; - sCompLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Ÿ̾... - sOrgLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Ÿ̾... - dwCrcValue = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // CRC ... + sCompLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 압축된 데이타길이얻기... + sOrgLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 원래데이타길이얻기... + dwCrcValue = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // CRC값 얻기... - /// + /// 압축 데이터 얻기 및 해제 CCompressMng Compressor; - Compressor.PreUncompressWork((char *)(pDataPack->m_pData + iOffset), sCompLen, sOrgLen); // Ǯ... + Compressor.PreUncompressWork((char *)(pDataPack->m_pData + iOffset), sCompLen, sOrgLen); // 압축 풀기... iOffset += sCompLen; if (Compressor.Extract() == false || Compressor.m_nErrorOccurred != 0 || dwCrcValue != Compressor.m_dwCrc) { return; } - // Ǯ Ÿ б + // 압축 풀린 데이타 읽기 BYTE * pDecodeBuf = (BYTE *)(Compressor.m_pOutputBuffer); - // ӽ÷ .. + // 임시로 데이터 팩 만들고.. DataPack DataPackTemp; DataPackTemp.m_Size = sOrgLen; DataPackTemp.m_pData = pDecodeBuf; int iOffset2 = 0; - this->ProcessPacket(&DataPackTemp, iOffset2); // ٷ Ľ... + this->ProcessPacket(&DataPackTemp, iOffset2); // 바로 파싱... DataPackTemp.m_Size = 0; DataPackTemp.m_pData = NULL; } void CGameProcMain::MsgRecv_ContinousPacket(DataPack * pDataPack, - int & iOffset) // ̴... ѹ Ľؾ Ѵ!!! + int & iOffset) // 압축된 데이터 이다... 한번 더 파싱해야 한다!!! { - int iWholeSize = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Ÿ̾... + int iWholeSize = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 원래데이타길이얻기... int iOffset2 = iOffset, iOffsetPrev = 0, iSizeThisPacket = 0; int i = 0; while (iOffset2 < iWholeSize) { iOffsetPrev = iOffset2; - iSizeThisPacket = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset2); // Ÿ̾... + iSizeThisPacket = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset2); // 원래데이타길이얻기... if (iSizeThisPacket <= 0 || iSizeThisPacket >= iWholeSize) { char szErr[256]; - sprintf(szErr, " Ŷ ޱ - (%d) ũ(%d/%d)", i, iSizeThisPacket, iWholeSize); + sprintf(szErr, "연속 패킷 받기 오류 - 순서(%d) 크기(%d/%d)", i, iSizeThisPacket, iWholeSize); CGameProcedure::ReportDebugStringAndSendToServer(szErr); __ASSERT(0, szErr); - break; // !! + break; // 멈춘다!! } i++; @@ -6186,7 +6186,7 @@ void CGameProcMain::MsgRecv_ContinousPacket(DataPack * pDataPack, iOffset += iWholeSize; } -void CGameProcMain::MsgRecv_WareHouse(DataPack * pDataPack, int & iOffset) // Ŷ.. +void CGameProcMain::MsgRecv_WareHouse(DataPack * pDataPack, int & iOffset) // 보관함 관련 패킷.. { BYTE bResult, bSubCom = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); @@ -6229,7 +6229,7 @@ void CGameProcMain::MsgRecv_ContinousPacket(DataPack * pDataPack, } } -void CGameProcMain::MsgRecv_WareHouseOpen(DataPack * pDataPack, int & iOffset) // .. +void CGameProcMain::MsgRecv_WareHouseOpen(DataPack * pDataPack, int & iOffset) // 보관함 오픈.. { if (m_pUIWareHouseDlg->IsVisible()) { return; @@ -6239,7 +6239,7 @@ void CGameProcMain::MsgRecv_ContinousPacket(DataPack * pDataPack, int64_t iWareGold = CAPISocket::Parse_GetInt64(pDataPack->m_pData, iOffset); m_pUIWareHouseDlg->EnterWareHouseStateStart(iWareGold); - for (int i = 0; i < MAX_ITEM_WARE_PAGE * MAX_ITEM_TRADE; i++) // ŭ.. + for (int i = 0; i < MAX_ITEM_WARE_PAGE * MAX_ITEM_TRADE; i++) // 슬롯 갯수마큼.. { iItemID = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); iItemDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); @@ -6251,7 +6251,7 @@ void CGameProcMain::MsgRecv_ContinousPacket(DataPack * pDataPack, m_pUIWareHouseDlg->SetVisible(true); } - if (m_pUIInventory->IsVisible()) { // κ丮 ȿ .. + if (m_pUIInventory->IsVisible()) { // 인벤토리가 안열려 있으면.. this->CommandToggleUIInventory(); } @@ -6270,7 +6270,7 @@ void CGameProcMain::PlayBGM_Town() { return; } m_pSnd_Town->SetMaxVolume(60); - m_pSnd_Town->Play(NULL, 3.0f); // .. Ͱ Ѵ.. + m_pSnd_Town->Play(NULL, 3.0f); // 전투 음악 설정.. 해제는 주위에 몬스터가 없을때 한다.. } void CGameProcMain::PlayBGM_Battle() { @@ -6281,7 +6281,7 @@ void CGameProcMain::PlayBGM_Battle() { return; } m_pSnd_Battle->SetMaxVolume(80); - m_pSnd_Battle->Play(NULL, 3.0f); // .. Ͱ Ѵ.. + m_pSnd_Battle->Play(NULL, 3.0f); // 전투 음악 설정.. 해제는 주위에 몬스터가 없을때 한다.. } void CGameProcMain::ReleaseSound() { @@ -6292,7 +6292,7 @@ void CGameProcMain::ReleaseSound() { CN3Base::s_SndMgr.ReleaseStreamObj(&m_pSnd_Battle); } -void CGameProcMain::MsgRecv_NpcChangeOpen(DataPack * pDataPack, int & iOffset) // Class Change ʱȭ.. +void CGameProcMain::MsgRecv_NpcChangeOpen(DataPack * pDataPack, int & iOffset) // Class Change와 초기화.. { BYTE bSubCom = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); @@ -6319,7 +6319,7 @@ void CGameProcMain::ReleaseSound() { } } -void CGameProcMain::MsgRecv_AllPointInit(DataPack * pDataPack, int & iOffset) // All Point ʱȭ.. +void CGameProcMain::MsgRecv_AllPointInit(DataPack * pDataPack, int & iOffset) // All Point 초기화.. { BYTE bType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); DWORD dwGold = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); @@ -6328,13 +6328,13 @@ void CGameProcMain::ReleaseSound() { std::string szMsg; switch (bType) { - case 0x00: // .. + case 0x00: // 돈이 부족.. ::_LoadStringFromResource(IDS_POINTINIT_NOT_ENOUGH_NOAH, szMsg); sprintf(szBuf, szMsg.c_str(), dwGold); CGameProcedure::s_pProcMain->MsgOutput(szBuf, 0xffff3b3b); break; - case 0x01: // .. + case 0x01: // 성공.. s_pPlayer->m_InfoExt.iStrength = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); m_pUIVar->m_pPageState->UpdateStrength(s_pPlayer->m_InfoExt.iStrength, s_pPlayer->m_InfoExt.iStrength_Delta); @@ -6367,11 +6367,11 @@ void CGameProcMain::ReleaseSound() { m_pUIVar->m_pPageState->UpdateWeight(s_pPlayer->m_InfoExt.iWeight, s_pPlayer->m_InfoExt.iWeightMax); s_pPlayer->m_InfoExt.iBonusPointRemain = - CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ʽ Ʈ.. + CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 남은 보너스 포인트.. m_pUIVar->m_pPageState->UpdateBonusPointAndButtons( - s_pPlayer->m_InfoExt.iBonusPointRemain); // ʽ Ʈ Ѱ?? + s_pPlayer->m_InfoExt.iBonusPointRemain); // 보너스 포인트 적용이 가능한가?? - // .. κ丮 ٲٰ ŷ.. ŷʹ Ÿ.. + // 돈 변경.. 인벤토리는 바꾸고 상거래.. 개인 거래와는 배타적.. s_pPlayer->m_InfoExt.iGold = dwGold; if (m_pUIInventory->IsVisible()) { m_pUIInventory->GoldUpdate(); @@ -6393,7 +6393,7 @@ void CGameProcMain::ReleaseSound() { } } -void CGameProcMain::MsgRecv_SkillPointInit(DataPack * pDataPack, int & iOffset) // Skill Point ʱȭ.. +void CGameProcMain::MsgRecv_SkillPointInit(DataPack * pDataPack, int & iOffset) // Skill Point 초기화.. { BYTE bType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); DWORD dwGold = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); @@ -6401,20 +6401,20 @@ void CGameProcMain::ReleaseSound() { std::string szMsg; switch (bType) { - case 0x00: // .. + case 0x00: // 돈이 부족.. ::_LoadStringFromResource(IDS_POINTINIT_NOT_ENOUGH_NOAH, szMsg); sprintf(szBuf, szMsg.c_str(), dwGold); CGameProcedure::s_pProcMain->MsgOutput(szBuf, 0xffff3b3b); break; - case 0x01: // .. + case 0x01: // 성공.. m_pUISkillTreeDlg->m_iSkillInfo[0] = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); for (int i = 1; i < 9; i++) { m_pUISkillTreeDlg->m_iSkillInfo[i] = 0; } m_pUISkillTreeDlg->InitIconUpdate(); - // .. κ丮 ٲٰ ŷ.. ŷʹ Ÿ.. + // 돈 변경.. 인벤토리는 바꾸고 상거래.. 개인 거래와는 배타적.. s_pPlayer->m_InfoExt.iGold = dwGold; if (m_pUIInventory->IsVisible()) { m_pUIInventory->GoldUpdate(); @@ -6439,13 +6439,13 @@ void CGameProcMain::ReleaseSound() { } } -void CGameProcMain::MsgRecv_PointChangePriceQueryRequest(DataPack * pDataPack, int & iOffset) // ݿ Ŷ.. +void CGameProcMain::MsgRecv_PointChangePriceQueryRequest(DataPack * pDataPack, int & iOffset) // 가격에 대한 응답 패킷.. { DWORD dwGold = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); m_pUINpcChange->ReceivePriceFromServer(dwGold); } -void CGameProcMain::MsgRecv_NoahChange(DataPack * pDataPack, int & iOffset) // .. +void CGameProcMain::MsgRecv_NoahChange(DataPack * pDataPack, int & iOffset) // 노아 변경.. { BYTE bType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); DWORD dwGoldOffset = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); @@ -6474,7 +6474,7 @@ void CGameProcMain::ReleaseSound() { break; } - // .. κ丮 ٲٰ ŷ.. ŷʹ Ÿ.. + // 돈 변경.. 인벤토리는 바꾸고 상거래.. 개인 거래와는 배타적.. s_pPlayer->m_InfoExt.iGold = dwGold; if (m_pUIInventory->IsVisible()) { m_pUIInventory->GoldUpdate(); @@ -6487,7 +6487,7 @@ void CGameProcMain::ReleaseSound() { } } -void CGameProcMain::MsgRecv_WarpList(DataPack * pDataPack, int & iOffset) // Ʈ - ü ִ.. +void CGameProcMain::MsgRecv_WarpList(DataPack * pDataPack, int & iOffset) // 워프 리스트 - 존 체인지가 될 수도 있다.. { m_pUIWarp->Reset(); @@ -6499,15 +6499,15 @@ void CGameProcMain::ReleaseSound() { for (int i = 0; i < iListCount; i++) { __WarpInfo WI; - WI.iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID - iStrLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ̸ - CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, WI.szName, iStrLen); // ̸ - iStrLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ǹ - CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, WI.szAgreement, iStrLen); // ǹ - WI.iZone = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ȣ - WI.iMaxUser = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ִ īƮ. - WI.iGold = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // - WI.vPos.x = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; // ǥ + WI.iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 워프 ID + iStrLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 이름 길이 + CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, WI.szName, iStrLen); // 이름 + iStrLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 동의문 길이 + CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, WI.szAgreement, iStrLen); // 동의문 + WI.iZone = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 존번호 + WI.iMaxUser = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 최대 유저 카운트. + WI.iGold = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 돈 + WI.vPos.x = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; // 좌표 WI.vPos.z = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; // WI.vPos.y = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; // @@ -6536,7 +6536,7 @@ void CGameProcMain::ReleaseSound() { } /* -void CGameProcMain::MsgRecv_ServerCheckAndRequestConcurrentUserCount(DataPack* pDataPack, int& iOffset) // IP Ʈ ޾ ڸ üũ .. +void CGameProcMain::MsgRecv_ServerCheckAndRequestConcurrentUserCount(DataPack* pDataPack, int& iOffset) // 서버 IP 와 포트를 받아 동접자를 체크해 본다.. { std::string szIP; int iStrLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // IP.. @@ -6546,11 +6546,11 @@ void CGameProcMain::ReleaseSound() { __WarpInfo WI; if(m_pUIWarp->InfoGetCur(WI) < 0) return; - bool bNeedConnectSubSocket = (szIP != s_pSocket->GetCurrentIP() || dwPort != s_pSocket->GetCurrentPort()); // ؾ IP Ʈ Ȱ + bool bNeedConnectSubSocket = (szIP != s_pSocket->GetCurrentIP() || dwPort != s_pSocket->GetCurrentPort()); // 접속해야 할 IP 와 포트가 똑같은지 - if(bNeedConnectSubSocket) // ؾ ϸ.. + if(bNeedConnectSubSocket) // 서브 소켓으로 접속해야 하면.. { - int iErr = s_pSocketSub->Connect(s_hWndSubSocket, szIP.c_str(), dwPort); // ؼ.. + int iErr = s_pSocketSub->Connect(s_hWndSubSocket, szIP.c_str(), dwPort); // 서브 소켓으로 접속해서.. if(iErr) { this->ReportServerConnectionFailed(WI.szName, iErr, false); @@ -6558,20 +6558,20 @@ void CGameProcMain::ReleaseSound() { } } - // üũ.. + // 동접자 체크.. int iOffsetSend = 0; BYTE byBuff[8]; CAPISocket::MP_AddByte(byBuff, iOffsetSend, N3_SERVER_CONCURRENT_CONNECT); CAPISocket::MP_AddShort(byBuff, iOffsetSend, WI.iZone); - CAPISocket::MP_AddByte(byBuff, iOffsetSend, s_pPlayer->m_InfoBase.eNation); // .. + CAPISocket::MP_AddByte(byBuff, iOffsetSend, s_pPlayer->m_InfoBase.eNation); // 국가별 동접수.. - if(bNeedConnectSubSocket) s_pSocketSub->Send(byBuff, iOffsetSend); // . - else s_pSocket->Send(byBuff, iOffsetSend); // .. + if(bNeedConnectSubSocket) s_pSocketSub->Send(byBuff, iOffsetSend); // 서브 소켓으로 보내기. + else s_pSocket->Send(byBuff, iOffsetSend); // 본 소켓으로 보내기.. } -void CGameProcMain::MsgRecv_ConcurrentUserCountAndSendServerCheck(DataPack* pDataPack, int& iOffset) // ڸ ް ϰڴٴ Ŷ . +void CGameProcMain::MsgRecv_ConcurrentUserCountAndSendServerCheck(DataPack* pDataPack, int& iOffset) // 동접자를 받고 서버에 접속하겠다는 패킷을 보낸다. { int iConcurrentUser = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // IP.. if(s_pSocketSub->IsConnected()) s_pSocketSub->Disconnect(); @@ -6579,7 +6579,7 @@ void CGameProcMain::ReleaseSound() { __WarpInfo WI; if(m_pUIWarp->InfoGetCur(WI) < 0) return; - if(iConcurrentUser < WI.iMaxUser) // Ѻ .. + if(iConcurrentUser < WI.iMaxUser) // 동접 제한보다 적으면.. { int iOffsetSend = 0; BYTE byBuff[8]; @@ -6591,7 +6591,7 @@ void CGameProcMain::ReleaseSound() { } else { - std::string szMsg; ::_LoadStringFromResource(IDS_MSG_CONCURRENT_USER_OVERFLOW, szMsg); // ʰ.. + std::string szMsg; ::_LoadStringFromResource(IDS_MSG_CONCURRENT_USER_OVERFLOW, szMsg); // 동시 접속 제한 초과.. this->MsgOutput(szMsg, 0xffff0000); } } @@ -6604,17 +6604,17 @@ void CGameProcMain::MsgRecv_Knights_Create(DataPack * pDataPack, int & iOffset) case N3_SP_KNIGHTS_CREATE_SUCCESS: { int sid = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); std::string szID; - int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID - int iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID ڿ .. - CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szID, iLen); // ID ڿ.. - int iGrade = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // - int iRank = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // + int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 기사단 ID + int iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ID 문자열 길이.. + CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szID, iLen); // ID 문자열.. + int iGrade = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 등급 + int iRank = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 순위 DWORD dwGold = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); if (s_pPlayer->IDNumber() == sid) { m_pUIInn->Message(IDS_CLAN_MAKE_SUCCESS); - // .. κ丮 ٲٰ ŷ.. ŷʹ Ÿ.. + // 돈 변경.. 인벤토리는 바꾸고 상거래.. 개인 거래와는 배타적.. s_pPlayer->m_InfoExt.iGold = dwGold; if (m_pUIInventory->IsVisible()) { m_pUIInventory->GoldUpdate(); @@ -6626,7 +6626,7 @@ void CGameProcMain::MsgRecv_Knights_Create(DataPack * pDataPack, int & iOffset) m_pSubProcPerTrade->m_pUIPerTradeDlg->GoldUpdate(); } - //(Ŭ)UIƮ...ض... + //기사단(클랜)UI업데이트...해라... s_pPlayer->m_InfoExt.eKnightsDuty = KNIGHTS_DUTY_CHIEF; s_pPlayer->KnightsInfoSet(iID, szID, iGrade, iRank); m_pUIVar->UpdateKnightsInfo(); @@ -6636,7 +6636,7 @@ void CGameProcMain::MsgRecv_Knights_Create(DataPack * pDataPack, int & iOffset) m_pUIVar->m_pPageKnights->ChangeUIByDuty(s_pPlayer->m_InfoExt.eKnightsDuty); } - //m_pUIKnightsOp->KnightsInfoInsert(iID, szID); // ߰.. + //m_pUIKnightsOp->KnightsInfoInsert(iID, szID); // 기사단 정보 추가.. } else { CPlayerOther * pUPC = s_pOPMgr->UPCGetByID(sid, true); if (pUPC) { @@ -6729,18 +6729,18 @@ void CGameProcMain::MsgRecv_Knights_Join(DataPack * pDataPack, int & iOffset) { std::string szMsg; switch ((e_SubPacket_KNights_Common)bSubCom) { - case N3_SP_KNIGHTS_COMMON_DBFAIL: //DB˻ .. + case N3_SP_KNIGHTS_COMMON_DBFAIL: //DB검색 실패.. break; - case N3_SP_KNIGHTS_COMMON_SUCCESS: //Ŭ + case N3_SP_KNIGHTS_COMMON_SUCCESS: //클랜가입 성공 { int sid = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); e_KnightsDuty eDuty = (e_KnightsDuty)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); - int iL = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Ҽ ̸ . + int iL = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 소속 기사단 이름 길이. std::string szKnightsName; CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szKnightsName, iL); - int iGrade = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // - int iRank = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // + int iGrade = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 등급 + int iRank = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 순위 if (s_pPlayer->IDNumber() == sid) { s_pPlayer->m_InfoExt.eKnightsDuty = eDuty; @@ -6761,31 +6761,31 @@ void CGameProcMain::MsgRecv_Knights_Join(DataPack * pDataPack, int & iOffset) { } } } break; - case N3_SP_KNIGHTS_COMMON_FAIL_NONE_USER: // .. + case N3_SP_KNIGHTS_COMMON_FAIL_NONE_USER: //없는 유저.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_NONE_USER, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_DEAD_USER: // ׾ .. + case N3_SP_KNIGHTS_COMMON_FAIL_DEAD_USER: //상대유저가 죽어 있음.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_DEAD_USER, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_ENEMY_USER: // ٸ.. + case N3_SP_KNIGHTS_COMMON_FAIL_ENEMY_USER: //상대유저의 국가가 다름.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_ENEMY_USER, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_OTHER_CLAN_USER: // ̹ ٸ Ŭ̳ ܿ ԵǾ .. + case N3_SP_KNIGHTS_COMMON_FAIL_OTHER_CLAN_USER: //상대유저가 이미 다른 클랜이나 기사단에 가입되어 있음.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_OTHER_CLAN_USER, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_INVALIDRIGHT: // .. + case N3_SP_KNIGHTS_COMMON_FAIL_INVALIDRIGHT: //권한이 없음.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_INVALIDRIGHT, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_NONE_CLAN: // ʴ .. + case N3_SP_KNIGHTS_COMMON_FAIL_NONE_CLAN: //존재하지 않는 기사단.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_NONE_CLAN, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_FULL: //ο Ǯ.. + case N3_SP_KNIGHTS_COMMON_FAIL_FULL: //인원이 풀.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_CLAN_FULL, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; @@ -6813,18 +6813,18 @@ void CGameProcMain::MsgRecv_Knights_Leave(DataPack * pDataPack, int & iOffset) { std::string szMsg; switch ((e_SubPacket_KNights_Common)bSubCom) { - case N3_SP_KNIGHTS_COMMON_DBFAIL: //DB˻ .. + case N3_SP_KNIGHTS_COMMON_DBFAIL: //DB검색 실패.. break; - case N3_SP_KNIGHTS_COMMON_SUCCESS: //ŬŻ + case N3_SP_KNIGHTS_COMMON_SUCCESS: //클랜탈퇴 성공 { int sid = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); e_KnightsDuty eDuty = (e_KnightsDuty)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); - int iL = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Ҽ ̸ . + int iL = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 소속 기사단 이름 길이. std::string szKnightsName; CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szKnightsName, iL); - int iGrade = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // - int iRank = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // + int iGrade = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 등급 + int iRank = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 순위 if (s_pPlayer->IDNumber() == sid) { s_pPlayer->m_InfoExt.eKnightsDuty = eDuty; @@ -6845,31 +6845,31 @@ void CGameProcMain::MsgRecv_Knights_Leave(DataPack * pDataPack, int & iOffset) { } } } break; - case N3_SP_KNIGHTS_COMMON_FAIL_NONE_USER: // .. + case N3_SP_KNIGHTS_COMMON_FAIL_NONE_USER: //없는 유저.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_NONE_USER, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_DEAD_USER: // ׾ .. + case N3_SP_KNIGHTS_COMMON_FAIL_DEAD_USER: //상대유저가 죽어 있음.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_DEAD_USER, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_ENEMY_USER: // ٸ.. + case N3_SP_KNIGHTS_COMMON_FAIL_ENEMY_USER: //상대유저의 국가가 다름.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_ENEMY_USER, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_OTHER_CLAN_USER: // ̹ ٸ Ŭ̳ ܿ ԵǾ .. + case N3_SP_KNIGHTS_COMMON_FAIL_OTHER_CLAN_USER: //상대유저가 이미 다른 클랜이나 기사단에 가입되어 있음.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_OTHER_CLAN_USER, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_INVALIDRIGHT: // .. + case N3_SP_KNIGHTS_COMMON_FAIL_INVALIDRIGHT: //권한이 없음.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_INVALIDRIGHT, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_NONE_CLAN: // ʴ .. + case N3_SP_KNIGHTS_COMMON_FAIL_NONE_CLAN: //존재하지 않는 기사단.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_NONE_CLAN, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_FULL: //ο Ǯ.. + case N3_SP_KNIGHTS_COMMON_FAIL_FULL: //인원이 풀.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_CLAN_FULL, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; @@ -6893,9 +6893,9 @@ void CGameProcMain::MsgRecv_Knights_AppointViceChief(DataPack * pDataPack, int & std::string szMsg; switch ((e_SubPacket_KNights_Common)bSubCom) { - case N3_SP_KNIGHTS_COMMON_DBFAIL: //DB˻ .. + case N3_SP_KNIGHTS_COMMON_DBFAIL: //DB검색 실패.. break; - case N3_SP_KNIGHTS_COMMON_SUCCESS: //Ŭ + case N3_SP_KNIGHTS_COMMON_SUCCESS: //클랜가입 성공 { int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); e_KnightsDuty eDuty = (e_KnightsDuty)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); @@ -6912,31 +6912,31 @@ void CGameProcMain::MsgRecv_Knights_AppointViceChief(DataPack * pDataPack, int & m_pUIVar->m_pPageKnights->ChangeUIByDuty(s_pPlayer->m_InfoExt.eKnightsDuty); } } break; - case N3_SP_KNIGHTS_COMMON_FAIL_NONE_USER: // .. + case N3_SP_KNIGHTS_COMMON_FAIL_NONE_USER: //없는 유저.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_NONE_USER, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_DEAD_USER: // ׾ .. + case N3_SP_KNIGHTS_COMMON_FAIL_DEAD_USER: //상대유저가 죽어 있음.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_DEAD_USER, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_ENEMY_USER: // ٸ.. + case N3_SP_KNIGHTS_COMMON_FAIL_ENEMY_USER: //상대유저의 국가가 다름.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_ENEMY_USER, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_OTHER_CLAN_USER: // ̹ ٸ Ŭ̳ ܿ ԵǾ .. + case N3_SP_KNIGHTS_COMMON_FAIL_OTHER_CLAN_USER: //상대유저가 이미 다른 클랜이나 기사단에 가입되어 있음.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_OTHER_CLAN_USER, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_INVALIDRIGHT: // .. + case N3_SP_KNIGHTS_COMMON_FAIL_INVALIDRIGHT: //권한이 없음.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_INVALIDRIGHT, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_NONE_CLAN: // ʴ .. + case N3_SP_KNIGHTS_COMMON_FAIL_NONE_CLAN: //존재하지 않는 기사단.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_NONE_CLAN, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; - case N3_SP_KNIGHTS_COMMON_FAIL_FULL: //ο Ǯ.. + case N3_SP_KNIGHTS_COMMON_FAIL_FULL: //인원이 풀.. ::_LoadStringFromResource(IDS_CLAN_JOIN_FAIL_CLAN_FULL, szMsg); this->MsgOutput(szMsg, 0xffffff00); break; @@ -6963,7 +6963,7 @@ void CGameProcMain::MsgRecv_Knights_MemberInfoAll(DataPack * pDataPack, int & iO case N3_SP_KNIGHTS_COMMON_SUCCESS: m_pUIVar->m_pPageKnights->MsgRecv_MemberInfo(pDataPack, iOffset); break; - case N3_SP_KNIGHTS_COMMON_DBFAIL: //DB˻ .. + case N3_SP_KNIGHTS_COMMON_DBFAIL: //DB검색 실패.. default: break; } @@ -7046,7 +7046,7 @@ void CGameProcMain::MsgRecv_Knigts_Join_Req(DataPack * pDataPack, int & iOffset) m_iJoinReqClanRequierID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); m_iJoinReqClan = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); - int iL = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Ҽ ̸ . + int iL = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 소속 기사단 이름 길이. std::string szKnightsName; CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szKnightsName, iL); @@ -7081,16 +7081,16 @@ bool CGameProcMain::MsgRecv_CharacterSelect(DataPack * pDataPack, int & iOffset) { bool bSuccess = CGameProcedure::MsgRecv_CharacterSelect(pDataPack, iOffset); - // ׾ ü ϴ ٽ ش. + //전쟁존에서 죽어서 서버 체인지 하는 경우는 다시 값을 세팅해준다. if (s_pPlayer->IsDead()) { this->InitPlayerPosition( - s_pPlayer->Position()); // ÷̾ ġ ʱȭ.. , ⺻ ϰ Ѵ. - s_pPlayer->RegenerateCollisionMesh(); // 浹 ޽ø ٽ .. - s_pPlayer->m_iSendRegeneration = 0; // ѹ ٽ Ⱥ ÷ - s_pPlayer->m_fTimeAfterDeath = 0; // ѹ ٽ Ⱥ ÷ + s_pPlayer->Position()); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. + s_pPlayer->RegenerateCollisionMesh(); // 충돌 메시를 다시 만든다.. + s_pPlayer->m_iSendRegeneration = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 + s_pPlayer->m_fTimeAfterDeath = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 // - // & ȿ ʱȭ.. + //마법 & 효과 초기화.. if (m_pUIStateBarAndMiniMap) { m_pUIStateBarAndMiniMap->ClearMagic(); } @@ -7112,26 +7112,26 @@ bool CGameProcMain::MsgRecv_CharacterSelect(DataPack * pDataPack, int & iOffset) } } - this->InitZone(s_pPlayer->m_InfoExt.iZoneCur, s_pPlayer->Position()); // ٲ۴.. - s_pProcMain->MsgSend_GameStart(); // ε .. + this->InitZone(s_pPlayer->m_InfoExt.iZoneCur, s_pPlayer->Position()); // 존을 바꾼다.. + s_pProcMain->MsgSend_GameStart(); // 존로딩이 끝나면 게임 시작.. return bSuccess; } void CGameProcMain::MsgRecv_Corpse(DataPack * pDataPack, int & iOffset) { - int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); //regenϰ ϴ ̵ + int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); //regen하고자 하는 유저의 아이디 if (s_pPlayer->IDNumber() != iID) { s_pOPMgr->CorpseAdd(iID); if (s_pPlayer->m_iIDTarget == iID) { - s_pPlayer->m_iIDTarget = -1; // regen ijͿ Ŀ ִٸ ʱȭ ش. + s_pPlayer->m_iIDTarget = -1; //만약 내가 regen한 캐릭터에 포커스를 가지고 있다면 초기화 해준다. } } } void CGameProcMain::MsgSend_PerTradeBBSReq(std::string szName, int iDestID) { - if (!m_pUITransactionDlg->IsVisible()) //// ΰ ŷ.. // ŷ ƴϸ.. + if (!m_pUITransactionDlg->IsVisible()) //// 개인간 아이템 거래.. // 상거래 중이 아니면.. { std::string szMsg; ::_LoadStringFromResource(IDS_PERSONAL_TRADE_REQUEST, szMsg); @@ -7180,14 +7180,14 @@ bool CGameProcMain::OnMouseMove(POINT ptCur, POINT ptPrev) CPlayerNPC* pTarget = NULL; int iID = -1; - pTarget = s_pOPMgr->Pick(ptCur.x, ptCur.y, iID, &vPick); // 濡 򸰳ѵ ŷ.. - this->TargetSelect(iID, false); // Ÿ ´.. - if(NULL == pTarget) // Ÿ .. + pTarget = s_pOPMgr->Pick(ptCur.x, ptCur.y, iID, &vPick); // 사방에 깔린넘들 픽킹.. + this->TargetSelect(iID, false); // 타겟을 잡는다.. + if(NULL == pTarget) // 타겟이 없으면.. { - s_pPlayer->m_pObjectTarget = ACT_WORLD->PickWithShape(ptCur.x, ptCur.y, true, &vPick); // ġ Ѵ.. - if(NULL == s_pPlayer->m_pObjectTarget) // Ÿٵ .. + s_pPlayer->m_pObjectTarget = ACT_WORLD->PickWithShape(ptCur.x, ptCur.y, true, &vPick); // 찍힌 위치를 저장한다.. + if(NULL == s_pPlayer->m_pObjectTarget) // 타겟도 없으면.. { - ACT_WORLD->PickWideWithTerrain(ptCur.x, ptCur.y, vPick); // .. + ACT_WORLD->PickWideWithTerrain(ptCur.x, ptCur.y, vPick); // 지형을 찍어본다.. } } s_pFX->SetBundlePos(m_pMagicSkillMng->m_iMyRegionTargetFXID, m_pMagicSkillMng->m_iMyRegionTargetFXID, vPick); @@ -7209,7 +7209,7 @@ bool CGameProcMain::OnMouseMove(POINT ptCur, POINT ptPrev) { vMyPos = s_pPlayer->Position(); vMyPos.y += s_pPlayer->Height() / 2; - ACT_WORLD->PickWideWithTerrain(ptCur.x, ptCur.y, m_vMouseSkillPos); // .. + ACT_WORLD->PickWideWithTerrain(ptCur.x, ptCur.y, m_vMouseSkillPos); // 지형을 찍어본다.. vDir = m_vMouseSkillPos - vMyPos; vGap = vDir; @@ -7218,11 +7218,11 @@ bool CGameProcMain::OnMouseMove(POINT ptCur, POINT ptPrev) { bool bColShape = ACT_WORLD->CheckCollisionWithShape(vMyPos, vDir, vGap.Magnitude(), &m_vMouseSkillPos, &vNormal); - if (!bColShape) // Ÿٵ .. + if (!bColShape) // 타겟도 없으면.. { int iID = -1; - s_pOPMgr->Pick(ptCur.x, ptCur.y, iID, &m_vMouseSkillPos); // 濡 򸰳ѵ ŷ.. - this->TargetSelect(iID, false); // Ÿ ´.. + s_pOPMgr->Pick(ptCur.x, ptCur.y, iID, &m_vMouseSkillPos); // 사방에 깔린넘들 픽킹.. + this->TargetSelect(iID, false); // 타겟을 잡는다.. } else { m_vMouseSkillPos.y = ACT_WORLD->GetHeightWithTerrain(m_vMouseSkillPos.x, m_vMouseSkillPos.z); } @@ -7234,7 +7234,7 @@ bool CGameProcMain::OnMouseMove(POINT ptCur, POINT ptPrev) { return true; } -// Ŭ +// 왼쪽 더블 클릭 bool CGameProcMain::OnMouseLDBtnPress(POINT ptCur, POINT ptPrev) { if (s_pUIMgr->m_bDoneSomething) { return false; @@ -7250,7 +7250,7 @@ bool CGameProcMain::OnMouseLDBtnPress(POINT ptCur, POINT ptPrev) { if (VP_THIRD_PERSON == s_pEng->ViewPoint()) { if (s_pPlayer->IsAttackableTarget(pTarget, false)) { this->CommandMove(MD_STOP, true); - this->CommandEnableAttackContinous(true, pTarget); // ڵ + this->CommandEnableAttackContinous(true, pTarget); // 자동 공격 } else if (pTarget && VP_THIRD_PERSON == s_pEng->ViewPoint()) { this->CommandMove(MD_FOWARD, true); s_pPlayer->SetMoveTargetID(s_pPlayer->m_iIDTarget); @@ -7262,7 +7262,7 @@ bool CGameProcMain::OnMouseLDBtnPress(POINT ptCur, POINT ptPrev) { return true; } -// Ŭ +// 왼쪽 클릭 bool CGameProcMain::OnMouseLBtnPress(POINT ptCur, POINT ptPrev) { if (s_pUIMgr->m_bDoneSomething) { return false; @@ -7283,23 +7283,23 @@ bool CGameProcMain::OnMouseLBtnPress(POINT ptCur, POINT ptPrev) { BOOL bFindCorpse = false; int iID = -1; - pTarget = s_pOPMgr->PickPrecisely(ptCur.x, ptCur.y, iID, &m_vMouseLBClickedPos); // 濡 򸰳ѵ ŷ.. - this->TargetSelect(iID, false); // Ÿ ´.. - if (NULL == pTarget) // Ÿ .. + pTarget = s_pOPMgr->PickPrecisely(ptCur.x, ptCur.y, iID, &m_vMouseLBClickedPos); // 사방에 깔린넘들 픽킹.. + this->TargetSelect(iID, false); // 타겟을 잡는다.. + if (NULL == pTarget) // 타겟이 없으면.. { - if (s_pPlayer->m_bAttackContinous) { // ϴ ̸.. - this->CommandEnableAttackContinous(false, NULL); // .. + if (s_pPlayer->m_bAttackContinous) { // 계속 공격하는 중이면.. + this->CommandEnableAttackContinous(false, NULL); // 계속 공격 취소.. } s_pPlayer->m_pObjectTarget = - ACT_WORLD->PickWithShape(ptCur.x, ptCur.y, true, &m_vMouseLBClickedPos); // ġ Ѵ.. - if (NULL == s_pPlayer->m_pObjectTarget) // Ÿٵ .. + ACT_WORLD->PickWithShape(ptCur.x, ptCur.y, true, &m_vMouseLBClickedPos); // 찍힌 위치를 저장한다.. + if (NULL == s_pPlayer->m_pObjectTarget) // 타겟도 없으면.. { - // ü .. - CPlayerNPC * pCorpse = s_pOPMgr->PickCorpse(ptCur.x, ptCur.y, iID); // ŷ.. - if (false == this->MsgSend_RequestItemBundleOpen(pCorpse)) // ü û.. + // 시체 뒤저서 아이템 상자 열기.. + CPlayerNPC * pCorpse = s_pOPMgr->PickCorpse(ptCur.x, ptCur.y, iID); // 픽킹.. + if (false == this->MsgSend_RequestItemBundleOpen(pCorpse)) // 시체 뒤지기 요청.. { - ACT_WORLD->PickWideWithTerrain(ptCur.x, ptCur.y, m_vMouseLBClickedPos); // .. + ACT_WORLD->PickWideWithTerrain(ptCur.x, ptCur.y, m_vMouseLBClickedPos); // 지형을 찍어본다.. } else { bFindCorpse = true; } @@ -7315,7 +7315,7 @@ bool CGameProcMain::OnMouseLBtnPress(POINT ptCur, POINT ptPrev) { if (!s_pPlayer->IsDead() && VP_THIRD_PERSON == s_pEng->ViewPoint()) { m_fLBClickTime = CN3Base::TimeGet(); - this->CommandSitDown(false, false); // ϴ .. + this->CommandSitDown(false, false); // 일단 일으켜 세운다.. if (pTarget) { if (s_pLocalInput->IsKeyDown(DIK_LCONTROL) || s_pLocalInput->IsKeyDown(DIK_RCONTROL)) { @@ -7324,7 +7324,7 @@ bool CGameProcMain::OnMouseLBtnPress(POINT ptCur, POINT ptPrev) { this->CommandMove(MD_STOP, true); } - this->CommandEnableAttackContinous(true, pTarget); // ڵ + this->CommandEnableAttackContinous(true, pTarget); // 자동 공격 } else { this->CommandMove(MD_FOWARD, true); s_pPlayer->SetMoveTargetID(s_pPlayer->m_iIDTarget); @@ -7337,7 +7337,7 @@ bool CGameProcMain::OnMouseLBtnPress(POINT ptCur, POINT ptPrev) { } else if (!bFindCorpse) { s_pPlayer->RotateTo(fYaw, true); __Vector3 vMovePoint; - ACT_WORLD->PickWideWithTerrain(ptCur.x, ptCur.y, vMovePoint); // .. + ACT_WORLD->PickWideWithTerrain(ptCur.x, ptCur.y, vMovePoint); // 지형을 찍어본다.. float fDist = (vMovePoint - s_pPlayer->Position()).Magnitude(); @@ -7358,7 +7358,7 @@ bool CGameProcMain::OnMouseLBtnPress(POINT ptCur, POINT ptPrev) { this->CommandMove(MD_STOP, true); } - this->CommandEnableAttackContinous(true, pTarget); // ڵ + this->CommandEnableAttackContinous(true, pTarget); // 자동 공격 } else { s_pPlayer->m_bAttackContinous = false; CommandToggleAttackContinous(); @@ -7369,7 +7369,7 @@ bool CGameProcMain::OnMouseLBtnPress(POINT ptCur, POINT ptPrev) { return true; } -// Ŭ +// 왼쪽 클릭업 bool CGameProcMain::OnMouseLBtnPressd(POINT ptCur, POINT ptPrev) { if (!s_pLocalInput->IsKeyDown(KM_MOVE_FOWARD)) { // if(!s_pPlayer->m_bTargetOrPosMove) @@ -7378,7 +7378,7 @@ bool CGameProcMain::OnMouseLBtnPressd(POINT ptCur, POINT ptPrev) { return true; } -// +// 왼쪽 눌리고 있을때 bool CGameProcMain::OnMouseLbtnDown(POINT ptCur, POINT ptPrev) { if (s_pUIMgr->m_bDoneSomething) { return false; @@ -7396,7 +7396,7 @@ bool CGameProcMain::OnMouseLbtnDown(POINT ptCur, POINT ptPrev) { float fYaw = ::_Yaw2D(vDir.x, vDir.z); if (!s_pPlayer->IsDead() && VP_THIRD_PERSON == s_pEng->ViewPoint() && - !s_pLocalInput->IsKeyDown(KM_MOVE_FOWARD)) // Ī ̸.. UI ǵ ʾ.. + !s_pLocalInput->IsKeyDown(KM_MOVE_FOWARD)) // 삼인칭 시점이면.. UI 를 건들지 않았으면.. { __Vector3 vMovePoint; float fDist; @@ -7407,11 +7407,11 @@ bool CGameProcMain::OnMouseLbtnDown(POINT ptCur, POINT ptPrev) { CommandToggleAttackContinous(); } - this->CommandSitDown(false, false); // ϴ .. + this->CommandSitDown(false, false); // 일단 일으켜 세운다.. s_pPlayer->RotateTo(fYaw, true); this->CommandMove(MD_FOWARD, false); - ACT_WORLD->PickWideWithTerrain(ptCur.x, ptCur.y, vMovePoint); // .. + ACT_WORLD->PickWideWithTerrain(ptCur.x, ptCur.y, vMovePoint); // 지형을 찍어본다.. fDist = (vMovePoint - s_pPlayer->Position()).Magnitude(); s_pPlayer->SetMoveTargetPos(vMovePoint); @@ -7421,7 +7421,7 @@ bool CGameProcMain::OnMouseLbtnDown(POINT ptCur, POINT ptPrev) { } s_pPlayer->RotateTo(fYaw, true); - ACT_WORLD->PickWideWithTerrain(ptCur.x, ptCur.y, vMovePoint); // .. + ACT_WORLD->PickWideWithTerrain(ptCur.x, ptCur.y, vMovePoint); // 지형을 찍어본다.. fDist = (vMovePoint - s_pPlayer->Position()).Magnitude(); @@ -7434,7 +7434,7 @@ bool CGameProcMain::OnMouseLbtnDown(POINT ptCur, POINT ptPrev) { return true; } -// Ŭ +// 오른쪽 클릭 bool CGameProcMain::OnMouseRBtnPress(POINT ptCur, POINT ptPrev) { if (s_pUIMgr->m_bDoneSomething) { return false; @@ -7446,18 +7446,18 @@ bool CGameProcMain::OnMouseRBtnPress(POINT ptCur, POINT ptPrev) { } int iID = -1; - CPlayerNPC * pNPC = s_pOPMgr->PickNPC(ptCur.x, ptCur.y, iID); // ŷ.. + CPlayerNPC * pNPC = s_pOPMgr->PickNPC(ptCur.x, ptCur.y, iID); // 픽킹.. if (NULL == pNPC) { - CPlayerNPC * pCorpse = s_pOPMgr->PickCorpse(ptCur.x, ptCur.y, iID); // ŷ.. - if (false == this->MsgSend_RequestItemBundleOpen(pCorpse)) // ü .. + CPlayerNPC * pCorpse = s_pOPMgr->PickCorpse(ptCur.x, ptCur.y, iID); // 픽킹.. + if (false == this->MsgSend_RequestItemBundleOpen(pCorpse)) // 시체 뒤저서 아이템 상자 열기.. { CN3Shape * pShape = ACT_WORLD->PickWithShape(ptCur.x, ptCur.y, true); - if (pShape && pShape == s_pPlayer->m_pObjectTarget && pShape->m_iEventID) // Event .. + if (pShape && pShape == s_pPlayer->m_pObjectTarget && pShape->m_iEventID) // Event 가 있으면.. { float fD = (s_pPlayer->Position() - pShape->Pos()).Magnitude(); float fDLimit = (s_pPlayer->Radius() + pShape->Radius()) * 2.0f; - if (fD > fDLimit) // Ÿ ָ + if (fD > fDLimit) // 거리가 멀면 { std::string szMsg; if (OBJECT_TYPE_BINDPOINT == pShape->m_iEventType) { @@ -7471,21 +7471,21 @@ bool CGameProcMain::OnMouseRBtnPress(POINT ptCur, POINT ptPrev) { std::string szMsg; ::_LoadStringFromResource(IDS_REQUEST_BINDPOINT, szMsg); this->MessageBoxPost(szMsg, "", MB_YESNO, - BEHAVIOR_REQUEST_BINDPOINT); // Ʈ ޽ ڽ + BEHAVIOR_REQUEST_BINDPOINT); // 바인팅 포인트 설정 메시지 박스 } else if (OBJECT_TYPE_WARP_POINT == pShape->m_iEventType) { - this->MsgSend_ObjectEvent(pShape->m_iEventID, pShape->m_iNPC_ID); // Ʈ ̺Ʈ .. + this->MsgSend_ObjectEvent(pShape->m_iEventID, pShape->m_iNPC_ID); // 오브젝트 이벤트 보내기.. } } } } - } else if (pNPC->IDNumber() == s_pPlayer->m_iIDTarget) // Ÿ ijͿ ŷ ijͰ ..) + } else if (pNPC->IDNumber() == s_pPlayer->m_iIDTarget) // 타겟으로 찍은 캐릭터와 피킹한 캐릭터가 같고 ..) { - if (pNPC->m_pShapeExtraRef) // Ʈ NPC ̸.. Ʈ NPC ID .. + if (pNPC->m_pShapeExtraRef) // 오브젝트 형태의 NPC 이면.. 컨트롤 할 NPC의 ID 가 있으면.. { if (pNPC->m_pShapeExtraRef->m_iNPC_ID > 0) { float fD = (s_pPlayer->Position() - pNPC->m_pShapeExtraRef->Pos()).Magnitude(); float fDLimit = (s_pPlayer->Radius() + pNPC->m_pShapeExtraRef->Radius()) * 2.0f; - if (fD > fDLimit) // Ÿ ָ + if (fD > fDLimit) // 거리가 멀면 { std::string szMsg; ::_LoadStringFromResource(IDS_ERR_REQUEST_OBJECT_EVENT_SO_FAR, szMsg); @@ -7494,21 +7494,21 @@ bool CGameProcMain::OnMouseRBtnPress(POINT ptCur, POINT ptPrev) { this->MsgSend_ObjectEvent(pNPC->m_pShapeExtraRef->m_iEventID, pNPC->IDNumber()); } } - } else // NPC ̸.. + } else // 보통 NPC 이면.. { - if (pNPC->m_InfoBase.eNation == s_pPlayer->m_InfoBase.eNation) // ϶.. + if (pNPC->m_InfoBase.eNation == s_pPlayer->m_InfoBase.eNation) // 같은 국가 일때만.. { float fD = (s_pPlayer->Position() - pNPC->Position()).Magnitude(); float fDLimit = (s_pPlayer->Radius() + pNPC->Radius()) * 3.0f; - if (fD > fDLimit) // Ÿ ָ + if (fD > fDLimit) // 거리가 멀면 { std::string szMsg; ::_LoadStringFromResource(IDS_ERR_REQUEST_NPC_EVENT_SO_FAR, szMsg); this->MsgOutput(szMsg, 0xffff8080); } else { - s_pPlayer->ActionMove(PSM_STOP); // ϴ ߰.. - pNPC->RotateTo(s_pPlayer); // ÷̾ . - this->MsgSend_NPCEvent(iID); // ̺Ʈ û.. + s_pPlayer->ActionMove(PSM_STOP); // 일단 멈추고.. + pNPC->RotateTo(s_pPlayer); // 방향을 플레이어 쪽으로 돌린다. + this->MsgSend_NPCEvent(iID); // 이벤트 요청.. if (m_pUITransactionDlg) { m_pUITransactionDlg->m_iNpcID = pNPC->IDNumber(); } @@ -7519,29 +7519,29 @@ bool CGameProcMain::OnMouseRBtnPress(POINT ptCur, POINT ptPrev) { return true; } -// Ŭ +// 오른쪽 클릭업 bool CGameProcMain::OnMouseRBtnPressd(POINT ptCur, POINT ptPrev) { return true; } -// +// 오른쪽 눌리고 있을때 bool CGameProcMain::OnMouseRbtnDown(POINT ptCur, POINT ptPrev) { float fMouseSensivity = 0.02f; - float fRotY = D3DX_PI * ((ptCur.x - ptPrev.x) * fMouseSensivity); // ȸ ϰ.. + float fRotY = D3DX_PI * ((ptCur.x - ptPrev.x) * fMouseSensivity); // 회전할 양을 계산하고.. float fRotX = D3DX_PI * ((ptCur.y - ptPrev.y) * fMouseSensivity); if (fRotY && s_pPlayer->IsAlive()) { if (VP_THIRD_PERSON == s_pEng->ViewPoint()) { s_pEng->CameraYawAdd(fRotY); } else if (false == s_pPlayer->m_bStun) { - s_pPlayer->RotAdd(fRotY); // .. + s_pPlayer->RotAdd(fRotY); // 기절해 있지 않을때만.. } } if (fRotX) { if (VP_THIRD_PERSON == s_pEng->ViewPoint()) { - s_pEng->CameraZoom(-fRotX); // ī޶ Ȯ + s_pEng->CameraZoom(-fRotX); // 카메라 확대 } else { - s_pEng->CameraPitchAdd(fRotX); // ī޶ + s_pEng->CameraPitchAdd(fRotX); // 카메라 각도 } } @@ -7555,13 +7555,13 @@ bool CGameProcMain::OnMouseRbtnDown(POINT ptCur, POINT ptPrev) { return true; } -// Ŭ +// 오른쪽 더블 클릭 bool CGameProcMain::OnMouseRDBtnPress(POINT ptCur, POINT ptPrev) { if (s_pUIMgr->m_bDoneSomething) { return false; } - //ų Ǿٸ.... + //스킬 매직이 사용되었다면.... m_pUIHotKeyDlg->EffectTriggerByMouse(); return true; @@ -7583,12 +7583,12 @@ void CGameProcMain::ProcessUIKeyInput(bool bEnable) { } void CGameProcMain::MsgSend_SpeedCheck(bool bInit) { - BYTE byBuff[10]; // .. - int iOffset = 0; // ɼ.. - float fTime = CN3Base::TimeGet(); // Ŭ̾Ʈ ð - - s_pSocket->MP_AddByte(byBuff, iOffset, N3_CHECK_SPEEDHACK); // ǵ üũ Ŷ.. - s_pSocket->MP_AddByte(byBuff, iOffset, bInit); // ð Ÿ true ̸ ؽð false üũŸ - s_pSocket->MP_AddFloat(byBuff, iOffset, fTime); // Ŭ̾Ʈ ð - s_pSocket->Send(byBuff, iOffset); // .. + BYTE byBuff[10]; // 버퍼.. + int iOffset = 0; // 옵셋.. + float fTime = CN3Base::TimeGet(); // 클라이언트 시간 + + s_pSocket->MP_AddByte(byBuff, iOffset, N3_CHECK_SPEEDHACK); // 스피드핵 체크 패킷.. + s_pSocket->MP_AddByte(byBuff, iOffset, bInit); // 서버가 기준 시간으로 쓸 타입 true 이면 기준시간 false면 체크타입 + s_pSocket->MP_AddFloat(byBuff, iOffset, fTime); // 클라이언트 시간 + s_pSocket->Send(byBuff, iOffset); // 보냄.. } diff --git a/src/game/GameProcMain.h b/src/game/GameProcMain.h index 99431b11..c9d1043f 100644 --- a/src/game/GameProcMain.h +++ b/src/game/GameProcMain.h @@ -19,15 +19,15 @@ class CGameProcMain : public CGameProcedure { public: #ifdef _N3_64GRID_ - CServerMesh * m_pSMesh; // ʿ ޽ Ŭ.. + CServerMesh * m_pSMesh; // 서버에게 필요한 메쉬 클래스.. #endif - class CUIInventory * m_pUIInventory; // κ丮 - class CUIVarious * m_pUIVar; // ij â,  ٿ뵵 UI - class CUIChat * m_pUIChatDlg; // ä ȭ.. - class CUIMessageWnd * m_pUIMsgDlg; // ޽ . + class CUIInventory * m_pUIInventory; // 인벤토리 + class CUIVarious * m_pUIVar; // 캐릭터 상태창, 기사단 관리 등이 페이지로 들어간 다용도 UI + class CUIChat * m_pUIChatDlg; // 채팅 입출력 대화상자.. + class CUIMessageWnd * m_pUIMsgDlg; // 게임 메시지 출력 상자. class CUIStateBar * m_pUIStateBarAndMiniMap; // mp,hp,exp, minimap.... - class CUICmd * m_pUICmd; // ϴ ɹư â.. - class CUITargetBar * m_pUITargetBar; // Ÿ â.. + class CUICmd * m_pUICmd; // 왼쪽 하단의 명령버튼 창.. + class CUITargetBar * m_pUITargetBar; // 타겟 상태창.. class CUITransactionDlg * m_pUITransactionDlg; class CUIDroppedItemDlg * m_pUIDroppedItemDlg; class CSubProcPerTrade * m_pSubProcPerTrade; @@ -44,37 +44,37 @@ class CGameProcMain : public CGameProcedure { class CUIInn * m_pUIInn; class CUICreateClanName * m_pUICreateClanName; - class CUIKnightsOperation * m_pUIKnightsOp; // Ʈ , , ... - class CUIPartyBBS * m_pUIPartyBBS; // Ƽ Խ. - class CUITradeSellBBS * m_pUITradeBBS; // ŷ Խ + class CUIKnightsOperation * m_pUIKnightsOp; // 기사단 리스트 보기, 가입, 등... + class CUIPartyBBS * m_pUIPartyBBS; // 파티 지원 게시판. + class CUITradeSellBBS * m_pUITradeBBS; // 상거래 게시판 class CUIQuestMenu * m_pUIQuestMenu; // Quest Menu class CUIQuestTalk * m_pUIQuestTalk; // Quest Talk class CUILevelGuide * m_pUILevelGuide; // Level guide class CUIDead * m_pUIDead; // Dead UI - class CUITradeBBSSelector * m_pUITradeBBSSelector; // ŷ Խ - class CUITradeBBSEditDlg * m_pUITradeBBSEdit; // ŷ Խù + class CUITradeBBSSelector * m_pUITradeBBSSelector; // 상거래 게시판 종류 선택 + class CUITradeBBSEditDlg * m_pUITradeBBSEdit; // 상거래 게시물 설명 class CUIRookieTip * m_pUIRookieTip; // RookieTip when closing notice ui class CUIExitMenu * m_pUIExitMenu; // Exit Menu - class CN3Shape * m_pTargetSymbol; // ÷̾ Ÿ ij ġ ׸ ȴ.. + class CN3Shape * m_pTargetSymbol; // 플레이어가 타겟으로 잡은 캐릭터의 위치위에 그리면 된다.. - class CN3SndObjStream *m_pSnd_Town, *m_pSnd_Battle; //, .. + class CN3SndObjStream *m_pSnd_Town, *m_pSnd_Battle; //마을음악, 전투음악 포인터.. class CMagicSkillMng * m_pMagicSkillMng; class CUINpcTalk * m_pUINpcTalk; class CUINPCChangeEvent * m_pUINpcChange; class CUIWarp * m_pUIWarp; - class CWarMessage * m_pWarMessage; // ޽ + class CWarMessage * m_pWarMessage; // 전쟁관련 메시지 class CLightMgr * m_pLightMgr; //.. - BOOL m_bLoadComplete; // ε ϷǾ?? + BOOL m_bLoadComplete; // 로딩이 완료되었나?? - float m_fMsgSendTimeMove; // ֱ ̵ ޽ ð.. - float m_fMsgSendTimeRot; // ֱ ȸ ޽ ð.. - float m_fPlayerYawSended; // ֱٿ ޽ ÷̾ y ȸ. - float m_fRequestGameSave; // ֱٿ û ð - __Vector3 m_vPlayerPosSended; // ֱٿ ޽ ÷̾ ġ. + float m_fMsgSendTimeMove; // 최근 이동 메시지 보낸 시간.. + float m_fMsgSendTimeRot; // 최근 회전 메시지 보낸 시간.. + float m_fPlayerYawSended; // 최근에 메시지를 보낸 시점의 플레이어 y 축 회전값. + float m_fRequestGameSave; // 최근에 게임 데이터 저장을 요청한 시간 + __Vector3 m_vPlayerPosSended; // 최근에 메시지를 보낸 시점의 플레이어 위치. __Vector3 m_vMouseLBClickedPos; __Vector3 m_vMouseSkillPos; @@ -119,9 +119,9 @@ class CGameProcMain : public CGameProcedure { bool MsgRecv_UserInAndRequest( DataPack * pDataPack, int & - iOffset); // User ̵ īƮŭ ޴´... ۱.. Ʈ ʿ ͸ û.. + iOffset); // 주위 영역의 모든 User 아이디를 카운트만큼 받는다... 글구.. 업데이트가 필요한 것만 서버에게 요청.. bool MsgRecv_UserInRequested(DataPack * pDataPack, - int & iOffset); // û ̵ ޾Ƽ User ó.. + int & iOffset); // 서버에게 요청한 유저의 아이디들을 받아서 User 처리.. bool MsgRecv_UserInOut(DataPack * pDataPack, int & iOffset); bool MsgRecv_UserIn(DataPack * pDataPack, int & iOffset, bool bWithFX = false); bool MsgRecv_UserOut(DataPack * pDataPack, int & iOffset); @@ -130,9 +130,9 @@ class CGameProcMain : public CGameProcedure { bool MsgRecv_NPCInAndRequest( DataPack * pDataPack, int & - iOffset); // NPC ̵ īƮŭ ޴´... ۱.. Ʈ ʿ ͸ û.. + iOffset); // 주위 영역의 모든 NPC 아이디를 카운트만큼 받는다... 글구.. 업데이트가 필요한 것만 서버에게 요청.. bool MsgRecv_NPCInRequested(DataPack * pDataPack, - int & iOffset); // û NPC ̵ ޾Ƽ User ó.. + int & iOffset); // 서버에게 요청한 NPC 아이디들을 받아서 User 처리.. bool MsgRecv_NPCInOut(DataPack * pDataPack, int & iOffset); bool MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset); bool MsgRecv_NPCOut(DataPack * pDataPack, int & iOffset); @@ -141,55 +141,55 @@ class CGameProcMain : public CGameProcedure { bool MsgRecv_Attack(DataPack * pDataPack, int & iOffset); bool MsgRecv_Dead(DataPack * pDataPack, int & iOffset); - bool MsgRecv_ItemMove(DataPack * pDataPack, int & iOffset); // Item Move .. - bool MsgRecv_ItemBundleDrop(DataPack * pDataPack, int & iOffset); // Item ʵ忡 Ÿµ - bool MsgRecv_ItemBundleOpen(DataPack * pDataPack, int & iOffset); // ڸ ų ü .. - bool MsgRecv_ItemTradeStart(DataPack * pDataPack, int & iOffset); // ŷ.. - bool MsgRecv_ItemTradeResult(DataPack * pDataPack, int & iOffset); // ŷ .. - bool MsgRecv_ItemDroppedGetResult(DataPack * pDataPack, int & iOffset); // Ա .. - bool MsgRecv_ItemWeightChange(DataPack * pDataPack, int & iOffset); // ȭ.. + bool MsgRecv_ItemMove(DataPack * pDataPack, int & iOffset); // Item Move에 대한 응답.. + bool MsgRecv_ItemBundleDrop(DataPack * pDataPack, int & iOffset); // Item 이 필드에 나타나는데에 대한 응답 + bool MsgRecv_ItemBundleOpen(DataPack * pDataPack, int & iOffset); // 아이템 상자를 열거나 시체를 뒤진다.. + bool MsgRecv_ItemTradeStart(DataPack * pDataPack, int & iOffset); // 아이템 상거래.. + bool MsgRecv_ItemTradeResult(DataPack * pDataPack, int & iOffset); // 아이템 상거래 결과.. + bool MsgRecv_ItemDroppedGetResult(DataPack * pDataPack, int & iOffset); // 땅에 떨어진 아이템 먹기 결과.. + bool MsgRecv_ItemWeightChange(DataPack * pDataPack, int & iOffset); // 아이템 무게 변화.. - bool MsgRecv_UserLookChange(DataPack * pDataPack, int & iOffset); // Ѹ ٲ.. + bool MsgRecv_UserLookChange(DataPack * pDataPack, int & iOffset); // 겉모습이 바뀐다.. 아이템 착용등 void MsgRecv_TargetHP(DataPack * pDataPack, int & iOffset); - void MsgRecv_ZoneChange(DataPack * pDataPack, int & iOffset); // ܼ ü. + void MsgRecv_ZoneChange(DataPack * pDataPack, int & iOffset); // 걍 단순한 존 체인지. void MsgRecv_Notice(DataPack * pDataPack, int & iOffset); void MsgRecv_PartyOrForce(DataPack * pDataPack, int & iOffset); void MsgRecv_PerTrade(DataPack * pDataPack, int & iOffset); - void MsgRecv_SkillChange(DataPack * pDataPack, int & iOffset); // ų ȭ.. - void MsgRecv_MagicProcess(DataPack * pDataPack, int & iOffset); // ų ȭ.. - void MsgRecv_ClassChange(DataPack * pDataPack, int & iOffset); // ȭ.. - void MsgRecv_ObjectEvent(DataPack * pDataPack, int & iOffset); // Ʈ ̺Ʈ û + void MsgRecv_SkillChange(DataPack * pDataPack, int & iOffset); // 스킬 변화.. + void MsgRecv_MagicProcess(DataPack * pDataPack, int & iOffset); // 스킬 변화.. + void MsgRecv_ClassChange(DataPack * pDataPack, int & iOffset); // 직업 변화.. + void MsgRecv_ObjectEvent(DataPack * pDataPack, int & iOffset); // 오브젝트 이벤트 신청에 대한 응답 - void MsgRecv_DurabilityChange(DataPack * pDataPack, int & iOffset); // .. + void MsgRecv_DurabilityChange(DataPack * pDataPack, int & iOffset); // 내구력 변경.. void MsgRecv_NpcEvent(DataPack * pDataPack, int & iOffset); // Npc Event(Exchange, Repair both).. - void MsgRecv_Knights(DataPack * pDataPack, int & iOffset); // Ŷ.. - void MsgRecv_KnightsListBasic(DataPack * pDataPack, int & iOffset); // ⺻ .. + void MsgRecv_Knights(DataPack * pDataPack, int & iOffset); // 기사단 조작 관련 패킷.. + void MsgRecv_KnightsListBasic(DataPack * pDataPack, int & iOffset); // 기사단 기본 정보들.. void MsgRecv_CompressedPacket(DataPack * pDataPack, - int & iOffset); // Ŷ̴... Ǯ 鼭 ѹ Ľؾ Ѵ!!! + int & iOffset); // 압축된 패킷이다... 압축 풀고 루프를 돌면서 한번더 파싱해야 한다!!! void MsgRecv_ContinousPacket(DataPack * pDataPack, - int & iOffset); // پ Ŷ̴.. 鼭 ѹ Ľؾ Ѵ!!! + int & iOffset); // 붙어서 오는 패킷이다.. 루프를 돌면서 한번더 파싱해야 한다!!! void MsgRecv_ItemRepair(DataPack * pDataPack, int & iOffset); // Item Repair Result.. void MsgRecv_ItemCountChange(DataPack * pDataPack, int & iOffset); // Item Count Change.. void MsgRecv_ItemDestroy(DataPack * pDataPack, int & iOffset); // Item Count Change.. - void MsgRecv_WareHouse(DataPack * pDataPack, int & iOffset); // Ŷ.. - void MsgRecv_WareHouseOpen(DataPack * pDataPack, int & iOffset); // .. + void MsgRecv_WareHouse(DataPack * pDataPack, int & iOffset); // 보관함 관련 패킷.. + void MsgRecv_WareHouseOpen(DataPack * pDataPack, int & iOffset); // 보관함 오픈.. - void MsgRecv_NpcChangeOpen(DataPack * pDataPack, int & iOffset); // Class Change ʱȭ.. - void MsgRecv_AllPointInit(DataPack * pDataPack, int & iOffset); // All Point ʱȭ.. - void MsgRecv_SkillPointInit(DataPack * pDataPack, int & iOffset); // Skill Point ʱȭ.. - void MsgRecv_PointChangePriceQueryRequest(DataPack * pDataPack, int & iOffset); // ݿ Ŷ.. + void MsgRecv_NpcChangeOpen(DataPack * pDataPack, int & iOffset); // Class Change와 초기화.. + void MsgRecv_AllPointInit(DataPack * pDataPack, int & iOffset); // All Point 초기화.. + void MsgRecv_SkillPointInit(DataPack * pDataPack, int & iOffset); // Skill Point 초기화.. + void MsgRecv_PointChangePriceQueryRequest(DataPack * pDataPack, int & iOffset); // 가격에 대한 응답 패킷.. - void MsgRecv_NoahChange(DataPack * pDataPack, int & iOffset); // .. - void MsgRecv_WarpList(DataPack * pDataPack, int & iOffset); // Ʈ.. - // void MsgRecv_ServerCheckAndRequestConcurrentUserCount(DataPack* pDataPack, int& iOffset); // IP Ʈ ޾ ڸ üũ .. + void MsgRecv_NoahChange(DataPack * pDataPack, int & iOffset); // 노아 변경.. + void MsgRecv_WarpList(DataPack * pDataPack, int & iOffset); // 워프 리스트.. + // void MsgRecv_ServerCheckAndRequestConcurrentUserCount(DataPack* pDataPack, int& iOffset); // 서버 IP 와 포트를 받아 동접자를 체크해 본다.. // void MsgRecv_ConcurrentUserCountAndSendServerCheck(DataPack* pDataPack, int& iOffset); //knights... @@ -218,7 +218,7 @@ class CGameProcMain : public CGameProcedure { void PlayBGM_Town(); void PlayBGM_Battle(); - void DoCommercialTransaction(int iTradeID); // ŷ.. + void DoCommercialTransaction(int iTradeID); // 상거래.. const __InfoPartyOrForce * PartyOrForceConditionGet(bool & bIAmLeader, bool & bIAmMember, int & iMemberIndex, class CPlayerBase *& pTarget); @@ -235,41 +235,41 @@ class CGameProcMain : public CGameProcedure { bool CommandToggleUINotice(); bool CommandToggleUILevelGuide(); - void CommandMove(e_MoveDirection eMD, bool bStartOrEnd); // ̴ (, ), ̱ ϴ°? + void CommandMove(e_MoveDirection eMD, bool bStartOrEnd); // 움직이는 방향(전후진, 멈춤), 움직이기 시작하는가? void CommandEnableAttackContinous(bool bEnable, CPlayerBase * pTarget); - void CommandCameraChange(); // ī޶ ٲٱ.. + void CommandCameraChange(); // 카메라 시점 바꾸기.. void CommandExitMenu(); void CommandSitDown(bool bLimitInterval, bool bSitDown, bool bImmediately = false); - void CommandTargetSelect_NearstEnemy(); // Ÿ .. - void CommandTargetSelect_NearstOurForce(); // Ƽ Ÿ.. + void CommandTargetSelect_NearstEnemy(); // 가장 가까운 적 타겟 잡기.. + void CommandTargetSelect_NearstOurForce(); // 가장 가까운 파티 타겟잡기.. - void CloseUIs(); // ŷ, ... UI ݱ.. + void CloseUIs(); // 각종 상거래, 워프등등... UI 닫기.. void MsgOutput(const std::string & szMsg, D3DCOLOR crMsg); void InitZone(int iZone, const __Vector3 & vPosPlayer); void InitUI(); - void InitPlayerPosition(const __Vector3 & vPos); // ÷̾ ġ ʱȭ.. , ⺻ ϰ Ѵ. + void InitPlayerPosition(const __Vector3 & vPos); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. - void MsgSend_Continous(); // Ư (?)Ͽ ޽ .. + void MsgSend_Continous(); // 특정 조건(?)하에서 서버에게 정기적으로 메시지를 보냄.. void MsgSend_Attack(int iTargetID, float fInterval, - float fDistance); // Ŷ - ̺ ֱ⸦ ༭ ŷ ´. + float fDistance); // 공격 패킷 날리기 - 테이블의 공격 주기를 같이 줘서 해킹을 막는다. void MsgSend_Move(bool bMove, - bool bContinous); // Ŷ .. // ̴° ? ֱ ̴ ǰ? - void MsgSend_Rotation(); // ȸ Ŷ .. - void MsgSend_Chat(enum e_ChatMode eMode, const std::string & szChat); // ä ޽ .. - void MsgSend_ChatSelectTarget(const std::string & szTargetID); // ϴ ä ϱ. + bool bContinous); // 서버에게 움직임 패킷을 날린다.. // 움직이는가 ? 주기적으로 움직이는 건가? + void MsgSend_Rotation(); // 서버에게 회전 패킷을 날린다.. + void MsgSend_Chat(enum e_ChatMode eMode, const std::string & szChat); // 서버에게 채팅 메시지를 날린다.. + void MsgSend_ChatSelectTarget(const std::string & szTargetID); // 일대일 채팅 상대 정하기. void MsgSend_Regen(); - bool MsgSend_RequestItemBundleOpen(CPlayerNPC * pCorpse); // ڸ ų ü .. + bool MsgSend_RequestItemBundleOpen(CPlayerNPC * pCorpse); // 아이템 상자를 열거나 시체를 뒤진다.. void MsgSend_RequestTargetHP(short siIDTarget, - BYTE byUpdateImmediately); // 0x00 - þԲ.. 0x01 - Ʈ.. + BYTE byUpdateImmediately); // 0x00 - 점차 늘어나게끔.. 0x01 - 즉시 업데이트.. void MsgSend_GameStart(); bool MsgSend_NPCEvent(short siIDTarget); - void MsgSend_NPCInRequest(int iID); // NPC ûѴ.. - void MsgSend_UserInRequest(int iID); // User ûѴ.. - void MsgSend_Warp(); // ?? - ü ɼ ִ.. - void MsgSend_ZoneChangeComplete(); // ü Ϸ.. ( ε ..) + void MsgSend_NPCInRequest(int iID); // NPC 정보가 없을 경우 요청한다.. + void MsgSend_UserInRequest(int iID); // User 정보가 없을 경우 요청한다.. + void MsgSend_Warp(); // 워프?? - 존체인지가 될수도 있다.. + void MsgSend_ZoneChangeComplete(); // 존 체인지 완료.. (맵 로딩 끝..) void MsgSend_StateChange(enum e_SubPacket_State eSP, int iState); void MsgSend_PerTradeReq(int iDestID, bool bNear = true); void MsgSend_SpeedCheck(bool bInit = false); @@ -278,7 +278,7 @@ class CGameProcMain : public CGameProcedure { void MsgSend_PartyOrForceLeave(int iPartyOrForce); // iPartyOrForce 1 : Party, 2:Force bool MsgSend_PartyOrForceCreate(int iPartyOrForce, const std::string & szID); // iPartyOrForce 1 : Party, 2:Force - void MsgSend_ObjectEvent(int iEventID, int iNPCID); // Ʈ Ǿ ִ ̺Ʈ û.. + void MsgSend_ObjectEvent(int iEventID, int iNPCID); // 오브젝트에 설정되어 있는 이벤트 요청.. void MsgSend_Weather(int iWeather, int iPercent); void MsgSend_Time(int iHour, int iMin); void MsgSend_Administrator(enum e_SubPacket_Administrator eSP, const std::string & szID); @@ -291,11 +291,11 @@ class CGameProcMain : public CGameProcedure { void MsgSend_PerTradeBBSReq(std::string szName, int iDestID); void MsgSend_CharacterSelect(); // virtual - void ProcessPlayerInclination(); // ó..( ־ 簡 ϸ ̲..). - void ProcessLocalInput(DWORD dwMouseFlags); // Ű óѴ.. + void ProcessPlayerInclination(); // 경사 처리..(가만히 있어도 경사가 급하면 미끄러짐..). + void ProcessLocalInput(DWORD dwMouseFlags); // 키보드 눌린것을 처리한다.. void ParseChattingCommand(const std::string & szCmd); - void UpdateUI_PartyOrForceButtons(); // Ŀǵ ٿ ִ Ƽ ư Ȳ Ʈ ش. + void UpdateUI_PartyOrForceButtons(); // 커맨드 줄에 있는 파티 버튼을 상황에 따라 업데이트 해준다. void UpdateUI_MiniMap(); void UpdateUI_TargetBar(); void UpdateBGM(); @@ -303,14 +303,14 @@ class CGameProcMain : public CGameProcedure { void RenderTarget(); - void Init(); // UI UI ҽ д´. + void Init(); // UI 와 UI 리소스등을 읽는다. void Release(); // Release.. void ReleaseUIs(); void ReleaseSound(); - void Tick(); // .. - void Render(); // .. + void Tick(); // 잡다한 계산.. + void Render(); // 렌더링.. - CGameProcMain(); // . - virtual ~CGameProcMain(); // Ҹ. + CGameProcMain(); // 생성자. + virtual ~CGameProcMain(); // 소멸자. }; diff --git a/src/game/GameProcNationSelect.cpp b/src/game/GameProcNationSelect.cpp index e05c2fe6..2f3b1028 100644 --- a/src/game/GameProcNationSelect.cpp +++ b/src/game/GameProcNationSelect.cpp @@ -21,7 +21,7 @@ CGameProcNationSelect::CGameProcNationSelect() { m_pUINationSelectDlg = NULL; - s_pPlayer->m_InfoBase.eNation = NATION_NOTSELECTED; // ʾҴ.. + s_pPlayer->m_InfoBase.eNation = NATION_NOTSELECTED; // 아직 국가를 선택하지 않았다.. } CGameProcNationSelect::~CGameProcNationSelect() { @@ -48,40 +48,40 @@ void CGameProcNationSelect::Init() { m_pUINationSelectDlg = new CUINationSelectDlg(); m_pUINationSelectDlg->Init(s_pUIMgr); m_pUINationSelectDlg->LoadFromFile(szTemp); - m_pUINationSelectDlg->m_pProcNationSelectRef = this; // ֱ.. + m_pUINationSelectDlg->m_pProcNationSelectRef = this; // 참조 포인터 넣기.. - s_pPlayer->m_InfoBase.eNation = NATION_NOTSELECTED; // ʾҴ.. + s_pPlayer->m_InfoBase.eNation = NATION_NOTSELECTED; // 아직 국가를 선택하지 않았다.. } void CGameProcNationSelect::Tick() { - CGameProcedure::Tick(); // Ű, 콺 Է .. + CGameProcedure::Tick(); // 키, 마우스 입력 등등.. if (NATION_KARUS == s_pPlayer->m_InfoBase.eNation || NATION_ELMORAD == s_pPlayer->m_InfoBase.eNation) { CGameProcedure::ProcActiveSet( - (CGameProcedure *)s_pProcCharacterSelect); // ij ٷ .. + (CGameProcedure *)s_pProcCharacterSelect); // 국가를 골랐으면 캐릭터 선택으로 바로 간다.. } } void CGameProcNationSelect::Render() { - s_pEng->Clear(0); // Ŭ.. - s_pEng->BeginScene(); // ... + s_pEng->Clear(0); // 클리어.. + s_pEng->BeginScene(); // 씬 렌더 ㅅ작... - CGameProcedure::Render(); // UI ׹ ⺻ ͵ .. + CGameProcedure::Render(); // UI 나 그밖의 기본적인 것들 렌더링.. - s_pEng->EndScene(); // ... + s_pEng->EndScene(); // 씬 렌더 시작... s_pEng->Present(CN3Base::s_hWndBase); } void CGameProcNationSelect::MsgSendNationSelect(e_Nation eNation) { - BYTE byBuff[4]; // Ŷ .. - int iOffset = 0; // .. + BYTE byBuff[4]; // 패킷 버퍼.. + int iOffset = 0; // 버퍼의 오프셋.. - CAPISocket::MP_AddByte(byBuff, iOffset, N3_NATION_SELECT); // Ŀ. - CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)eNation); // ̵ .. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_NATION_SELECT); // 커멘드. + CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)eNation); // 아이디 길이.. - s_pSocket->Send(byBuff, iOffset); // + s_pSocket->Send(byBuff, iOffset); // 보낸다 - s_pUIMgr->EnableOperationSet(false); // Ŷ ޱ ƹ ϰ Ѵ.. + s_pUIMgr->EnableOperationSet(false); // 응답 패킷을 받기 전까지 아무짓 못하게 한다.. } bool CGameProcNationSelect::ProcessPacket(DataPack * pDataPack, int & iOffset) { @@ -92,16 +92,16 @@ bool CGameProcNationSelect::ProcessPacket(DataPack * pDataPack, int & iOffset) { return true; } - int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ŀ Ľ.. - switch (iCmd) // Ŀ忡 ٶ б.. + int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 커멘드 파싱.. + switch (iCmd) // 커멘드에 다라서 분기.. { - case N3_NATION_SELECT: // ij ޽.. + case N3_NATION_SELECT: // 캐릭터 선택 메시지.. { int iNation = - CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // - 0 .. 1 - ī罺 2 - .. + CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 국가 - 0 실패.. 1 - 카루스 2 - 엘모라드.. if (0 == iNation) { - s_pPlayer->m_InfoBase.eNation = NATION_NOTSELECTED; // ʾҴ.. + s_pPlayer->m_InfoBase.eNation = NATION_NOTSELECTED; // 아직 국가를 선택하지 않았다.. } else if (1 == iNation) { s_pPlayer->m_InfoBase.eNation = NATION_KARUS; } else if (2 == iNation) { diff --git a/src/game/GameProcOption.cpp b/src/game/GameProcOption.cpp index 2fd1bfe4..5885c93d 100644 --- a/src/game/GameProcOption.cpp +++ b/src/game/GameProcOption.cpp @@ -22,9 +22,9 @@ void CGameProcOption::Release() { } void CGameProcOption::Render() { - CGameProcedure::Render(); // UI ׹ ⺻ ͵ .. + CGameProcedure::Render(); // UI 나 그밖의 기본적인 것들 렌더링.. } void CGameProcOption::Tick() { - CGameProcedure::Tick(); // Ű, 콺 Է .. + CGameProcedure::Tick(); // 키, 마우스 입력 등등.. } diff --git a/src/game/GameProcedure.cpp b/src/game/GameProcedure.cpp index b9601c88..45cc8f1e 100644 --- a/src/game/GameProcedure.cpp +++ b/src/game/GameProcedure.cpp @@ -56,16 +56,16 @@ CN3UIDebug CGameProcedure::s_UIDebug; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// -CKnightChrMgr * CGameProcedure::s_pKnightChr = NULL; // Ʈ ij.. -CN3SndObjStream * CGameProcedure::s_pSnd_BGM = NULL; // .. -CLocalInput * CGameProcedure::s_pLocalInput = NULL; // 콺 Ű Է ü .. Direct Input . -CAPISocket * CGameProcedure::s_pSocket = NULL; // ü -CAPISocket * CGameProcedure::s_pSocketSub = NULL; // ü +CKnightChrMgr * CGameProcedure::s_pKnightChr = NULL; // 나이트 캐릭터.. +CN3SndObjStream * CGameProcedure::s_pSnd_BGM = NULL; // 메인 배경음악 포인터.. +CLocalInput * CGameProcedure::s_pLocalInput = NULL; // 마우스와 키보드 입력 객체 .. Direct Input 을 썼다. +CAPISocket * CGameProcedure::s_pSocket = NULL; // 메인 소켓 객체 +CAPISocket * CGameProcedure::s_pSocketSub = NULL; // 서브 소켓 객체 CGameEng * CGameProcedure::s_pEng = NULL; // 3D Wrapper Engine CN3FXMgr * CGameProcedure::s_pFX = NULL; CUIManager * CGameProcedure::s_pUIMgr = NULL; // UI Manager -CUILoading * CGameProcedure::s_pUILoading = NULL; // ε.. +CUILoading * CGameProcedure::s_pUILoading = NULL; // 로딩바.. CUIMessageBoxManager * CGameProcedure::s_pMsgBoxMgr = NULL; // MessageBox Manager //bool CGameProcedure::s_bUseSpeedHack = false; @@ -88,19 +88,19 @@ HCURSOR CGameProcedure::s_hCursorAttack = NULL; HCURSOR CGameProcedure::s_hCursorPreRepair = NULL; HCURSOR CGameProcedure::s_hCursorNowRepair = NULL; -e_LogInClassification CGameProcedure::s_eLogInClassification; // .. MGame, Daum, KnightOnLine .... -std::string CGameProcedure::s_szAccount = ""; // ڿ.. -std::string CGameProcedure::s_szPassWord = ""; // .. -std::string CGameProcedure::s_szServer = ""; // ڿ.. +e_LogInClassification CGameProcedure::s_eLogInClassification; // 접속한 서비스.. MGame, Daum, KnightOnLine .... +std::string CGameProcedure::s_szAccount = ""; // 계정 문자열.. +std::string CGameProcedure::s_szPassWord = ""; // 계정 비번.. +std::string CGameProcedure::s_szServer = ""; // 서버 문자열.. bool CGameProcedure::m_bCursorLocked = false; HCURSOR CGameProcedure::m_hPrevGameCursor = NULL; -HWND CGameProcedure::s_hWndSubSocket = NULL; // Ͽ ڵ.. +HWND CGameProcedure::s_hWndSubSocket = NULL; // 서브 소켓용 윈도우 핸들.. int CGameProcedure::s_iChrSelectIndex = 0; bool CGameProcedure::s_bNeedReportVersionCheck = false; -bool CGameProcedure::s_bNeedReportConnectionClosed = false; // ؾ ϴ.. -bool CGameProcedure::s_bWindowed = false; // â ?? -bool CGameProcedure::s_bKeyPress = false; //Ű ui شϴ ۵ ִٸ -bool CGameProcedure::s_bKeyPressed = false; //Ű ö ui شϴ ۵ ִٸ +bool CGameProcedure::s_bNeedReportConnectionClosed = false; // 서버접속이 끊어진걸 보고해야 하는지.. +bool CGameProcedure::s_bWindowed = false; // 창모드 실행?? +bool CGameProcedure::s_bKeyPress = false; //키가 눌려졌을때 ui에서 해당하는 조작된적이 있다면 +bool CGameProcedure::s_bKeyPressed = false; //키가 올라갔을때 ui에서 해당하는 조작된적이 있다면 CGameProcedure::CGameProcedure() { m_bCursorLocked = false; @@ -155,7 +155,7 @@ void CGameProcedure::StaticMemberInit(HINSTANCE hInstance, HWND hWndMain, HWND h CN3Base::s_Options.iViewColorDepth, TRUE)) { exit(-1); } - // ⺻ 3D .. + // 게임 기본 3D 엔진 만들기.. ::SetFocus(hWndMain); // Set focus this window.. RECT rcTmp = rc; @@ -164,16 +164,16 @@ void CGameProcedure::StaticMemberInit(HINSTANCE hInstance, HWND hWndMain, HWND h CN3UIEdit::CreateEditWindow(hWndMain, rcTmp); ////////////////////////////////////////////////////////////////////////////////////////// - s_hWndSubSocket = hWndSub; // Ͽ ڵ.. + s_hWndSubSocket = hWndSub; // 서브 소켓용 윈도우 핸들.. - CGameBase::StaticMemberInit(); // Table , Ʈ, ij ʱȭ... + CGameBase::StaticMemberInit(); // Table 및 지형, 오브젝트, 캐릭터 초기화... ////////////////////////////////////////////////////////////////////////////////////////// - // Game Procedure ϰ Dz, 3D, Resource Table ε ʱȭ... + // Game Procedure 소켓과 로컬 인풋, 3D엔진, Resource Table 로딩 및 초기화... s_pSocket = new CAPISocket(); s_pSocketSub = new CAPISocket(); - // Ŀ .. + // 커서 만들기.. s_hCursorNormal = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR_NORMAL)); s_hCursorNormal1 = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR_NORMAL1)); s_hCursorClick = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR_CLICK)); @@ -189,10 +189,10 @@ void CGameProcedure::StaticMemberInit(HINSTANCE hInstance, HWND hWndMain, HWND h SetGameCursor(s_hCursorNormal); s_pLocalInput = new CLocalInput(); - s_pLocalInput->Init(hInstance, hWndMain, FALSE); // Input ʱȭ. + s_pLocalInput->Init(hInstance, hWndMain, FALSE); // Input 만 초기화. ////////////////////////////////////////////////////////////////////////////////////////// - // Sound ʱȭ.. + // Sound 초기화.. if (CN3Base::s_Options.bSndEnable) { CN3Base::s_SndMgr.Init(hWndMain); CN3Base::s_SndMgr.SetDuplicated(CN3Base::s_Options.bSndDuplicated); @@ -201,23 +201,23 @@ void CGameProcedure::StaticMemberInit(HINSTANCE hInstance, HWND hWndMain, HWND h s_pFX = new CN3FXMgr(); - __TABLE_UI_RESRC * pTblUI = s_pTbl_UI->Find(NATION_ELMORAD); // ⺻ UI Ѵ.. - __ASSERT(pTblUI, "⺻ UI ϴ."); + __TABLE_UI_RESRC * pTblUI = s_pTbl_UI->Find(NATION_ELMORAD); // 기본은 엘모라드 UI 로 한다.. + __ASSERT(pTblUI, "기본 UI 가 없습니다."); - s_pUIMgr = new CUIManager(); // ⺻ UIManager + s_pUIMgr = new CUIManager(); // 기본 UIManager s_pMsgBoxMgr = new CUIMessageBoxManager(); //MessageBox Manager - // .. + // 툴팁.. CN3UIBase::EnableTooltip(pTblUI->szToolTip); ////////////////////////////////////////////////////////////////////////////////////////// - // ν - s_pProcLogIn = new CGameProcLogIn(); // α ν - s_pProcNationSelect = new CGameProcNationSelect(); // - s_pProcCharacterSelect = new CGameProcCharacterSelect(); // ij - s_pProcCharacterCreate = new CGameProcCharacterCreate(); // ij - s_pProcMain = new CGameProcMain(); // ν - s_pProcOption = new CGameProcOption(); // ɼ ν + // 각 프로시저들 생성 + s_pProcLogIn = new CGameProcLogIn(); // 로그인 프로시져 + s_pProcNationSelect = new CGameProcNationSelect(); // 나라 선택 + s_pProcCharacterSelect = new CGameProcCharacterSelect(); // 캐릭터 선택 + s_pProcCharacterCreate = new CGameProcCharacterCreate(); // 캐릭터 만들기 + s_pProcMain = new CGameProcMain(); // 메인 게임 프로시져 + s_pProcOption = new CGameProcOption(); // 게임 옵션 프로시져 } void CGameProcedure::StaticMemberRelease() { @@ -230,38 +230,38 @@ void CGameProcedure::StaticMemberRelease() { } delete s_pSocket; - s_pSocket = NULL; // .. + s_pSocket = NULL; // 통신 끊기.. delete s_pSocketSub; - s_pSocketSub = NULL; // ֱ.. + s_pSocketSub = NULL; // 서브 소켓 없애기.. delete s_pFX; s_pFX = NULL; //////////////////////////////////////////////////////////// - // ⺻ .. + // 기본값 쓰기.. if (s_pPlayer) { - int iRun = s_pPlayer->IsRunning(); // ̵ 尡 ٴ ¿ - CGameProcedure::RegPutSetting("UserRun", &iRun, 4); // ȱ, ٱ .. + int iRun = s_pPlayer->IsRunning(); // 이동 모드가 뛰는 상태였으면 + CGameProcedure::RegPutSetting("UserRun", &iRun, 4); // 걷기, 뛰기 상태 기록.. } if (s_pEng) { e_ViewPoint eVP = s_pEng->ViewPoint(); - CGameProcedure::RegPutSetting("CameraMode", &eVP, 4); // ī޶ + CGameProcedure::RegPutSetting("CameraMode", &eVP, 4); // 카메라 상태 기록 } - // ⺻ .. + // 기본값 쓰기.. //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// - // ȭ ̱.. + // 엔딩화면 보이기.. if (s_pPlayer) { e_Nation eNation = s_pPlayer->m_InfoBase.eNation; __TABLE_UI_RESRC * pTbl = s_pTbl_UI->Find(eNation); if (pTbl) { - CUIEndingDisplay Credit; // ǥϱ.. + CUIEndingDisplay Credit; // 엔딩 표시하기.. Credit.LoadFromFile(pTbl->szEndingDisplay); Credit.Render(); } } - // ȭ ̱.. + // 엔딩화면 보이기.. //////////////////////////////////////////////////////////////////////// delete s_pKnightChr; @@ -269,7 +269,7 @@ void CGameProcedure::StaticMemberRelease() { // if ( (s_pProcMain) && (s_pProcMain->m_pUIHotKeyDlg) ) // s_pProcMain->m_pUIHotKeyDlg->CloseIconRegistry(); - // UI ġ ̱ .. + // UI 위치및 보이기 등의 정보 저장.. if (s_pProcMain) { UIPostData_Write(UI_POST_WND_CHAT, s_pProcMain->m_pUIChatDlg); UIPostData_Write(UI_POST_WND_HOTKEY, s_pProcMain->m_pUIHotKeyDlg); @@ -277,21 +277,21 @@ void CGameProcedure::StaticMemberRelease() { // UIPostData_Write(UI_POST_WND_PARTY, s_pProcMain->m_pUIPartyOrForce); } - // ν + // 각 프로시저들 delete s_pProcLogIn; - s_pProcLogIn = NULL; // α ν + s_pProcLogIn = NULL; // 로그인 프로시져 delete s_pProcNationSelect; - s_pProcNationSelect = NULL; // + s_pProcNationSelect = NULL; // 나라 선택 delete s_pProcCharacterSelect; - s_pProcCharacterSelect = NULL; // ij + s_pProcCharacterSelect = NULL; // 캐릭터 선택 delete s_pProcCharacterCreate; - s_pProcCharacterCreate = NULL; // ij + s_pProcCharacterCreate = NULL; // 캐릭터 만들기 delete s_pProcMain; - s_pProcMain = NULL; // ν + s_pProcMain = NULL; // 메인 게임 프로시져 delete s_pProcOption; - s_pProcOption = NULL; // ɼ ν + s_pProcOption = NULL; // 게임 옵션 프로시져 - // UI .. + // UI 들 날리기.. if (s_pUILoading) { delete s_pUILoading; } @@ -304,7 +304,7 @@ void CGameProcedure::StaticMemberRelease() { delete s_pLocalInput; s_pLocalInput = NULL; delete s_pEng; - s_pEng = NULL; // .!!!!! + s_pEng = NULL; // 젤 마지막에 엔진 날리기.!!!!! if (s_pGameCursor) { delete s_pGameCursor; @@ -315,7 +315,7 @@ void CGameProcedure::StaticMemberRelease() { } void CGameProcedure::Tick() { - s_pLocalInput->Tick(); // Ű 콺κ Է ޴´. + s_pLocalInput->Tick(); // 키보드와 마우스로부터 입력을 받는다. if (s_pGameCursor) { s_pGameCursor->Tick(); } @@ -333,7 +333,7 @@ void CGameProcedure::Tick() { SetGameCursor(((NATION_ELMORAD == eNation) ? s_hCursorNormal1 : s_hCursorNormal)); } if (dwMouseFlags & MOUSE_RBCLICKED) { - if (s_pPlayer->m_bAttackContinous && s_pProcActive == s_pProcMain) { // ν ̸.. + if (s_pPlayer->m_bAttackContinous && s_pProcActive == s_pProcMain) { // 메인 프로시져 이면.. SetGameCursor(s_hCursorAttack); } else { SetGameCursor(((NATION_ELMORAD == eNation) ? s_hCursorNormal1 : s_hCursorNormal)); @@ -348,18 +348,18 @@ void CGameProcedure::Tick() { s_pUIMgr->Tick(); } - // ϸ... + // 몬가 하면... // if((dwRet & UI_MOUSEPROC_CHILDDONESOMETHING) || (dwRet & UI_MOUSEPROC_DONESOMETHING)) // s_pLocalInput->MouseRemoveFlag(0xffMOUSE_LBCLICK | MOUSE_LBCLICKED | MOUSE_LBDBLCLK); - s_pUIMgr->m_bDoneSomething = false; // UI ߴ... + s_pUIMgr->m_bDoneSomething = false; // UI 에서 조작을 했다... if (dwRet != UI_MOUSEPROC_NONE) { - s_pUIMgr->m_bDoneSomething = true; // UI ߴ... + s_pUIMgr->m_bDoneSomething = true; // UI 에서 조작을 했다... } CN3Base::s_SndMgr.Tick(); // Sound Engine... - // ũ ĸ Ű.. - if (s_pLocalInput->IsKeyPress(DIK_NUMPADMINUS)) // Űе ̳ʽ Ű .. + // 스크린 캡쳐 키.. + if (s_pLocalInput->IsKeyPress(DIK_NUMPADMINUS)) // 키패드의 마이너스 키를 누르면.. { SYSTEMTIME st; ::GetLocalTime(&st); @@ -370,39 +370,39 @@ void CGameProcedure::Tick() { } ////////////////////////////////// - // Network Msg óϱ + // Network Msg 처리하기 DataPack * pDataPack = NULL; - while (s_pSocket->PktQueueSize() > 0) // Ŷ Ʈ Ŷ ֳ???? + while (s_pSocket->PktQueueSize() > 0) // 패킷 리스트에 패킷이 있냐???? { int iOffset = 0; - pDataPack = s_pSocket->PktQueueFront(); // ť ù° .. + pDataPack = s_pSocket->PktQueueFront(); // 큐의 첫번째 것을 복사.. if (false == ProcessPacket(pDataPack, iOffset)) { - // Ŷ ó Ȳ ƴϴ. + // 패킷을 처리할 상황이 아니다. int iTempOffst = 0; int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iTempOffst); CLogWriter::Write("Invalid Packet... (%d)", iCmd); } delete pDataPack; - s_pSocket->PktQueuePop(); // Ŷ ť .. + s_pSocket->PktQueuePop(); // 패킷을 큐에서 꺼냄.. } - while (s_pSocketSub->PktQueueSize() > 0) // Ŷ Ʈ Ŷ ֳ???? + while (s_pSocketSub->PktQueueSize() > 0) // 패킷 리스트에 패킷이 있냐???? { int iOffset = 0; - pDataPack = s_pSocketSub->PktQueueFront(); // ť ù° .. + pDataPack = s_pSocketSub->PktQueueFront(); // 큐의 첫번째 것을 복사.. if (false == ProcessPacket(pDataPack, iOffset)) { - break; // Ŷ ó Ȳ ƴϴ. + break; // 패킷을 처리할 상황이 아니다. } delete pDataPack; - s_pSocketSub->PktQueuePop(); // Ŷ ť .. + s_pSocketSub->PktQueuePop(); // 패킷을 큐에서 꺼냄.. } - // Network Msg óϱ + // Network Msg 처리하기 ////////////////////////////////// } void CGameProcedure::Render() { if (s_pUIMgr) { - s_pUIMgr->Render(); // UI .. + s_pUIMgr->Render(); // UI 들 렌더링.. } s_pMsgBoxMgr->Render(); @@ -412,7 +412,7 @@ void CGameProcedure::Render() { } void CGameProcedure::TickActive() { - if (s_pProcActive != s_pProcPrev) // ν ٲ.. + if (s_pProcActive != s_pProcPrev) // 프로시저가 바뀌면.. { if (s_pProcPrev) { s_pProcPrev->Release(); @@ -425,12 +425,12 @@ void CGameProcedure::TickActive() { } if (s_pProcActive) { - s_pProcActive->Tick(); // ν Tick ................................ + s_pProcActive->Tick(); // 현재 프로시저 Tick ................................ } } void CGameProcedure::RenderActive() { - // if(s_pProcActive != s_pProcPrev) // ν ٲ.. + // if(s_pProcActive != s_pProcPrev) // 프로시저가 바뀌면.. // { // if(s_pProcPrev) s_pProcPrev->Release(); // if(s_pProcActive) s_pProcActive->Init(); @@ -458,7 +458,7 @@ bool CGameProcedure::CaptureScreenAndSaveToFile(const std::string & szFN) { if (hDIB) { int nQuality = 90; - //ڴ ũ ĸĸ Ҽ ְ... + //운영자는 양질의 스크린 캡쳐를 할수 있게... if (s_pPlayer->m_InfoBase.iAuthority == AUTHORITY_MANAGER) { nQuality = 100; } @@ -537,18 +537,18 @@ void CGameProcedure::ProcActiveSet(CGameProcedure * pProc) { } if (s_pUIMgr) { - s_pUIMgr->EnableOperationSet(true); // UI Ҽ ְ Ѵ.. + s_pUIMgr->EnableOperationSet(true); // UI를 조작할수 있게 한다.. } - CGameProcedure::MessageBoxClose(-1); // MessageBox . + CGameProcedure::MessageBoxClose(-1); // MessageBox 가 떠 있으면 감춘다. - s_pProcPrev = s_pProcActive; // .. + s_pProcPrev = s_pProcActive; // 전의 것 포인터 기억.. s_pProcActive = pProc; } void CGameProcedure::ReConnect() { - s_bNeedReportConnectionClosed = false; // ؾ ϴ.. + s_bNeedReportConnectionClosed = false; // 서버접속이 끊어진걸 보고해야 하는지.. CGameProcedure::s_pSocket->ReConnect(); - s_bNeedReportConnectionClosed = true; // ؾ ϴ.. + s_bNeedReportConnectionClosed = true; // 서버접속이 끊어진걸 보고해야 하는지.. } std::string CGameProcedure::MessageBoxPost(const std::string & szMsg, const std::string & szTitle, int iStyle, @@ -640,15 +640,15 @@ void CGameProcedure::UIPostData_Read(const std::string & szKey, CN3UIBase * pUI, return; } - // 1. Ʈ ͸ .. - // 2. ͸ о´.. - // 3. ȿ ǴѴ.. + // 1. 디폴트 데이터를 만든다.. + // 2. 데이터를 읽어온다.. + // 3. 영역이 유효한지를 판단한다.. __WndInfo WI; WI.ptPosition.x = iDefaultX; WI.ptPosition.y = iDefaultY; if (false == RegGetSetting(szKey.c_str(), &WI, sizeof(__WndInfo))) { - WI.bVisible = true; // ⺻ Ͱ ̰ Ѵ.. + WI.bVisible = true; // 기본 데이터가 없으면 무조건 보이게 한다.. } RECT rc = pUI->GetRegion(); @@ -748,10 +748,10 @@ std::string CGameProcedure::GetStrRegKeySetting() { } bool CGameProcedure::ProcessPacket(DataPack * pDataPack, int & iOffset) { - int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // Ŀ Ľ.. - switch (iCmd) // Ŀ忡 ٶ б.. + int iCmd = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 커멘드 파싱.. + switch (iCmd) // 커멘드에 다라서 분기.. { - case N3_VERSION_CHECK: // ȣȭ ޴´.. + case N3_VERSION_CHECK: // 암호화도 같이 받는다.. this->MsgRecv_VersionCheck(pDataPack, iOffset); // virtual return true; @@ -759,14 +759,14 @@ bool CGameProcedure::ProcessPacket(DataPack * pDataPack, int & iOffset) { this->MsgRecv_GameServerLogIn(pDataPack, iOffset); return true; - case N3_SERVER_CHANGE: // ٲٱ ޽.. + case N3_SERVER_CHANGE: // 서버 바꾸기 메시지.. { - // ٸ ٽ Ѵ. + // 다른 존 서버로 다시 접속한다. int iLen = 0; std::string szName, szIP; - // iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // ̸ + // iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 서버 이름 // CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szName, iLen); - iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // IP + iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 서버 IP CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szIP, iLen); DWORD dwPort = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); s_pPlayer->m_InfoExt.iZoneInit = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); @@ -774,17 +774,17 @@ bool CGameProcedure::ProcessPacket(DataPack * pDataPack, int & iOffset) { int iVictoryNation = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); CGameProcedure::LoadingUIChange(iVictoryNation); - s_bNeedReportConnectionClosed = false; // ؾ ϴ.. - s_pSocket->Disconnect(); // ... - Sleep(2000); // 2 .. ó ð ش. + s_bNeedReportConnectionClosed = false; // 서버접속이 끊어진걸 보고해야 하는지.. + s_pSocket->Disconnect(); // 끊고... + Sleep(2000); // 2초 딜레이.. 서버가 처리할 시간을 준다. int iErr = s_pSocket->Connect(s_hWndBase, szIP.c_str(), dwPort); - s_bNeedReportConnectionClosed = true; // ؾ ϴ.. + s_bNeedReportConnectionClosed = true; // 서버접속이 끊어진걸 보고해야 하는지.. if (iErr) { - this->ReportServerConnectionFailed("Current Zone", iErr, true); // .. Exit. + this->ReportServerConnectionFailed("Current Zone", iErr, true); // 서버 접속 오류.. Exit. } else { - // üũ .. ȣȭ Ű ´. - // ν Character_Select αϰ GameServer_LogIn . + // 버전체크를 보내면.. 응답으로 버전과 암호화 키가 온다. + // 메인 프로시저의 경우 Character_Select 를 보내고 로그인일경우 GameServer_LogIn 을 보낸다. this->MsgSend_VersionCheck(); } } @@ -847,26 +847,26 @@ void CGameProcedure::ReportDebugStringAndSendToServer(const std::string & szDebu if (s_pSocket && s_pSocket->IsConnected()) { int iLen = szDebug.size(); - std::vector buffer(iLen + 4, 0); // .. - int iOffset = 0; // ɼ.. + std::vector buffer(iLen + 4, 0); // 버퍼.. + int iOffset = 0; // 옵셋.. s_pSocket->MP_AddByte(&buffer[0], iOffset, N3_REPORT_DEBUG_STRING); s_pSocket->MP_AddShort(&buffer[0], iOffset, iLen); s_pSocket->MP_AddString(&buffer[0], iOffset, szDebug); - s_pSocket->Send(&buffer[0], iOffset); // .. + s_pSocket->Send(&buffer[0], iOffset); // 보냄.. } } void CGameProcedure::MsgSend_GameServerLogIn() { - BYTE byBuff[128]; // Ŷ .. - int iOffset = 0; // .. + BYTE byBuff[128]; // 패킷 버퍼.. + int iOffset = 0; // 버퍼의 오프셋.. - CAPISocket::MP_AddByte(byBuff, iOffset, N3_GAME_SERVER_LOGIN); // Ŀ. - CAPISocket::MP_AddShort(byBuff, iOffset, s_szAccount.size()); // ̵ .. - CAPISocket::MP_AddString(byBuff, iOffset, s_szAccount); // ̵.. - CAPISocket::MP_AddShort(byBuff, iOffset, s_szPassWord.size()); // н - CAPISocket::MP_AddString(byBuff, iOffset, s_szPassWord); // н + CAPISocket::MP_AddByte(byBuff, iOffset, N3_GAME_SERVER_LOGIN); // 커멘드. + CAPISocket::MP_AddShort(byBuff, iOffset, s_szAccount.size()); // 아이디 길이.. + CAPISocket::MP_AddString(byBuff, iOffset, s_szAccount); // 실제 아이디.. + CAPISocket::MP_AddShort(byBuff, iOffset, s_szPassWord.size()); // 패스워드 길이 + CAPISocket::MP_AddString(byBuff, iOffset, s_szPassWord); // 실제 패스워드 - s_pSocket->Send(byBuff, iOffset); // + s_pSocket->Send(byBuff, iOffset); // 보낸다 } void CGameProcedure::MsgSend_VersionCheck() // virtual @@ -874,11 +874,11 @@ void CGameProcedure::MsgSend_VersionCheck() // virtual // Version Check int iOffset = 0; BYTE byBuffs[4]; - CAPISocket::MP_AddByte(byBuffs, iOffset, N3_VERSION_CHECK); // Ŀ. - s_pSocket->Send(byBuffs, iOffset); // + CAPISocket::MP_AddByte(byBuffs, iOffset, N3_VERSION_CHECK); // 커멘드. + s_pSocket->Send(byBuffs, iOffset); // 보낸다 #ifdef _CRYPTION - s_pSocket->m_bEnableSend = FALSE; // ..? + s_pSocket->m_bEnableSend = FALSE; // 보내기 가능..? #endif // #ifdef _CRYPTION } @@ -886,33 +886,33 @@ void CGameProcedure::MsgSend_CharacterSelect() // virtual { BYTE byBuff[64]; int iOffset = 0; - CAPISocket::MP_AddByte(byBuff, iOffset, N3_CHARACTER_SELECT); // Ŀ. - CAPISocket::MP_AddShort(byBuff, iOffset, s_szAccount.size()); // .. - CAPISocket::MP_AddString(byBuff, iOffset, s_szAccount); // ڿ.. - CAPISocket::MP_AddShort(byBuff, iOffset, s_pPlayer->IDString().size()); // ij ̵ .. - CAPISocket::MP_AddString(byBuff, iOffset, s_pPlayer->IDString()); // ij ̵ ڿ.. - CAPISocket::MP_AddByte(byBuff, iOffset, s_pPlayer->m_InfoExt.iZoneInit); // ó ƴ 0x01:ó - CAPISocket::MP_AddByte(byBuff, iOffset, s_pPlayer->m_InfoExt.iZoneCur); // ij â ij ȣ - s_pSocket->Send(byBuff, iOffset); // + CAPISocket::MP_AddByte(byBuff, iOffset, N3_CHARACTER_SELECT); // 커멘드. + CAPISocket::MP_AddShort(byBuff, iOffset, s_szAccount.size()); // 계정 길이.. + CAPISocket::MP_AddString(byBuff, iOffset, s_szAccount); // 계정 문자열.. + CAPISocket::MP_AddShort(byBuff, iOffset, s_pPlayer->IDString().size()); // 캐릭 아이디 길이.. + CAPISocket::MP_AddString(byBuff, iOffset, s_pPlayer->IDString()); // 캐릭 아이디 문자열.. + CAPISocket::MP_AddByte(byBuff, iOffset, s_pPlayer->m_InfoExt.iZoneInit); // 처음 접속인지 아닌지 0x01:처음 접속 + CAPISocket::MP_AddByte(byBuff, iOffset, s_pPlayer->m_InfoExt.iZoneCur); // 캐릭터 선택창에서의 캐릭터 존 번호 + s_pSocket->Send(byBuff, iOffset); // 보낸다 CLogWriter::Write("MsgSend_CharacterSelect - name(%s) zone(%d)", s_pPlayer->IDString().c_str(), - s_pPlayer->m_InfoExt.iZoneCur); // α.. + s_pPlayer->m_InfoExt.iZoneCur); // 디버깅 로그.. } void CGameProcedure::MsgSend_AliveCheck() { BYTE byBuff[4]; int iOffset = 0; - CAPISocket::MP_AddByte(byBuff, iOffset, N3_ALIVE_CHECK); // Ŀ. - s_pSocket->Send(byBuff, iOffset); // + CAPISocket::MP_AddByte(byBuff, iOffset, N3_ALIVE_CHECK); // 커멘드. + s_pSocket->Send(byBuff, iOffset); // 보낸다 } int CGameProcedure::MsgRecv_VersionCheck(DataPack * pDataPack, int & iOffset) // virtual { - int iVersion = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // + int iVersion = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 버전 #ifdef _CRYPTION - __int64 iPublicKey = CAPISocket::Parse_GetInt64(pDataPack->m_pData, iOffset); // ȣȭ Ű + __int64 iPublicKey = CAPISocket::Parse_GetInt64(pDataPack->m_pData, iOffset); // 암호화 공개키 DataPack::InitCrypt(iPublicKey); - s_pSocket->m_bEnableSend = TRUE; // ..? + s_pSocket->m_bEnableSend = TRUE; // 보내기 가능..? #endif // #ifdef _CRYPTION if (iVersion != CURRENT_VERSION) { @@ -937,14 +937,14 @@ int CGameProcedure::MsgRecv_VersionCheck(DataPack * pDataPack, int & iOffset) // int CGameProcedure::MsgRecv_GameServerLogIn(DataPack * pDataPack, int & iOffset) // virtual { - int iNation = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // - 0 0xff - .. + int iNation = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 국가 - 0 없음 0xff - 실패.. return iNation; } bool CGameProcedure::MsgRecv_CharacterSelect(DataPack * pDataPack, int & iOffset) // virtual { - int iResult = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 0x00 - if (1 == iResult) // .. + int iResult = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 0x00 실패 + if (1 == iResult) // 성공.. { int iZoneCur = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); float fX = (CAPISocket::Parse_GetWord(pDataPack->m_pData, iOffset)) / 10.0f; @@ -960,7 +960,7 @@ bool CGameProcedure::MsgRecv_CharacterSelect(DataPack * pDataPack, int & iOffset CLogWriter::Write("MsgRecv_CharacterSelect - name(%s) zone(%d -> %d)", s_pPlayer->m_InfoBase.szID.c_str(), iZonePrev, iZoneCur); return true; - } else // + } else // 실패 { CLogWriter::Write("MsgRecv_CharacterSelect - failed(%d)", iResult); return false; @@ -974,7 +974,7 @@ bool CGameProcedure::MsgRecv_CharacterSelect(DataPack * pDataPack, int & iOffset } void CGameProcedure::ProcessUIKeyInput(bool bEnable) { - s_bKeyPressed = false; //Ű ö ui شϴ ۵ ִٸ + s_bKeyPressed = false; //키가 올라갔을때 ui에서 해당하는 조작된적이 있다면 if (!bEnable) { if (s_bKeyPress) { @@ -1003,7 +1003,7 @@ void CGameProcedure::ProcessUIKeyInput(bool bEnable) { s_bKeyPressed |= pMsgBox->OnKeyPressed(i); } } - } else if (pUIFocus && pUIFocus->IsVisible()) // Ŀ UI ... + } else if (pUIFocus && pUIFocus->IsVisible()) // 포커싱 된 UI 가 있으면... { for (int i = 0; i < NUMDIKEYS; i++) { if (s_pLocalInput->IsKeyPress(i)) { @@ -1057,13 +1057,13 @@ void CGameProcedure::LoadingUIChange(int iVictoryNation) { s_pUILoading = NULL; // Loading Bar s_pUILoading = new CUILoading(); - __ASSERT(s_pUILoading, "εȭ "); + __ASSERT(s_pUILoading, "로딩화면 생성 실패"); if (s_pUILoading == NULL) { return; } - __TABLE_UI_RESRC * pTblUI = s_pTbl_UI->Find(NATION_ELMORAD); // ⺻ UI Ѵ.. - __ASSERT(pTblUI, "⺻ UI ϴ."); + __TABLE_UI_RESRC * pTblUI = s_pTbl_UI->Find(NATION_ELMORAD); // 기본은 엘모라드 UI 로 한다.. + __ASSERT(pTblUI, "기본 UI 가 없습니다."); if (pTblUI == NULL) { return; } @@ -1084,5 +1084,5 @@ void CGameProcedure::LoadingUIChange(int iVictoryNation) { } TRACE("Loading UIF : %s\n", szLoading.c_str()); - s_pUILoading->LoadFromFile(szLoading); // ⺻ ε .. + s_pUILoading->LoadFromFile(szLoading); // 기본적인 로딩 바 만들기.. } diff --git a/src/game/GameProcedure.h b/src/game/GameProcedure.h index 8b5a6fcb..06e2907b 100644 --- a/src/game/GameProcedure.h +++ b/src/game/GameProcedure.h @@ -48,16 +48,16 @@ class DataPack; class CGameProcedure : public CGameBase { public: - static class CKnightChrMgr * s_pKnightChr; // Ʈ ij.. - static class CN3SndObjStream * s_pSnd_BGM; // .. - static class CLocalInput * s_pLocalInput; // 콺 Ű Է ü .. Direct Input . - static class CAPISocket * s_pSocket; // ü - static class CAPISocket * s_pSocketSub; // ü.. + static class CKnightChrMgr * s_pKnightChr; // 나이트 캐릭터.. + static class CN3SndObjStream * s_pSnd_BGM; // 메인 배경음악 포인터.. + static class CLocalInput * s_pLocalInput; // 마우스와 키보드 입력 객체 .. Direct Input 을 썼다. + static class CAPISocket * s_pSocket; // 메인 소켓 객체 + static class CAPISocket * s_pSocketSub; // 서브 소켓 객체.. static class CGameEng * s_pEng; // 3D Wrapper Engine static class CN3FXMgr * s_pFX; static class CUIManager * s_pUIMgr; // UI Manager - static class CUILoading * s_pUILoading; // ε.. + static class CUILoading * s_pUILoading; // 로딩바.. static class CUIMessageBoxManager * s_pMsgBoxMgr; // MessageBox Manager static class CGameProcLogIn * s_pProcLogIn; @@ -80,21 +80,21 @@ class CGameProcedure : public CGameBase { static HCURSOR s_hCursorPreRepair; static HCURSOR s_hCursorNowRepair; - static e_LogInClassification s_eLogInClassification; // .. MGame, Daum, KnightOnLine .... - static std::string s_szAccount; // ڿ.. - static std::string s_szPassWord; // .. - static std::string s_szServer; // ̸ ڿ.. - static int s_iChrSelectIndex; // ̰ ° ij...?? + static e_LogInClassification s_eLogInClassification; // 접속한 서비스.. MGame, Daum, KnightOnLine .... + static std::string s_szAccount; // 계정 문자열.. + static std::string s_szPassWord; // 계정 비번.. + static std::string s_szServer; // 서버이름 문자열.. + static int s_iChrSelectIndex; // 이계정의 몇번째 캐릭인지...?? static bool m_bCursorLocked; static HCURSOR m_hPrevGameCursor; - static HWND s_hWndSubSocket; // Ͽ ڵ.. + static HWND s_hWndSubSocket; // 서브 소켓용 윈도우 핸들.. static bool s_bNeedReportVersionCheck; - static bool s_bNeedReportConnectionClosed; // ؾ ϴ.. - static bool s_bWindowed; // â ?? - static bool s_bKeyPress; //Ű ui شϴ ۵ ִٸ - static bool s_bKeyPressed; //Ű ö ui شϴ ۵ ִٸ + static bool s_bNeedReportConnectionClosed; // 서버접속이 끊어진걸 보고해야 하는지.. + static bool s_bWindowed; // 창모드 실행?? + static bool s_bKeyPress; //키가 눌려졌을때 ui에서 해당하는 조작된적이 있다면 + static bool s_bKeyPressed; //키가 올라갔을때 ui에서 해당하는 조작된적이 있다면 #if _DEBUG static class CN3UIDebug s_UIDebug; @@ -113,8 +113,8 @@ class CGameProcedure : public CGameBase { static void ReportServerConnectionClosed(bool bNeedQuitGame); static void ReportDebugStringAndSendToServer(const std::string & szDebug); - virtual int MsgRecv_VersionCheck(DataPack * pDataPack, int & iOffset); // ȣȭ Ű ޴´.. - virtual int MsgRecv_GameServerLogIn(DataPack * pDataPack, int & iOffset); // virtual - ȣ Ѵ. + virtual int MsgRecv_VersionCheck(DataPack * pDataPack, int & iOffset); // 암호화 키도 같이 받는다.. + virtual int MsgRecv_GameServerLogIn(DataPack * pDataPack, int & iOffset); // virtual - 국가번호를 리턴한다. virtual bool MsgRecv_CharacterSelect(DataPack * pDataPack, int & iOffset); static void MsgSend_GameServerLogIn(); @@ -122,9 +122,9 @@ class CGameProcedure : public CGameBase { virtual void MsgSend_CharacterSelect(); void MsgSend_AliveCheck(); - virtual void Release(); // ҽ Ǯֱ.. - virtual void Init(); // ʿ ҵ ʱȭ ε - virtual void Tick(); // ν ε Ѵ. 0 ̸ ״ + virtual void Release(); // 리소스 풀어주기.. + virtual void Init(); // 필요한 요소들을 초기화 및 로딩 + virtual void Tick(); // 프로시져 인덱스를 리턴한다. 0 이면 그대로 진행 virtual void Render(); virtual void ProcessUIKeyInput(bool bEnable = true); diff --git a/src/game/GrassBoard.cpp b/src/game/GrassBoard.cpp index f5655dde..bca4956c 100644 --- a/src/game/GrassBoard.cpp +++ b/src/game/GrassBoard.cpp @@ -54,10 +54,10 @@ void CGrassBoard::ReCalcMatrix() { } void CGrassBoard::Tick(CN3Terrain * pTerrain) { - // ȸ Ų.. + // 회전 시킨다.. static __Vector3 vBakCam; if (vBakCam == s_CameraData.vEye) { - return; // ī޶ ʿ + return; // 카메라 움직이지 않으면 계산 필요없음 } vBakCam = s_CameraData.vEye; @@ -67,14 +67,14 @@ void CGrassBoard::Tick(CN3Terrain * pTerrain) { for (int i = 0; i < m_ucTexNum; ++i) { pGrass = &m_sGrassInfo[i]; - if (pGrass->vPos.y == 0.0f) { // ̰ + if (pGrass->vPos.y == 0.0f) { // 높이값 pGrass->vPos.y = pTerrain->GetHeight(pGrass->vPos.x, pGrass->vPos.z); } - // ī޶ + // 카메라와의 방향백터 vDir = s_CameraData.vEye - pGrass->vPos; - // ī޶ ư + // 카메라 방향으로 방향을 튼다 if (vDir.x > 0.0f) { pGrass->mtxWorld.RotationY(-atanf(vDir.z / vDir.x) - (D3DX_PI * 0.5f)); } else { @@ -82,7 +82,7 @@ void CGrassBoard::Tick(CN3Terrain * pTerrain) { } pGrass->mtxWorld.PosSet(m_sGrassInfo[i].vPos); - // ī޶ Ÿ ĸ + // 카메라와의 거리에 따라 알파먹임 dwAlpha = SetBrightLevel(vDir.Magnitude()); if (dwAlpha != 0x00000000) { pGrass->dwAlpColor = dwAlpha; @@ -92,7 +92,7 @@ void CGrassBoard::Tick(CN3Terrain * pTerrain) { void CGrassBoard::Render(CN3Texture ** ppTex) { if (m_bCamOut == TRUE) { - return; // ī޶  + return; // 카메라 범위 벋어나 찍지 않음 } static DWORD dwColorop, dwColorA1, dwColorA2; @@ -157,9 +157,9 @@ void CGrassBoard::LoadFromFile(int iTexIndex, unsigned char ucTexOrgIndex, __Vec } DWORD CGrassBoard::SetBrightLevel(float Level) { - static float fLevelbak; // ī޶ Ÿ Ͽ İ ѱ- Ÿ + static float fLevelbak; // 카메라와의 거리를 백업하여 같을시 알파계산을 넘김-예전 데이타 간직 if (fLevelbak == Level) { - return 0x00000000; // ī޶ Ÿ ٸ ʿ䰡 + return 0x00000000; // 카메라와의 거리가 같다면 계산할 필요가 없다 } fLevelbak = Level; @@ -167,26 +167,26 @@ DWORD CGrassBoard::SetBrightLevel(float Level) { return 0x00ffffff; } if (Level > m_fBrightmin + m_fBrightmax) { - return 0x00ffffff; // Ÿ ̻ + return 0x00ffffff; // 일정거리 이상은 보이지 않음 } DWORD Color = 0x00ffffff; - if (Level > m_fBrightmin) // Ÿŭ + if (Level > m_fBrightmin) // 일정거리내만큼 보임 { float brightper = (Level - m_fBrightmin) / m_fBrightmax; DWORD alphaColor = 255 - 255 * brightper; Color = (alphaColor << 24) | 0x00ffffff; } else { - Color = 0xffffffff; // Ÿ + Color = 0xffffffff; // 일정거리안은 완전히 보여줌 } return Color; } void CGrassBoard::SetInfo(__Vector3 vBoardPosion, unsigned short usData) { - m_vCenterPo.Set(vBoardPosion.x + 2.0f, vBoardPosion.y, vBoardPosion.z + 2.0f); // ߰ġ - m_ucTexIndex = (unsigned char)((usData & 0xff00) >> 8); // Ǯ ε - m_ucTexNum = (unsigned char)(usData & 0x00ff); // Ǯ + m_vCenterPo.Set(vBoardPosion.x + 2.0f, vBoardPosion.y, vBoardPosion.z + 2.0f); // 지도에서의 중간위치기억 + m_ucTexIndex = (unsigned char)((usData & 0xff00) >> 8); // 풀의 인덱스 + m_ucTexNum = (unsigned char)(usData & 0x00ff); // 풀의 갯수 if (m_ucTexNum > 20) { m_ucTexNum = 20; @@ -212,7 +212,7 @@ void CGrassBoard::SetInfo(__Vector3 vBoardPosion, unsigned short usData) { } mRand = rand(); - pGrass->vPos.z = (mRand % 40) / 10.000 + vBoardPosion.z; // + pGrass->vPos.z = (mRand % 40) / 10.000 + vBoardPosion.z; // 랜더값를 좀더 벌리기 위해 pGrass->vPos.y = 0.0f; } } diff --git a/src/game/GrassBoard.h b/src/game/GrassBoard.h index b28fbe21..783270ff 100644 --- a/src/game/GrassBoard.h +++ b/src/game/GrassBoard.h @@ -17,16 +17,16 @@ class CGrassBoard : public CN3Transform { protected: typedef struct Grass_Info { __Matrix44 mtxWorld; - __Vector3 vPos; // Ǯ ġ() - DWORD dwAlpColor; // Ǯ - int iTexIndex; // Ǯ ε + __Vector3 vPos; // 풀의 위치(지도상의) + DWORD dwAlpColor; // 풀의 알파 + int iTexIndex; // 풀의 인덱스 } Grass_Info; // __VertexXyzColorT1 m_vRects[4]; Grass_Info m_sGrassInfo[20]; int m_nTexIndex; - unsigned char m_ucTexIndex; // ׸ε - unsigned char m_ucTexNum; // Ǯ + unsigned char m_ucTexIndex; // 그림인덱스 + unsigned char m_ucTexNum; // 풀의 갯수 // float m_fLeftPo; // float m_fTopPo; @@ -38,9 +38,9 @@ class CGrassBoard : public CN3Transform { float m_fBrightmin; // unit full bright lengs float m_fBrightmax; // unit shadow lengs - BOOL m_bCamOut; // ī޶  ʿ (TRUE) + BOOL m_bCamOut; // 카메라의 범위를 벋어나 랜더 할 필요 없음(TRUE) - BOOL m_bGroundInfo; // Ǯ ׸ ִ Ȯ + BOOL m_bGroundInfo; // 현재 셀이 풀을 그릴수 있는지 확인 public: // void TexSelectNum(int Texindex,unsigned char TexOrgIndex) {m_nTexIndex = Texindex, m_usTexIndex = TexOrgIndex;} diff --git a/src/game/GrassMng.cpp b/src/game/GrassMng.cpp index 475bdf2b..7500d706 100644 --- a/src/game/GrassMng.cpp +++ b/src/game/GrassMng.cpp @@ -25,9 +25,9 @@ CGrassMng::CGrassMng() { } CGrassMng::~CGrassMng() { - CLogWriter::Write("CGrassMng::~CGrassMng -> Ҹ"); // TmpLog1122 + CLogWriter::Write("CGrassMng::~CGrassMng -> 소멸자"); // TmpLog1122 Release(); - CLogWriter::Write("CGrassMng::~CGrassMng -> Ҹ finish"); // TmpLog1122 + CLogWriter::Write("CGrassMng::~CGrassMng -> 소멸자 finish"); // TmpLog1122 } void CGrassMng::Init(__Vector3 CamPo) { @@ -44,7 +44,7 @@ void CGrassMng::Tick(CGameProcedure * pProc) { return; } - __Vector3 vCamPos = pProc->s_pEng->s_CameraData.vEye; // ī޶ ġ + __Vector3 vCamPos = pProc->s_pEng->s_CameraData.vEye; // 현재 카메라의 위치 ChkTileRange(vCamPos.x, vCamPos.z); @@ -54,7 +54,7 @@ void CGrassMng::Tick(CGameProcedure * pProc) { for (int j = 0; j < GRASS_TILENUM; ++j, ++pGrassBoard) { pGrassBoard->ScaleSet(1.5f, 1.5f, 1.5f); - // ī޶ ̸ ʴ´. + // 카메라 밖이면 랜더를 하지 않는다. vCamPos = pGrassBoard->GetPo(); IsCamOut = pProc->s_pEng->s_CameraData.IsOutOfFrustum(vCamPos, 3); if (IsCamOut == TRUE) { @@ -122,9 +122,9 @@ void CGrassMng::Tick(CGameProcedure * pProc) { return; } - // (Ǯ ġ Ÿ ´) - unsigned char cGroundInfo = s_pTerrain->GetGrassAttr(((WORD)m_pCount[i].x)/TILE_SIZE, ((WORD)m_pCount[i].z)/TILE_SIZE); // Ÿ - if(cGroundInfo==0) // Ǯ Ѹ (,) ƴ + // 지형정보(풀이 위치한 타일의 지형정보를 얻는다) + unsigned char cGroundInfo = s_pTerrain->GetGrassAttr(((WORD)m_pCount[i].x)/TILE_SIZE, ((WORD)m_pCount[i].z)/TILE_SIZE); // 현재 타일의 정보 + if(cGroundInfo==0) // 풀을 뿌리는 셀(영역,지역) 아님 { pGrass->m_bCamOut = TRUE; continue; @@ -132,13 +132,13 @@ void CGrassMng::Tick(CGameProcedure * pProc) { GrassIndex |= cGroundInfo; - m_pCount[i].y = s_pTerrain->GetHeight(m_pCount[i].x, m_pCount[i].z); // + m_pCount[i].y = s_pTerrain->GetHeight(m_pCount[i].x, m_pCount[i].z); // 높이 설정 pGrass->ScaleSet(1.5f, 1.5f, 1.5f); vPivot.Set(m_pCount[i].x,m_pCount[i].y,m_pCount[i].z); BOOL IsCamOut; - // ī޶ ̸ ʴ´. + // 카메라 밖이면 랜더를 하지 않는다. IsCamOut = pProc->s_pEng->s_CameraData.IsOutOfFrustum(vPivot,1); if(IsCamOut==TRUE) { @@ -146,18 +146,18 @@ void CGrassMng::Tick(CGameProcedure * pProc) { continue; } - // Ÿ Ͽ ε巴 ̰ Ѵ. + // 거리를 계산하여 부드럽게 보이게 한다. __Vector3 leng = vCamPos - m_pCount[i]; float lengs = leng.Magnitude(); - IsCamOut = pGrass->SetBrightLevel(lengs); // Ÿ , ϰԲ ڵ - if(IsCamOut == TRUE) // Ÿ ָ Ѵ. + IsCamOut = pGrass->SetBrightLevel(lengs); // 거리간 알파, 랜더하게끔 자동 세팅 + if(IsCamOut == TRUE) // 거리가 멀면 랜더를 안한다. { pGrass->m_bCamOut = TRUE; continue; } - pGrass->PosSet(vPivot); // ġ Է - pGrass->Tick(-1); // ī޶ ġ ° ȯ + pGrass->PosSet(vPivot); // 위치 입력 + pGrass->Tick(-1); // 카메라의 위치에 맞게 변환 if(pGrass->ThisTexIsHave(cGroundInfo) == false) { int nGrassNum; @@ -165,10 +165,10 @@ void CGrassMng::Tick(CGameProcedure * pProc) { FindGrassIndex(cGroundInfo,nGrassNum,uCGrassMngIndex); pGrass->TexSelectNum(nGrassNum,uCGrassMngIndex); } - pGrass->m_bCamOut = FALSE; // ȭ鿡 ѷ() + pGrass->m_bCamOut = FALSE; // 화면에 뿌려줌(랜더) } - // ٸ Ǯ ٽ Ǯ ä + // 만약 다른 풀의 종류에 변동이 생겼을 경우 모두 지우고 다시 풀로 채운다 if(m_ucDrawIndex!=GrassIndex) { m_ucDrawIndex = GrassIndex; @@ -185,7 +185,7 @@ void CGrassMng::FindGrassIndex(unsigned char GrassIndex, int & nFineGrass, unsig FindGrassIndex(GrassIndex, InputGrass, InputGrassOrg, GrassInputCount); - if (GrassInputCount > 0) // Ǯ 2 ̸̻ Ѵ + if (GrassInputCount > 0) // 만약 풀이 2개 이상이면 랜덤으로 구한다 { nFineGrass = (int)(rand() % GrassInputCount); } @@ -212,13 +212,13 @@ void CGrassMng::Render() { CN3Base::s_lpD3DDev->GetTextureStageState(0, D3DTSS_ALPHAARG1, &dwAlphaArg1); CN3Base::s_lpD3DDev->GetTextureStageState(0, D3DTSS_ALPHAARG1, &dwAlphaArg2); - // render state + // render state 세팅 CN3Base::s_lpD3DDev->SetRenderState(D3DRS_LIGHTING, TRUE); CN3Base::s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); CN3Base::s_lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); CN3Base::s_lpD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - // texture state (alpha) + // texture state 세팅 (alpha) CN3Base::s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); CN3Base::s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); CN3Base::s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); @@ -370,7 +370,7 @@ void CGrassMng::ChkThisZoneUseGrass(int nGrassUseOrder) { bool CGrassMng::ChangeZone() { Release(); - // ̹ ׸ ִ + // 이번 존에서 쓰일 그림의 최대 갯수 if (!ACT_WORLD->GetTerrainRef()) { return false; } @@ -381,7 +381,7 @@ bool CGrassMng::ChangeZone() { return false; } - // ׸ ū ̸ ű + // 그림의 수많큰 이름을 옮기고 나머지 지움 for (int i = 0; i < m_iFileMaxNum; i++) { #ifdef _DEBUG if (ACT_WORLD->GetTerrainRef()) { @@ -399,11 +399,11 @@ bool CGrassMng::ChangeZone() { m_txTexture[i] = NULL; } - // ű Ǯ ε + // 지금 옮긴 지형에서 쓰일 풀의 인덱스를 가짐 __Vector3 vCamPos = CGameBase::s_CameraData.vEye; this->ChkTileRange(vCamPos.x, vCamPos.z); - // Tick,Render + // Tick,Render를 허락 m_bChkZoneChange = true; return true; @@ -416,27 +416,27 @@ inline bool CGrassMng::IsInRect(float fPoX, float fPoY, float * fRange) { void CGrassMng::ChkTileRange(float fCamX, float fCamZ) { if (IsInRect(fCamX, fCamZ, m_fChkRange) == true) { - return; // ĥ + return; // 고칠게 없어 } - // ij ٷ ĭ + // 캐릭터의 바로 한칸의 영역 float fCompRange[4]; fCompRange[GRASS_LEFT] = (fCamX / TILE_SIZE) * TILE_SIZE; fCompRange[GRASS_RIGHT] = fCompRange[GRASS_LEFT] + TILE_SIZE; fCompRange[GRASS_TOP] = (fCamZ / TILE_SIZE) * TILE_SIZE; fCompRange[GRASS_BOTTOM] = fCompRange[GRASS_TOP] + TILE_SIZE; - // ü + // 전체 구역 float fLargeRange[4]; fLargeRange[GRASS_LEFT] = fCompRange[GRASS_LEFT] - 5 * TILE_SIZE; fLargeRange[GRASS_RIGHT] = fCompRange[GRASS_RIGHT] + 5 * TILE_SIZE; fLargeRange[GRASS_TOP] = fCompRange[GRASS_TOP] - 5 * TILE_SIZE; fLargeRange[GRASS_BOTTOM] = fCompRange[GRASS_BOTTOM] + 5 * TILE_SIZE; - // ο Ÿ ´ + // 새로운 타일의 영역을 얻어온다 WORD FineTile[GRASS_TILENUM * 2]; int iFineTile = 0; - FineNewTile(FineTile, iFineTile, fCompRange, fLargeRange); // ٲپ Ÿ ã + FineNewTile(FineTile, iFineTile, fCompRange, fLargeRange); // 바꾸어야할 타일 찾음 int iTileCount = 0; __Vector3 vCenter; @@ -448,19 +448,19 @@ void CGrassMng::ChkTileRange(float fCamX, float fCamZ) { vCenter = pBoard->GetPo(); - //  ã + // 영역 벗어난 구역에 찾은구역 넣음 if (IsInRect(vCenter.x, vCenter.z, fLargeRange) == false) { if (!ACT_WORLD->GetTerrainRef()) { continue; } usGrassInfo = ACT_WORLD->GetTerrainRef()->GetGrassAttr(((WORD)FineTile[iTileCount]) / TILE_SIZE, ((WORD)FineTile[iTileCount + 1]) / - TILE_SIZE); // Ÿ + TILE_SIZE); // 현재 타일의 정보 - vCenter.Set(FineTile[iTileCount], 0.0f, FineTile[iTileCount + 1]); // ǥ + vCenter.Set(FineTile[iTileCount], 0.0f, FineTile[iTileCount + 1]); // 왼쪽위의 좌표 vCenter.y = ACT_WORLD->GetTerrainRef()->GetHeight(vCenter.x, vCenter.z); - pBoard->SetInfo(vCenter, usGrassInfo); // Ÿ Ǯ + pBoard->SetInfo(vCenter, usGrassInfo); // 타일의 정보를 바탕으로 풀 갱신 iTileCount += 2; } diff --git a/src/game/GrassMng.h b/src/game/GrassMng.h index 6c1d0740..ceea2cba 100644 --- a/src/game/GrassMng.h +++ b/src/game/GrassMng.h @@ -21,9 +21,9 @@ class CN3Terrain; class CGrassMng : public CGameBase { protected: // std::list m_Grasses; - CGrassBoard m_pGrasses[GRASS_TILENUM][GRASS_TILENUM]; // Ǯ ѷ + CGrassBoard m_pGrasses[GRASS_TILENUM][GRASS_TILENUM]; // 풀 뿌려지는 영역 // __Vector3 m_pCount[GRASS_MAX]; - float m_fChkRange[4]; // ī޶ ġ˻ + float m_fChkRange[4]; // 카메라와의 위치검색용 // __Vector3 m_vCamPo; bool m_bChkZoneChange; @@ -31,7 +31,7 @@ class CGrassMng : public CGameBase { CN3Texture * m_txTexture[8]; #ifdef _DEBUG - char m_strFileName[8][_MAX_PATH]; // ߿ Ÿ ׸ ̸ ޴´ + char m_strFileName[8][_MAX_PATH]; // 나중에 디버거를 위해 그림의 이름을 백업 받는다 #endif int m_iFileMaxNum; @@ -45,7 +45,7 @@ class CGrassMng : public CGameBase { void FindGrassIndex(const unsigned char uCGrassMngOrder, int * pnInputGrass, unsigned char * GrassIndex, int & nGrassTotNum); - void ChkTileRange(float fCamX, float fCamZ); // Ÿϰ äũ,tick + void ChkTileRange(float fCamX, float fCamZ); // 타일간움직임 채크,tick void FineNewTile(WORD * Tile, int & iCount, float * ChkRange, float * LargeRange); public: @@ -56,7 +56,7 @@ class CGrassMng : public CGameBase { bool ChangeZone(); - bool IsInRect(float fPoX, float fPoY, float * fRange); // ִ Ȯ + bool IsInRect(float fPoX, float fPoY, float * fRange); // 영역내에 있는지 확인 public: CGrassMng(); virtual ~CGrassMng(); diff --git a/src/game/ItemRepairMgr.cpp b/src/game/ItemRepairMgr.cpp index 18a9e11a..383732ef 100644 --- a/src/game/ItemRepairMgr.cpp +++ b/src/game/ItemRepairMgr.cpp @@ -49,7 +49,7 @@ void CItemRepairMgr::Tick() { POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); - // ġ ؼ + // 위치를 구해서 int iArm = 0x00; int iOrder = -1; __IconItemSkill * spItem = NULL; @@ -81,12 +81,12 @@ void CItemRepairMgr::Tick() { } } - // .. + // 아이콘 위에 있으면.. int iRepairGold = 0; if (spItem) { iRepairGold = CalcRepairGold(spItem); - // ǥ.. + // 수리 가격 툴팁 표시.. if (pDlg) { pDlg->m_bBRender = true; pDlg->m_iBxpos = ptCur.x; @@ -95,22 +95,22 @@ void CItemRepairMgr::Tick() { pDlg->m_iBRequiredGold = iRepairGold; } - // θ.. + // 내가 가진 돈 보다 수리 비용이 비싸면.. if (iRepairGold > s_pPlayer->m_InfoExt.iGold) { - // ǥ.. + // 빨갛게 표시.. if (pDlg) { pDlg->m_bBHaveEnough = false; } } else { - //̸ .. + //아이면 원래 색깔.. if (pDlg) { pDlg->m_bBHaveEnough = true; } } } - DWORD dwMouseFlags = CGameProcedure::s_pLocalInput->MouseGetFlag(); // 콺 ư ÷ - LocalInput.h - if (dwMouseFlags & MOUSE_LBCLICK) // ư .. + DWORD dwMouseFlags = CGameProcedure::s_pLocalInput->MouseGetFlag(); // 마우스 버튼 플래그 - LocalInput.h 참조 + if (dwMouseFlags & MOUSE_LBCLICK) // 왼쪽 버튼을 누르면.. { m_pspItemBack = spItem; m_iArm = iArm; @@ -118,28 +118,28 @@ void CItemRepairMgr::Tick() { } else if (dwMouseFlags & MOUSE_LBCLICKED) { if (m_pspItemBack && spItem && (m_pspItemBack == spItem)) { // Send To Server.. - if (iRepairGold > 0) // .. + if (iRepairGold > 0) // 수리 가격이 있으면.. { - // θ.. + // 내가 가진 돈 보다 수리 비용이 비싸면.. if (iRepairGold > s_pPlayer->m_InfoExt.iGold) { - // ʰ ޽ ǥ.. + // 서버에게 보내지 않고 메시지 표시.. std::string szMsg; ::_LoadStringFromResource(IDS_REPAIR_LACK_GOLD, szMsg); CGameProcedure::s_pProcMain->MsgOutput(szMsg, 0xffff00ff); } else { - BYTE byBuff[8]; // Ŷ .. - int iOffset = 0; // Ŷ .. + BYTE byBuff[8]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. - CAPISocket::MP_AddByte(byBuff, iOffset, N3_ITEM_REPAIR_REQUEST); // ŸƮ Ŷ Ŀ.. - CAPISocket::MP_AddByte(byBuff, iOffset, iArm); // ̵ Ŷ ֱ.. - CAPISocket::MP_AddByte(byBuff, iOffset, iOrder); // ̵ Ŷ ֱ.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_ITEM_REPAIR_REQUEST); // 게임 스타트 패킷 커멘드.. + CAPISocket::MP_AddByte(byBuff, iOffset, iArm); // 아이디 길이 패킷에 넣기.. + CAPISocket::MP_AddByte(byBuff, iOffset, iOrder); // 아이디 길이 패킷에 넣기.. CAPISocket::MP_AddDword(byBuff, iOffset, spItem->pItemBasic->dwID + - spItem->pItemExt->dwID); // ̵ ڿ Ŷ ֱ.. + spItem->pItemExt->dwID); // 아이디 문자열 패킷에 넣기.. CGameProcedure::s_pSocket->Send(byBuff, iOffset); - // ٸ.. + // 응답을 기다림.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = true; // Change To Cursor.. @@ -160,23 +160,23 @@ void CItemRepairMgr::ReceiveResultFromServer(int iResult, int64_t iUserGold) { return; } - // ̸ npc Durability ִ밪.. + // 성공이면 npc영역의 Durability를 최대값으로.. if (iResult == 0x01) { m_pspItemBack->iDurability = m_pspItemBack->pItemBasic->siMaxDurability + m_pspItemBack->pItemExt->siMaxDurability; switch (m_iArm) { - case 0x01: // ϰ ִ + case 0x01: // 장착하고 있는 아이템 pInv->m_pMySlot[m_iiOrder] = m_pspItemBack; - s_pPlayer->DurabilitySet((e_ItemSlot)m_iiOrder, m_pspItemBack->iDurability); // ش.. + s_pPlayer->DurabilitySet((e_ItemSlot)m_iiOrder, m_pspItemBack->iDurability); // 내구력을 복구 해준다.. break; - case 0x02: // κ丮 ִ .. + case 0x02: // 인벤토리에 있는 아이템.. pInv->m_pMyInvWnd[m_iiOrder] = m_pspItemBack; break; } - // ° UISTYLE_DURABILITY_EXHAUST ̸.. + // 아이콘 상태가 UISTYLE_DURABILITY_EXHAUST 이면.. m_pspItemBack->pUIIcon->SetStyle(m_pspItemBack->pUIIcon->GetStyle() & (~UISTYLE_DURABILITY_EXHAUST)); if (pDlg) { @@ -185,10 +185,10 @@ void CItemRepairMgr::ReceiveResultFromServer(int iResult, int64_t iUserGold) { pInv->PlayRepairSound(); } - // Ʈ.. + // 돈 업데이트.. UpdateUserTotalGold(iUserGold); - // ٸ .. + // 응답 기다림 해제.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; // Change To Cursor.. @@ -196,7 +196,7 @@ void CItemRepairMgr::ReceiveResultFromServer(int iResult, int64_t iUserGold) { } void CItemRepairMgr::UpdateUserTotalGold(int64_t iGold) { - // Ʈ.. + // 돈 업데이트.. s_pPlayer->m_InfoExt.iGold = iGold; CN3UIString * pStatic = (CN3UIString *)CGameProcedure::s_pProcMain->m_pUIInventory->GetChildByID("text_gold"); __ASSERT(pStatic, "NULL UI Component!!"); diff --git a/src/game/KnightOnLine.vcxproj.filters b/src/game/KnightOnLine.vcxproj.filters index 95b7906a..1668d172 100644 --- a/src/game/KnightOnLine.vcxproj.filters +++ b/src/game/KnightOnLine.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/game/KnightOnLine.vcxproj.user b/src/game/KnightOnLine.vcxproj.user index 5cbd9fcb..fc398488 100644 --- a/src/game/KnightOnLine.vcxproj.user +++ b/src/game/KnightOnLine.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\assets\game diff --git a/src/game/LightMgr.cpp b/src/game/LightMgr.cpp index 4315f067..cb7166cc 100644 --- a/src/game/LightMgr.cpp +++ b/src/game/LightMgr.cpp @@ -49,29 +49,29 @@ void CLightMgr::Release() { ///////////////////////////////////////////// /////////////////////////////////////////////////////////////// - // ⺻ Ʈ + // 기본 라이트 세팅 D3DCOLORVALUE crLgt; crLgt.a = 0.0f, crLgt.r = crLgt.g = crLgt.b = 0.8f; - CN3Light * pLightGlobal = new CN3Light(); // ü Ʈ.. + CN3Light * pLightGlobal = new CN3Light(); // 전체를 비출 라이트.. pLightGlobal->m_Data.InitDirection(LGT_DEFAULT0, __Vector3(0, -1, 0), crLgt); m_pActiveLight[LGT_DEFAULT0] = pLightGlobal; crLgt.a = 0.0f, crLgt.r = crLgt.g = crLgt.b = 0.5f; - CN3Light * pLightGlobal2 = new CN3Light(); // ݴ ü Ʈ.. + CN3Light * pLightGlobal2 = new CN3Light(); // 반대 편에서 전체를 비출 라이트.. pLightGlobal2->m_Data.InitDirection(LGT_DEFAULT1, __Vector3(0, 1, 0), crLgt); m_pActiveLight[LGT_DEFAULT1] = pLightGlobal2; crLgt.a = 0.0f, crLgt.r = crLgt.g = crLgt.b = 0.3f; - CN3Light * pLight = new CN3Light(); // ī޶ پ ٴѴ... + CN3Light * pLight = new CN3Light(); // 카메라와 붙어 다닌다... pLight->m_Data.InitPoint(LGT_DEFAULT2, __Vector3(0, 0, 0), crLgt, 32.0f); m_pActiveLight[LGT_DEFAULT2] = pLight; - // ⺻ Ʈ + // 기본 라이트 세팅 /////////////////////////////////////////////////////////////// } void CLightMgr::Tick() { - //Ÿ ߷... + //거리에 따라 추려내고... int NumSlotEmpty = 0; float LimitLeft, LimitRight, LimitUp, LimitDown; LimitLeft = CN3Base::s_CameraData.vEye.x - LIGHT_VALIDRANGE; @@ -119,7 +119,7 @@ void CLightMgr::Tick() { } } - //tick.. + //tick돌려라.. for (int i = 0; i < LGT_MAX; i++) { if (m_pActiveLight[i]) { m_pActiveLight[i]->Tick(); diff --git a/src/game/LocalInput.cpp b/src/game/LocalInput.cpp index b71df0fc..70ab1582 100644 --- a/src/game/LocalInput.cpp +++ b/src/game/LocalInput.cpp @@ -23,24 +23,24 @@ CLocalInput::CLocalInput(void) { // m_bKeyboard = FALSE; m_nMouseFlag = 0; - m_nMouseFlagOld = 0; // 콺 ư ÷ - m_dwTickLBDown = 0; // 콺 ư Ŭ - m_dwTickRBDown = 0; // 콺 ư Ŭ + m_nMouseFlagOld = 0; // 마우스 버튼 눌림 플래그 + m_dwTickLBDown = 0; // 마우스 왼쪽 버튼 더블 클릭 감지용 + m_dwTickRBDown = 0; // 마우스 오른쪽 버튼 더블 클릭 감지용 - m_ptCurMouse.x = m_ptCurMouse.y = 0; // 콺 - m_ptOldMouse.x = m_ptOldMouse.y = 0; // 콺 + m_ptCurMouse.x = m_ptCurMouse.y = 0; // 현재 마우스 포인터 + m_ptOldMouse.x = m_ptOldMouse.y = 0; // 직전 마우스 포인터 - SetRect(&m_rcLBDrag, 0, 0, 0, 0); // 巡 - SetRect(&m_rcMBDrag, 0, 0, 0, 0); // 巡 - SetRect(&m_rcRBDrag, 0, 0, 0, 0); // 巡 + SetRect(&m_rcLBDrag, 0, 0, 0, 0); // 드래그 영역 + SetRect(&m_rcMBDrag, 0, 0, 0, 0); // 드래그 영역 + SetRect(&m_rcRBDrag, 0, 0, 0, 0); // 드래그 영역 - SetRect(&m_rcMLimit, 0, 0, 0, 0); // 콺 + SetRect(&m_rcMLimit, 0, 0, 0, 0); // 마우스 움직임 제한 영역 - memset(m_byCurKeys, 0, sizeof(m_byCurKeys)); // Ű - memset(m_byOldKeys, 0, sizeof(m_byOldKeys)); // Ű - memset(m_bKeyPresses, 0, sizeof(m_bKeyPresses)); // Ű - memset(m_bKeyPresseds, 0, sizeof(m_bKeyPresseds)); // Ű - m_bNoKeyDown = FALSE; // ƹ ŰԷµ + memset(m_byCurKeys, 0, sizeof(m_byCurKeys)); // 현재 키 상태 + memset(m_byOldKeys, 0, sizeof(m_byOldKeys)); // 직전 키 상태 + memset(m_bKeyPresses, 0, sizeof(m_bKeyPresses)); // 키를 누른 순간인지 + memset(m_bKeyPresseds, 0, sizeof(m_bKeyPresseds)); // 키를 눌렀다 떼는 순간인지 + m_bNoKeyDown = FALSE; // 아무 키입력도 없는지 memset(m_dwTickKeyPress, 0, sizeof(m_dwTickKeyPress)); } @@ -79,7 +79,7 @@ BOOL CLocalInput::Init(HINSTANCE hInst, HWND hWnd, BOOL bActivateKeyboard, BOOL BOOL ExclusiveMouseAccess) { HRESULT rval; - m_hWnd = hWnd; // ڵ .. + m_hWnd = hWnd; // 윈도우 핸들 기억.. rval = DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void **)(&m_lpDI), NULL); if (rval != DI_OK) { @@ -236,7 +236,7 @@ void CLocalInput::UnacquireMouse() { ///////////////////////////////////////////////////////////////////////////////////////////// // Updates all devices. Call this before you check for input. ///////////////////////////////////////////////////////////////////////////////////////////// -// ǵ̸ ü ν ѹ ° .. ϸ ȥ ü ִ. +// 되도록이면 전체 프로시저 돌때 한번씩만 도는게 좋다.. 여러번 하면 혼란이 올수도 있다. void CLocalInput::Tick(void) { #if _DEBUG if (ImGui::GetIO().WantCaptureMouse || ImGui::GetIO().WantCaptureKeyboard) { @@ -250,7 +250,7 @@ void CLocalInput::Tick(void) { // WORD i; // DWORD key; - HWND hWndActive = ::GetActiveWindow(); // Ŀ̵Ǿ... + HWND hWndActive = ::GetActiveWindow(); // 포커싱되었을때만... if (hWndActive != m_hWnd) { return; } @@ -260,21 +260,21 @@ void CLocalInput::Tick(void) { /////////////////////// // if(m_bKeyboard) // { - memcpy(m_byOldKeys, m_byCurKeys, NUMDIKEYS); // Ű - err = m_lpDIDKeyboard->GetDeviceState(NUMDIKEYS, m_byCurKeys); // Ű + memcpy(m_byOldKeys, m_byCurKeys, NUMDIKEYS); // 전의 키 상태 기록 + err = m_lpDIDKeyboard->GetDeviceState(NUMDIKEYS, m_byCurKeys); // 현재 키 상태 기록 if (err != DI_OK) { AcquireKeyboard(); } else { - m_bNoKeyDown = TRUE; // ÷ ƹ͵ ȴ + m_bNoKeyDown = TRUE; // 첨엔 아무것도 안눌림 for (int i = 0; i < NUMDIKEYS; i++) { if (!m_byOldKeys[i] && m_byCurKeys[i]) { - m_bKeyPresses[i] = TRUE; // + m_bKeyPresses[i] = TRUE; // 눌리는 순간 } else { m_bKeyPresses[i] = FALSE; } if (m_byOldKeys[i] && !m_byCurKeys[i]) { - m_bKeyPresseds[i] = TRUE; // .. + m_bKeyPresseds[i] = TRUE; // 눌렀다 떼는 순간.. } else { m_bKeyPresseds[i] = FALSE; } @@ -292,14 +292,14 @@ void CLocalInput::Tick(void) { // if(m_bMouse) // { // DIMOUSESTATE DIMState; - // err = m_lpDIDMouse->GetDeviceState(sizeof(DIMState), &DIMState); // 콺 - ̻Ÿ.. ڲ.. .. + // err = m_lpDIDMouse->GetDeviceState(sizeof(DIMState), &DIMState); // 마우스 상태 얻기 - 이상타.. 자꾸.. 에러가.. // if(err != DI_OK) // { // AcquireMouse(); // return; // } - // 콺 ġ + // 마우스 위치 새로 가져오기 // m_ptCurMouse.x += DIMState.lX; // m_ptCurMouse.y += DIMState.lY; @@ -321,22 +321,22 @@ void CLocalInput::Tick(void) { // if (m_ptCurMouse.y < m_rcMLimit.top) // m_ptCurMouse.y = m_rcMLimit.top; - m_ptOldMouse = m_ptCurMouse; // ϴ ... + m_ptOldMouse = m_ptCurMouse; // 일단 전의 것 복사... RECT rcClient; ::GetClientRect(m_hWnd, &rcClient); - ::GetCursorPos(&m_ptCurMouse); // ̻ؼ... ׳ ý 콺 Ŀ ġ - ::ScreenToClient(m_hWnd, &m_ptCurMouse); // Ŭ̾Ʈ ȯ + ::GetCursorPos(&m_ptCurMouse); // 좀 이상해서... 그냥 시스템 마우스 커서 위치 가져오기 + ::ScreenToClient(m_hWnd, &m_ptCurMouse); // 클라이언트 영역으로 변환 if (PtInRect(&rcClient, m_ptCurMouse) == - FALSE) // || GetFocus() != m_hWnd) // ũ ۿ ְų Ŀ .. + FALSE) // || GetFocus() != m_hWnd) // 스크린 영역 밖에 있거나 포커스가 가있지 않으면.. { } else { - // 콺 ư . + // 마우스 버튼 상태 보관. m_nMouseFlagOld = m_nMouseFlag; m_nMouseFlag = 0; - // 콺 + // 마우스 상태 가져오기 if (_IsKeyDown(VK_LBUTTON)) { m_nMouseFlag |= MOUSE_LBDOWN; } @@ -347,7 +347,7 @@ void CLocalInput::Tick(void) { m_nMouseFlag |= MOUSE_RBDOWN; } - // ư Ŭ .. + // 버튼 클릭 직후.. if ((m_nMouseFlagOld & MOUSE_LBDOWN) == FALSE && (m_nMouseFlag & MOUSE_LBDOWN)) { m_nMouseFlag |= MOUSE_LBCLICK; } @@ -358,7 +358,7 @@ void CLocalInput::Tick(void) { m_nMouseFlag |= MOUSE_RBCLICK; } - // ư + // 버튼에서 손을 떼면 if ((m_nMouseFlagOld & MOUSE_LBDOWN) && (m_nMouseFlag & MOUSE_LBDOWN) == FALSE) { m_nMouseFlag |= MOUSE_LBCLICKED; } @@ -369,8 +369,8 @@ void CLocalInput::Tick(void) { m_nMouseFlag |= MOUSE_RBCLICKED; } - static DWORD dwDblClk = GetDoubleClickTime(); // Ŭð .. - if (m_nMouseFlag & MOUSE_LBCLICKED) // Ŭ + static DWORD dwDblClk = GetDoubleClickTime(); // 윈도우의 더블 클릭시간을 가져오고.. + if (m_nMouseFlag & MOUSE_LBCLICKED) // 왼쪽 더블 클릭 감지 { static DWORD dwCLicked = 0; if (timeGetTime() < dwCLicked + dwDblClk) { @@ -378,7 +378,7 @@ void CLocalInput::Tick(void) { } dwCLicked = timeGetTime(); } - if (m_nMouseFlag & MOUSE_MBCLICKED) // Ŭ + if (m_nMouseFlag & MOUSE_MBCLICKED) // 왼쪽 더블 클릭 감지 { static DWORD dwCLicked = 0; if (timeGetTime() < dwCLicked + dwDblClk) { @@ -386,7 +386,7 @@ void CLocalInput::Tick(void) { } dwCLicked = timeGetTime(); } - if (m_nMouseFlag & MOUSE_RBCLICKED) // Ŭ + if (m_nMouseFlag & MOUSE_RBCLICKED) // 왼쪽 더블 클릭 감지 { static DWORD dwCLicked = 0; if (timeGetTime() < dwCLicked + dwDblClk) { @@ -395,7 +395,7 @@ void CLocalInput::Tick(void) { dwCLicked = timeGetTime(); } - // 巡 ó + // 드래그 영역 처리 if (m_nMouseFlag & MOUSE_LBDOWN) { m_rcLBDrag.right = m_ptCurMouse.x; m_rcLBDrag.bottom = m_ptCurMouse.y; diff --git a/src/game/LocalInput.h b/src/game/LocalInput.h index 4ccbc1c9..1d899dc4 100644 --- a/src/game/LocalInput.h +++ b/src/game/LocalInput.h @@ -8,7 +8,7 @@ const int DK_PRESS = 2; const int DK_REPEAT = 4; const int NUMDIKEYS = 256; -// 콺 ÷ - Ѱ ̻ ÷װ OR յǾ ִ.. +// 마우스 플래그 - 한개 이상의 플래그가 OR 연산으로 조합되어 있다.. const int MOUSE_LBCLICK = 0x1; const int MOUSE_LBCLICKED = 0x2; const int MOUSE_LBDOWN = 0x4; @@ -43,35 +43,35 @@ class CLocalInput { // BOOL m_bMouse; // BOOL m_bKeyboard; - int m_nMouseFlag, m_nMouseFlagOld; // 콺 ư ÷ - DWORD m_dwTickLBDown; // 콺 ư Ŭ - DWORD m_dwTickRBDown; // 콺 ư Ŭ + int m_nMouseFlag, m_nMouseFlagOld; // 마우스 버튼 눌림 플래그 + DWORD m_dwTickLBDown; // 마우스 왼쪽 버튼 더블 클릭 감지용 + DWORD m_dwTickRBDown; // 마우스 오른쪽 버튼 더블 클릭 감지용 - POINT m_ptCurMouse; // 콺 - POINT m_ptOldMouse; // 콺 + POINT m_ptCurMouse; // 현재 마우스 포인터 + POINT m_ptOldMouse; // 직전 마우스 포인터 - RECT m_rcLBDrag; // 巡 - RECT m_rcMBDrag; // 巡 - RECT m_rcRBDrag; // 巡 + RECT m_rcLBDrag; // 드래그 영역 + RECT m_rcMBDrag; // 드래그 영역 + RECT m_rcRBDrag; // 드래그 영역 - RECT m_rcMLimit; // 콺 - BYTE m_byCurKeys[NUMDIKEYS]; // Ű - BYTE m_byOldKeys[NUMDIKEYS]; // Ű - BOOL m_bKeyPresses[NUMDIKEYS]; // Ű - BOOL m_bKeyPresseds[NUMDIKEYS]; // Ű - BOOL m_bNoKeyDown; // ƹ ŰԷµ + RECT m_rcMLimit; // 마우스 움직임 제한 영역 + BYTE m_byCurKeys[NUMDIKEYS]; // 현재 키 상태 + BYTE m_byOldKeys[NUMDIKEYS]; // 직전 키 상태 + BOOL m_bKeyPresses[NUMDIKEYS]; // 키를 누른 순간인지 + BOOL m_bKeyPresseds[NUMDIKEYS]; // 키를 눌렀다 떼는 순간인지 + BOOL m_bNoKeyDown; // 아무 키입력도 없는지 DWORD m_dwTickKeyPress[NUMDIKEYS]; public: - void KeyboardClearInput(int iIndex = -1) // Ű Է ȿȭ Ų.. ⺻ ȿȭ̴.. + void KeyboardClearInput(int iIndex = -1) // 키보드 입력을 무효화 시킨다.. 기본값은 몽땅 무효화이다.. { if (-1 == iIndex) { memset(m_byOldKeys, 0, sizeof(m_byOldKeys)); memset(m_byCurKeys, 0, sizeof(m_byCurKeys)); memset(m_bKeyPresses, 0, sizeof(m_bKeyPresses)); memset(m_bKeyPresseds, 0, sizeof(m_bKeyPresseds)); - } else if (iIndex >= 0 && iIndex < NUMDIKEYS) // Ư Ű ȿȭ.. + } else if (iIndex >= 0 && iIndex < NUMDIKEYS) // 특정한 키만 무효화.. { m_byCurKeys[iIndex] = m_byOldKeys[iIndex] = m_bKeyPresses[iIndex] = m_bKeyPresseds[iIndex] = 0; } @@ -82,19 +82,19 @@ class CLocalInput { return FALSE; } return m_byCurKeys[iIndex]; - } // Ű尡 ִ... Ǿ ִ DIK_???? ĵڵ带 .. + } // 키보드가 눌려있는지... 에 정의 되어 있는 DIK_???? 스캔코드를 참조.. BOOL IsKeyPress(int iIndex) { if (iIndex < 0 || iIndex >= NUMDIKEYS) { return FALSE; } return m_bKeyPresses[iIndex]; - } // Ű带 ... Ǿ ִ DIK_???? ĵڵ带 .. + } // 키보드를 누르는 순간... 에 정의 되어 있는 DIK_???? 스캔코드를 참조.. BOOL IsKeyPressed(int iIndex) { if (iIndex < 0 || iIndex >= NUMDIKEYS) { return FALSE; } return m_bKeyPresseds[iIndex]; - } // Ű带 ... Ǿ ִ DIK_???? ĵڵ带 .. + } // 키보드를 누르고나서 떼는 순간... 에 정의 되어 있는 DIK_???? 스캔코드를 참조.. BOOL Init(HINSTANCE hInst, HWND hWnd, BOOL bActivateKeyboard = TRUE, BOOL bActivateMouse = TRUE, BOOL ExclusiveMouseAccess = TRUE); @@ -106,7 +106,7 @@ class CLocalInput { void SetActiveDevices(BOOL bKeyboard, BOOL bMouse); void MouseSetPos(int x, int y); - BOOL KeyboardGetKeyState(int nDIKey); // ֱ Ű ˻.. + BOOL KeyboardGetKeyState(int nDIKey); // 최근 눌려진 키 검사.. const POINT MouseGetPos() { return m_ptCurMouse; } const POINT MouseGetPosOld() { return m_ptOldMouse; } @@ -115,7 +115,7 @@ class CLocalInput { RECT MouseGetMBDragRect() { return m_rcMBDrag; } RECT MouseGetRBDragRect() { return m_rcRBDrag; } - int MouseGetFlag() { return m_nMouseFlag; } // Mouse Flag or յǾ ִ. + int MouseGetFlag() { return m_nMouseFlag; } // Mouse Flag 의 or 연산으로 조합되어 있다. int MouseGetFlagOld() { return m_nMouseFlagOld; } void MouseRemoveFlag(int nFlag = -1) { if (-1 == nFlag) { @@ -123,7 +123,7 @@ class CLocalInput { } else { m_nMouseFlag &= (~nFlag); } - } // Ư Mouse Flag + } // 특정한 Mouse Flag 제거 CLocalInput(void); ~CLocalInput(void); diff --git a/src/game/MachineBase.cpp b/src/game/MachineBase.cpp index 061f794b..538edb4f 100644 --- a/src/game/MachineBase.cpp +++ b/src/game/MachineBase.cpp @@ -37,7 +37,7 @@ void CMachineBase::Release() { } void CMachineBase::ReCalcMatrix4AnimatedPart() { - // Ʈ Ʈ ٽ ش.. + // 바퀴 파트의 매트릭스를 다시 계산해 준다.. int iPC = m_Parts.size(); for (int i = 0; i < iPC; i++) { for (int j = 0; j < NUM_WHEEL; ++j) { @@ -53,9 +53,9 @@ void CMachineBase::ReCalcMatrix4AnimatedPart() { } void CMachineBase::ReCalcMatrix() { - // CN3Transform::ReCalcMatrix(); // Transfomr Matrix ְ.. + // CN3Transform::ReCalcMatrix(); // Transfomr Matrix 를 계산 해주고.. /* - // + // 균형잡기 위한 계산 static __Matrix44 mtx1; static __Matrix44 mtx2; mtx1.Scale(m_vScale); mtx2.Rotation(0, m_fDirRadian, 0); mtx1 *= mtx2; mtx1.PosSet(m_vPos); @@ -66,16 +66,16 @@ void CMachineBase::ReCalcMatrix() { __Vector3 vPos2 = m_vBalancePoint[1]*mtx1; vPos1.y = pTerrain->GetHeight(vPos1.x, vPos1.z); vPos2.y = pTerrain->GetHeight(vPos2.x, vPos2.z); - if (vPos1.y != -FLT_MAX && vPos2.y != -FLT_MAX) fPitch = asinf((vPos2.y - vPos1.y)/(vPos1-vPos2).Magnitude()); // ϶ + if (vPos1.y != -FLT_MAX && vPos2.y != -FLT_MAX) fPitch = asinf((vPos2.y - vPos1.y)/(vPos1-vPos2).Magnitude()); // 지형범위 안일때 계산 vPos1 = m_vBalancePoint[2]*mtx1; vPos2 = m_vBalancePoint[3]*mtx1; vPos1.y = pTerrain->GetHeight(vPos1.x, vPos1.z); vPos2.y = pTerrain->GetHeight(vPos2.x, vPos2.z); - if (vPos1.y != -FLT_MAX && vPos2.y != -FLT_MAX) fRoll = asinf((vPos2.y - vPos1.y)/(vPos1-vPos2).Magnitude()); // ϶ + if (vPos1.y != -FLT_MAX && vPos2.y != -FLT_MAX) fRoll = asinf((vPos2.y - vPos1.y)/(vPos1-vPos2).Magnitude()); // 지형범위 안일때만 계산 - // machine , ȸ, ġ + // machine의 스케일, 회전, 위치 계산 D3DXMatrixRotationYawPitchRoll(&mtx1, -m_fDirRadian, fPitch, fRoll); - // -m_fDirRadian : - ٿִ N3Base ǵ matrix d3d ݴ Ǿ ־.. + // -m_fDirRadian : -를 붙여주는 이유는 N3Base에 정의된 matrix연산과 d3d의 연산이 반대로 되어 있어서.. m_Matrix.Scale(m_vScale); m_Matrix *= mtx1; @@ -83,7 +83,7 @@ void CMachineBase::ReCalcMatrix() { ReCalcMatrix4AnimatedPart(); - // Animate ʴ Ʈ Ʈ ٽ . + // Animate 되지 않는 나머지 파트의 매트릭스를 다시 계산. int iPC = m_Parts.size(); for(int i = 0; i < iPC; i++) { @@ -97,7 +97,7 @@ void CMachineBase::Render() { CN3Shape::Render(); if (m_bSkipCalcPartMtx) { ZeroMemory(m_bSkipCalcPartMtx, - sizeof(m_bSkipCalcPartMtx[0]) * PartCount()); // ׸ part matrix ÷ ʱȭ + sizeof(m_bSkipCalcPartMtx[0]) * PartCount()); // 그린후 part matrix계산 플래그 초기화 } } @@ -105,8 +105,8 @@ void CMachineBase::Tick(float fFrm) { /* CN3Shape::Tick(fFrm); if (m_bDontRender) return; - // ȸ - if (!((m_dwMachineState & MS_TURNRIGHT) && (m_dwMachineState & MS_TURNLEFT))) // ¿ ð ƴϸ + // 회전 계산 + if (!((m_dwMachineState & MS_TURNRIGHT) && (m_dwMachineState & MS_TURNLEFT))) // 좌우 동시가 아니면 { float fAddRadian = 0.0f; if (m_dwMachineState & MS_TURNRIGHT) @@ -121,7 +121,7 @@ void CMachineBase::Tick(float fFrm) { m_fDirRadian += fAddRadian; if (m_fDirRadian > (2 * D3DX_PI)) m_fDirRadian -= (2 * D3DX_PI); } - // ȸ . + // 바퀴 회전각 계산. for (int i=0; im_pTerrain->GetHeight(vPos.x, vPos.z); m_vPos = vPos; - // ȸ . + // 바퀴 회전각 계산. for (int i=0; i D3DX_PI*2) m_Wheel[i].fRadian -= (D3DX_PI*2); else if (m_Wheel[i].fRadian < 0.0f) m_Wheel[i].fRadian += (D3DX_PI*2); } - // Rotate + // Rotate 계산 // m_vRot.y = m_fDirRadian; - // ̵ matrix. + // 이동 후 matrix계산. ReCalcMatrix(); */ } @@ -196,50 +196,50 @@ void CMachineBase::LoadMachine(FILE * stream) { } Release(); - char szSrcName[_MAX_PATH]; // shape source ̸ - char szWheel[NUM_WHEEL][_MAX_PATH]; // pmesh̸ + char szSrcName[_MAX_PATH]; // shape source파일 이름 + char szWheel[NUM_WHEEL][_MAX_PATH]; // 바퀴 pmesh이름 int result; result = fscanf(stream, "Speed = %f\n", &m_fSpeed); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "RotateSpeed = %f\n", &m_fRotateSpeed); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Shape_Name = %s\n", szSrcName); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Wheel_FL = %s\n", szWheel[WHEEL_FL]); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Wheel_FR = %s\n", szWheel[WHEEL_FR]); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Wheel_BL = %s\n", szWheel[WHEEL_BL]); - __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); result = fscanf(stream, "Wheel_BR = %s\n", szWheel[WHEEL_BR]); - __ASSERT(result != EOF, "߸ Machine "); - // result = fscanf(stream, "WheelRadius_FL = %f\n", &(m_Wheel[WHEEL_FL].fRadius)); __ASSERT(result != EOF, "߸ Machine "); - // result = fscanf(stream, "WheelRadius_FR = %f\n", &(m_Wheel[WHEEL_FR].fRadius)); __ASSERT(result != EOF, "߸ Machine "); - // result = fscanf(stream, "WheelRadius_BL = %f\n", &(m_Wheel[WHEEL_BL].fRadius)); __ASSERT(result != EOF, "߸ Machine "); - // result = fscanf(stream, "WheelRadius_BR = %f\n", &(m_Wheel[WHEEL_BR].fRadius)); __ASSERT(result != EOF, "߸ Machine "); + __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); + // result = fscanf(stream, "WheelRadius_FL = %f\n", &(m_Wheel[WHEEL_FL].fRadius)); __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); + // result = fscanf(stream, "WheelRadius_FR = %f\n", &(m_Wheel[WHEEL_FR].fRadius)); __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); + // result = fscanf(stream, "WheelRadius_BL = %f\n", &(m_Wheel[WHEEL_BL].fRadius)); __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); + // result = fscanf(stream, "WheelRadius_BR = %f\n", &(m_Wheel[WHEEL_BR].fRadius)); __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); - // shape loadϱ + // shape load하기 this->Load(szSrcName); - __ASSERT(m_bSkipCalcPartMtx == NULL, "Machine ޸ ɼ"); + __ASSERT(m_bSkipCalcPartMtx == NULL, "Machine에서 메모리 릭 가능성"); int iPartCount = PartCount(); if (iPartCount > 0) { m_bSkipCalcPartMtx = new BOOL[iPartCount]; } ZeroMemory(m_bSkipCalcPartMtx, sizeof(m_bSkipCalcPartMtx[0]) * iPartCount); - // CN3SPart ã + // 각각의 바퀴 CN3SPart 포인터 찾기 for (int i = 0; i < NUM_WHEEL; ++i) { m_Wheel[i].pPart = GetPartByPMeshName(szWheel[i]); - __ASSERT(m_Wheel[i].pPart, "Machine Ʈ NULLԴϴ."); - // ϱ + __ASSERT(m_Wheel[i].pPart, "Machine의 바퀴 파트가 NULL입니다."); + // 바퀴 반지름 구하기 CN3PMesh * pPMesh = m_Wheel[i].pPart->Mesh(); - __ASSERT(pPMesh, "machine PMesh ."); + __ASSERT(pPMesh, "machine 바퀴의 PMesh가 없어요."); m_Wheel[i].fRadius = (pPMesh->Max().y - pPMesh->Min().y) / 2.0f; } - // machine 1.0f(rad)ȸҶ ư (rad) ϱ + // machine이 1.0f(rad)회전할때 바퀴가 돌아가는 각도(rad) 정도 계산하기 for (int i = 0; i < NUM_WHEEL; ++i) { if (i == WHEEL_FL || i == WHEEL_BL) { m_Wheel[i].fRotateRatio = m_Wheel[i].pPart->m_vPivot.Magnitude() / m_Wheel[i].fRadius; @@ -248,14 +248,14 @@ void CMachineBase::LoadMachine(FILE * stream) { } } - // ϱ - m_vBalancePoint[0] = m_Wheel[WHEEL_FL].pPart->m_vPivot + // + // 균형을 잡기위한 점 계산하기 + m_vBalancePoint[0] = m_Wheel[WHEEL_FL].pPart->m_vPivot + // 전 0.5 * (m_Wheel[WHEEL_FR].pPart->m_vPivot - m_Wheel[WHEEL_FL].pPart->m_vPivot); - m_vBalancePoint[1] = m_Wheel[WHEEL_BL].pPart->m_vPivot + // + m_vBalancePoint[1] = m_Wheel[WHEEL_BL].pPart->m_vPivot + // 후 0.5 * (m_Wheel[WHEEL_BR].pPart->m_vPivot - m_Wheel[WHEEL_BL].pPart->m_vPivot); - m_vBalancePoint[2] = m_Wheel[WHEEL_FL].pPart->m_vPivot + // + m_vBalancePoint[2] = m_Wheel[WHEEL_FL].pPart->m_vPivot + // 좌 0.5 * (m_Wheel[WHEEL_BL].pPart->m_vPivot - m_Wheel[WHEEL_FL].pPart->m_vPivot); - m_vBalancePoint[3] = m_Wheel[WHEEL_FR].pPart->m_vPivot + // + m_vBalancePoint[3] = m_Wheel[WHEEL_FR].pPart->m_vPivot + // 우 0.5 * (m_Wheel[WHEEL_BR].pPart->m_vPivot - m_Wheel[WHEEL_FR].pPart->m_vPivot); } diff --git a/src/game/MachineBase.h b/src/game/MachineBase.h index 42713ba9..36cfd724 100644 --- a/src/game/MachineBase.h +++ b/src/game/MachineBase.h @@ -32,32 +32,32 @@ class CMachineBase : public CN3Shape { NUM_WHEEL = 4 }; struct __Wheel { - // - // __Vector3 m_vPivot; // Local - CN3SPart * pPart; // Shape Part + // 바퀴 정보 + // __Vector3 m_vPivot; // Local 축 + CN3SPart * pPart; // Shape의 바퀴 Part포인터 - // Է¹ ִ . - float fRadius; // - float fRotateRatio; // machine 1.0f(rad)ȸҶ ư (rad) + // 바퀴 정보 입력받은 후 계산해주는 값들. + float fRadius; // 바퀴의 반지름 + float fRotateRatio; // machine이 1.0f(rad)회전할때 바퀴가 돌아가는 각도(rad) 정도 - // ٲ . - float fRadian; // ư . (x .) + // 게임 진행시 바뀌는 정보. + float fRadian; // 현재 바퀴의 돌아간 각도. (x축으로 돌린다.) }; std::string m_szID; // id string protected: __Wheel m_Wheel[NUM_WHEEL]; - float m_fSpeed; // ʴ ̵ӵ() - float m_fRotateSpeed; // ʴ ȸ ӵ - //__Vector3 m_vDir; // machine - float m_fDirRadian; // (z 0.0f); + float m_fSpeed; // 초당 이동속도(전후진) + float m_fRotateSpeed; // 초당 회전 각속도 + //__Vector3 m_vDir; // machine의 진행방향 + float m_fDirRadian; // 진행방향 각도(z양의 방향이 0.0f); DWORD m_dwMachineState; - BOOL * m_bSkipCalcPartMtx; // Ʈ Ʈ dzʶٱ(partŭ Ҵ) - __Vector3 m_vBalancePoint[4]; // 4 ġ(¿) ǥ. + BOOL * m_bSkipCalcPartMtx; // 파트 메트릭스 계산 건너뛰기(part갯수만큼 할당됨) + __Vector3 m_vBalancePoint[4]; // 균형을 잡기위한 4점의 위치(전후좌우) 로컬좌표임. - float m_fFireRadian; // ߻簢 - float m_fFireSpeed; // ߻ӵ() + float m_fFireRadian; // 발사각 + float m_fFireSpeed; // 발사속도(세기) // Attributes public: @@ -80,7 +80,7 @@ class CMachineBase : public CN3Shape { protected: CN3SPart * GetPartByPMeshName(const std::string & szName); virtual void ReCalcMatrix4AnimatedPart(); - // ӽ + // 머신 동작 관련 public: void Stop() { m_dwMachineState = MS_STOP; } void ToggleMoveForward(BOOL bOn) { @@ -112,5 +112,5 @@ class CMachineBase : public CN3Shape { } } - virtual void Fire(); // ߻ + virtual void Fire(); // 발사 }; diff --git a/src/game/MachineMng.cpp b/src/game/MachineMng.cpp index e186e44e..c76d9e60 100644 --- a/src/game/MachineMng.cpp +++ b/src/game/MachineMng.cpp @@ -99,7 +99,7 @@ void CMachineMng::ReceiveReplyMsg(ReplyMsg& RPMsg) // if(g_Facade.m_pSndMgr->m_IdxCatapultThrow == g_Facade.m_pSndMgr->m_NumCatapultThrow) g_Facade.m_pSndMgr->m_IdxCatapultThrow = 0; } break; - case ID_MACHINE_POSITION: // ġ 缳 + case ID_MACHINE_POSITION: // 투석기 위치 재설정 pMachine = GetMachine(RPMsg.s_pStrID); if (pMachine) { @@ -116,7 +116,7 @@ void CMachineMng::AddMachine(ReplyMsg& RPMsg) // if (lstrlen(RPMsg.s_cprscID) == 0) return; char szFileName[_MAX_PATH] = "misc\\machines\\catapult.mcn"; - FILE* stream = fopen(szFileName, "r"); //textϷ + FILE* stream = fopen(szFileName, "r"); //text파일로 만든다 #if _DEBUG char szErr[512]; if(NULL == stream) @@ -126,8 +126,8 @@ void CMachineMng::AddMachine(ReplyMsg& RPMsg) } #endif - char szMachineType[64]; // machine - int result = fscanf(stream, "Machine_Type = %s\n", szMachineType); __ASSERT(result != EOF, "߸ Machine "); + char szMachineType[64]; // machine 종류 + int result = fscanf(stream, "Machine_Type = %s\n", szMachineType); __ASSERT(result != EOF, "잘못된 Machine 세팅 파일"); CMachineBase* pMachine = NULL; if (lstrcmpi(szMachineType, "catapult") == 0) diff --git a/src/game/MagicSkillMng.cpp b/src/game/MagicSkillMng.cpp index 5ddf4e62..a0d99187 100644 --- a/src/game/MagicSkillMng.cpp +++ b/src/game/MagicSkillMng.cpp @@ -104,11 +104,11 @@ void CMagicSkillMng::Init() { __InfoPlayerBase * pInfoBase = &(s_pPlayer->m_InfoBase); /* - CLASS_KA_WARRIOR = 101, CLASS_KA_ROGUE, CLASS_KA_WIZARD, CLASS_KA_PRIEST, // ⺻ + CLASS_KA_WARRIOR = 101, CLASS_KA_ROGUE, CLASS_KA_WIZARD, CLASS_KA_PRIEST, // 여기까지 기본 직업 CLASS_KA_BERSERKER = 105, CLASS_KA_GUARDIAN, CLASS_KA_HUNTER = 107, CLASS_KA_PENETRATOR, CLASS_KA_SORCERER = 109, CLASS_KA_NECROMANCER, CLASS_KA_SHAMAN = 111, CLASS_KA_DARKPRIEST, - CLASS_EL_WARRIOR = 201, CLASS_EL_ROGUE, CLASS_EL_WIZARD, CLASS_EL_PRIEST, // ⺻ + CLASS_EL_WARRIOR = 201, CLASS_EL_ROGUE, CLASS_EL_WIZARD, CLASS_EL_PRIEST, // 여기까지 기본 직업 CLASS_EL_BLADE = 205, CLASS_EL_PROTECTOR, CLASS_EL_RANGER = 207, CLASS_EL_ASSASIN, CLASS_EL_MAGE = 209, CLASS_EL_ENCHANTER, CLASS_EL_CLERIC = 211, CLASS_EL_DRUID, */ @@ -253,21 +253,21 @@ bool CMagicSkillMng::CheckValidSkillMagic(__TABLE_UPC_SKILL * pSkill) { } } - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. - __TABLE_ITEM_EXT * pItemExt = NULL; // ̺ ü .. + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. + __TABLE_ITEM_EXT * pItemExt = NULL; // 아이템 테이블 구조체 포인터.. - pItem = s_pTbl_Items_Basic->Find(pSkill->dwExhaustItem / 1000 * 1000); // .. + pItem = s_pTbl_Items_Basic->Find(pSkill->dwExhaustItem / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { - pItemExt = s_pTbl_Items_Exts[pItem->byExtIndex]->Find(pSkill->dwExhaustItem % 1000); // .. + pItemExt = s_pTbl_Items_Exts[pItem->byExtIndex]->Find(pSkill->dwExhaustItem % 1000); // 열 데이터 얻기.. } if (NULL == pItem || NULL == pItemExt) { __ASSERT(0, "NULL Item"); CLogWriter::Write("MyInfo - Inv - Unknown Item %d, IDNumber", pSkill->dwExhaustItem); - return false; // .. + return false; // 아이템이 없으면.. } if (pItem->byAttachPoint == ITEM_LIMITED_EXHAUST) { - // üũ.. + // 종족 체크.. switch (pItem->byNeedRace) { case 0: break; @@ -279,7 +279,7 @@ bool CMagicSkillMng::CheckValidSkillMagic(__TABLE_UPC_SKILL * pSkill) { break; } - // üũ.. + // 직업 체크.. if (pItem->byNeedClass != 0) { switch (pItem->byNeedClass) { case CLASS_KINDOF_WARRIOR: @@ -426,12 +426,12 @@ bool CMagicSkillMng::CheckValidSkillMagic(__TABLE_UPC_SKILL * pSkill) { } } - // 䱸 üũ.. + // 요구레벨 체크.. if (CGameBase::s_pPlayer->m_InfoBase.iLevel < pItem->cNeedLevel + pItemExt->siNeedLevel) { return false; } - // 䱸 ɷġ üũ.. + // 요구 능력치 체크.. int iNeedValue; iNeedValue = pItem->byNeedStrength; if (iNeedValue != 0) { @@ -484,7 +484,7 @@ bool CMagicSkillMng::CheckValidCondition(int iTargetID, __TABLE_UPC_SKILL * pSki __InfoPlayerBase * pInfoBase = &(s_pPlayer->m_InfoBase); __InfoPlayerMySelf * pInfoExt = &(s_pPlayer->m_InfoExt); - // ´ ų ˾ƺ... + //직업에 맞는 스킬인지 알아봐라... e_Class_Represent Class = CGameProcedure::GetRepresentClass(pInfoBase->eClass); if (pSkill->iNeedSkill != 0) { @@ -621,21 +621,21 @@ bool CMagicSkillMng::CheckValidCondition(int iTargetID, __TABLE_UPC_SKILL * pSki } } - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. - __TABLE_ITEM_EXT * pItemExt = NULL; // ̺ ü .. + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. + __TABLE_ITEM_EXT * pItemExt = NULL; // 아이템 테이블 구조체 포인터.. - pItem = s_pTbl_Items_Basic->Find(pSkill->dwExhaustItem / 1000 * 1000); // .. + pItem = s_pTbl_Items_Basic->Find(pSkill->dwExhaustItem / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { - pItemExt = s_pTbl_Items_Exts[pItem->byExtIndex]->Find(pSkill->dwExhaustItem % 1000); // .. + pItemExt = s_pTbl_Items_Exts[pItem->byExtIndex]->Find(pSkill->dwExhaustItem % 1000); // 열 데이터 얻기.. } if (NULL == pItem || NULL == pItemExt) { __ASSERT(0, "NULL Item"); CLogWriter::Write("MyInfo - Inv - Unknown Item %d, IDNumber", pSkill->dwExhaustItem); - return false; // .. + return false; // 아이템이 없으면.. } if (pItem->byAttachPoint == ITEM_LIMITED_EXHAUST) { - // üũ.. + // 종족 체크.. switch (pItem->byNeedRace) { case 0: break; @@ -647,7 +647,7 @@ bool CMagicSkillMng::CheckValidCondition(int iTargetID, __TABLE_UPC_SKILL * pSki break; } - // üũ.. + // 직업 체크.. if (pItem->byNeedClass != 0) { switch (pItem->byNeedClass) { case CLASS_KINDOF_WARRIOR: @@ -794,12 +794,12 @@ bool CMagicSkillMng::CheckValidCondition(int iTargetID, __TABLE_UPC_SKILL * pSki } } - // 䱸 üũ.. + // 요구레벨 체크.. if (CGameBase::s_pPlayer->m_InfoBase.iLevel < pItem->cNeedLevel + pItemExt->siNeedLevel) { return false; } - // 䱸 ɷġ üũ.. + // 요구 능력치 체크.. int iNeedValue; iNeedValue = pItem->byNeedStrength; if (iNeedValue != 0) { @@ -916,7 +916,7 @@ bool CMagicSkillMng::CheckValidCondition(int iTargetID, __TABLE_UPC_SKILL * pSki } ///////////////////////////////////////////////////////////////////////////////////////////////////// - // ų Ʈ üũ + // 스킬 사용시 오브젝트 체크 CPlayerBase * pTarget = m_pGameProcMain->CharacterGetByID(iTargetID, false); if (pTarget == NULL) { return true; @@ -1031,7 +1031,7 @@ bool CMagicSkillMng::CheckValidCondition(int iTargetID, __TABLE_UPC_SKILL * pSki break; } - // ų Ʈ üũ + // 스킬 사용시 오브젝트 체크 ///////////////////////////////////////////////////////////////////////////////////////////////////// return true; @@ -1041,18 +1041,18 @@ bool CMagicSkillMng::CheckValidCondition(int iTargetID, __TABLE_UPC_SKILL * pSki /// // bool CMagicSkillMng::MsgSend_MagicProcess(int iTargetID, __TABLE_UPC_SKILL * pSkill) { - //if(m_fRecastTime > 0.0f) return;//recast time ȵǾ..^^ + //if(m_fRecastTime > 0.0f) return;//recast time이 아직 안되었네..^^ if (s_pPlayer->IsDead()) { - return false; // ׾ ֳ.. ^^ + return false; // 죽어 있네.. ^^ } /////////////////////////////////////////////////////////////////////////////////// - // ų Ǵ ˻... + // 스킬 쓸 조건이 되는지 검사... if (pSkill->iSelfAnimID1 >= 0) { if (IsCasting() || m_fRecastTime > 0.0f) { return false; } - } else //ijõ۾ .. + } else //캐스팅동작없는 마법.. { if (m_dwCastingStateNonAction != 0 || m_fRecastTimeNonAction > 0.0f) { return false; @@ -1070,14 +1070,14 @@ bool CMagicSkillMng::MsgSend_MagicProcess(int iTargetID, __TABLE_UPC_SKILL * pSk if (!CheckValidCondition(iTargetID, pSkill)) { return false; } - //TRACE(" state : %d time %.2f\n", s_pPlayer->State(), CN3Base::TimeGet()); - // ų Ǵ ˻ ... + //TRACE("마법성공 state : %d time %.2f\n", s_pPlayer->State(), CN3Base::TimeGet()); + // 스킬 쓸 조건이 되는지 검사 끝... /////////////////////////////////////////////////////////////////////////////////// __InfoPlayerBase * pInfoBase = &(s_pPlayer->m_InfoBase); __InfoPlayerMySelf * pInfoExt = &(s_pPlayer->m_InfoExt); CPlayerBase * pTarget = m_pGameProcMain->CharacterGetByID(iTargetID, false); - //Ÿ ʱȭ.. + //지역마법타겟 초기화.. CGameProcedure::s_pFX->Stop(s_pPlayer->IDNumber(), s_pPlayer->IDNumber(), m_iMyRegionTargetFXID, m_iMyRegionTargetFXID, true); m_dwRegionMagicState = 0; @@ -1090,9 +1090,9 @@ bool CMagicSkillMng::MsgSend_MagicProcess(int iTargetID, __TABLE_UPC_SKILL * pSk } // - // if(!pTarget) return false;//ӽ ϴ ׾ ִٸ Ѵ. + // if(!pTarget) return false;//임시 일단 죽어 있다면 리턴을 한다. - float fDist = s_pPlayer->Radius() + 1.0f; // Ÿ.. + float fDist = s_pPlayer->Radius() + 1.0f; // 공격 거리제한.. if (pTarget) { fDist += pTarget->Radius(); } @@ -1139,7 +1139,7 @@ bool CMagicSkillMng::MsgSend_MagicProcess(int iTargetID, __TABLE_UPC_SKILL * pSk } StartSkillMagicAtTargetPacket(pSkill, (short)pTarget->IDNumber()); return true; - } else if (pInfo) //Ÿ Ƽ鿡 ... + } else if (pInfo) //거리에 상관없이 파티원들에게 쓸때... { StartSkillMagicAtTargetPacket(pSkill, (short)pInfo->iID); return true; @@ -1191,9 +1191,9 @@ bool CMagicSkillMng::MsgSend_MagicProcess(int iTargetID, __TABLE_UPC_SKILL * pSk case SKILLMAGIC_TARGET_AREA_ALL: { m_dwRegionMagicState = 1; m_dwRegionSkill = (*pSkill); - // CGameProcedure::s_pFX->TriggerBundle(s_pPlayer->IDNumber(), 0, m_iMyRegionTargetFXID, m_pGameProcMain->m_vMouseLBClickedPos, m_iMyRegionTargetFXID); //ݹ... + // CGameProcedure::s_pFX->TriggerBundle(s_pPlayer->IDNumber(), 0, m_iMyRegionTargetFXID, m_pGameProcMain->m_vMouseLBClickedPos, m_iMyRegionTargetFXID); //전격무기... CGameProcedure::s_pFX->TriggerBundle(s_pPlayer->IDNumber(), 0, m_iMyRegionTargetFXID, - m_pGameProcMain->m_vMouseSkillPos, m_iMyRegionTargetFXID); //ݹ... + m_pGameProcMain->m_vMouseSkillPos, m_iMyRegionTargetFXID); //전격무기... return true; } case SKILLMAGIC_TARGET_DEAD_FRIEND_ONLY: { @@ -1214,7 +1214,7 @@ bool CMagicSkillMng::MsgSend_MagicProcess(int iTargetID, __TABLE_UPC_SKILL * pSk } bool CMagicSkillMng::CheckValidDistance(__TABLE_UPC_SKILL * pSkill, __Vector3 vTargetPos, float fTargetRadius) { - float fDist = (vTargetPos - s_pPlayer->Position()).Magnitude(); // Ÿ ϰ.. + float fDist = (vTargetPos - s_pPlayer->Position()).Magnitude(); // 공격 거리를 구하고.. if (pSkill->iValidDist > 0 && fDist <= (pSkill->iValidDist + fTargetRadius + 1.0f)) { return true; @@ -1231,7 +1231,7 @@ bool CMagicSkillMng::CheckValidDistance(__TABLE_UPC_SKILL * pSkill, __Vector3 vT } } - //ȭ.... + //화살쏠때.... if (pSkill->dw1stTableType == 2 || pSkill->dw2ndTableType == 2) { __IconItemSkill * pItemIcon1 = m_pGameProcMain->m_pUIInventory->m_pMySlot[ITEM_SLOT_HAND_LEFT]; __IconItemSkill * pItemIcon2 = m_pGameProcMain->m_pUIInventory->m_pMySlot[ITEM_SLOT_HAND_RIGHT]; @@ -1286,7 +1286,7 @@ void CMagicSkillMng::StartSkillMagicAtPosPacket(__TABLE_UPC_SKILL * pSkill, __Ve } return; } - m_pGameProcMain->CommandSitDown(false, false); // Ȥö ɾ .. + m_pGameProcMain->CommandSitDown(false, false); // 혹시라도 앉아있음 일으켜 세운다.. if (pSkill->iCastTime == 0) { char szBuff[80]; @@ -1311,7 +1311,7 @@ void CMagicSkillMng::StartSkillMagicAtPosPacket(__TABLE_UPC_SKILL * pSkill, __Ve CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. return; } @@ -1365,7 +1365,7 @@ void CMagicSkillMng::StartSkillMagicAtPosPacket(__TABLE_UPC_SKILL * pSkill, __Ve CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. if (pSkill->iTarget == SKILLMAGIC_TARGET_ENEMY_ONLY) { m_pGameProcMain->PlayBGM_Battle(); @@ -1395,7 +1395,7 @@ void CMagicSkillMng::StartSkillMagicAtTargetPacket(__TABLE_UPC_SKILL * pSkill, s return; } - m_pGameProcMain->CommandSitDown(false, false); // Ȥö ɾ .. + m_pGameProcMain->CommandSitDown(false, false); // 혹시라도 앉아있음 일으켜 세운다.. if ((pSkill->dw1stTableType == 1 || pSkill->dw2ndTableType == 1) && pSkill->iCastTime == 0) { CPlayerBase * pTarget = m_pGameProcMain->CharacterGetByID(TargetID, true); @@ -1403,19 +1403,19 @@ void CMagicSkillMng::StartSkillMagicAtTargetPacket(__TABLE_UPC_SKILL * pSkill, s return; } - //ٷ skill ..^^ - //casting packet ʰ..ٷ effect packet .. + //바로 skill로 들어가..^^ + //casting packet은 보내지 않고..바로 effect packet을 보낸다.. - // ִϸ̼ 尡...=^^= - //ȿ 尡.. + //기술 애니메이션 드가...=^^= + //효과있으면 같이 드가.. __TABLE_UPC_SKILL_TYPE_1 * pType1 = m_pTbl_Type_1->Find(pSkill->dwID); if (!pType1) { return; } - // ˱ ٲپ ش.. - // D3DCOLOR crTrace = TraceColorGet(pSkill); // ų ˱ Ѵ.. - // s_pPlayer->PlugTraceColorRemake(crTrace); // ˱ .. + // 검기 색을 바꾸어 준다.. + // D3DCOLOR crTrace = TraceColorGet(pSkill); // 스킬의 종류에 따라 검기의 색을 정한다.. + // s_pPlayer->PlugTraceColorRemake(crTrace); // 검기 색 적용.. s_pPlayer->RotateTo(pTarget); s_pPlayer->m_iSkillStep = 1; @@ -1427,7 +1427,7 @@ void CMagicSkillMng::StartSkillMagicAtTargetPacket(__TABLE_UPC_SKILL * pSkill, s m_iComboSkillID = pSkill->dwID; for (int i = 0; i < pType1->iNumCombo; i++) { - bool bImmediately = ((0 == i) ? true : false); // ó ٷ ִ´.. + bool bImmediately = ((0 == i) ? true : false); // 처음건 바로 넣는다.. s_pPlayer->AnimationAdd((e_Ani)pType1->iAct[i], bImmediately); } @@ -1453,7 +1453,7 @@ void CMagicSkillMng::StartSkillMagicAtTargetPacket(__TABLE_UPC_SKILL * pSkill, s CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. return; } @@ -1480,12 +1480,12 @@ void CMagicSkillMng::StartSkillMagicAtTargetPacket(__TABLE_UPC_SKILL * pSkill, s CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. return; } ///////////////////////////////////////////////////////////// - // Ŷ 鼭 ׳ ó.. + //내껀 패킷 보내면서 그냥 처리.. s_pPlayer->m_dwMagicID = pSkill->dwID; s_pPlayer->m_fCastingTime = 0.0f; m_iTarget = TargetID; @@ -1533,7 +1533,7 @@ void CMagicSkillMng::StartSkillMagicAtTargetPacket(__TABLE_UPC_SKILL * pSkill, s CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. if (pSkill->iTarget == SKILLMAGIC_TARGET_ENEMY_ONLY) { m_pGameProcMain->PlayBGM_Battle(); @@ -1543,7 +1543,7 @@ void CMagicSkillMng::StartSkillMagicAtTargetPacket(__TABLE_UPC_SKILL * pSkill, s } // -// ij ̸ ɽ óؾߵǰ, flyingȿ ó.. +// 내가 캐스팅 중이면 케스팅 처리해야되고, flying효과도 처리.. // void CMagicSkillMng::Tick() { m_fRecastTime -= CN3Base::s_fSecPerFrm; @@ -1609,7 +1609,7 @@ void CMagicSkillMng::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. m_dwCastingStateNonAction = 0; m_fCastTimeNonAction = 0.0f; @@ -1641,7 +1641,7 @@ void CMagicSkillMng::SuccessCast(__TABLE_UPC_SKILL * pSkill, CPlayerBase * pTarg CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)N3_SP_MAGIC_EFFECTING); } else { CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)N3_SP_MAGIC_FLYING); - if (pSkill->dw1stTableType == 2 || pSkill->dw2ndTableType == 2) //ȭ.. + if (pSkill->dw1stTableType == 2 || pSkill->dw2ndTableType == 2) //화살쏘기.. { int iNumArrow = 1; __TABLE_UPC_SKILL_TYPE_2 * pType2 = m_pTbl_Type_2->Find(pSkill->dwID); @@ -1656,11 +1656,11 @@ void CMagicSkillMng::SuccessCast(__TABLE_UPC_SKILL * pSkill, CPlayerBase * pTarg } if (pSkill->dw1stTableType == 1 || pSkill->dw2ndTableType == 1) { - //ٷ skill ..^^ - //casting packet ʰ..ٷ effect packet .. + //바로 skill로 들어가..^^ + //casting packet은 보내지 않고..바로 effect packet을 보낸다.. - // ִϸ̼ 尡...=^^= - //ȿ 尡.. + //기술 애니메이션 드가...=^^= + //효과있으면 같이 드가.. __TABLE_UPC_SKILL_TYPE_1 * pType1 = m_pTbl_Type_1->Find(pSkill->dwID); if (!pType1) { return; @@ -1673,7 +1673,7 @@ void CMagicSkillMng::SuccessCast(__TABLE_UPC_SKILL * pSkill, CPlayerBase * pTarg m_iNumStep = pType1->iNumCombo; for (int i = 0; i < pType1->iNumCombo; i++) { - bool bImmediately = ((0 == i) ? true : false); // ó ٷ ִ´.. + bool bImmediately = ((0 == i) ? true : false); // 처음건 바로 넣는다.. s_pPlayer->AnimationAdd((const e_Ani)pType1->iAct[i], bImmediately); } @@ -1699,7 +1699,7 @@ void CMagicSkillMng::SuccessCast(__TABLE_UPC_SKILL * pSkill, CPlayerBase * pTarg CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. } else { char szBuff[80]; std::string buff; @@ -1718,15 +1718,15 @@ void CMagicSkillMng::SuccessCast(__TABLE_UPC_SKILL * pSkill, CPlayerBase * pTarg CAPISocket::MP_AddShort(byBuff, iOffset, (short)m_vTargetPos.y); CAPISocket::MP_AddShort(byBuff, iOffset, (short)m_vTargetPos.z); - CAPISocket::MP_AddShort(byBuff, iOffset, (short)idx); //flying̶ idx... + CAPISocket::MP_AddShort(byBuff, iOffset, (short)idx); //flying이라면 idx... CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. if (pSkill->iFlyingFX != 0) { //////////////////////////////////////////////////// - //flyingóϱ.. + //flying처리하기.. int SourceID = s_pPlayer->IDNumber(); s_pPlayer->m_iMagicAni = pSkill->iSelfAnimID2; @@ -1746,7 +1746,7 @@ void CMagicSkillMng::SuccessCast(__TABLE_UPC_SKILL * pSkill, CPlayerBase * pTarg CGameProcedure::s_pFX->Stop(SourceID, SourceID, pSkill->iSelfFX1, -1, true); CGameProcedure::s_pFX->Stop(SourceID, SourceID, pSkill->iSelfFX1, -2, true); - if (pSkill->dw1stTableType == 2 || pSkill->dw2ndTableType == 2) //ȭ.. + if (pSkill->dw1stTableType == 2 || pSkill->dw2ndTableType == 2) //화살쏘기.. { short Data[6] = {m_vTargetPos.x, m_vTargetPos.y, m_vTargetPos.z, idx, 0, 0}; FlyingType2(pSkill, SourceID, m_iTarget, Data); @@ -1803,20 +1803,20 @@ void CMagicSkillMng::FailCast(__TABLE_UPC_SKILL * pSkill) { CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. } void CMagicSkillMng::ProcessCasting() { - //ij ó.. + //캐스팅 처리.. if (s_pPlayer->m_dwMagicID != 0xffffffff) { __TABLE_UPC_SKILL * pSkill = s_pTbl_Skill->Find(s_pPlayer->m_dwMagicID); CPlayerBase * pTarget = m_pGameProcMain->CharacterGetByID(m_iTarget, true); if (pTarget) { - s_pPlayer->RotateTo(pTarget); // ϴ Ÿ .. + s_pPlayer->RotateTo(pTarget); // 일단 타겟을 향해 방향을 돌린다.. } - //ij Ϸ... + //캐스팅 성공적으로 완료... float fCastingTime = ((float)pSkill->iCastTime) / 10.0f * s_pPlayer->m_fAttackDelta; if (pSkill) { @@ -1827,7 +1827,7 @@ void CMagicSkillMng::ProcessCasting() { bSuccess = true; } - //ij ... + //캐스팅 실패... if (bSuccess == false && (s_pPlayer->State() != PSA_SPELLMAGIC || s_pPlayer->StateMove() != PSM_STOP)) { FailCast(pSkill); } @@ -1838,10 +1838,10 @@ void CMagicSkillMng::ProcessCasting() { } void CMagicSkillMng::ProcessCombo() { - // ޺ ϳ ٸ...=^^= + //만약 콤보동작중 하나의 동작이 끝났다면...=^^= if (m_fComboTime > (s_pPlayer->m_fAttackDelta * 1.2f)) //s_pPlayer->IsAnimationChange()) { - if (m_iCurrStep == m_iNumStep) //޺ .. + if (m_iCurrStep == m_iNumStep) //콤보공격 끝났다.. { __TABLE_UPC_SKILL * pSkill = s_pTbl_Skill->Find(m_iComboSkillID); if (pSkill) { @@ -1862,7 +1862,7 @@ void CMagicSkillMng::MobCasting(__TABLE_UPC_SKILL * pSkill, int iSourceID) { return; } - //ij Ϸ... + //캐스팅 성공적으로 완료... BYTE byBuff[32]; int iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)N3_MAGIC); @@ -1872,7 +1872,7 @@ void CMagicSkillMng::MobCasting(__TABLE_UPC_SKILL * pSkill, int iSourceID) { CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)N3_SP_MAGIC_EFFECTING); } else { CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)N3_SP_MAGIC_FLYING); - if (pSkill->dw1stTableType == 2 || pSkill->dw2ndTableType == 2) //ȭ.. + if (pSkill->dw1stTableType == 2 || pSkill->dw2ndTableType == 2) //화살쏘기.. { int iNumArrow = 1; __TABLE_UPC_SKILL_TYPE_2 * pType2 = m_pTbl_Type_2->Find(pSkill->dwID); @@ -1894,11 +1894,11 @@ void CMagicSkillMng::MobCasting(__TABLE_UPC_SKILL * pSkill, int iSourceID) { CAPISocket::MP_AddShort(byBuff, iOffset, (short)m_vTargetPos.y); CAPISocket::MP_AddShort(byBuff, iOffset, (short)m_vTargetPos.z); - CAPISocket::MP_AddShort(byBuff, iOffset, (short)idx); //flying̶ idx... + CAPISocket::MP_AddShort(byBuff, iOffset, (short)idx); //flying이라면 idx... CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. } void CMagicSkillMng::MsgRecv_Casting(DataPack * pDataPack, int & iOffset) { @@ -1935,9 +1935,9 @@ void CMagicSkillMng::MsgRecv_Casting(DataPack * pDataPack, int & iOffset) { return; } - // ... + //내가 쓸때... if (iSourceID == s_pPlayer->IDNumber()) { - m_pGameProcMain->CommandSitDown(false, false); // Ȥö ɾ .. + m_pGameProcMain->CommandSitDown(false, false); // 혹시라도 앉아있음 일으켜 세운다.. s_pPlayer->m_dwMagicID = dwMagicID; s_pPlayer->m_fCastingTime = 0.0f; @@ -1945,9 +1945,9 @@ void CMagicSkillMng::MsgRecv_Casting(DataPack * pDataPack, int & iOffset) { m_vTargetPos = vTargetPos; } - //Ͱ ... + //몬스터가 나를 향해 쏠때... if (s_pOPMgr->NPCGetByID(iSourceID, true)) { - pPlayer->RotateTo((CPlayerBase *)s_pPlayer); // ̳ ٶ󺻴. + pPlayer->RotateTo((CPlayerBase *)s_pPlayer); // 이넘을 바라본다. pPlayer->m_iIDTarget = iTargetID; pPlayer->ActionMove(PSM_STOP); pPlayer->m_iMagicAni = pSkill->iSelfAnimID1; @@ -2040,7 +2040,7 @@ void CMagicSkillMng::MsgRecv_Flying(DataPack * pDataPack, int & iOffset) { CGameProcedure::s_pFX->Stop(iSourceID, iSourceID, pSkill->iSelfFX1, -1, true); CGameProcedure::s_pFX->Stop(iSourceID, iSourceID, pSkill->iSelfFX1, -2, true); - if (pSkill->dw1stTableType == 2 || pSkill->dw2ndTableType == 2) //ȭ.. + if (pSkill->dw1stTableType == 2 || pSkill->dw2ndTableType == 2) //화살쏘기.. { FlyingType2(pSkill, iSourceID, iTargetID, Data); return; @@ -2087,7 +2087,7 @@ void CMagicSkillMng::MsgRecv_Effecting(DataPack * pDataPack, int & iOffset) { ////common.....////////////////////////////////////////////////////////////// if (pPlayer && iSourceID != s_pPlayer->IDNumber() && pPlayer->State() == PSA_SPELLMAGIC) { - pPlayer->m_iMagicAni = pSkill->iSelfAnimID2; //ȭ ... + pPlayer->m_iMagicAni = pSkill->iSelfAnimID2; //화살놓는 동작... pPlayer->m_fCastFreezeTime = 0.0f; pPlayer->Action(PSA_SPELLMAGIC, false); pPlayer->m_iSkillStep = 0; @@ -2097,7 +2097,7 @@ void CMagicSkillMng::MsgRecv_Effecting(DataPack * pDataPack, int & iOffset) { CGameProcedure::s_pFX->Stop(iSourceID, iSourceID, pSkill->iSelfFX1, -2, true); if (pSkill->dw1stTableType == 1 || - pSkill->dw2ndTableType == 1) // Ÿ1ΰ ų̾..޺ ־.. Ưϰ ؾߵ.. + pSkill->dw2ndTableType == 1) // 타입1인경우 걍 스킬이야..콤보도 껴있어..좀 특별하게 관리해야돼.. { if (!EffectingType1(dwMagicID, iSourceID, iTargetID, Data)) { return; @@ -2118,7 +2118,7 @@ void CMagicSkillMng::MsgRecv_Effecting(DataPack * pDataPack, int & iOffset) { if (pSkill->iFlyingFX != 0 && (pSkill->iTarget < SKILLMAGIC_TARGET_AREA_ENEMY || pSkill->iTarget > SKILLMAGIC_TARGET_AREA)) { - return; //ö ִ ȿ fail óѴ.. + return; //플라잉이 있는 마법의 경우는 효과를 fail에서 처리한다.. } if (iTargetID == -1) { @@ -2172,7 +2172,7 @@ void CMagicSkillMng::MsgRecv_Fail(DataPack * pDataPack, int & iOffset) { if (iSourceID == s_pPlayer->IDNumber()) { s_pPlayer->m_dwMagicID = 0xffffffff; - m_pGameProcMain->CommandSitDown(false, false); // Ȥö ɾ .. + m_pGameProcMain->CommandSitDown(false, false); // 혹시라도 앉아있음 일으켜 세운다.. std::string buff; ::_LoadStringFromResource(IDS_MSG_FMT_TARGET_ATTACK_FAILED, buff); @@ -2194,7 +2194,7 @@ void CMagicSkillMng::MsgRecv_Fail(DataPack * pDataPack, int & iOffset) { if (iSourceID == s_pPlayer->IDNumber()) { s_pPlayer->m_dwMagicID = 0xffffffff; - m_pGameProcMain->CommandSitDown(false, false); // Ȥö ɾ .. + m_pGameProcMain->CommandSitDown(false, false); // 혹시라도 앉아있음 일으켜 세운다.. std::string buff; ::_LoadStringFromResource(IDS_SKILL_FAIL_EFFECTING, buff); @@ -2205,7 +2205,7 @@ void CMagicSkillMng::MsgRecv_Fail(DataPack * pDataPack, int & iOffset) { return; } - if (Data[3] == SKILLMAGIC_FAIL_CASTING) // ij ̴.. + if (Data[3] == SKILLMAGIC_FAIL_CASTING) // 캐스팅 실패인 것이다.. { CGameProcedure::s_pFX->Stop(iSourceID, iSourceID, pSkill->iSelfFX1, -1, true); CGameProcedure::s_pFX->Stop(iSourceID, iSourceID, pSkill->iSelfFX1, -2, true); @@ -2217,7 +2217,7 @@ void CMagicSkillMng::MsgRecv_Fail(DataPack * pDataPack, int & iOffset) { if (iSourceID == s_pPlayer->IDNumber()) { s_pPlayer->m_dwMagicID = 0xffffffff; - m_pGameProcMain->CommandSitDown(false, false); // Ȥö ɾ .. + m_pGameProcMain->CommandSitDown(false, false); // 혹시라도 앉아있음 일으켜 세운다.. std::string buff; ::_LoadStringFromResource(IDS_SKILL_FAIL_CASTING, buff); @@ -2226,7 +2226,7 @@ void CMagicSkillMng::MsgRecv_Fail(DataPack * pDataPack, int & iOffset) { return; } - if (Data[3] == SKILLMAGIC_FAIL_KILLFLYING) //flyingȿ ̰..ڸ Ÿȿ ض.. + if (Data[3] == SKILLMAGIC_FAIL_KILLFLYING) //flying효과 죽이고..그자리에 타겟효과 해라.. { if (iSourceID == s_pPlayer->IDNumber() || ((iTargetID == s_pPlayer->IDNumber() && s_pOPMgr->NPCGetByID(iSourceID, false) != NULL))) { @@ -2260,7 +2260,7 @@ void CMagicSkillMng::MsgRecv_Fail(DataPack * pDataPack, int & iOffset) { return; } - if (Data[3] == SKILLMAGIC_FAIL_ENDCOMBO) //combo. + if (Data[3] == SKILLMAGIC_FAIL_ENDCOMBO) //combo끝났다. { if (pPlayer) { pPlayer->m_iSkillStep = 0; @@ -2268,12 +2268,12 @@ void CMagicSkillMng::MsgRecv_Fail(DataPack * pDataPack, int & iOffset) { return; } - //׿ stop ʿѰ .. - //׶... + //그외 stop이 필요한게 있을꺼야.. + //그땐... //CGameProcedure::s_pFX->Stop(iSourceID, iTargetID, pSkill->iSelfFX, 0); } -//type4 .. +//type4 해제.. void CMagicSkillMng::MsgRecv_BuffType(DataPack * pDataPack, int & iOffset) { int iBuffType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); __InfoPlayerBase * pInfoBase = &(s_pPlayer->m_InfoBase); @@ -2313,7 +2313,7 @@ void CMagicSkillMng::MsgRecv_BuffType(DataPack * pDataPack, int & iOffset) { case BUFFTYPE_SPEED: s_pPlayer->m_fMoveDelta /= m_fSpeed; m_fSpeed = 1.0f; - //TRACE("Ʈ . MoveDelta = %f\n", s_pPlayer->m_fMoveDelta); + //TRACE("스프린트 해제. MoveDelta = %f\n", s_pPlayer->m_fMoveDelta); break; case BUFFTYPE_ABILITY: pInfoExt->iStrength_Delta -= m_iStr; @@ -2380,11 +2380,11 @@ void CMagicSkillMng::FlyingType2(__TABLE_UPC_SKILL * pSkill, int iSourceID, int int LeftItem = pPlayer->ItemClass_LeftHand() / 10; int RightItem = pPlayer->ItemClass_RightHand() / 10; - if (LeftItem == (ITEM_CLASS_BOW / 10)) //Ȱ̴.. + if (LeftItem == (ITEM_CLASS_BOW / 10)) //활이닷.. { __Vector3 vPos = pPlayer->Position(); CN3Base::s_SndMgr.PlayOnceAndRelease(ID_SOUND_SKILL_THROW_ARROW, &vPos); - } else if (RightItem == (ITEM_CLASS_JAVELIN / 10)) //â̴...pla + } else if (RightItem == (ITEM_CLASS_JAVELIN / 10)) //투창이닷...pla { } @@ -2405,7 +2405,7 @@ void CMagicSkillMng::FlyingType2(__TABLE_UPC_SKILL * pSkill, int iSourceID, int __Vector3 vTargetPos3; __Matrix44 mtx; for (int i = 1; i <= NumArrow; i++) { - float fAng = (__PI * (float)i) / 12.0f; // 15 ... + float fAng = (__PI * (float)i) / 12.0f; // 15도 씩 나눠서... mtx.Identity(); mtx.RotationY(-fAng); @@ -2434,7 +2434,7 @@ void CMagicSkillMng::FlyingType2(__TABLE_UPC_SKILL * pSkill, int iSourceID, int __Vector3 vTargetPos3; __Matrix44 mtx; for (int i = 1; i <= NumArrow; i++) { - float fAng = (__PI * (float)i) / 12.0f; // 15 ... + float fAng = (__PI * (float)i) / 12.0f; // 15도 씩 나눠서... mtx.Identity(); mtx.RotationY(-fAng); @@ -2464,7 +2464,7 @@ void CMagicSkillMng::FlyingType2(__TABLE_UPC_SKILL * pSkill, int iSourceID, int __Vector3 vTargetPos3; __Matrix44 mtx; for (int i = 1; i <= NumArrow; i++) { - float fAng = (__PI * (float)i) / 12.0f; // 15 ... + float fAng = (__PI * (float)i) / 12.0f; // 15도 씩 나눠서... mtx.Identity(); mtx.RotationY(-fAng); @@ -2492,23 +2492,23 @@ void CMagicSkillMng::FlyingType2(__TABLE_UPC_SKILL * pSkill, int iSourceID, int bool CMagicSkillMng::EffectingType1(DWORD dwMagicID, int iSourceID, int iTargetID, short * pData) { CPlayerBase * pTarget = m_pGameProcMain->CharacterGetByID(iTargetID, false); if (pTarget) { - if (iSourceID != s_pPlayer->IDNumber()) // ų .. + if (iSourceID != s_pPlayer->IDNumber()) // 내가 스킬을 쓸때.. { __TABLE_UPC_SKILL_TYPE_1 * pType1 = m_pTbl_Type_1->Find(dwMagicID); if (pType1) { CPlayerBase * pPlayer = m_pGameProcMain->CharacterGetByID(iSourceID, true); __ASSERT(pPlayer, "NULL Player Pointer!!"); if (pPlayer) { - // ˱ ٲپ ش.. + // 검기 색을 바꾸어 준다.. // __TABLE_UPC_SKILL* pSkill = s_pTbl_Skill->Find(dwMagicID); - // D3DCOLOR crTrace = TraceColorGet(pSkill); // ų ˱ Ѵ.. - // pPlayer->PlugTraceColorRemake(crTrace); // ˱ .. + // D3DCOLOR crTrace = TraceColorGet(pSkill); // 스킬의 종류에 따라 검기의 색을 정한다.. + // pPlayer->PlugTraceColorRemake(crTrace); // 검기 색 적용.. pPlayer->RotateTo(pTarget); pPlayer->m_iSkillStep = 1; for (int i = 0; i < pType1->iNumCombo; i++) { - bool bImmediately = ((0 == i) ? true : false); // ó ٷ ִ´.. + bool bImmediately = ((0 == i) ? true : false); // 처음건 바로 넣는다.. pPlayer->AnimationAdd((const e_Ani)pType1->iAct[i], bImmediately); } } @@ -2523,7 +2523,7 @@ bool CMagicSkillMng::EffectingType1(DWORD dwMagicID, int iSourceID, int iTargetI CPlayerBase* pTarget = m_pGameProcMain->CharacterGetByID(iTargetID, false); if(pTarget) { - if(iSourceID == s_pPlayer->IDNumber()) // ų .. + if(iSourceID == s_pPlayer->IDNumber()) // 내가 스킬을 쓸때.. { __TABLE_UPC_SKILL_TYPE_1* pType1 = m_pTbl_Type_1->Find(dwMagicID); @@ -2552,14 +2552,14 @@ bool CMagicSkillMng::EffectingType1(DWORD dwMagicID, int iSourceID, int iTargetI CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. //m_iActionState[pData[0]-1] = -1; } } m_iResult[pData[0]-1] = pData[1]; }// end of if(pType1 && pData[0] <= pType1->iNumCombo) } - else if(pData[0]==1) // ٸ ų + else if(pData[0]==1) // 다른 유저가 스킬을 쓸때 { __TABLE_UPC_SKILL_TYPE_1* pType1 = m_pTbl_Type_1->Find(dwMagicID); if(pType1) @@ -2568,17 +2568,17 @@ bool CMagicSkillMng::EffectingType1(DWORD dwMagicID, int iSourceID, int iTargetI __ASSERT(pPlayer, "NULL Player Pointer!!"); if(pPlayer) { - // ˱ ٲپ ش.. + // 검기 색을 바꾸어 준다.. // __TABLE_UPC_SKILL* pSkill = s_pTbl_Skill->Find(dwMagicID); -// D3DCOLOR crTrace = TraceColorGet(pSkill); // ų ˱ Ѵ.. -// pPlayer->PlugTraceColorRemake(crTrace); // ˱ .. +// D3DCOLOR crTrace = TraceColorGet(pSkill); // 스킬의 종류에 따라 검기의 색을 정한다.. +// pPlayer->PlugTraceColorRemake(crTrace); // 검기 색 적용.. pPlayer->RotateTo(pTarget); pPlayer->m_iSkillStep = 1; for(int i=0;iiNumCombo;i++) { - bool bImmediately = ((0 == i) ? true : false); // ó ٷ ִ´.. + bool bImmediately = ((0 == i) ? true : false); // 처음건 바로 넣는다.. pPlayer->AnimationAdd((const e_Ani)pType1->iAct[i], bImmediately); } } @@ -2643,7 +2643,7 @@ void CMagicSkillMng::EffectingType4(DWORD dwMagicID) { m_pGameProcMain->m_pUIStateBarAndMiniMap->AddMagic(pSkill, (float)pType4->iDuration); m_ListBuffTypeID.insert(stlmultimapVAL_INT_DWORD(pType4->iBuffType, dwMagicID)); - // Ÿ ߺ ... ͸ ȿ.. + //같은 버프타입의 마법은 중복사용할 수 없다...먼저 사용된 것만 유효.. if (pType4) { switch (pType4->iBuffType) { case BUFFTYPE_MAXHP: @@ -2745,14 +2745,14 @@ void CMagicSkillMng::EffectingType4(DWORD dwMagicID) { } // -// ų̳ ε ־ Ѵ.. -// ̰ ε ִ Լ.. +// 내가 쓰는 스킬이나 마법은 내가 인덱스를 넣어서 관리한다.. +// 이건 인덱스 넣는 함수.. // int CMagicSkillMng::AddIdx(DWORD MagicID, int iNum) { int idx = 0; std::map::iterator it; - //Ǵ index Ѳ .. + //연결되는 index를 여러개 한꺼번에 만드는 경우.. if (iNum > 1) { if (m_MySelf.size() != 0) { it = m_MySelf.end(); @@ -2768,7 +2768,7 @@ int CMagicSkillMng::AddIdx(DWORD MagicID, int iNum) { return idx; } - //׳ ϳ ε .. + //그냥 하나의 인덱스만 만드는 경우.. for (it = m_MySelf.begin(); it != m_MySelf.end(); it++) { if (it->first == idx) { idx++; @@ -2821,7 +2821,7 @@ void CMagicSkillMng::InitType4() { } // -// ̰ ε ϴ Լ.. +// 이건 인덱스 제거하는 함수.. // void CMagicSkillMng::RemoveIdx(int idx) { m_MySelf.erase(idx); @@ -2832,29 +2832,29 @@ DWORD CMagicSkillMng::GetMagicID(int idx) { return it->second; } -D3DCOLOR CMagicSkillMng::TraceColorGet(__TABLE_UPC_SKILL * pSkill) // ų ˱ Ѵ.. +D3DCOLOR CMagicSkillMng::TraceColorGet(__TABLE_UPC_SKILL * pSkill) // 스킬의 종류에 따라 검기의 색을 정한다.. { if (NULL == pSkill) { return 0xff404040; } D3DCOLOR crTrace = 0xffff4040; - switch (pSkill->dwNeedItem) // 䱸 ۿ ... + switch (pSkill->dwNeedItem) // 요구 아이템에 따라서... { case 1: - crTrace = 0xff808080; // ITEM_CLASS_DAGGER = 11 // ܰ(dagger) + crTrace = 0xff808080; // ITEM_CLASS_DAGGER = 11 // 단검(dagger) case 2: - crTrace = 0xff909090; // ITEM_CLASS_SWORD = 21, // Ѽհ(onehandsword) - //case : crTrace = ; // ITEM_CLASS_SWORD_2H = 22, // 3 : հ(twohandsword) + crTrace = 0xff909090; // ITEM_CLASS_SWORD = 21, // 한손검(onehandsword) + //case : crTrace = ; // ITEM_CLASS_SWORD_2H = 22, // 3 : 양손검(twohandsword) case 3: - crTrace = 0xff7070ff; // ITEM_CLASS_AXE = 31, // Ѽյ(onehandaxe) - //case : crTrace = ; // ITEM_CLASS_AXE_2H = 32, // μյ(twohandaxe) + crTrace = 0xff7070ff; // ITEM_CLASS_AXE = 31, // 한손도끼(onehandaxe) + //case : crTrace = ; // ITEM_CLASS_AXE_2H = 32, // 두손도끼(twohandaxe) case 4: - crTrace = 0xffa07070; // ITEM_CLASS_MACE = 41, // ѼŸݹ(mace) - //case : crTrace = ; // ITEM_CLASS_MACE_2H = 42, // μŸݹ(twohandmace) + crTrace = 0xffa07070; // ITEM_CLASS_MACE = 41, // 한손타격무기(mace) + //case : crTrace = ; // ITEM_CLASS_MACE_2H = 42, // 두손타격무기(twohandmace) case 5: - crTrace = 0xffff7070; // ITEM_CLASS_SPEAR = 51, // â(spear) - //case : crTrace = ; // ITEM_CLASS_POLEARM = 52, // (polearm) + crTrace = 0xffff7070; // ITEM_CLASS_SPEAR = 51, // 창(spear) + //case : crTrace = ; // ITEM_CLASS_POLEARM = 52, // 폴암(polearm) default: crTrace = 0xff4040ff; } @@ -3002,15 +3002,15 @@ void CMagicSkillMng::ClearDurationalMagic() { } void CMagicSkillMng::StopCastingByRatio() { - m_pGameProcMain->CommandSitDown(false, false); // . + m_pGameProcMain->CommandSitDown(false, false); // 일으켜 세운다. if (IsCasting()) { __TABLE_UPC_SKILL * pSkill = s_pTbl_Skill->Find(s_pPlayer->m_dwMagicID); if (pSkill) { int SuccessValue = rand() % 100; - if (SuccessValue >= pSkill->iPercentSuccess) // ų ̺ ִ Ȯ Ѵ.. + if (SuccessValue >= pSkill->iPercentSuccess) // 스킬 테이블에 있는 확률대로 실패한다.. { FailCast(pSkill); - //if( s_pPlayer->Action(PSA_BASIC, false, NULL, true); // ij , ⺻ .. + //if( s_pPlayer->Action(PSA_BASIC, false, NULL, true); // 캐스팅 취소, 기본동작으로 강제 세팅.. } } } @@ -3032,9 +3032,9 @@ void CMagicSkillMng::StunMySelf(__TABLE_UPC_SKILL_TYPE_3 * pType3) { float Prob = (30.0f + (40.0f - (40.0f * (Regist / 80.0f)))); - if (sample < (int)Prob) //... + if (sample < (int)Prob) //얼어라... { - m_pGameProcMain->CommandSitDown(false, false); // . + m_pGameProcMain->CommandSitDown(false, false); // 일으켜 세운다. s_pPlayer->Stun(STUN_TIME); } } \ No newline at end of file diff --git a/src/game/MagicSkillMng.h b/src/game/MagicSkillMng.h index 5b85f0c5..aa65c90e 100644 --- a/src/game/MagicSkillMng.h +++ b/src/game/MagicSkillMng.h @@ -31,7 +31,7 @@ class CMagicSkillMng : public CGameBase { int m_iTarget; __Vector3 m_vTargetPos; - // Ÿ ó .. + //나를 타겟으로 잡은 몬스터처리 관련.. std::map m_MobList; // int m_iMobID; DWORD m_dwMobMagicID; //related type4..... @@ -69,17 +69,17 @@ class CMagicSkillMng : public CGameBase { float m_fDelay; //related region magic... - DWORD m_dwRegionMagicState; //0:ħ..1:..2:. - __TABLE_UPC_SKILL m_dwRegionSkill; //õ ų.. + DWORD m_dwRegionMagicState; //0:마침..1:지역선택중..2:지역선택했음. + __TABLE_UPC_SKILL m_dwRegionSkill; //선택된 지역스킬.. //related non-casting action magic... - DWORD m_dwCastingStateNonAction; //0:ƹ͵ 1: ij + DWORD m_dwCastingStateNonAction; //0:아무것도 없는 평온한 상태 1: 캐스팅중 float m_fCastTimeNonAction; DWORD m_dwNonActionMagicID; int m_iNonActionMagicTarget; float m_fRecastTimeNonAction; - //.. + //지역마법.. int m_iMyRegionTargetFXID; protected: @@ -113,7 +113,7 @@ class CMagicSkillMng : public CGameBase { void StunMySelf(__TABLE_UPC_SKILL_TYPE_3 * pType3); void StopCastingByRatio(); void ClearDurationalMagic(); - D3DCOLOR TraceColorGet(__TABLE_UPC_SKILL * pSkill); // ų ˱ Ѵ.. + D3DCOLOR TraceColorGet(__TABLE_UPC_SKILL * pSkill); // 스킬의 종류에 따라 검기의 색을 정한다.. bool IsPositiveMagic(DWORD dwMagicID); bool IsCasting(); diff --git a/src/game/Main.cpp b/src/game/Main.cpp index 6e6e8e6c..6c224775 100644 --- a/src/game/Main.cpp +++ b/src/game/Main.cpp @@ -131,7 +131,7 @@ LRESULT CALLBACK WndProcMain(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar if (CGameProcedure::s_pProcMain->m_fExitCurCountDownToReach == -1.0f) { g_bActive = FALSE; CLogWriter::Write("WA_INACTIVE."); - ::PostQuitMessage(0); // â ƴϸ ñ?? + ::PostQuitMessage(0); // 창모드 아니면 팅긴다?? } else if (CGameProcedure::s_pProcMain->m_pUIChatDlg) { std::string szMsg; ::_LoadStringFromResource(IDS_EXIT_GAME_DURING_BATTLE_WARNING, szMsg); @@ -307,18 +307,18 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi N3_INFO("Game started"); ////////////////////////////// - // ǵ üŷ... + // 스피드 핵 체킹용... // DWORD dwCSHID; // HANDLE hThreadCheckSpeedHack = ::CreateThread(NULL, 0, CheckSpeedHackProc, NULL, CREATE_SUSPENDED, &dwCSHID); // ::SetThreadPriority(hThreadCheckSpeedHack, THREAD_PRIORITY_NORMAL); - // ǵ üŷ... + // 스피드 핵 체킹용... ////////////////////////////// char szPath[_MAX_PATH] = ""; GetCurrentDirectory(_MAX_PATH, szPath); CN3Base::PathSet(szPath); - // б.. + // 세팅 읽기.. char szIniPath[_MAX_PATH] = ""; lstrcpy(szIniPath, CN3Base::PathGet().c_str()); lstrcat(szIniPath, "Option.Ini"); @@ -383,10 +383,10 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi } int iSndEnable = GetPrivateProfileInt("Sound", "Enable", 1, szIniPath); - CN3Base::s_Options.bSndEnable = (iSndEnable) ? true : false; // ... + CN3Base::s_Options.bSndEnable = (iSndEnable) ? true : false; // 사운드... int iSndDuplicate = GetPrivateProfileInt("Sound", "Duplicate", 0, szIniPath); - CN3Base::s_Options.bSndDuplicated = (iSndDuplicate) ? true : false; // ... + CN3Base::s_Options.bSndDuplicated = (iSndDuplicate) ? true : false; // 사운드... int iWindowCursor = GetPrivateProfileInt("Cursor", "WindowCursor", 1, szIniPath); CN3Base::s_Options.bWindowCursor = (iWindowCursor) ? true : false; // cursor... @@ -397,46 +397,46 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi CGameProcedure::s_bWindowed = true; #endif // #if _DEBUG - // ι° .. + // 두번째 소켓으로 쓸 서브 윈도우 만들기.. HWND hWndSub = CreateSubWindow(hInstance); - ::ShowWindow(hWndSub, SW_HIDE); // ߱.. + ::ShowWindow(hWndSub, SW_HIDE); // 감추기.. - // 츦 .. + // 메인 윈도우를 만들고.. HWND hWndMain = CreateMainWindow(hInstance); if (NULL == hWndMain || NULL == hWndSub) { CLogWriter::Write("Cannot create window."); exit(-1); } - ::ShowWindow(hWndMain, nCmdShow); // ش.. + ::ShowWindow(hWndMain, nCmdShow); // 보여준다.. ::SetActiveWindow(hWndMain); - // Launcher ׷̵.. - FILE * pFile = fopen("Launcher2.exe", "r"); // ׷̵ Ұ ش.. + // Launcher 업그레이드.. + FILE * pFile = fopen("Launcher2.exe", "r"); // 업그레이드 할게 있음 해 준다.. if (pFile) { fclose(pFile); - if (::DeleteFile("Launcher.exe")) // .. + if (::DeleteFile("Launcher.exe")) // 원래 걸 지우고.. { - ::rename("Launcher2.exe", "Launcher.exe"); // ̸ ٲپ ش.. + ::rename("Launcher2.exe", "Launcher.exe"); // 이름을 바꾸어 준다.. } } - // α׷ μ ó.. - if (lpCmdLine && lstrlen(lpCmdLine) > 0 && lstrlen(lpCmdLine) < 64) // μ .. + // 프로그램 인수 처리.. + if (lpCmdLine && lstrlen(lpCmdLine) > 0 && lstrlen(lpCmdLine) < 64) // 인수로 뭔가 들어오면.. { char szService[64], szAccountTmp[64], szPWTmp[64]; sscanf(lpCmdLine, "%s %s %s", szService, szAccountTmp, szPWTmp); - if (0 == lstrcmpi(szService, "MGame")) { // α... + if (0 == lstrcmpi(szService, "MGame")) { // 엠게임 계정 로그인... CGameProcedure::s_eLogInClassification = LIC_MGAME; - } else if (0 == lstrcmpi(szService, "Daum")) { // α... + } else if (0 == lstrcmpi(szService, "Daum")) { // 다음 계정 로그인... CGameProcedure::s_eLogInClassification = LIC_DAUM; } else { CGameProcedure::s_eLogInClassification = LIC_KNIGHTONLINE; } - CGameProcedure::s_szAccount = szAccountTmp; // - CGameProcedure::s_szPassWord = szPWTmp; // . + CGameProcedure::s_szAccount = szAccountTmp; // 계정 + CGameProcedure::s_szPassWord = szPWTmp; // 비번. - if (0 == lstrcmpi(szService, "$#$%&^@!#$%#@^%&#%$&^")) { //  ... + if (0 == lstrcmpi(szService, "$#$%&^@!#$%#@^%&#%$&^운영팀전용게임")) { // 운영팀 전용 게임... CGameProcedure::s_bWindowed = true; } else { CGameProcedure::s_bWindowed = false; @@ -444,9 +444,9 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi } ////////////////////////////////////////////////////////////////////////////////////////// - // Static Member ... - CGameProcedure::StaticMemberInit(hInstance, hWndMain, hWndSub); // ı WM_DESTROY Ѵ.. - CGameProcedure::ProcActiveSet((CGameProcedure *)CGameProcedure::s_pProcLogIn); // α ν .. + // Static Member 생성... + CGameProcedure::StaticMemberInit(hInstance, hWndMain, hWndSub); // 파괴는 WM_DESTROY 에서 한다.. + CGameProcedure::ProcActiveSet((CGameProcedure *)CGameProcedure::s_pProcLogIn); // 로그인 프로시져부터 시작.. BOOL bGotMsg = FALSE; @@ -492,14 +492,14 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi #endif // #if _DEBUG ////////////////////////////// - // ǵ üŷ... + // 스피드 핵 체킹용... // ::TerminateThread(hThreadCheckSpeedHack, 0); // hThreadCheckSpeedHack = 0; // dwCSHID = 0; - // ǵ üŷ... + // 스피드 핵 체킹용... ////////////////////////////// - CGameProcedure::StaticMemberRelease(); // ...... + CGameProcedure::StaticMemberRelease(); // 모두 해제...... CN3Log::Destroy(); return msg.wParam; diff --git a/src/game/N3EffectWave2.cpp b/src/game/N3EffectWave2.cpp index 53e6c691..c37ed106 100644 --- a/src/game/N3EffectWave2.cpp +++ b/src/game/N3EffectWave2.cpp @@ -12,7 +12,7 @@ #define ATISQRT 4.94974747f -// .. Ʈ Ҵ.. +// 생성자.. 변수 디폴트값 할당.. CN3EffectWave2::CN3EffectWave2() { m_iPondMeshNum = 0; m_pCPondMesh = NULL; @@ -63,7 +63,7 @@ bool CN3EffectWave2::Load(HANDLE hFile) { ptmpPondMesh = &m_pCPondMesh[i]; int iVC; - ReadFile(hFile, &iVC, sizeof(iVC), &dwNum, NULL); // + ReadFile(hFile, &iVC, sizeof(iVC), &dwNum, NULL); // 점 갯수 ptmpPondMesh->m_iVC = iVC; /// ptmpPondMesh->m_bTick2Rand = FALSE; /// if (iVC <= 0) { @@ -72,7 +72,7 @@ bool CN3EffectWave2::Load(HANDLE hFile) { } int iWidthVertex; - ReadFile(hFile, &iWidthVertex, sizeof(iWidthVertex), &dwNum, NULL); // δ + ReadFile(hFile, &iWidthVertex, sizeof(iWidthVertex), &dwNum, NULL); // 한 라인당 점 갯수 ptmpPondMesh->m_iWidthVtx = iWidthVertex; /// ptmpPondMesh->m_iHeightVtx = iVC / iWidthVertex; /// @@ -85,9 +85,9 @@ bool CN3EffectWave2::Load(HANDLE hFile) { // XyxT2 -> XyzColorT2 Converting. ptmpPondMesh->m_pVertices = new __VertexPond[iVC]; /// ReadFile(hFile, ptmpPondMesh->m_pVertices, iVC * sizeof(__VertexPond), &dwNum, NULL); - ptmpPondMesh->m_pVertices[0].y += 0.2f; // ġ ũ 䵿ģ - ptmpPondMesh->m_pVertices[iWidthVertex].y += 0.2f; // ġ ũ 䵿ģ - ptmpPondMesh->m_pfMaxHeight = ptmpPondMesh->m_pVertices[0].y -= 0.3f; // ִġ + ptmpPondMesh->m_pVertices[0].y += 0.2f; // 수치가 높으면 물결이 크게 요동친다 + ptmpPondMesh->m_pVertices[iWidthVertex].y += 0.2f; // 수치가 높으면 물결이 크게 요동친다 + ptmpPondMesh->m_pfMaxHeight = ptmpPondMesh->m_pVertices[0].y -= 0.3f; // 물결의 최대치 ptmpPondMesh->m_pfVelocityArray = new float[iVC]; /// memset(ptmpPondMesh->m_pfVelocityArray, 0, sizeof(float) * iVC); @@ -99,7 +99,7 @@ bool CN3EffectWave2::Load(HANDLE hFile) { int iWidth = iWidthVertex, iHeight = iVC / iWidthVertex; int x = 0, y = iWidth; - WORD * indexPtr = ptmpPondMesh->m_wpIndex; // ﰢ θ ġ + WORD * indexPtr = ptmpPondMesh->m_wpIndex; // 삼각형을 부를 위치 설정 iWidth--; __VertexPond * ptVtx = ptmpPondMesh->m_pVertices; @@ -108,7 +108,7 @@ bool CN3EffectWave2::Load(HANDLE hFile) { StZ = ptVtx[0].z, EnZ = ptVtx[iHeight].z; for (int j = 0; j < iHeight; j++) { for (int k = 0; k < iWidth; k++) { - // ﰢ θ ġ + // 삼각형을 부를 위치 설정 indexPtr[0] = x; indexPtr[1] = x + 1; indexPtr[2] = y; @@ -120,7 +120,7 @@ bool CN3EffectWave2::Load(HANDLE hFile) { x++; y++; - // ִּ ġ + // 연못의 최소최대 위치 구함 if (StX > ptVtx->x) { StX = ptVtx->x; } @@ -150,7 +150,7 @@ bool CN3EffectWave2::Load(HANDLE hFile) { ptmpPondMesh->m_bTick2Rand = TRUE; /// if (m_iMaxVtxNum < iVC) { - m_iMaxVtxNum = iVC; // ū + m_iMaxVtxNum = iVC; // 가장큰 계산범위 구함 } } @@ -189,12 +189,12 @@ void CN3EffectWave2::Tick() { m_fTexIndex -= 32.0f; } - // Ӱ谪 .. + // 프레임이 임계값보다 작으면 버린다.. if (CN3Base::s_fFrmPerSec < g_EPSILON) { return; } - // Desire Frame Rate Frame .. + // Desire Frame Rate보다 Frame이 잘 나오는 경우.. if (30.0f <= CN3Base::s_fFrmPerSec) { static float ftemp = 0.0f; frame = (30.0f / CN3Base::s_fFrmPerSec) * 1.2f; @@ -204,7 +204,7 @@ void CN3EffectWave2::Tick() { ftemp -= 1.0f; } } - // Desire Frame Frame ȳ .. + // Desire Frame보다 Frame이 잘 안나오는 경우.. else { static float ftemp = 0.0f; frame = (30.0f / CN3Base::s_fFrmPerSec) * 1.2f; @@ -247,7 +247,7 @@ void CN3EffectWave2::Render() { // Set s_lpD3DDev->SetTransform(D3DTS_WORLD, &matWorld); - // texture state (alpha) + // texture state 세팅 (alpha) s_lpD3DDev->SetTexture(0, m_pTexPond[(int)m_fTexIndex]->Get()); s_lpD3DDev->SetTexture(1, m_pTexWave->Get()); s_lpD3DDev->SetTexture(2, NULL); @@ -295,20 +295,20 @@ void CN3EffectWave2::Render() { void CN3EffectWave2::UpdateWaterPositions() { CPongMesh * pPondMesh; - // Ÿ + // 기초 데이타 int x, y, n, m; float d; float tempX, tempZ; __VertexPond *pVtx, *ptmpVtx, *ptmpVtxSub, *ptmpVtxPlus; float * pForceArray, *ptmpForceArray, *ptmpFArrSub, *ptmpFArrPlus; - // + // 계산 변수 float max, min, mincal, maxcal; for (int i = 0; i < m_iPondMeshNum; i++) { pPondMesh = &m_pCPondMesh[i]; - // ̹ Ѿ + // 이번에 쓰이지 않을 경우 넘어감 if (CN3Base::s_CameraData.IsOutOfFrustum(pPondMesh->m_vCenterPo, pPondMesh->m_fRadius) == TRUE) { pPondMesh->m_bTick2Rand = FALSE; continue; @@ -317,7 +317,7 @@ void CN3EffectWave2::UpdateWaterPositions() { } // TRACE("Pond Is Chk ---------- %d \n",i); - // ʵŸ ۼ + // 기초데이타 작성 m = pPondMesh->m_iWidthVtx; n = pPondMesh->m_iHeightVtx; // max = 0.16f*pPondMesh->m_fWaterScaleX; @@ -332,7 +332,7 @@ void CN3EffectWave2::UpdateWaterPositions() { pVtx = pPondMesh->m_pVertices; pForceArray = m_pfMaxVtx; - // + // 계산 for (x = 1; x < n - 1; x++) { ptmpFArrSub = pForceArray; pForceArray += m; @@ -443,7 +443,7 @@ void CN3EffectWave2::UpdateWaterPositions() { tempX = pPondMesh->m_fWaterScaleX * 32.0f; tempZ = pPondMesh->m_fWaterScaleZ * 32.0f; - ptmpForceArray = pPondMesh->m_pfVelocityArray; // ̶ + ptmpForceArray = pPondMesh->m_pfVelocityArray; // 같은형이라 빌려씀 pForceArray = m_pfMaxVtx; pVtx = pPondMesh->m_pVertices; for (x = 0; x < pPondMesh->m_iVC; x++) { diff --git a/src/game/N3EffectWave2.h b/src/game/N3EffectWave2.h index 3856bf13..418a8225 100644 --- a/src/game/N3EffectWave2.h +++ b/src/game/N3EffectWave2.h @@ -33,19 +33,19 @@ class CN3EffectWave2 : public CN3BaseFileAccess { class CPongMesh { public: - BOOL m_bTick2Rand; // þ߿ tickrend + BOOL m_bTick2Rand; // 시야에 들어와 tick과rend를 실행결정 __VertexPond * m_pVertices; // Vertices - float * m_pfVelocityArray; // - float m_pfMaxHeight; // ̻ ö ϰ - WORD * m_wpIndex; // ׸ ׸ + float * m_pfVelocityArray; // 계산 저장 + float m_pfMaxHeight; // 물결이 어느정도 이상 올라가지 못하게 함 + WORD * m_wpIndex; // 그림을 그릴 순서 int m_iIC; // Index Buffer Count. int m_iVC; // Vertex Count. - int m_iWidthVtx, m_iHeightVtx; // 꿡 ʿ - float m_fWaterScaleX, m_fWaterScaleZ; // 꿡 ʿ + int m_iWidthVtx, m_iHeightVtx; // 계산에 필요 + float m_fWaterScaleX, m_fWaterScaleZ; // 계산에 필요 - __Vector3 m_vCenterPo; // ߰ - float m_fRadius; // + __Vector3 m_vCenterPo; // 연못의 중간지점 + float m_fRadius; // 연못의 지름 CPongMesh() { m_bTick2Rand = FALSE; @@ -69,15 +69,15 @@ class CN3EffectWave2 : public CN3BaseFileAccess { }; public: - int m_iPondMeshNum; // ü - CPongMesh * m_pCPondMesh; // + int m_iPondMeshNum; // 전체 연못의 갯수 + CPongMesh * m_pCPondMesh; // 연못의 정보 CN3Texture * m_pTexPond[MAX_POND_TEX]; CN3Texture * m_pTexWave; float m_fTexIndex; - int m_iMaxVtxNum; // vertices - float * m_pfMaxVtx; // ӽ + int m_iMaxVtxNum; // 가장 많은 vertices수 + float * m_pfMaxVtx; // 물결높이 계산을 위한 임시 public: void Release(); diff --git a/src/game/N3FXBundleGame.cpp b/src/game/N3FXBundleGame.cpp index 56a818ca..25d9a581 100644 --- a/src/game/N3FXBundleGame.cpp +++ b/src/game/N3FXBundleGame.cpp @@ -239,7 +239,7 @@ bool CN3FXBundleGame::Tick() { m_vPos += m_vDir*CN3Base::s_fSecPerFrm*m_fVelocity; float fTerrainY = s_pTerrain->GetHeight(m_vPos.x, m_vPos.z); - if(m_vPos.y <= fTerrainY) m_vPos.y = fTerrainY + 0.3f; // Ÿ 󰡶.. + if(m_vPos.y <= fTerrainY) m_vPos.y = fTerrainY + 0.3f; //땅을 타고 날라가라.. break; */ } @@ -276,7 +276,7 @@ bool CN3FXBundleGame::Tick() { m_vPos += m_vDir * CN3Base::s_fSecPerFrm * m_fVelocity; //float fTerrainY = s_pTerrain->GetHeight(m_vPos.x, m_vPos.z); - //if(m_vPos.y <= fTerrainY) m_vPos.y = fTerrainY + 0.3f; // Ÿ 󰡶.. + //if(m_vPos.y <= fTerrainY) m_vPos.y = fTerrainY + 0.3f; //땅을 타고 날라가라.. break; } @@ -296,7 +296,7 @@ bool CN3FXBundleGame::Tick() { break; } case FX_BUNDLE_REGION_POISON: { - CN3Camera * pCamera = CGameProcedure::s_pEng->CameraGetActive(); // Ȱȭ ī޶ .. + CN3Camera * pCamera = CGameProcedure::s_pEng->CameraGetActive(); // 활성화된 카메라 얻기.. __Vector3 vEyePos = pCamera->EyePos(); __Vector3 vEyeAt = pCamera->AtPos(); diff --git a/src/game/N3FXBundleGame.h b/src/game/N3FXBundleGame.h index 40615849..0a225af1 100644 --- a/src/game/N3FXBundleGame.h +++ b/src/game/N3FXBundleGame.h @@ -8,11 +8,11 @@ class CN3FXBundleGame : public CN3FXBundle { public: - int m_iID; //׿ Ƶ.. + int m_iID; //겜에서 쓰는 아디.. int m_iIdx; bool m_bRegion; - //  ...ΰ ̿Դ.. + //포물선 운동을 위한...싸인곡선 이용함다.. float m_fDistance; float m_fHeight; diff --git a/src/game/N3FXMgr.cpp b/src/game/N3FXMgr.cpp index 5e7bff85..d70763ab 100644 --- a/src/game/N3FXMgr.cpp +++ b/src/game/N3FXMgr.cpp @@ -54,7 +54,7 @@ void CN3FXMgr::TriggerBundle(int SourceID, int SourceJoint, int FXID, int Target stlMAP_BUNDLEORIGIN_IT itOrigin = m_OriginBundle.find(strTmp); - if (itOrigin != m_OriginBundle.end()) // ȿ ִ.. + if (itOrigin != m_OriginBundle.end()) //같은 효과가 있다.. { LPFXBUNDLEORIGIN pSrc = itOrigin->second; @@ -71,7 +71,7 @@ void CN3FXMgr::TriggerBundle(int SourceID, int SourceJoint, int FXID, int Target m_ListBundle.push_back(pBundle); pSrc->iNum++; - } else // ȿ .. + } else //같은 효과가 없다.. { LPFXBUNDLEORIGIN pSrc = new FXBUNDLEORIGIN; pSrc->pBundle = new CN3FXBundleGame; @@ -111,7 +111,7 @@ void CN3FXMgr::TriggerBundle(int SourceID, int SourceJoint, int FXID, __Vector3 stlMAP_BUNDLEORIGIN_IT itOrigin = m_OriginBundle.find(strTmp); - if (itOrigin != m_OriginBundle.end()) // ȿ ִ.. + if (itOrigin != m_OriginBundle.end()) //같은 효과가 있다.. { LPFXBUNDLEORIGIN pSrc = itOrigin->second; CN3FXBundleGame * pBundle = new CN3FXBundleGame; @@ -126,7 +126,7 @@ void CN3FXMgr::TriggerBundle(int SourceID, int SourceJoint, int FXID, __Vector3 pBundle->Trigger(SourceID, TargetPos, pFX->dwSoundID); m_ListBundle.push_back(pBundle); pSrc->iNum++; - } else // ȿ .. + } else //같은 효과가 없다.. { LPFXBUNDLEORIGIN pSrc = new FXBUNDLEORIGIN; pSrc->pBundle = new CN3FXBundleGame; @@ -241,7 +241,7 @@ void CN3FXMgr::Tick() { itOrigin++; } // TRACE("Origin Bundle Count : %d \n", m_OriginBundle.size()); - // TRACE("羲 ִ ȿ : %d \n", m_ListBundle.size()); + // TRACE("현재쓰고 있는 효과의 수 : %d \n", m_ListBundle.size()); stlLIST_BUNDLEGAME_IT it = m_ListBundle.begin(); //std::list::iterator it = m_ListBundle.begin(); @@ -253,7 +253,7 @@ void CN3FXMgr::Tick() { } if (pBundle->m_dwState == FX_BUNDLE_STATE_DEAD) { stlMAP_BUNDLEORIGIN_IT itOrigin = m_OriginBundle.find(pBundle->FileName()); - if (itOrigin != m_OriginBundle.end()) // ȿ ִ.. + if (itOrigin != m_OriginBundle.end()) //같은 효과가 있다.. { LPFXBUNDLEORIGIN pSrc = itOrigin->second; pSrc->iNum--; @@ -268,11 +268,11 @@ void CN3FXMgr::Tick() { continue; } - // ̰.. - //pBundle->m_iMoveType ִ üũ - //þ߱ ˻ .... Ѵٸ...view frustum ϴ° ƴ϶... - //player obj Ÿ ؼ Ÿ ̸̻ ִ ɷض.. - //浹˻ + //내가 쏜 것이고.. + //pBundle->m_iMoveType과 살아있는지를 체크한 다음 + //시야권 검사는 보류....만약 한다면...view frustum으로 하는게 아니라... + //player와 obj의 거리를 구해서 일정거리 이상이면 없애는 걸로해라.. + //충돌검사 /* if(pBundle->m_iMoveType != FX_BUNDLE_MOVE_NONE && pBundle->m_dwState==FX_BUNDLE_STATE_LIVE && @@ -287,7 +287,7 @@ void CN3FXMgr::Tick() { pBundle->Stop(); } - DWORD dwToMe = 0; //dwToMe==1̸ .. dwToMe==2̸ Ÿ.. + DWORD dwToMe = 0; //dwToMe==1이면 내가 쏜거.. dwToMe==2이면 내가 타겟.. if (s_pPlayer->IDNumber() == pBundle->m_iSourceID) { dwToMe = 1; } else if (s_pPlayer->IDNumber() == pBundle->m_iTargetID && @@ -299,7 +299,7 @@ void CN3FXMgr::Tick() { __Vector3 vCol; float fHeight = 0.5f; - // npc or player 浹üũ.. + // npc or player와 충돌체크.. bool bCol = false; it_UPC it = s_pOPMgr->m_UPCs.begin(); it_UPC itEnd = s_pOPMgr->m_UPCs.end(); @@ -334,7 +334,7 @@ void CN3FXMgr::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)N3_MAGIC); @@ -351,7 +351,7 @@ void CN3FXMgr::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, pBundle->m_iIdx); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. break; } @@ -364,7 +364,7 @@ void CN3FXMgr::Tick() { } if ((pBundle->m_vPos - pUPC->Position()).Magnitude() > 16.0f) { - continue; // 16 ̻ .. + continue; // 16 미터 이상 떨어져 있음 지나간다.. } __Vector3 vCp = pUPC->Center(); @@ -394,7 +394,7 @@ void CN3FXMgr::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)N3_MAGIC); @@ -411,7 +411,7 @@ void CN3FXMgr::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, pBundle->m_iIdx); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. break; } @@ -435,7 +435,7 @@ void CN3FXMgr::Tick() { } if ((pBundle->m_vPos - pNPC->Position()).Magnitude() > 16.0f) { - continue; // 16 ̻ .. + continue; // 16 미터 이상 떨어져 있음 지나간다.. } if (pNPC->IDNumber() == pBundle->m_iTargetID && pNPC->m_pShapeExtraRef) { @@ -467,7 +467,7 @@ void CN3FXMgr::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)N3_MAGIC); @@ -484,7 +484,7 @@ void CN3FXMgr::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, pBundle->m_iIdx); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. break; } @@ -514,7 +514,7 @@ void CN3FXMgr::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)N3_MAGIC); @@ -531,14 +531,14 @@ void CN3FXMgr::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, pBundle->m_iIdx); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. break; } } } - // Object 浹 üũ.. + // Object 와 충돌 체크.. if (bCol == false && true == ACT_WORLD->CheckCollisionWithShape(pBundle->m_vPos, pBundle->m_vDir, pBundle->m_fVelocity * CN3Base::s_fSecPerFrm, &vCol)) { @@ -565,7 +565,7 @@ void CN3FXMgr::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)N3_MAGIC); @@ -582,13 +582,13 @@ void CN3FXMgr::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, pBundle->m_iIdx); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. } - // 浹üũ.. + // 지형과 충돌체크.. if (bCol == false && ACT_WORLD->CheckCollisionWithTerrain(pBundle->m_vPos, pBundle->m_vDir, pBundle->m_fVelocity, &vCol)) { - //浹... - //⼭ Ŷ ڱ... + //충돌... + //여기서 패킷 날려야 겠구만... bCol = true; pBundle->m_vPos = vCol; pBundle->Stop(); @@ -611,7 +611,7 @@ void CN3FXMgr::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)N3_MAGIC); @@ -628,7 +628,7 @@ void CN3FXMgr::Tick() { CAPISocket::MP_AddShort(byBuff, iOffset, pBundle->m_iIdx); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. } } } @@ -641,7 +641,7 @@ void CN3FXMgr::Tick() { // // void CN3FXMgr::Render() { - //° renderstate... + //온갖 renderstate설정... DWORD dwLgt, dwAlpha, dwZEnable; DWORD dwSrcBlend, dwDestBlend; diff --git a/src/game/N3FXMgr.h b/src/game/N3FXMgr.h index ae2710a3..0cddba3a 100644 --- a/src/game/N3FXMgr.h +++ b/src/game/N3FXMgr.h @@ -16,7 +16,7 @@ class CN3FXBundleGame; -typedef struct __FXBundleOrigin // 鿡 Ʈ Ҷ.. +typedef struct __FXBundleOrigin // 번들에서 파트들 관리할때.. { class CN3FXBundleGame * pBundle; int iNum; diff --git a/src/game/N3MP3.cpp b/src/game/N3MP3.cpp index 4270b149..0a673184 100644 --- a/src/game/N3MP3.cpp +++ b/src/game/N3MP3.cpp @@ -67,7 +67,7 @@ bool CN3Mp3::Init() { void CN3Mp3::Release() { ClearGraph(); - // ̽ Ѵ + // 인터페이스들을 릴리즈 한다 if (m_pMediaEvent) { m_pMediaEvent->Release(); m_pMediaEvent = NULL; @@ -89,7 +89,7 @@ void CN3Mp3::Release() { m_pGraphBuilder = NULL; } - // COM uninitializeѴ + // COM을 uninitialize한다 CoUninitialize(); } @@ -105,10 +105,10 @@ bool CN3Mp3::ClearGraph() { IBaseFilter ** ppFilters; if (m_pMediaControl) { - m_pMediaControl->Stop(); // ָ . + m_pMediaControl->Stop(); // 연주를 멈춘다. } - // ׷ ͸ EnumFilters ͸ ´ + // 그래프 내의 모든 필터를 얻기 위해 EnumFilters 포인터를 얻는다 if (m_pGraphBuilder->EnumFilters(&pFilterEnum) != S_OK) { return false; } @@ -116,7 +116,7 @@ bool CN3Mp3::ClearGraph() { int iFiltCount = 0; int iPos = 0; - // ľ + // 필터의 갯수를 파악 while (S_OK == pFilterEnum->Skip(1)) { iFiltCount++; } @@ -125,7 +125,7 @@ bool CN3Mp3::ClearGraph() { pFilterEnum->Reset(); - // Ϳ ͸ ´ + // 필터에 대한 포인터를 모두 얻어온다 while (S_OK == pFilterEnum->Next(1, &(ppFilters[iPos++]), NULL)) { ; } @@ -135,14 +135,14 @@ bool CN3Mp3::ClearGraph() { pFilterEnum = NULL; } - // ͸ ׷ Ѵ + // 모든 필터를 그래프에서 제거한다 for (iPos = 0; iPos < iFiltCount; iPos++) { m_pGraphBuilder->RemoveFilter(ppFilters[iPos]); if (!ppFilters[iPos]) { continue; } while (ppFilters[iPos]->Release() != 0) { - ; // ref count ŭ Ѵ + ; // ref count 수 만큼 한다 } ppFilters[iPos] = NULL; } diff --git a/src/game/N3Terrain.cpp b/src/game/N3Terrain.cpp index 61395299..6b519655 100644 --- a/src/game/N3Terrain.cpp +++ b/src/game/N3Terrain.cpp @@ -111,8 +111,8 @@ CN3Terrain::~CN3Terrain() { // // MakeDistanceTable -// Ÿ ̺ ְ ̸ ̺ .. -// Ÿ.. +// 거리를 계산하지 말고 테이블에서 가져올 수 있게 미리 테이블 생성.. +// 정수 단위 거리.. // void CN3Terrain::MakeDistanceTable() { for (int x = 0; x < DISTANCE_TABLE_SIZE; x++) { @@ -263,8 +263,8 @@ void CN3Terrain::Init() { SetRectEmpty(&m_pat_BoundRect); //m_pat_Center2Side = ((int)CN3Base::s_CameraData.fFP / (PATCH_TILE_SIZE * TILE_SIZE)) + 1; - // m_pat_Center2Side = 17; // CN3Base::s_CameraData.fFP = 512 Ҷ... - m_pat_Center2Side = 33; // CN3Base::s_CameraData.fFP = 1024 Ҷ... + // m_pat_Center2Side = 17; // CN3Base::s_CameraData.fFP = 512 라고 가정할때... + m_pat_Center2Side = 33; // CN3Base::s_CameraData.fFP = 1024 라고 가정할때... m_iNumPatch = (m_pat_Center2Side << 1) + 1; @@ -310,7 +310,7 @@ void CN3Terrain::Init() { } // -// ī尡 Ÿϸ ׸ ִ ˻... +// 글픽카드가 타일맵을 그릴 수 있는지 없는지 검사... // void CN3Terrain::TestAvailableTile() { m_bAvailableTile = true; @@ -377,13 +377,13 @@ void CN3Terrain::TestAvailableTile() { // Load... // bool CN3Terrain::Load(HANDLE hFile) { - std::string szFNBackup = m_szFileName; // Init ϰ ̸ .... ׷... + std::string szFNBackup = m_szFileName; // Init 를 하고 나면 파일 이름이 없어진다.... 그래서... Init(); m_szFileName = szFNBackup; - CUILoading * pUILoading = CGameProcedure::s_pUILoading; // ε.. + CUILoading * pUILoading = CGameProcedure::s_pUILoading; // 로딩바.. if (pUILoading) { pUILoading->Render("Allocating Terrain...", 0); } @@ -461,7 +461,7 @@ bool CN3Terrain::Load(HANDLE hFile) { __ASSERT(m_pGrassAttr, "GrassAttr Data Memory Allocation Failed..-.-"); ReadFile(hFile, m_pGrassAttr, sizeof(unsigned char) * m_ti_MapSize * m_ti_MapSize, &dwRWC, NULL); - //^^vǮ ֱ...( ־..) + //^^v풀갯수 정보 넣기...(조만간 넣어라..) m_pGrassNum = (unsigned char *)GlobalAlloc(GMEM_FIXED, sizeof(unsigned char) * m_ti_MapSize * m_ti_MapSize); if (m_pGrassNum == NULL) { CLogWriter::Write("Terrain Error : GrassNum Data Memory Allocation Failed..-.-"); @@ -503,7 +503,7 @@ bool CN3Terrain::Load(HANDLE hFile) { if (pUILoading) { pUILoading->Render("Loading River Data...", 0); } - m_pRiver->Load(hFile); // ʵ ö ø ..2002.11.15 + m_pRiver->Load(hFile); // 맵데이터 올때까지만 잠시만 막자..2002.11.15 m_pPond->Load(hFile); if (pUILoading) { @@ -695,12 +695,12 @@ void CN3Terrain::LoadTileInfo(HANDLE hFile) { hTTGFile = CreateFile(SrcName[SrcIdx], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); for (int j = 0; j < TileIdx; j++) { - // m_pTileTex[i].m_iLOD = s_Options.iTexLOD_Terrain; // LOD б.. - // m_pTileTex[i].Load(hTTGFile);// տ ִ ͵... - m_pTileTex[i].SkipFileHandle(hTTGFile); // տ ִ ͵... + // m_pTileTex[i].m_iLOD = s_Options.iTexLOD_Terrain; // LOD 적용후 읽기.. + // m_pTileTex[i].Load(hTTGFile);// 앞에 있는 쓸때 없는 것들... + m_pTileTex[i].SkipFileHandle(hTTGFile); // 앞에 있는 쓸때 없는 것들... } - m_pTileTex[i].m_iLOD = s_Options.iTexLOD_Terrain; // LOD б.. - m_pTileTex[i].Load(hTTGFile); // ¥ Ÿ... + m_pTileTex[i].m_iLOD = s_Options.iTexLOD_Terrain; // LOD 적용후 읽기.. + m_pTileTex[i].Load(hTTGFile); // 진짜 타일... //loading bar... int iLoading = (i + 1) * 100 / m_NumTileTex; @@ -721,8 +721,8 @@ void CN3Terrain::LoadTileInfo(HANDLE hFile) { } // -// lod level .. -// default 3... +// lod level 설정.. +// default는 3... // min = 0, max = 10.. // bool CN3Terrain::SetLODLevel(int level) { @@ -755,7 +755,7 @@ bool CN3Terrain::SetLODLevel(int level) { // // SetBlunt... -// ġ ׸ ϱ.. Ұ.. +// 각 패치들 그릴방법 정하기..어느면을 무디게 할것인지.. // void CN3Terrain::SetBlunt() { for (int x = 0; x < m_iNumPatch; x++) { @@ -824,7 +824,7 @@ void CN3Terrain::SetBlunt() { // Tick.. // void CN3Terrain::Tick() { - int iLOD = 0; // LOD .. ߿ ٲپ Ѵ. + int iLOD = 0; // LOD 수준 계산.. 나중에 계산식을 바꾸어야 한다. iLOD = (int)(3.0f * s_CameraData.fFP / 512.0f); bool ChangeLOD = this->SetLODLevel(iLOD); @@ -854,7 +854,7 @@ void CN3Terrain::Tick() { // // CheckMovePatch -// ġ ̵ ̷ ... +// 패치단위의 이동이 이루어 졌는지... // bool CN3Terrain::CheckMovePatch() { m_ti_CenterPos.x = Real2Tile(CN3Base::s_CameraData.vEye.x); @@ -896,8 +896,8 @@ void CN3Terrain::DispositionPatch() { } } - //lightmapо ġϰ... - //ִ ... + //lightmap읽어서 배치하고... + //있던건 지우고... POINT PrevCenter = m_pat_CenterPos; m_pat_CenterPos.x = m_pat_LBPos.x + (m_iNumPatch / 2); m_pat_CenterPos.y = m_pat_LBPos.y + (m_iNumPatch / 2); @@ -1189,8 +1189,8 @@ CN3Texture * CN3Terrain::GetLightMap(int tx, int tz) { // // CheckBounce... -// ġ ÿ ˻.. -// return true... +// 패치단위의 가시영역 검사.. +// 변했으면 return true... // bool CN3Terrain::CheckBound() { RECT prevPatRc = m_pat_BoundRect; @@ -1199,17 +1199,17 @@ bool CN3Terrain::CheckBound() { rc.left = rc.right = Real2Patch(CN3Base::s_CameraData.vEye.x); rc.top = rc.bottom = Real2Patch(CN3Base::s_CameraData.vEye.z); - // ü Ϳ Far ġ .. + // 사면체의 법선 벡터와 Far 네 귀퉁이 위치 계산.. float fS = sinf(CN3Base::s_CameraData.fFOV / 2.0f); float fPL = CN3Base::s_CameraData.fFP; - float fAspect = CN3Base::s_CameraData.fAspect; // Ⱦ + float fAspect = CN3Base::s_CameraData.fAspect; // 종횡비 - // Far Plane ġ + // Far Plane 의 네 귀퉁이 위치 계산 __Vector3 vFPs[4] = {__Vector3(fPL * -fS * fAspect, fPL * fS, fPL), // LeftTop __Vector3(fPL * fS * fAspect, fPL * fS, fPL), // rightTop __Vector3(fPL * fS * fAspect, fPL * -fS, fPL), // RightBottom __Vector3(fPL * -fS * fAspect, fPL * -fS, fPL)}; // LeftBottom - // ġ ȸ Ѵ.. + // 귀퉁이 위치에 회전 행렬을 적용한다.. for (int i = 0; i < 4; i++) { vFPs[i] = vFPs[i] * CN3Base::s_CameraData.mtxViewInverse; } @@ -1355,7 +1355,7 @@ void CN3Terrain::Render() { hr = s_lpD3DDev->GetSamplerState(1, D3DSAMP_ADDRESSU, &AddressU2); hr = s_lpD3DDev->GetSamplerState(1, D3DSAMP_ADDRESSV, &AddressV2); - // ؽĵ 輱 ִ..^^ + // 각각의 텍스쳐들을 연결했을때 경계선을 없앨 수 있다..^^ hr = s_lpD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR); hr = s_lpD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR); hr = s_lpD3DDev->SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR); @@ -1398,7 +1398,7 @@ void CN3Terrain::Render() { // // Log2(x) = l.. -// 2 ¼ ؼ ۵...(x>0) +// 2의 승수에 대해서만 제대로 작동...(x>0) // inline int CN3Terrain::Log2(int x) { int l = 0; @@ -1429,20 +1429,20 @@ float CN3Terrain::GetHeight(float x, float z) { float y; float h1, h2, h3, h12, h13; - if ((ix + iz) % 2 == 0) //簢 / .. + if ((ix + iz) % 2 == 0) //사각형이 / 모양.. { h1 = m_pMapData[ix * m_ti_MapSize + iz].fHeight; h3 = m_pMapData[(ix + 1) * m_ti_MapSize + (iz + 1)].fHeight; - if (dZ > dX) // ﰢ.. + if (dZ > dX) //윗쪽 삼각형.. { h2 = m_pMapData[ix * m_ti_MapSize + (iz + 1)].fHeight; - h12 = h1 + (h2 - h1) * dZ; // h1 h2 ̰ - h13 = h1 + (h3 - h1) * dZ; // h1 h3 ̰ + h12 = h1 + (h2 - h1) * dZ; // h1과 h2사이의 높이값 + h13 = h1 + (h3 - h1) * dZ; // h1과 h3사이의 높이값 - y = h12 + ((h13 - h12) * (dX / dZ)); // ã ϴ ̰ + y = h12 + ((h13 - h12) * (dX / dZ)); // 찾고자 하는 높이값 return y; - } else //Ʒ ﰢ.. + } else //아래쪽 삼각형.. { if (dX == 0.0f) { return h1; @@ -1450,20 +1450,20 @@ float CN3Terrain::GetHeight(float x, float z) { h2 = m_pMapData[(ix + 1) * m_ti_MapSize + iz].fHeight; - h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - h13 = h1 + (h3 - h1) * dX; // h1 h3 ̰ + h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + h13 = h1 + (h3 - h1) * dX; // h1과 h3사이의 높이값 - y = h12 + ((h13 - h12) * (dZ / dX)); // ã ϴ ̰ + y = h12 + ((h13 - h12) * (dZ / dX)); // 찾고자 하는 높이값 return y; } } - else if ((ix + iz) % 2 == 1) //簢 .. + else if ((ix + iz) % 2 == 1) //사각형이 역슬레쉬 모양.. { h1 = m_pMapData[(ix + 1) * m_ti_MapSize + iz].fHeight; h3 = m_pMapData[ix * m_ti_MapSize + (iz + 1)].fHeight; - if ((dX + dZ) > 1.0f) // ﰢ.. + if ((dX + dZ) > 1.0f) //윗쪽 삼각형.. { if (dZ == 0.0f) { return h1; @@ -1475,15 +1475,15 @@ float CN3Terrain::GetHeight(float x, float z) { y = h12 + ((h13 - h12) * ((1.0f - dX) / dZ)); return y; - } else //Ʒ ﰢ.. + } else //아래쪽 삼각형.. { if (dX == 1.0f) { return h1; } h2 = m_pMapData[ix * m_ti_MapSize + iz].fHeight; - h12 = h2 + (h1 - h2) * dX; // h1 h2 ̰ - h13 = h3 + (h1 - h3) * dX; // h1 h3 ̰ + h12 = h2 + (h1 - h2) * dX; // h1과 h2사이의 높이값 + h13 = h3 + (h1 - h3) * dX; // h1과 h3사이의 높이값 y = h12 + ((h13 - h12) * (dZ / (1.0f - dX))); return y; @@ -1600,7 +1600,7 @@ BOOL CN3Terrain::Pick(int x, int y, __Vector3 & vPick) { int ix = ((int)vPosCur.x) / TILE_SIZE; int iz = ((int)vPosCur.z) / TILE_SIZE; - if ((ix + iz) % 2 == 1) // .. ޼ ε... + if ((ix + iz) % 2 == 1) // 당근.. 왼손 바인딩... { A.Set((float)ix * TILE_SIZE, GetHeight(ix * TILE_SIZE, iz * TILE_SIZE), (float)iz * TILE_SIZE); C.Set((float)(ix + 1) * TILE_SIZE, GetHeight((ix + 1) * TILE_SIZE, iz * TILE_SIZE), (float)iz * TILE_SIZE); @@ -1620,13 +1620,13 @@ BOOL CN3Terrain::Pick(int x, int y, __Vector3 & vPick) { } bCollision = ::_IntersectTriangle(vPos, vDir, A, B, C, t, u, v, &vPick); - if (FALSE == bCollision) // 浹 .... + if (FALSE == bCollision) // 충돌점이 없을 경우.... { - vPick.Set(0, 0, 0); // ϴ 浹 .. + vPick.Set(0, 0, 0); // 일단 충돌 점은 없고.. - // .... !!!! ؽ ۿ ε .. - __Vector3 AA[8]; // ؽ .. - int pIndex[36]; // ε .. + // 음.... !!가상!! 버텍스 버퍼와 인덱스 버퍼 만들기.. + __Vector3 AA[8]; // 가상 버텍스 버퍼.. + int pIndex[36]; // 가상 인덱스 버퍼.. int * pIdx = pIndex; AA[0] = __Vector3(vPos.x - COLLISION_BOX, vPos.y - COLLISION_BOX, vPos.z + COLLISION_BOX); @@ -1638,7 +1638,7 @@ BOOL CN3Terrain::Pick(int x, int y, __Vector3 & vPick) { AA[6] = __Vector3(vPos.x + COLLISION_BOX, vPos.y + COLLISION_BOX, vPos.z - COLLISION_BOX); AA[7] = __Vector3(vPos.x - COLLISION_BOX, vPos.y + COLLISION_BOX, vPos.z - COLLISION_BOX); - // . + // 윗면. *pIdx++ = 0; *pIdx++ = 1; *pIdx++ = 3; @@ -1646,7 +1646,7 @@ BOOL CN3Terrain::Pick(int x, int y, __Vector3 & vPick) { *pIdx++ = 3; *pIdx++ = 1; - // ո.. + // 앞면.. *pIdx++ = 7; *pIdx++ = 3; *pIdx++ = 6; @@ -1654,7 +1654,7 @@ BOOL CN3Terrain::Pick(int x, int y, __Vector3 & vPick) { *pIdx++ = 6; *pIdx++ = 3; - // .. + // 왼쪽.. *pIdx++ = 4; *pIdx++ = 0; *pIdx++ = 7; @@ -1662,7 +1662,7 @@ BOOL CN3Terrain::Pick(int x, int y, __Vector3 & vPick) { *pIdx++ = 7; *pIdx++ = 0; - // .. + // 오른쪽.. *pIdx++ = 6; *pIdx++ = 2; *pIdx++ = 5; @@ -1670,7 +1670,7 @@ BOOL CN3Terrain::Pick(int x, int y, __Vector3 & vPick) { *pIdx++ = 5; *pIdx++ = 2; - // ޸.. + // 뒷면.. *pIdx++ = 5; *pIdx++ = 1; *pIdx++ = 4; @@ -1678,7 +1678,7 @@ BOOL CN3Terrain::Pick(int x, int y, __Vector3 & vPick) { *pIdx++ = 4; *pIdx++ = 1; - // ظ.. + // 밑면.. *pIdx++ = 7; *pIdx++ = 6; *pIdx++ = 4; @@ -1764,7 +1764,7 @@ BOOL CN3Terrain::PickWide(int x, int y, __Vector3 & vPick) { break; }; - if ((ix + iz) % 2 == 1) // .. ޼ ε... + if ((ix + iz) % 2 == 1) // 당근.. 왼손 바인딩... { A.Set((float)ix * TILE_SIZE, GetHeight(ix * TILE_SIZE, iz * TILE_SIZE), (float)iz * TILE_SIZE); C.Set((float)(ix + 1) * TILE_SIZE, GetHeight((ix + 1) * TILE_SIZE, iz * TILE_SIZE), @@ -1814,17 +1814,17 @@ BOOL CN3Terrain::PickWide(int x, int y, __Vector3 & vPick) { } } vPosCur += (vDir * TILE_SIZE); - //vDir ũⰡ ۱ Nomalizeϰ TILE_SIZEŭ ؼ üũ ġ ٲش. - //̷ üũ κ üũϱ ϰ Ŀ. + //vDir 크기가 작기 때문에 Nomalize하고 TILE_SIZE만큼 곱해서 다음 체크할 위치를 바꿔준다. + //이렇게 하지 않으면 체크한 부분을 여러번 체크하기 때문에 부하가 커진다. } - if (FALSE == bCollision) // 浹 .... + if (FALSE == bCollision) // 충돌점이 없을 경우.... { - vPick.Set(0, 0, 0); // ϴ 浹 .. + vPick.Set(0, 0, 0); // 일단 충돌 점은 없고.. - // .... !!!! ؽ ۿ ε .. - __Vector3 AA[8]; // ؽ .. - int pIndex[36]; // ε .. + // 음.... !!가상!! 버텍스 버퍼와 인덱스 버퍼 만들기.. + __Vector3 AA[8]; // 가상 버텍스 버퍼.. + int pIndex[36]; // 가상 인덱스 버퍼.. int * pIdx = pIndex; #define COL_BOX_OFF 2000 @@ -1838,7 +1838,7 @@ BOOL CN3Terrain::PickWide(int x, int y, __Vector3 & vPick) { AA[6] = __Vector3(vPos.x + COL_BOX_OFF, vPos.y + COL_BOX_OFF, vPos.z - COL_BOX_OFF); AA[7] = __Vector3(vPos.x - COL_BOX_OFF, vPos.y + COL_BOX_OFF, vPos.z - COL_BOX_OFF); - // . + // 윗면. *pIdx++ = 0; *pIdx++ = 1; *pIdx++ = 3; @@ -1846,7 +1846,7 @@ BOOL CN3Terrain::PickWide(int x, int y, __Vector3 & vPick) { *pIdx++ = 3; *pIdx++ = 1; - // ո.. + // 앞면.. *pIdx++ = 7; *pIdx++ = 3; *pIdx++ = 6; @@ -1854,7 +1854,7 @@ BOOL CN3Terrain::PickWide(int x, int y, __Vector3 & vPick) { *pIdx++ = 6; *pIdx++ = 3; - // .. + // 왼쪽.. *pIdx++ = 4; *pIdx++ = 0; *pIdx++ = 7; @@ -1862,7 +1862,7 @@ BOOL CN3Terrain::PickWide(int x, int y, __Vector3 & vPick) { *pIdx++ = 7; *pIdx++ = 0; - // .. + // 오른쪽.. *pIdx++ = 6; *pIdx++ = 2; *pIdx++ = 5; @@ -1870,7 +1870,7 @@ BOOL CN3Terrain::PickWide(int x, int y, __Vector3 & vPick) { *pIdx++ = 5; *pIdx++ = 2; - // ޸.. + // 뒷면.. *pIdx++ = 5; *pIdx++ = 1; *pIdx++ = 4; @@ -1878,7 +1878,7 @@ BOOL CN3Terrain::PickWide(int x, int y, __Vector3 & vPick) { *pIdx++ = 4; *pIdx++ = 1; - // ظ.. + // 밑면.. *pIdx++ = 7; *pIdx++ = 6; *pIdx++ = 4; @@ -1917,7 +1917,7 @@ void CN3Terrain::CalcCollisionTerrainByOTPlayer(__Vector3 vOrig, __Vector3 vAt, int ix = ((int)vec2.x) / TILE_SIZE; int iz = ((int)vec2.z) / TILE_SIZE; - if ((ix + iz) % 2 == 1) // .. ޼ ε... + if ((ix + iz) % 2 == 1) // 당근.. 왼손 바인딩... { A.Set((float)ix * TILE_SIZE, GetHeight(ix * TILE_SIZE, iz * TILE_SIZE), (float)iz * TILE_SIZE); C.Set((float)(ix + 1) * TILE_SIZE, GetHeight((ix + 1) * TILE_SIZE, iz * TILE_SIZE), (float)iz * TILE_SIZE); @@ -1966,9 +1966,9 @@ void CN3Terrain::CalcCollisionTerrainByOTPlayer(__Vector3 vOrig, __Vector3 vAt, //#define COLLISION_BOX 6000 - // .... !!!! ؽ ۿ ε .. - __Vector3 AA[8]; // ؽ .. - int pIndex[36]; // ε .. + // 음.... !!가상!! 버텍스 버퍼와 인덱스 버퍼 만들기.. + __Vector3 AA[8]; // 가상 버텍스 버퍼.. + int pIndex[36]; // 가상 인덱스 버퍼.. int * pIdx = pIndex; AA[0] = __Vector3(vec4.x - COLLISION_BOX, vec4.y - COLLISION_BOX, vec4.z + COLLISION_BOX); @@ -1980,7 +1980,7 @@ void CN3Terrain::CalcCollisionTerrainByOTPlayer(__Vector3 vOrig, __Vector3 vAt, AA[6] = __Vector3(vec4.x + COLLISION_BOX, vec4.y + COLLISION_BOX, vec4.z - COLLISION_BOX); AA[7] = __Vector3(vec4.x - COLLISION_BOX, vec4.y + COLLISION_BOX, vec4.z - COLLISION_BOX); - // . + // 윗면. *pIdx++ = 0; *pIdx++ = 1; *pIdx++ = 3; @@ -1988,7 +1988,7 @@ void CN3Terrain::CalcCollisionTerrainByOTPlayer(__Vector3 vOrig, __Vector3 vAt, *pIdx++ = 3; *pIdx++ = 1; - // ո.. + // 앞면.. *pIdx++ = 7; *pIdx++ = 3; *pIdx++ = 6; @@ -1996,7 +1996,7 @@ void CN3Terrain::CalcCollisionTerrainByOTPlayer(__Vector3 vOrig, __Vector3 vAt, *pIdx++ = 6; *pIdx++ = 3; - // .. + // 왼쪽.. *pIdx++ = 4; *pIdx++ = 0; *pIdx++ = 7; @@ -2004,7 +2004,7 @@ void CN3Terrain::CalcCollisionTerrainByOTPlayer(__Vector3 vOrig, __Vector3 vAt, *pIdx++ = 7; *pIdx++ = 0; - // .. + // 오른쪽.. *pIdx++ = 6; *pIdx++ = 2; *pIdx++ = 5; @@ -2012,7 +2012,7 @@ void CN3Terrain::CalcCollisionTerrainByOTPlayer(__Vector3 vOrig, __Vector3 vAt, *pIdx++ = 5; *pIdx++ = 2; - // ޸.. + // 뒷면.. *pIdx++ = 5; *pIdx++ = 1; *pIdx++ = 4; @@ -2020,7 +2020,7 @@ void CN3Terrain::CalcCollisionTerrainByOTPlayer(__Vector3 vOrig, __Vector3 vAt, *pIdx++ = 4; *pIdx++ = 1; - // ظ.. + // 밑면.. *pIdx++ = 7; *pIdx++ = 6; *pIdx++ = 4; @@ -2080,7 +2080,7 @@ bool CN3Terrain::CheckCollision(__Vector3 & vPos, __Vector3 & vDir, float fVeloc } ///////////////////////////////////////////// - // ϰ Ϸ..... + //걍 덜 정밀하게 하려면..이케... // (*vCol) = vPos; (*vCol).y = this->GetHeight(vPos.x, vPos.z) + 0.1f; @@ -2088,8 +2088,8 @@ bool CN3Terrain::CheckCollision(__Vector3 & vPos, __Vector3 & vDir, float fVeloc // ///////////////////////////////////////////// - //ϰ Ϸ ... - //浹ߴ... + //정밀하게 하려면 다음과 같이해... + //충돌했다... RECT rt; rt.left = Real2Tile(vPos.x); rt.bottom = Real2Tile(vPos.z); @@ -2113,7 +2113,7 @@ bool CN3Terrain::CheckCollision(__Vector3 & vPos, __Vector3 & vDir, float fVeloc float t, u, v; for (int ix = rt.left; ix <= rt.right; ix++) { for (int iz = rt.bottom; iz <= rt.top; iz++) { - if ((ix + iz) % 2 == 1) // .. ޼ ε... + if ((ix + iz) % 2 == 1) // 당근.. 왼손 바인딩... { A.Set((float)ix * TILE_SIZE, GetHeight(ix * TILE_SIZE, iz * TILE_SIZE), (float)iz * TILE_SIZE); C.Set((float)(ix + 1) * TILE_SIZE, GetHeight((ix + 1) * TILE_SIZE, iz * TILE_SIZE), @@ -2174,7 +2174,7 @@ bool CN3Terrain::CheckCollision(__Vector3 & vPos, __Vector3 & vDir, float fVeloc } bool CN3Terrain::LoadColorMap(const std::string & szFN) { - CUILoading * pUILoading = CGameProcedure::s_pUILoading; // ε.. + CUILoading * pUILoading = CGameProcedure::s_pUILoading; // 로딩바.. m_iNumColorMap = (m_pat_MapSize * PATCH_PIXEL_SIZE) / COLORMAPTEX_SIZE; m_ppColorMapTex = new CN3Texture *[m_iNumColorMap]; @@ -2191,7 +2191,7 @@ bool CN3Terrain::LoadColorMap(const std::string & szFN) { char szBuff[128]; for (int x = 0; x < m_iNumColorMap; x++) { for (int z = 0; z < m_iNumColorMap; z++) { - m_ppColorMapTex[x][z].m_iLOD = s_Options.iTexLOD_Terrain; // LOD д´.. + m_ppColorMapTex[x][z].m_iLOD = s_Options.iTexLOD_Terrain; // LOD 적용후 읽는다.. m_ppColorMapTex[x][z].Load(hColorMapFile); } diff --git a/src/game/N3Terrain.h b/src/game/N3Terrain.h index d67d3ba7..30e1b8ed 100644 --- a/src/game/N3Terrain.h +++ b/src/game/N3Terrain.h @@ -6,9 +6,9 @@ #pragma once //////////////////////////////// -// տ ti_ Ÿϴ.. -// տ pat_ ġ.. -// տ re_ ʹ.. +// 변수앞에 ti_가 붙은 건 타일단위.. +// 변수앞에 pat_가 붙은 건 패치단위.. +// 변수앞에 re_가 붙은 건 미터단위.. // #include "N3Base/N3BaseFileAccess.h" @@ -31,15 +31,15 @@ class CN3Terrain : public CN3BaseFileAccess { CN3TerrainPatch ** m_ppPatch; POINT m_pat_LBPos; POINT m_pat_PrevLBPos; - RECT m_pat_BoundRect; //LBPos ǥ.. + RECT m_pat_BoundRect; //LBPos에 대한 상대좌표.. int m_iNumPatch; - int m_pat_Center2Side; //߽ ʺ .. + int m_pat_Center2Side; //중심점에서 한쪽변까지의 길이.. int m_iDistanceTable[DISTANCE_TABLE_SIZE][DISTANCE_TABLE_SIZE]; //MapInfo.. MAPDATA * m_pMapData; - int m_ti_MapSize; //  .. 4096Meter -> 1024 + 1 - int m_pat_MapSize; // ġ ..  Ʋ.. + int m_ti_MapSize; // 셀이 몇개 들어가나.. 4096Meter -> 1024 + 1 + int m_pat_MapSize; // 패치 갯수.. 사이즈에 따라 틀리다.. __Vector3 * m_pNormal; //LightMap Info.. @@ -58,17 +58,17 @@ class CN3Terrain : public CN3BaseFileAccess { POINT m_ti_PrevCenterPos; //Texture... - int m_NumTileTex; // Tile Texture + int m_NumTileTex; // Tile Texture 갯수 CN3Texture * m_pTileTex; //ColorMap.. CN3Texture ** m_ppColorMapTex; - int m_iNumColorMap; // ÷ Ǿ ִ.. = + int m_iNumColorMap; // 컬러맵은 분할 저장되어 있다.. 갯수 = - //÷ ̸.. + //컬러맵위에 덧 씌우는 무늬맵.. CN3Texture m_pBaseTex; - //ŸϹ.. + //타일방향.. float m_fTileDirU[8][4]; float m_fTileDirV[8][4]; @@ -93,10 +93,10 @@ class CN3Terrain : public CN3BaseFileAccess { void TestAvailableTile(); void MakeDistanceTable(); - inline int Log2(int x); //2 ¼ .... - int Real2Tile(float x) { return ((int)x / TILE_SIZE); } // ǥ -> Ÿǥ...(ǥ) - int Tile2Patch(int x) { return (x / PATCH_TILE_SIZE); } // Ÿǥ -> ġǥ...(ǥ) - int Real2Patch(float fX) { return (((int)fX / TILE_SIZE) / PATCH_TILE_SIZE); } // ǥ -> ġǥ..(ǥ) + inline int Log2(int x); //2의 승수 전용.... + int Real2Tile(float x) { return ((int)x / TILE_SIZE); } // 실좌표 -> 타일좌표...(절대좌표) + int Tile2Patch(int x) { return (x / PATCH_TILE_SIZE); } // 타일좌표 -> 패치좌표...(절대좌표계) + int Real2Patch(float fX) { return (((int)fX / TILE_SIZE) / PATCH_TILE_SIZE); } // 실좌표 -> 패치좌표..(절대좌표계) void LoadTileInfo(HANDLE hFile); bool CheckRenderablePatch(); @@ -138,13 +138,13 @@ class CN3Terrain : public CN3BaseFileAccess { bool CheckIncline( const __Vector3 & vPos, const __Vector3 & vDir, - float fIncline); // ġ ⿡ 簪 μ °ͺ ũ(ö ̸) true, false + float fIncline); // 현재 위치와 방향에서의 경사값이 인수로 들어온것보다 크면(못올라갈 곳이면) true, 작으면 false bool CheckCollisionCamera(__Vector3 & vEye, const __Vector3 & vAt, - float fNP); // vEye ´.. ī޶ Near Plane . + float fNP); // vEye 에 계산된 값도 들어온다.. 카메라 Near Plane을 넣으면 계산. BOOL CheckCollisionByHeight(const __Vector3 & vPos, float fUnitSize, float & fHeight) { fHeight = this->GetHeight(vPos.x, vPos.z); if (vPos.y < fHeight + fUnitSize) { - return TRUE; // ̰ + ũ ۴ٸ + return TRUE; // 현재 높이가 지형높이 + 크기 보다 작다면 } return FALSE; } diff --git a/src/game/N3TerrainDef.h b/src/game/N3TerrainDef.h index f80fae84..a5fcb9b4 100644 --- a/src/game/N3TerrainDef.h +++ b/src/game/N3TerrainDef.h @@ -1,8 +1,8 @@ //////////////////////////////////////////////////////////////////////////////////////// // // N3TerrainDef.h -// - ̰ Terrain õ ڷ, ... -// - ӿ (Ʈ ƴ...^^) +// - 이것저것 Terrain에 관련된 자료형정의, 상수정의... +// - 게임에 쓰는 지형 (쿼드트리 아님...^^) // - 2001. 10. 22. // // By Donghoon.. @@ -12,17 +12,17 @@ #pragma once // Constant Definitions.. -const int PATCH_TILE_SIZE = 8; // ġ ϳ Ÿ 8x8 . -const int TILE_SIZE = 4; // Ÿϳ 4m -const int MAX_LOD_LEVEL = 10; // LOD ܰ Detail... -const int MIN_LOD_LEVEL = 0; // LOD ܰ Rough... +const int PATCH_TILE_SIZE = 8; // 패치 하나에 타일이 8x8개 들어간다. +const int TILE_SIZE = 4; // 타일하나당 길이 4m +const int MAX_LOD_LEVEL = 10; // LOD수준이 가장 높은 단계 가장 Detail... +const int MIN_LOD_LEVEL = 0; // LOD수준이 가장 낮은 단계 가장 Rough... const int MAX_PATCH_LEVEL = 3; // 2 ^ 3 = 8. -const int PATCH_PIXEL_SIZE = 32; // ġϳ  ȼ.. -const int UNITUV = 32; // ÷ ؽ 忡  Ÿϼ.. -const int LIGHTMAP_TEX_SIZE = 16; // Ÿ ϳ  Ʈ ؽ ũ. -const int TILE_PIXEL_SIZE = 128; // Ÿϳ ȼ . -const int COLORMAPTEX_SIZE = 128; // ÷ ؽ ȼũ..128x128 -const int DISTANCE_TABLE_SIZE = 64; // Ÿ ̺ ũ(64 x 64).. +const int PATCH_PIXEL_SIZE = 32; // 패치하나에 들어가는 픽셀수.. +const int UNITUV = 32; // 컬러맵 텍스쳐 한장에 들어가는 타일수.. +const int LIGHTMAP_TEX_SIZE = 16; // 타일 하나당 들어가는 라이트맵 텍스쳐 크기. +const int TILE_PIXEL_SIZE = 128; // 타일하나의 실제 픽셀 사이즈. +const int COLORMAPTEX_SIZE = 128; // 컬러맵 텍스쳐의 픽셀크기..128x128 +const int DISTANCE_TABLE_SIZE = 64; // 셀단위의 거리 테이블 크기(64 x 64).. const int MAX_GRASS = 8; const int MAX_TERRAIN_SOUND_EFFECT = 4; @@ -40,14 +40,14 @@ enum { }; // Structure Definitions.. -typedef struct __MapData // ʵ... +typedef struct __MapData // 맵데이터... { - float fHeight; //Ÿؽİ ƴ.. - DWORD bIsTileFull : 1; // ̰.. - DWORD Tex1Dir : 5; //ù° Ÿ ؽ . - DWORD Tex2Dir : 5; //ι° Ÿ ؽ . - DWORD Tex1Idx : 10; //ù° Ÿ ؽ ε. - DWORD Tex2Idx : 10; //ι° Ÿ ؽ ε. + float fHeight; //타일텍스쳐가 꽉차는지 아닌지.. + DWORD bIsTileFull : 1; //지형의 높이값.. + DWORD Tex1Dir : 5; //첫번째 타일 텍스쳐 찍는 방향. + DWORD Tex2Dir : 5; //두번째 타일 텍스쳐 찍는 방향. + DWORD Tex1Idx : 10; //첫번째 타일 텍스쳐의 인덱스. + DWORD Tex2Idx : 10; //두번째 타일 텍스쳐의 인덱스. __MapData() { bIsTileFull = true; diff --git a/src/game/N3TerrainManager.cpp b/src/game/N3TerrainManager.cpp index 145b74b5..17b95fba 100644 --- a/src/game/N3TerrainManager.cpp +++ b/src/game/N3TerrainManager.cpp @@ -74,13 +74,13 @@ void CN3TerrainManager::InitWorld(int iZoneID, const __Vector3 & vPosPlayer) { } CLogWriter::Write("CN3TerrainManager::InitWorld Pre Load\t%d", m_pTerrain); // TmpLog_11_22 - m_pTerrain->LoadFromFile(pZone->szTerrainFN); // ..ε.. + m_pTerrain->LoadFromFile(pZone->szTerrainFN); // 지형..로드.. CLogWriter::Write("CN3TerrainManager::InitWorld Pre Load ColorMap"); // TmpLog_11_22 - m_pTerrain->LoadColorMap(pZone->szColorMapFN); // ÷ ε.. + m_pTerrain->LoadColorMap(pZone->szColorMapFN); // 컬러맵 로드.. CLogWriter::Write("CN3TerrainManager::InitWorld Pre Release Shapes\t%d", m_pShapes); // TmpLog_11_22 m_pShapes->Release(); CLogWriter::Write("CN3TerrainManager::InitWorld Pre Load Shapes"); // TmpLog_11_22 - m_pShapes->LoadFromFile(pZone->szObjectPostDataFN); // Ʈ ε.. + m_pShapes->LoadFromFile(pZone->szObjectPostDataFN); // 오브젝트 데이터 로드.. char szFName[_MAX_PATH]; _splitpath(pZone->szTerrainFN.c_str(), NULL, NULL, szFName, NULL); @@ -94,9 +94,9 @@ void CN3TerrainManager::InitWorld(int iZoneID, const __Vector3 & vPosPlayer) { // CLogWriter::Write("CN3TerrainManager::InitWorld Pre Load Grasses\t%d", m_pGrasses); // TmpLog_11_22 // m_pGrasses->Init(vPosPlayer); CLogWriter::Write("CN3TerrainManager::InitWorld Pre Load Sky\t%d", m_pSky); // TmpLog_11_22 - m_pSky->LoadFromFile(pZone->szSkySetting); // ϴ, , ¾, ȭ ؽó ε.. + m_pSky->LoadFromFile(pZone->szSkySetting); // 하늘, 구름, 태양, 날씨 변화등 정보 및 텍스처 로딩.. m_pSky->SunAndMoonDirectionFixByHour( - pZone->iFixedSundDirection); // , ϵ簡 Ȥ 0 ̸ ʴ´. + pZone->iFixedSundDirection); // 해, 달 방향을 고정하든가 혹은 0 이면 고정하지 않는다. } void CN3TerrainManager::Tick() { @@ -264,12 +264,12 @@ CN3Shape * CN3TerrainManager::PickWithShape(int iXScreen, int iYScreen, bool bMu } } -bool CN3TerrainManager::CheckCollisionWithShape(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol, // 浹 - __Vector3 * pvNormal, // 浹Ѹ - __Vector3 * pVec) // 浹 __Vector3[3] +bool CN3TerrainManager::CheckCollisionWithShape(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol, // 충돌 지점 + __Vector3 * pvNormal, // 충돌한면의 법선벡터 + __Vector3 * pVec) // 충돌한 면 의 폴리곤 __Vector3[3] { if (m_pShapes) { return m_pShapes->CheckCollision(vPos, vDir, fSpeedPerSec, pvCol, pvNormal, pVec); diff --git a/src/game/N3TerrainManager.h b/src/game/N3TerrainManager.h index cdc67106..9cf69228 100644 --- a/src/game/N3TerrainManager.h +++ b/src/game/N3TerrainManager.h @@ -9,11 +9,11 @@ class CN3TerrainManager : public CN3WorldBase { friend class CN3WorldManager; - class CN3Terrain * m_pTerrain; // Ŭ - class CN3ShapeMgr * m_pShapes; // ü Ŭ - class CN3SkyMng * m_pSky; // ϴ Ŭ - class CBirdMng * m_pBirdMng; // ϴÿ ٴϴ .. - // class CGrassMng* m_pGrasses; // Ǯ ׸ + class CN3Terrain * m_pTerrain; // 지형 클래스 + class CN3ShapeMgr * m_pShapes; // 물체 클래스 + class CN3SkyMng * m_pSky; // 하늘 클래스 + class CBirdMng * m_pBirdMng; // 하늘에 날라다니는 새들 관리.. + // class CGrassMng* m_pGrasses; // 풀 그림 // Function.. void InitWorld(int iZoneID, const __Vector3 & vPosPlayer); @@ -42,12 +42,12 @@ class CN3TerrainManager : public CN3WorldBase { float GetHeightWithShape(float fX, float fZ, __Vector3 * pvNormal = NULL); CN3Shape * ShapeGetByIDWithShape(int iID); CN3Shape * PickWithShape(int iXScreen, int iYScreen, bool bMustHaveEvent, __Vector3 * pvPick = NULL); - bool CheckCollisionWithShape(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol = NULL, // 浹 - __Vector3 * pvNormal = NULL, // 浹Ѹ - __Vector3 * pVec = NULL); // 浹 __Vector3[3] + bool CheckCollisionWithShape(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol = NULL, // 충돌 지점 + __Vector3 * pvNormal = NULL, // 충돌한면의 법선벡터 + __Vector3 * pVec = NULL); // 충돌한 면 의 폴리곤 __Vector3[3] // Sky.. D3DCOLOR GetSkyColorWithSky(); diff --git a/src/game/N3TerrainPatch.cpp b/src/game/N3TerrainPatch.cpp index 1b8bb9f5..16446018 100644 --- a/src/game/N3TerrainPatch.cpp +++ b/src/game/N3TerrainPatch.cpp @@ -9,7 +9,7 @@ #include "N3Base/N3Texture.h" // -// +// 생성자 // CN3TerrainPatch::CN3TerrainPatch() { m_bIsRender = FALSE; @@ -43,7 +43,7 @@ CN3TerrainPatch::CN3TerrainPatch() { } // -// Ҹ +// 소멸자 // CN3TerrainPatch::~CN3TerrainPatch() { Release(); @@ -237,7 +237,7 @@ void CN3TerrainPatch::Tick() { m_pIsTileFull[TileCount] = MapData.bIsTileFull; if (m_pTileTexIndx[0][TileCount] < 0 || m_pTileTexIndx[0][TileCount] > m_pRefTerrain->m_NumTileTex || - m_pIsTileFull[TileCount] == false) // Ÿ ..÷ ... + m_pIsTileFull[TileCount] == false) // 타일이 없는 경우..컬러맵을 찍어야 돼... { u1[0] = u1[1] = UVConvert((float)(tx % UNITUV) / (float)UNITUV); u1[2] = u1[3] = UVConvert(u1[0] + (1.0f / (float)UNITUV)); @@ -256,7 +256,7 @@ void CN3TerrainPatch::Tick() { v2[0] = v2[3] = 0.0f; v2[1] = v2[2] = 1.0f; - } else // Ÿ ... + } else // 타일을 찍는 경우... { u1[0] = m_pRefTerrain->m_fTileDirU[dir1][2]; u1[1] = m_pRefTerrain->m_fTileDirU[dir1][0]; @@ -386,7 +386,7 @@ void CN3TerrainPatch::Tick() { cx = ix * m_CellSize + HalfCell + m_ti_LBPoint.x; cz = iz * m_CellSize + HalfCell + m_ti_LBPoint.y; - //cell  ... + //cell의 가운데 점... tx = cx; tz = cz; @@ -506,7 +506,7 @@ void CN3TerrainPatch::Tick() { return; } - if (m_iLevel > 2) // level3 ̻.. + if (m_iLevel > 2) // level3 이상.. { m_FanInfoList.clear(); __VertexT1 * pVertices; @@ -522,7 +522,7 @@ void CN3TerrainPatch::Tick() { cx = ix * m_CellSize + HalfCell + m_ti_LBPoint.x; cz = iz * m_CellSize + HalfCell + m_ti_LBPoint.y; - //cell  ... + //cell의 가운데 점... tx = cx; tz = cz; @@ -675,7 +675,7 @@ void CN3TerrainPatch::Render() { hr = CN3Base::s_lpD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, vc, fc); vc += it->NumVertex; #if _DEBUG - CN3Base::s_RenderInfo.nTerrain_Polygon += it->NumVertex; // Rendering Information .. + CN3Base::s_RenderInfo.nTerrain_Polygon += it->NumVertex; // Rendering Information 갱신.. #endif } return; @@ -696,7 +696,7 @@ void CN3TerrainPatch::Render() { hr = CN3Base::s_lpD3DDev->SetTexture(2, NULL); if ((m_pTileTexIndx[0][i] < 0) || m_pTileTexIndx[0][i] >= m_pRefTerrain->m_NumTileTex || - (m_pIsTileFull[i] == false)) // 0: ÷, 1: or 0:κŸ 1:NONE... + (m_pIsTileFull[i] == false)) // 0: 컬러맵, 1:무늬 or 0:부분타일 1:NONE... { hr = CN3Base::s_lpD3DDev->SetTexture(0, m_pRefColorTex->Get()); hr = CN3Base::s_lpD3DDev->SetTexture(1, m_pRefTerrain->m_pBaseTex.Get()); @@ -770,7 +770,7 @@ void CN3TerrainPatch::Render() { } #if _DEBUG - CN3Base::s_RenderInfo.nTerrain_Tile_Polygon += TotalTile * 2; // Rendering Information .. + CN3Base::s_RenderInfo.nTerrain_Tile_Polygon += TotalTile * 2; // Rendering Information 갱신.. #endif // Render Light Map... @@ -804,8 +804,8 @@ void CN3TerrainPatch::Render() { } // -// ȼ ҽŲ Ŀ uvٲִ Լ.. -// ʿ ƴ..-.- ؽ Ʈ mirror ȴ... +// 한픽셀씩 축소시킨 커러맵 쓸때 uv바꿔주는 함수.. +// 필요없게 됐다..-.- 걍 텍스쳐 스테이지 스테이트에서 mirror쓰면 된다..ㅡ.ㅡ // inline float CN3TerrainPatch::UVConvert(float uv) { //return ( (uv*((float)COLORMAPTEX_SIZE - 2.0f) + 1.0f) / (float)COLORMAPTEX_SIZE); diff --git a/src/game/N3TerrainPatch.h b/src/game/N3TerrainPatch.h index 75b61844..f91d6d49 100644 --- a/src/game/N3TerrainPatch.h +++ b/src/game/N3TerrainPatch.h @@ -37,7 +37,7 @@ class CN3TerrainPatch : public CN3Base { CN3Texture ** m_pRefLightMapTex; int m_NumLightMapTex; - //Tile ϴ ī . + //Tile지원 안하는 카드들을 위한 설정. //LPDIRECT3DVERTEXBUFFER9 m_pFoolishTileVB; //int m_NumFoolishTile; diff --git a/src/game/N3UIDBCLButton.cpp b/src/game/N3UIDBCLButton.cpp index 48d3462d..9ba2cdc1 100644 --- a/src/game/N3UIDBCLButton.cpp +++ b/src/game/N3UIDBCLButton.cpp @@ -21,14 +21,14 @@ DWORD CN3UIDBCLButton::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT DWORD dwRet = UI_MOUSEPROC_NONE; RECT rect = GetRegion(); - if (!::PtInRect(&rect, ptCur)) // ̸ + if (!::PtInRect(&rect, ptCur)) // 영역 밖이면 { dwRet |= CN3UIBase::MouseProc(dwFlags, ptCur, ptOld); return dwRet; } if (dwFlags & UI_MOUSE_LBDBLCLK) { - m_pParent->ReceiveMessage(this, UIMSG_ICON_DBLCLK); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_ICON_DBLCLK); // 부모에게 버튼 클릭 통지.. dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } diff --git a/src/game/N3UIIcon.cpp b/src/game/N3UIIcon.cpp index 412e268c..e1cda7fa 100644 --- a/src/game/N3UIIcon.cpp +++ b/src/game/N3UIIcon.cpp @@ -46,73 +46,73 @@ DWORD CN3UIIcon::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptO rect = GetMoveRect(); - if (!::PtInRect(&rect, ptCur)) // ̸ + if (!::PtInRect(&rect, ptCur)) // 영역 밖이면 { dwRet |= CN3UIBase::MouseProc(dwFlags, ptCur, ptOld); return dwRet; } - if ((dwFlags & UI_MOUSE_LBCLICK) && !(dwFlags & UI_MOUSE_RBDOWN)) // ʹư + if ((dwFlags & UI_MOUSE_LBCLICK) && !(dwFlags & UI_MOUSE_RBDOWN)) // 왼쪽버튼 눌르는 순간 { m_pParent->SetState(UI_STATE_ICON_MOVING); - m_pParent->ReceiveMessage(this, UIMSG_ICON_DOWN_FIRST); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_ICON_DOWN_FIRST); // 부모에게 버튼 클릭 통지.. dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } - if ((dwFlags & UI_MOUSE_LBCLICKED) && !(dwFlags & UI_MOUSE_RBDOWN)) // ʹư + if ((dwFlags & UI_MOUSE_LBCLICKED) && !(dwFlags & UI_MOUSE_RBDOWN)) // 왼쪽버튼을 떼는 순간 { - if (m_pParent && m_pParent->GetState() == UI_STATE_ICON_MOVING) // ° ư Down ̸ + if (m_pParent && m_pParent->GetState() == UI_STATE_ICON_MOVING) // 이전 상태가 버튼을 Down 상태이면 { m_pParent->SetState(UI_STATE_COMMON_NONE); - m_pParent->ReceiveMessage(this, UIMSG_ICON_UP); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_ICON_UP); // 부모에게 버튼 클릭 통지.. dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } } - if ((dwFlags & UI_MOUSE_RBCLICK) && !(dwFlags & UI_MOUSE_LBDOWN)) // + if ((dwFlags & UI_MOUSE_RBCLICK) && !(dwFlags & UI_MOUSE_LBDOWN)) // 오른쪽 { - m_pParent->ReceiveMessage(this, UIMSG_ICON_RDOWN_FIRST); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_ICON_RDOWN_FIRST); // 부모에게 버튼 클릭 통지.. dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } - if ((dwFlags & UI_MOUSE_RBCLICKED) && !(dwFlags & UI_MOUSE_LBDOWN)) // ư + if ((dwFlags & UI_MOUSE_RBCLICKED) && !(dwFlags & UI_MOUSE_LBDOWN)) // 오른쪽 버튼을 떼는 순간 { - m_pParent->ReceiveMessage(this, UIMSG_ICON_RUP); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_ICON_RUP); // 부모에게 버튼 클릭 통지.. dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } - if (dwFlags & UI_MOUSE_LBDOWN) // + if (dwFlags & UI_MOUSE_LBDOWN) // 왼쪽 { - m_pParent->ReceiveMessage(this, UIMSG_ICON_DOWN); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_ICON_DOWN); // 부모에게 버튼 클릭 통지.. dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } /* else { - if(m_pParent && m_pParent->GetState() == UI_STATE_ICON_MOVING) // ° ư Down ̸ + if(m_pParent && m_pParent->GetState() == UI_STATE_ICON_MOVING) // 이전 상태가 버튼을 Down 상태이면 { - m_pParent->ReceiveMessage(this, UIMSG_ICON_UP); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_ICON_UP); // 부모에게 버튼 클릭 통지.. dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } } */ - if (dwFlags & UI_MOUSE_LBDBLCLK) // Ŭ + if (dwFlags & UI_MOUSE_LBDBLCLK) // 왼쪽 더블 클릭 { - m_pParent->ReceiveMessage(this, UIMSG_ICON_DBLCLK); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_ICON_DBLCLK); // 부모에게 버튼 클릭 통지.. dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } - if (dwFlags & UI_MOUSE_RBDBLCLK) // Ŭ + if (dwFlags & UI_MOUSE_RBDBLCLK) // 오른쪽 더블 클릭 { - m_pParent->ReceiveMessage(this, UIMSG_ICON_RDBLCLK); // θ𿡰 ư Ŭ .. + m_pParent->ReceiveMessage(this, UIMSG_ICON_RDBLCLK); // 부모에게 버튼 클릭 통지.. dwRet |= UI_MOUSEPROC_DONESOMETHING; return dwRet; } diff --git a/src/game/N3UIWndBase.cpp b/src/game/N3UIWndBase.cpp index 9f2a3918..e1f5b4f5 100644 --- a/src/game/N3UIWndBase.cpp +++ b/src/game/N3UIWndBase.cpp @@ -45,11 +45,11 @@ CN3UIWndBase::CN3UIWndBase() { s_pSnd_Gold = CN3Base::s_SndMgr.CreateObj(ID_SOUND_GOLD_IN_INVENTORY); s_pSnd_Repair = CN3Base::s_SndMgr.CreateObj(ID_SOUND_ITEM_IN_REPAIR); } - s_iRefCount++; // īƮ + s_iRefCount++; // 참조 카운트 } CN3UIWndBase::~CN3UIWndBase() { - s_iRefCount--; // īƮ + s_iRefCount--; // 참조 카운트 if (s_iRefCount == 0) { CN3Base::s_SndMgr.ReleaseObj(&s_pSnd_Item_Etc); CN3Base::s_SndMgr.ReleaseObj(&s_pSnd_Item_Weapon); @@ -106,9 +106,9 @@ DWORD CN3UIWndBase::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & return dwRet; } - // ڱ ڽ ޽ ־ Ѵ.. ^^ + // 아이콘을 가진 윈도우는 자기 윈도우 영역을 벗어 났을때도 자식의 메시지를 받을수 있어야 한다.. ^^ - // UI ̴ ڵ + // UI 움직이는 코드 if (UI_STATE_COMMON_MOVE == m_eState) { if (dwFlags & UI_MOUSE_LBCLICKED) { SetState(UI_STATE_COMMON_NONE); @@ -119,36 +119,36 @@ DWORD CN3UIWndBase::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & return dwRet; } - if (false == IsIn(ptCur.x, ptCur.y)) // ̸ + if (false == IsIn(ptCur.x, ptCur.y)) // 영역 밖이면 { if (false == IsIn(ptOld.x, ptOld.y)) { if (GetState() != UI_STATE_ICON_MOVING) { - return dwRet; // ǥ ̸ + return dwRet; // 이전 좌표도 영역 밖이면 } } - dwRet |= UI_MOUSEPROC_PREVINREGION; // ǥ ̾. + dwRet |= UI_MOUSEPROC_PREVINREGION; // 이전 좌표는 영역 안이었다. } else { - // tool tip + // tool tip 관련 if (s_pTooltipCtrl) { s_pTooltipCtrl->SetText(m_szToolTip); } } - dwRet |= UI_MOUSEPROC_INREGION; // ̹ ǥ ̴. + dwRet |= UI_MOUSEPROC_INREGION; // 이번 좌표는 영역 안이다. - // child ޼ + // child에게 메세지 전달 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); DWORD dwChildRet = pChild->MouseProc(dwFlags, ptCur, ptOld); if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { - // ̰쿡 հ Ŀ ̴. + // 이경우에는 먼가 포커스를 받은 경우이다. dwRet |= (UI_MOUSEPROC_CHILDDONESOMETHING | UI_MOUSEPROC_DONESOMETHING); return dwRet; } } - // UI ̴ ڵ + // UI 움직이는 코드 if (UI_STATE_COMMON_MOVE != m_eState && PtInRect(&m_rcMovable, ptCur) && (dwFlags & UI_MOUSE_LBCLICK)) { - // κ丮 ̰ ŷ ̸.. + // 인벤토리 윈도우이고 상거래 중이면.. if ((UIType() == UI_TYPE_ICON_MANAGER) && (m_eUIWnd == UIWND_INVENTORY) && (CGameProcedure::s_pProcMain->m_pUITransactionDlg->IsVisible())) { return dwRet; diff --git a/src/game/N3UIWndBase.h b/src/game/N3UIWndBase.h index 64e40326..f872d095 100644 --- a/src/game/N3UIWndBase.h +++ b/src/game/N3UIWndBase.h @@ -19,12 +19,12 @@ enum e_UIWND { UIWND_INVENTORY = 0, // Inventory Wnd.. UIWND_TRANSACTION, // Transaction Wnd.. UIWND_DROPITEM, // Drop Item Wnd.. - UIWND_PER_TRADE, // ΰ ŷ.. + UIWND_PER_TRADE, // 개인간 거래.. UIWND_SKILL_TREE, // Skill Icon Info Wnd.. UIWND_HOTKEY, // Hot Key Wnd.. UIWND_PER_TRADE_EDIT, // Per Trade Edit Wnd.. UIWND_EXCHANGE_REPAIR, // Exchange Repair Wnd.. - UIWND_WARE_HOUSE, // .. + UIWND_WARE_HOUSE, // 보관함.. UIWND_UNKNOWN, // Wnd Unknown.. }; @@ -40,7 +40,7 @@ enum e_UIWND_DISTRICT { UIWND_DISTRICT_SKILL_HOTKEY, // Skillicon district of Hotkey icon wnd.. UIWND_DISTRICT_EX_RE_NPC, // Exchange Repair Wnd Npc District.. UIWND_DISTRICT_EX_RE_INV, // Exchange Repair Wnd Inv District.. - UIWND_DISTRICT_TRADE_MY, // Npc ŷ .. + UIWND_DISTRICT_TRADE_MY, // Npc 와의 거래에서 내 영역.. UIWND_DISTRICT_PER_TRADE_INV, // Inv District of Per Trade Wnd .. UIWND_DISTRICT_UNKNOWN, // District Unknown.. }; @@ -74,7 +74,7 @@ struct __IconItemSkill { __TABLE_ITEM_BASIC * pItemBasic; // Item.. ^^ __TABLE_ITEM_EXT * pItemExt; int iCount; - int iDurability; // + int iDurability; // 내구력 }; __TABLE_UPC_SKILL * pSkill; // Skill.. ^^ @@ -124,7 +124,7 @@ class CUIImageTooltipDlg; class CCountableItemEditDlg; // Class ^^ -class CN3UIWndBase : public CN3UIBase // Լ ڽ Area ľ ִ Լ ־ ??? +class CN3UIWndBase : public CN3UIBase // 가상 함수로 자식의 Area 갯수를 파악할 수 있는 함수가 있어야 하지 않을 까??? // int GetChildCountByAreaType(eAreatype .. ) ^^ { void PlayItemEtcSound(); @@ -141,7 +141,7 @@ class CCountableItemEditDlg; protected: e_UIWND m_eUIWnd; - static int s_iRefCount; // īƮ... + static int s_iRefCount; // 참조 카운트... static CN3SndObj * s_pSnd_Item_Etc; static CN3SndObj * s_pSnd_Item_Weapon; static CN3SndObj * s_pSnd_Item_Armor; diff --git a/src/game/N3WorldBase.h b/src/game/N3WorldBase.h index 05f96147..0243a682 100644 --- a/src/game/N3WorldBase.h +++ b/src/game/N3WorldBase.h @@ -44,12 +44,12 @@ class CN3WorldBase : public CN3BaseFileAccess, public CGameBase { virtual float GetHeightWithShape(float fX, float fZ, __Vector3 * pvNormal = NULL) = 0; virtual CN3Shape * ShapeGetByIDWithShape(int iID) = 0; virtual CN3Shape * PickWithShape(int iXScreen, int iYScreen, bool bMustHaveEvent, __Vector3 * pvPick = NULL) = 0; - virtual bool CheckCollisionWithShape(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol = NULL, // 浹 - __Vector3 * pvNormal = NULL, // 浹Ѹ - __Vector3 * pVec = NULL) = 0; // 浹 __Vector3[3] + virtual bool CheckCollisionWithShape(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol = NULL, // 충돌 지점 + __Vector3 * pvNormal = NULL, // 충돌한면의 법선벡터 + __Vector3 * pVec = NULL) = 0; // 충돌한 면 의 폴리곤 __Vector3[3] // Sky.. virtual D3DCOLOR GetSkyColorWithSky() { return 0x00000000; } diff --git a/src/game/N3WorldManager.cpp b/src/game/N3WorldManager.cpp index f0cab4ae..9f30d2c9 100644 --- a/src/game/N3WorldManager.cpp +++ b/src/game/N3WorldManager.cpp @@ -45,7 +45,7 @@ void CN3WorldManager::InitWorld(int iZoneID, const __Vector3 & vPosPlayer) { delete m_pActiveWorld; } - // Zone .. + // Zone 선택.. if (iZoneID != 51) // N3Terrain.. { CLogWriter::Write("CN3WorldManager::InitWorld Pre new Terrain ZoneID(%d)", iZoneID); // TmpLog_11_22 @@ -59,7 +59,7 @@ void CN3WorldManager::InitWorld(int iZoneID, const __Vector3 & vPosPlayer) { m_bIndoor = true; } - // Zone ʱȭ.. + // Zone 초기화.. m_pActiveWorld->InitWorld(iZoneID, vPosPlayer); } diff --git a/src/game/PacketDef.h b/src/game/PacketDef.h index cd9178b8..12d789c7 100644 --- a/src/game/PacketDef.h +++ b/src/game/PacketDef.h @@ -1,25 +1,25 @@ #pragma once -const int SOCKET_PORT_GAME = 15001; // Ʈ ȣ.. -const int SOCKET_PORT_LOGIN = 15100; // Ʈ ȣ.. +const int SOCKET_PORT_GAME = 15001; // 소켓이 붙을 포트 번호.. +const int SOCKET_PORT_LOGIN = 15100; // 소켓이 붙을 포트 번호.. #define N3_ACCOUNT_LOGIN 0xf3 -#define N3_ACCOUNT_LOGIN_MGAME 0xf4 // !!! LOGIN_REQ !!! +#define N3_ACCOUNT_LOGIN_MGAME 0xf4 // !!! LOGIN_REQ !!! 와 동일 #define N3_GAMESERVER_GROUP_LIST \ - 0xf5 // Recv - b1(ServerCount) loop( s1(IP), str1(IPڿ), s1(̸), str1(̸ڿ), s1(ο) ) + 0xf5 // Recv - b1(ServerCount) loop( s1(IP길이), str1(IP문자열), s1(서버이름길이), str1(서버이름문자열), s1(서버접속인원) ) -#define N3_GAME_SERVER_LOGIN 0x01 // Game server Log in.. -#define N3_NEW_CHARACTER 0x02 // ij .. -#define N3_DELETE_CHARACTER 0x03 // ij .. +#define N3_GAME_SERVER_LOGIN 0x01 // Game server 에 Log in.. +#define N3_NEW_CHARACTER 0x02 // 캐릭터 새로 만들기.. +#define N3_DELETE_CHARACTER 0x03 // 만들어 놓은 캐릭터 지우기.. #define N3_CHARACTER_SELECT 0x04 // Game start.. -#define N3_NATION_SELECT 0x05 // - 0 ̸ .. +#define N3_NATION_SELECT 0x05 // 국가 선택 - 0 이면 실패.. #define N3_MOVE 0x06 // Move.. #define N3_ROTATE 0x09 // Rotate.. #define N3_USER_INOUT 0x07 // User inout.. #define N3_NPC_INOUT 0x0A // NPC inout.. #define N3_ATTACK 0x08 // Attack.. #define N3_NPC_MOVE 0x0B // NPC move.. -#define N3_ALL_CHARACTER_INFO_REQUEST 0x0C // ij ûϱ.. +#define N3_ALL_CHARACTER_INFO_REQUEST 0x0C // 모든 캐릭터 정보 요청하기.. #define N3_GAMESTART 0x0D // Game Start.. #define N3_MYINFO 0x0E // NPC moveedge.. #define N3_CHAT 0x10 // Chat.. @@ -32,58 +32,58 @@ enum e_ChatMode { N3_CHAT_CLAN, N3_CHAT_PUBLIC, N3_CHAT_WAR, - N3_CHAT_TITLE, //ٿ - N3_CHAT_TITLE_DELETE, //ٿ ִ - N3_CHAT_CONTINUE, // - N3_CHAT_CONTINUE_DELETE, // + N3_CHAT_TITLE, //맨윗줄에 갈 공지 + N3_CHAT_TITLE_DELETE, //맨윗줄에 있는 공지 삭제 + N3_CHAT_CONTINUE, //지속 공지 + N3_CHAT_CONTINUE_DELETE, //지속 공지 삭제 N3_CHAT_UNKNOWN = 0xffffffff }; #define N3_DEAD 0x11 // Player Dead.. #define N3_REGENE 0x12 // Player Regene.. -#define N3_TIME 0x13 // ӻ ð -#define N3_WEATHER 0x14 // ӻ ȭ +#define N3_TIME 0x13 // 게임상의 시간 +#define N3_WEATHER 0x14 // 게임상의 날씨변화 #define N3_UPDATE_REGION_UPC 0x15 // Player Regene.. #define N3_UPDATE_REGION_NPC 0x1C // NPC Region Update -#define N3_REQUEST_NPC_IN 0x1D // NPC û +#define N3_REQUEST_NPC_IN 0x1D // NPC 정보 요청 #define N3_WARP 0x1E // Warp !!! #define N3_ITEM_MOVE 0x1F // Item Move.. #define N3_HP_CHANGE 0x17 // Player stats Update #define N3_MSP_CHANGE 0x18 // Player stats Update #define N3_EXP_CHANGE 0x1A // Player stats Update #define N3_LEVEL_CHANGE 0x1B // Player stats Update -#define N3_REALM_POINT_CHANGE 0x2A // Player stats Update // ⿩ -#define N3_REQUEST_USER_IN 0x16 // Update Region ʿ User In û -#define N3_NPC_EVENT 0x20 // NPC Event ŷ.. -#define N3_ITEM_TRADE_START 0x25 // ŷ Ŷ.. .. -#define N3_TARGET_HP 0x22 // Target Character HP Percentage û -#define N3_ITEM_BUNDLE_DROP 0x23 // 鼭 Item -#define N3_ITEM_BUNDLE_OPEN_REQUEST 0x24 // ۻڸ ų ü .. û ޱ .. -#define N3_ITEM_TRADE 0x21 // ŷ Ŷ.. .. +#define N3_REALM_POINT_CHANGE 0x2A // Player stats Update // 국가 기여도 +#define N3_REQUEST_USER_IN 0x16 // Update Region 다음에 필요한 User In 요청 +#define N3_NPC_EVENT 0x20 // NPC Event 예를 들면 상거래.. +#define N3_ITEM_TRADE_START 0x25 // 상거래 패킷.. 서버가 줌.. +#define N3_TARGET_HP 0x22 // Target Character HP Percentage 요청 +#define N3_ITEM_BUNDLE_DROP 0x23 // 죽으면서 Item 드롭 +#define N3_ITEM_BUNDLE_OPEN_REQUEST 0x24 // 아이템상자를 열거나 시체를 뒤진다.. 요청과 데이터 받기 공통.. +#define N3_ITEM_TRADE 0x21 // 상거래 패킷.. 서버가 줌.. enum e_SubPacket_Trade { N3_SP_TRADE_BUY = 0x01, N3_SP_TRADE_SELL = 0x02, N3_SP_TRADE_MOVE = 0x03 }; -#define N3_ITEM_DROPPED_GET 0x26 // ȹ ۿ .. -#define N3_ZONE_CHANGE 0x27 // ü.. Recv - b1 ȣ f3 ǥ X, Z, Y | Recv +#define N3_ITEM_DROPPED_GET 0x26 // 유저가 획득한 아이템에 대한 거.. +#define N3_ZONE_CHANGE 0x27 // 존체인지.. Recv - b1 존번호 f3 좌표 X, Z, Y | Recv #define N3_POINT_CHANGE \ - 0x28 // ü - b1(1 2ü 3ø 4 5) s(-1 +1) // b1(1 2ü 3ø 4 5ŷ) s(ġ) + 0x28 // 레벨 체인지 - 보낼때 b1(1힘 2체력 3민첩 4지능 5마력) s(-1 +1) // 받을때 b1(1힘 2체력 3민첩 4지능 5매력) s(절대수치) #define N3_STATE_CHANGE \ - 0x29 // ºȭ Send - b2(Type, State) | Recv S1(ID) b2(Type, State) - // Type 1 ɱ⼭, 2 Ƽ... + 0x29 // 상태변화 Send - b2(Type, State) | Recv S1(ID) b2(Type, State) - // Type 1 앉기서기, 2 파티구함... enum e_SubPacket_State { N3_SP_STATE_CHANGE_SITDOWN = 0x01, N3_SP_STATE_CHANGE_RECRUIT_PARTY = 0x02, N3_SP_STATE_CHANGE_SIZE = 0x03, - N3_SP_STATE_CHANGE_ACTION = 0x04, // 1 - λ, 11 - + N3_SP_STATE_CHANGE_ACTION = 0x04, // 1 - 인사, 11 - 도발 N3_SP_STATE_CHANGE_VISIBLE = 0x05 -}; // 0 ~ 255 +}; // 투명 0 ~ 255 -#define N3_VERSION_CHECK 0x2B // üũ... s1 - Version -//#define N3_CRYPTION_PUBLIC_KEY 0x2C // ȣȭ 64 Ʈ Ű Recv 64i -#define N3_USER_LOOK_CHANGE 0x2D // ÷̾ ̳ Ⱑ ٲ.. -#define N3_NOTICE 0x2E // .. +#define N3_VERSION_CHECK 0x2B // 버전 체크... s1 - Version +//#define N3_CRYPTION_PUBLIC_KEY 0x2C // 암호화 64 비트 공개키 Recv 64i +#define N3_USER_LOOK_CHANGE 0x2D // 플레이어의 복장이나 무기가 바뀐다.. +#define N3_NOTICE 0x2E // 공지사항.. #define N3_PARTY_OR_FORCE 0x2F // Party Or Force Packet... Send - b1(Party:1, Force:2) // Sub Packet @@ -91,14 +91,14 @@ enum e_SubPacket_Party { N3_SP_PARTY_OR_FORCE_CREATE = 0x01, // Send - s1(ID) | Recv b1(YesNoErr) N3_SP_PARTY_OR_FORCE_PERMIT = 0x02, // Send - b1(YesNo) | Recv - s1(ID) N3_SP_PARTY_OR_FORCE_INSERT = - 0x03, // Send - s1(ID) | Recv - s3(ID, HPMax, HP) b2(Level, Class) - ڿ ID ˾Ƴ.. ID -1 ̸.. Ƽ ° ѰŴ.. - N3_SP_PARTY_OR_FORCE_REMOVE = 0x04, // Send - s1(ID) | Recv - s1(ID) - ڱ ڽ̸ Ƽ Ѵ.. + 0x03, // Send - s1(ID) | Recv - s3(ID, HPMax, HP) b2(Level, Class) - 문자열은 ID 로 알아낸다.. ID 가 -1 이면.. 파티에 들어오는것을 상대방이 거절한거다.. + N3_SP_PARTY_OR_FORCE_REMOVE = 0x04, // Send - s1(ID) | Recv - s1(ID) - 자기 자신이면 파티를 깨야 한다.. N3_SP_PARTY_OR_FORCE_DESTROY = 0x05, // Send N3_SP_PARTY_OR_FORCE_HP_CHANGE = 0x06, // Recv - s3(ID, HPMax, HP) N3_SP_PARTY_OR_FORCE_LEVEL_CHANGE = 0x07, // Recv - s1(ID), b1(Level) - N3_SP_PARTY_OR_FORCE_CLASS_CHANGE = 0x08, // Recv - s1(ID), b1(Class)幰 Ҷ... + N3_SP_PARTY_OR_FORCE_CLASS_CHANGE = 0x08, // Recv - s1(ID), b1(Class)드물지만 전직할때... N3_SP_PARTY_OR_FORCE_STATUS_CHANGE = 0x09 -}; // Recv - s1(ID), b1(Status), , Ӽ, ູ +}; // Recv - s1(ID), b1(Status)독, 저주, 지속성마법, 축복 #define N3_PER_TRADE 0x30 // Personal Trade.. // Sub Packet @@ -113,19 +113,19 @@ enum e_SubPacket_PerTrade { N3_SP_PER_TRADE_CANCEL = 0x08 }; -// ȿ Ŷ ( ) +// 마법효과 패킷 구조(모두 공통) // (BYTE) N3_MAGIC // (BYTE) N3_MAGIC_CASTING or flying or effecting or fail // (DWORD) Magic ID -// (short) ID -// (short) ŸID +// (short) 시전자 ID +// (short) 타겟ID // (short) data1 // (short) data2 // (short) data3 // (short) data4 // (short) data5 // (short) data6 -#define N3_MAGIC 0x31 //ȿ.. +#define N3_MAGIC 0x31 //마법효과.. // Sub Packet enum e_SubPacket_Magic { N3_SP_MAGIC_CASTING = 0x01, @@ -137,7 +137,7 @@ enum e_SubPacket_Magic { }; #define N3_SKILL_CHANGE 0x32 // Skill Point Change.. -#define N3_OBJECT_EVENT 0x33 // Send - s4(Object Event ID, Parameter, NPC ID, NPC Command) | Recv +#define N3_OBJECT_EVENT 0x33 // Send - s4(Object Event ID, Parameter, 조종할 NPC ID, 조종할 NPC Command) | Recv #define N3_CLASS_CHANGE 0x34 // Class Change.. // Sub Packet.. @@ -158,39 +158,39 @@ enum e_SubPacket_ClassChange { }; // Failure.. #define N3_CHAT_SELECT_TARGET \ - 0x35 // Send - s1(ID String Length) str1(ID String) | Recv - s1(ID String Length) str1(ID String) ڿ ̰ 0̸ .. -#define N3_CONCURRENT_USER_COUNT 0x36 // Send - ... | Recv - s1( ڼ) -#define N3_REQUEST_GAME_SAVE 0x37 // û.. ޴° .. + 0x35 // Send - s1(ID String Length) str1(ID String) | Recv - s1(ID String Length) str1(ID String) 문자열 길이가 0이면 실패.. +#define N3_CONCURRENT_USER_COUNT 0x36 // Send - ... | Recv - s1(현재 동시 접속자수) +#define N3_REQUEST_GAME_SAVE 0x37 // 서버에 저장 요청.. 받는건 없다.. -#define N3_DURABILITY_CHANGE 0x38 // .. +#define N3_DURABILITY_CHANGE 0x38 // 내구력 변경.. -#define N3_TIME_NOTIFY 0x39 // Ŷ ƹ͵ Ⱥ 2 .. ̰ .. +#define N3_TIME_NOTIFY 0x39 // 패킷에서 아무것도 안보낸지 2초 지나면.. 이걸 보낸다.. -#define N3_ITEM_TRADE_REPAIR 0x3a // Ÿ, ȯ, .. -#define N3_ITEM_REPAIR_REQUEST 0x3b // .. +#define N3_ITEM_TRADE_REPAIR 0x3a // 아이템 매매, 교환, 수리.. +#define N3_ITEM_REPAIR_REQUEST 0x3b // 아이템 수리 응답.. #define N3_KNIGHTS 0x3C // Knights Related Packet.. enum e_SubPacket_Knights { - N3_SP_KNIGHTS_CREATE = 0x01, // Send - s1(Name Length) str1 | Recv - b1(1: 0:) - N3_SP_KNIGHTS_JOIN = 0x02, // Send - s1(Knights ID) | Recv - b1(1: 0:) - N3_SP_KNIGHTS_WITHDRAW = 0x03, // Ż Send - | Recv - b1(1: 0:) - N3_SP_KNIGHTS_MEMBER_REMOVE = 0x04, // - - N3_SP_KNIGHTS_DESTROY = 0x05, // ǰ Send - | Recv - b1(1: 0:) - N3_SP_KNIGHTS_MEMBER_JOIN_ADMIT = 0x06, // 㰡 Send - s1(Knights ID) | Recv - b1(1: 0:) - N3_SP_KNIGHTS_MEMBER_JOIN_REJECT = 0x07, // Send - s1(Knights ID) | Recv - b1(1: 0:) - N3_SP_KNIGHTS_MEMBER_PUNISH = 0x08, // ¡ - ԰ - N3_SP_KNIGHTS_APPOINT_CHIEF = 0x09, // Ӹ - ԰ - N3_SP_KNIGHTS_APPOINT_VICECHIEF = 0x0A, // δ Ӹ - ԰ - N3_SP_KNIGHTS_APPOINT_OFFICER = 0x0B, // 屳Ӹ - ԰ + N3_SP_KNIGHTS_CREATE = 0x01, // 생성 Send - s1(Name Length) str1 | Recv - b1(1:성공 0:실패) + N3_SP_KNIGHTS_JOIN = 0x02, // 가입 Send - s1(Knights ID) | Recv - b1(1:성공 0:실패) + N3_SP_KNIGHTS_WITHDRAW = 0x03, // 탈퇴 Send - | Recv - b1(1:성공 0:실패) + N3_SP_KNIGHTS_MEMBER_REMOVE = 0x04, // 멤버 삭제 - + N3_SP_KNIGHTS_DESTROY = 0x05, // 뽀개기 Send - | Recv - b1(1:성공 0:실패) + N3_SP_KNIGHTS_MEMBER_JOIN_ADMIT = 0x06, // 멤버 가입 허가 Send - s1(Knights ID) | Recv - b1(1:성공 0:실패) + N3_SP_KNIGHTS_MEMBER_JOIN_REJECT = 0x07, // 멤버 가입 거절 Send - s1(Knights ID) | Recv - b1(1:성공 0:실패) + N3_SP_KNIGHTS_MEMBER_PUNISH = 0x08, // 멤버 징계 - 가입과 같음 + N3_SP_KNIGHTS_APPOINT_CHIEF = 0x09, // 단장 임명 - 가입과 같음 + N3_SP_KNIGHTS_APPOINT_VICECHIEF = 0x0A, // 부단장 임명 - 가입과 같음 + N3_SP_KNIGHTS_APPOINT_OFFICER = 0x0B, // 장교임명 - 가입과 같음 N3_SP_KNIGHTS_GRADE_CHANGE_ALL = - 0x0C, // Recv - s1(count) Loop { s1(Knights ID) b2(Grade Rank) } + 0x0C, // 전 기사단의 등급 및 순위 변경 Recv - s1(count) Loop { s1(Knights ID) b2(Grade Rank) } N3_SP_KNIGHTS_MEMBER_INFO_ALL = - 0x0D, // û Send - s1(page) | s1(Member Count) Loop { s1(Name Length) str1 (Name) } + 0x0D, // 모든 멤버 요청 Send - s1(page) | s1(Member Count) Loop { s1(Name Length) str1 (Name) } N3_SP_KNIGHTS_MEMBER_INFO_ONLINE = - 0x0E, // Ʈ Send - s1(page) | s1(Member Count) Loop { s1(Name Length) str1 (Name) } - N3_SP_KNIGHTS_STASH = 0x0F, // â - N3_SP_KNIGHTS_DUTY_CHANGE = 0x10, // .. ش .. Recv - s1(Knights ID) b1(); - N3_SP_KNIGHTS_JOIN_REQ = 0x11, // ε + 0x0E, // 현재 접속 리스트 Send - s1(page) | s1(Member Count) Loop { s1(Name Length) str1 (Name) } + N3_SP_KNIGHTS_STASH = 0x0F, // 기사단 창고 + N3_SP_KNIGHTS_DUTY_CHANGE = 0x10, // 멤버의 직위 변경.. 해당 멤버에게 간다.. Recv - s1(Knights ID) b1(직위); + N3_SP_KNIGHTS_JOIN_REQ = 0x11, // 기사단 인덱스 N3_SP_KNIGHTS_UNKNOWN }; @@ -207,96 +207,96 @@ enum e_SubPacket_KNights_Create { }; enum e_SubPacket_KNights_Common { - N3_SP_KNIGHTS_COMMON_DBFAIL = 0x00, //DB˻ .. - N3_SP_KNIGHTS_COMMON_SUCCESS = 0x01, // - N3_SP_KNIGHTS_COMMON_FAIL_NONE_USER = 0x02, // .. - N3_SP_KNIGHTS_COMMON_FAIL_DEAD_USER = 0x03, // ׾ .. - N3_SP_KNIGHTS_COMMON_FAIL_ENEMY_USER = 0x04, // ٸ.. - N3_SP_KNIGHTS_COMMON_FAIL_OTHER_CLAN_USER = 0x05, // ̹ ٸ Ŭ̳ ܿ ԵǾ .. - N3_SP_KNIGHTS_COMMON_FAIL_INVALIDRIGHT = 0x06, // .. - N3_SP_KNIGHTS_COMMON_FAIL_NONE_CLAN = 0x07, // ʴ .. - N3_SP_KNIGHTS_COMMON_FAIL_FULL = 0x08, //ο Ǯ.. - N3_SP_KNIGHTS_COMMON_FAIL_ME = 0x09, //ڱڽ .. - N3_SP_KNIGHTS_COMMON_FAIL_NOT_JOINED = 0x0A, //̳ Ŭ ԵǾ ... - N3_SP_KNIGHTS_COMMON_FAIL_REJECT = 0x0B, // ... - N3_SP_KNIGHTS_COMMON_FAIL_BATTLEZONE = 0x0C // ź.. -}; // join, appoint, leave, withdraw ..... + N3_SP_KNIGHTS_COMMON_DBFAIL = 0x00, //DB검색 실패.. + N3_SP_KNIGHTS_COMMON_SUCCESS = 0x01, //성공 + N3_SP_KNIGHTS_COMMON_FAIL_NONE_USER = 0x02, //없는 유저.. + N3_SP_KNIGHTS_COMMON_FAIL_DEAD_USER = 0x03, //상대유저가 죽어 있음.. + N3_SP_KNIGHTS_COMMON_FAIL_ENEMY_USER = 0x04, //상대유저의 국가가 다름.. + N3_SP_KNIGHTS_COMMON_FAIL_OTHER_CLAN_USER = 0x05, //상대유저가 이미 다른 클랜이나 기사단에 가입되어 있음.. + N3_SP_KNIGHTS_COMMON_FAIL_INVALIDRIGHT = 0x06, //권한이 없음.. + N3_SP_KNIGHTS_COMMON_FAIL_NONE_CLAN = 0x07, //존재하지 않는 기사단.. + N3_SP_KNIGHTS_COMMON_FAIL_FULL = 0x08, //인원이 풀.. + N3_SP_KNIGHTS_COMMON_FAIL_ME = 0x09, //자기자신을 선택한 경우.. + N3_SP_KNIGHTS_COMMON_FAIL_NOT_JOINED = 0x0A, //기사단이나 클랜에 가입되어 있지 않음... + N3_SP_KNIGHTS_COMMON_FAIL_REJECT = 0x0B, //상대편에서 거절... + N3_SP_KNIGHTS_COMMON_FAIL_BATTLEZONE = 0x0C // 전쟁존에서의 거부.. +}; // join, appoint, leave, withdraw 모두 쓴다..... #define N3_ITEM_COUNT_CHANGE 0x3d -#define N3_KNIGHTS_LIST_BASIC 0x3e // û +#define N3_KNIGHTS_LIST_BASIC 0x3e // 기사단 정보 요청 enum e_SubPacket_KnightsList { - N3_SP_KNIGHTS_LIST_BASIC_ALL = 0x01, // Receive - s1(knights Count) { s21(id, ̸), str1(̸) } - N3_SP_KNIGHTS_LIST_BASIC_INSERT = 0x02, // Receive - s2(id, ̸), str1(̸) + N3_SP_KNIGHTS_LIST_BASIC_ALL = 0x01, // Receive - s1(knights Count) { s21(id, 이름길이), str1(이름) } + N3_SP_KNIGHTS_LIST_BASIC_INSERT = 0x02, // Receive - s2(id, 이름길이), str1(이름) N3_SP_KNIGHTS_LIST_BASIC_REMOVE = 0x03 }; // Receive - s1(id) #define N3_ITEM_DESTROY 0x3f -#define N3_ADMINISTRATOR 0x40 // Ŷ.. +#define N3_ADMINISTRATOR 0x40 // 관리자 전용 패킷.. enum e_SubPacket_Administrator { - N3_SP_ADMINISTRATOR_ARREST = 0x01, // ִ ü.. Send b1(Type) s1(̸), str1(̸) - N3_SP_ADMINISTRATOR_FORBID_CONNECT = 0x02, // ӱ ѾƳ.. Send b1(Type) s1(̸), str1(̸) - N3_SP_ADMINISTRATOR_CHAT_FORBID = 0x03, // äñ Send b1(Type) s1(̸), str1(̸) + N3_SP_ADMINISTRATOR_ARREST = 0x01, // 그 유저 있는 곳으로 존체인지.. Send b1(Type) s1(유저이름길이), str1(유저이름) + N3_SP_ADMINISTRATOR_FORBID_CONNECT = 0x02, // 접속금지 및 쫓아내기.. Send b1(Type) s1(유저이름길이), str1(유저이름) + N3_SP_ADMINISTRATOR_CHAT_FORBID = 0x03, // 채팅금지 Send b1(Type) s1(유저이름길이), str1(유저이름) N3_SP_ADMINISTRATOR_CHAT_PERMIT = 0x04 -}; // ä㰡 Send b1(Type) s1(̸), str1(̸) +}; // 채팅허가 Send b1(Type) s1(유저이름길이), str1(유저이름) -#define N3_CHECK_SPEEDHACK 0x41 // ǵ üũ Ŷ.. +#define N3_CHECK_SPEEDHACK 0x41 // 스피드핵 체크용 패킷.. -#define N3_COMPRESSED_PACKET 0x42 // Ŷ,.. Ǯ ѹ Ľؾ Ѵ.. -#define N3_CONTINOUS_PACKET 0x44 // پ Ŷ.. 鼭 Ľؾ Ѵ.. +#define N3_COMPRESSED_PACKET 0x42 // 압축된 패킷,.. 풀어서 한번더 파싱해야 한다.. +#define N3_CONTINOUS_PACKET 0x44 // 붙어서 오는 패킷.. 루프를 돌면서 파싱해야 한다.. -#define N3_WAREHOUSE 0X45 // Ŷ.. +#define N3_WAREHOUSE 0X45 // 보관함 메인 패킷.. enum e_SubPacket_WareHouse { N3_SP_WARE_OPEN = 0x01, // Open.. - N3_SP_WARE_GET_IN = 0x02, // ̱.. - N3_SP_WARE_GET_OUT = 0X03, // .. - N3_SP_WARE_WARE_MOVE = 0x04, // ̵.. - N3_SP_WARE_INV_MOVE = 0x05, // ̵.. - N3_SP_WARE_INN = 0x10, // ó.. .. + N3_SP_WARE_GET_IN = 0x02, // 녛기.. + N3_SP_WARE_GET_OUT = 0X03, // 빼기.. + N3_SP_WARE_WARE_MOVE = 0x04, // 이동.. + N3_SP_WARE_INV_MOVE = 0x05, // 이동.. + N3_SP_WARE_INN = 0x10, // 맨처음..여관주인임을 받음.. N3_SP_WARE_UNKNOWN }; #define N3_SERVER_CHANGE 0x46 #define N3_REPORT_DEBUG_STRING 0x47 -#define N3_HOME 0x48 // .. ޴´. +#define N3_HOME 0x48 // 마을로 가기.. 응답으로 워프를 받는다. #define N3_FRIEND_INFO \ - 0x49 // ģ .. Send s1(īƮ) s1(̸), str1(̸) | Receive s1(īƮ) Loop { s1(̸), str1(̸), b1(, Ƽ or ) } -#define N3_NOAH_CHANGE 0x4a // Change.. + 0x49 // 친구 정보.. Send s1(유저카운트) s1(이름길이), str1(유저이름) | Receive s1(유저카운트) ㅣLoop { s1(이름길이), str1(유저이름), b1(접속, 파티 or 연산) } +#define N3_NOAH_CHANGE 0x4a // 노아 Change.. enum e_SubPacket_NoahChange { - N3_SP_NOAH_GET = 0x01, // , - N3_SP_NOAH_LOST = 0x02, // н.. - N3_SP_NOAH_SPEND = 0x03 // Һ.. + N3_SP_NOAH_GET = 0x01, // 노아 습득, + N3_SP_NOAH_LOST = 0x02, // 노아 분실.. + N3_SP_NOAH_SPEND = 0x03 // 노아 소비.. }; -#define N3_WARP_LIST 0x4b // Ʈ Recv - -//#define N3_SERVER_CHECK 0x4c // ӽ üũ... Recv - s1, str1(IP), s1(dwPort) | Send s1(Zone ID), s3(x*10,z*10,y*10) -//#define N3_SERVER_CONCURRENT_CONNECT 0x4d // ڼ... Send - b1() | Recv - s1(ڼ) -#define N3_CORPSE_CHAR 0x4e // ijͰ ٽ regen Ͽ ü . -#define N3_PARTY_BBS 0x4f // Ƽ Խǿ ϱ +#define N3_WARP_LIST 0x4b // 워프 리스트 Recv - +//#define N3_SERVER_CHECK 0x4c // 가상 임시 서버 체크... Recv - s1, str1(IP), s1(dwPort) | Send s1(Zone ID), s3(x*10,z*10,y*10) +//#define N3_SERVER_CONCURRENT_CONNECT 0x4d // 동시접속자수... Send - b1(국가) | Recv - s1(동접자수) +#define N3_CORPSE_CHAR 0x4e // 캐릭터가 다시 regen을 하여 시체로 남긴다. +#define N3_PARTY_BBS 0x4f // 파티 게시판에 등록하기 enum e_Party_BBS { - N3_SP_PARTY_REGISTER = 0x01, // Ƽ Խǿ - N3_SP_PARTY_REGISTER_CANCEL = 0x02, // Ƽ Խǿ + N3_SP_PARTY_REGISTER = 0x01, // 파티 게시판에 등록 + N3_SP_PARTY_REGISTER_CANCEL = 0x02, // 파티 게시판에서 등록 취소 N3_SP_PARTY_BBS_DATA = 0x03 -}; // Ƽ Խ 䱸 +}; // 파티 게시 정보 요구 -#define N3_TRADE_BBS 0x50 // ŷ Խ +#define N3_TRADE_BBS 0x50 // 상거래 게시판 enum e_Trade_BBS_Kind { - N3_SP_TRADE_BBS_BUY = 0x01, // + N3_SP_TRADE_BBS_BUY = 0x01, // 사는 물건 목록 N3_SP_TRADE_BBS_SELL = 0x02 -}; // Ĵ +}; // 파는 물건 목록 enum e_Trade_BBS_Sub { - N3_SP_TYPE_REGISTER = 0x01, // ϱ - N3_SP_TYPE_REGISTER_CANCEL = 0x02, // ϱ - N3_SP_TYPE_BBS_DATA = 0x03, // Խ 䱸 - N3_SP_TYPE_BBS_OPEN = 0x04, // ŷ Խ + N3_SP_TYPE_REGISTER = 0x01, // 물건 등록하기 + N3_SP_TYPE_REGISTER_CANCEL = 0x02, // 등록 해제하기 + N3_SP_TYPE_BBS_DATA = 0x03, // 게시판 정보 요구 + N3_SP_TYPE_BBS_OPEN = 0x04, // 상거래 게시판 열기 N3_SP_TYPE_BBS_TRADE = 0X05 -}; // Խǿ ŷ ûϱ +}; // 게시판에서 거래 신청하기 #define N3_KICK_OUT 0x51 // Recv s1, str1(IP) s1(port) | Send s1, str1(ID) -#define N3_NPC_QUEST 0X52 // npc Ʈ -#define N3_ALIVE_CHECK 0x53 // ܼ +#define N3_NPC_QUEST 0X52 // npc 퀘스트 +#define N3_ALIVE_CHECK 0x53 // 단순 에코 #define N3_ITEM_WEIGHT_CHANGE 0x54 -#define N3_QUEST_SELECT 0x55 // Ʈ ޴ -#define N3_QUEST_TALK 0x56 // Ʈ ȭ +#define N3_QUEST_SELECT 0x55 // 퀘스트 메뉴 선택 +#define N3_QUEST_TALK 0x56 // 퀘스트 대화 -#define N3_TEMP_TEST 0xff // ӽ ׽Ʈ.. +#define N3_TEMP_TEST 0xff // 임시 테스트.. #ifdef _DEBUG #include diff --git a/src/game/PlayerBase.cpp b/src/game/PlayerBase.cpp index 5f5c76be..16030a7f 100644 --- a/src/game/PlayerBase.cpp +++ b/src/game/PlayerBase.cpp @@ -24,52 +24,52 @@ CN3SndObj * CPlayerBase::m_pSnd_MyMove = NULL; CPlayerBase::CPlayerBase() { m_ePlayerType = PLAYER_BASE; // Player Type ... Base, NPC, OTher, MySelf - m_Chr.PartAlloc(PART_POS_COUNT); // ⺻ Ʈ ÷ .. + m_Chr.PartAlloc(PART_POS_COUNT); // 기본적으로 파트와 플러그 세팅.. m_Chr.PlugAlloc(PLUG_POS_COUNT); - m_pLooksRef = NULL; // ⺻ ⺻ ̺ - memset(m_pItemPlugBasics, 0, sizeof(m_pItemPlugBasics)); // ijͿ .. + m_pLooksRef = NULL; // 기본적인 모습과 기본 정보 참조 테이블 + memset(m_pItemPlugBasics, 0, sizeof(m_pItemPlugBasics)); // 캐릭터에 붙은 무기들.. memset(m_pItemPlugExts, 0, sizeof(m_pItemPlugExts)); - memset(m_pItemPartBasics, 0, sizeof(m_pItemPartBasics)); // ijͿ ʵ.. - memset(m_pItemPartExts, 0, sizeof(m_pItemPartExts)); // ijͿ ʵ.. + memset(m_pItemPartBasics, 0, sizeof(m_pItemPartBasics)); // 캐릭터에 붙은 갑옷들.. + memset(m_pItemPartExts, 0, sizeof(m_pItemPartExts)); // 캐릭터에 붙은 갑옷들.. m_iIDTarget = -1; m_iMagicAni = 0; - m_bGuardSuccess = false; //  ߴ ÷.. - m_bVisible = true; // ̴?? + m_bGuardSuccess = false; // 방어에 성공했는지에 대한 플래그.. + m_bVisible = true; // 보이는지?? - m_iDroppedItemID = 0; // Ʈ + m_iDroppedItemID = 0; // 죽은후 떨어트린 아이템 - m_Chr.m_nJointPartStarts[0] = 1; // ü - ϸ̼ и óϴµ... Ʈ ε̴. - m_Chr.m_nJointPartEnds[0] = 15; // ü + m_Chr.m_nJointPartStarts[0] = 1; // 상체 - 에니메이션을 분리해 처리하는데... 조인트 인덱스이다. + m_Chr.m_nJointPartEnds[0] = 15; // 상체 - m_Chr.m_nJointPartStarts[1] = 16; // ü - m_Chr.m_nJointPartEnds[1] = 23; // ü + m_Chr.m_nJointPartStarts[1] = 16; // 하체 + m_Chr.m_nJointPartEnds[1] = 23; // 하체 - m_cvDuration.a = m_cvDuration.r = m_cvDuration.g = m_cvDuration.b = 1.0f; // ÷ - m_fDurationColorTimeCur = 0; // ð.. - m_fDurationColorTime = 0; // ӽð.. + m_cvDuration.a = m_cvDuration.r = m_cvDuration.g = m_cvDuration.b = 1.0f; // 지속 컬러 값 + m_fDurationColorTimeCur = 0; // 현재 시간.. + m_fDurationColorTime = 0; // 지속시간.. - m_fFlickeringFactor = 1.0f; // ڰŸ 1.0 ̸ ʴ´.... - m_fFlickeringTime = 0; // ڰŸ ð.. + m_fFlickeringFactor = 1.0f; // 깜박거림 알파 값 1.0 이면 깜박이지 않는다.... + m_fFlickeringTime = 0; // 깜박거림 시간.. - m_fTimeAfterDeath = 0; // ״ ϴ Ÿ̸ - 5 Ѱ?? ٷ ״´. + m_fTimeAfterDeath = 0; // 죽는 모션을 취하는 타이머 - 5초정도면 적당한가?? 그전에 공격을 받으면 바로 죽는다. m_eStateNext = m_eState = PSA_BASIC; - m_eStateMove = PSM_STOP; // ÷ .. - m_eStateDying = PSD_UNKNOWN; // - m_fTimeDying = 0; // ״ Ҷ ð.. + m_eStateMove = PSM_STOP; // 첨에 정지.. + m_eStateDying = PSD_UNKNOWN; // 죽을때 방법 + m_fTimeDying = 0; // 죽는 모션 취할때 지난 시간.. - m_fRotRadianPerSec = D3DXToRadian(270.0f); // ʴ ȸ Ȱ + m_fRotRadianPerSec = D3DXToRadian(270.0f); // 초당 회전 라디안값 m_fMoveSpeedPerSec = - 0; // ʴ .. ̰ ⺻̰ (ȱ, ޸, ڷ, ֵ) ؼ .. - m_fYawCur = 0; // ȸ.. + 0; // 초당 움직임 값.. 이값은 기본값이고 상태(걷기, 달리기, 뒤로, 저주등) 에 따라 가감해서 쓴다.. + m_fYawCur = 0; // 현재 회전값.. m_fYawToReach = 0; - m_fGravityCur = 0; // ߷°.. - m_fYNext = 0; // Ʈ Ȥ 浹 üũ ̰.. + m_fGravityCur = 0; // 중력값.. + m_fYNext = 0; // 오브젝트 혹은 지형의 충돌 체크에 따른 높이값.. - m_fScaleToSet = 1.0f; // ȭ.. + m_fScaleToSet = 1.0f; // 점차 스케일 값변화.. m_fScalePrev = 1.0f; m_pSnd_Move = NULL; @@ -82,19 +82,19 @@ CPlayerBase::CPlayerBase() { m_pSnd_Blow = NULL; m_bSoundAllSet = false; - m_InfoBase.Init(); // ÷ 𸥴.. + m_InfoBase.Init(); // 첨엔 종족값을 모른다.. - m_pShapeExtraRef = NULL; // NPC ̳ Ʈ ̸ ͸ ؼ ,.. + m_pShapeExtraRef = NULL; // 이 NPC 가 성문이나 집등 오브젝트의 형태이면 이 포인터를 세팅해서 쓴,다.. m_fCastFreezeTime = 0.0f; - m_iSkillStep = 0; // ų ִٸ 0 ƴѰ̴... - m_fAttackDelta = 1.0f; // ų̳ ϴ ӵ.. 1.0 ⺻̰ Ŭ Ѵ. - m_fMoveDelta = 1.0f; // ų̳ ϴ ̵ ӵ 1.0 ⺻̰ Ŭ δ. + m_iSkillStep = 0; // 현재 스킬을 쓰고 있다면 0 이 아닌값이다... + m_fAttackDelta = 1.0f; // 스킬이나 마법에 의해 변하는 공격 속도.. 1.0 이 기본이고 클수록 더 빨리 공격한다. + m_fMoveDelta = 1.0f; // 스킬이나 마법에 의해 변하는 이동 속도 1.0 이 기본이고 클수록 더 빨리 움직인다. - m_vDirDying.Set(0, 0, 1); // и .. + m_vDirDying.Set(0, 0, 1); // 죽을때 밀리는 방향.. - // ׸ ʱȭ - // By : Ecli666 ( On 2002-03-29 4:23:36 ) + // 그림자 초기화 + // By : Ecli666 ( On 2002-03-29 오후 4:23:36 ) /* m_pTexShadow = NULL; m_pTexShadow = s_MngTex.Get("Chr\\Shadow_Character.tga"); @@ -103,16 +103,16 @@ CPlayerBase::CPlayerBase() { m_vShadows[2].Set( 0.7f, 0,-0.7f, 1, 1); m_vShadows[3].Set(-0.7f, 0,-0.7f, 0, 1); */ - // ~(By Ecli666 On 2002-03-29 4:23:36 ) + // ~(By Ecli666 On 2002-03-29 오후 4:23:36 ) - // Ʈ ʱȭ... // ǥÿ Ʈ dz Ѵ.. + // 폰트 초기화... // 정보 표시용 폰트와 풍선용은 따로 생성한다.. m_pIDFont = NULL; m_pClanFont = NULL; m_pInfoFont = NULL; m_pBalloonFont = NULL; m_fTimeBalloon = 0; - m_bAnimationChanged = false; // ť ϸ̼ ϴ õȴ.. + m_bAnimationChanged = false; // 큐에 넣은 에니메이션이 변하는 순간만 세팅된다.. m_pvVertex[0].Set(-SHADOW_PLANE_SIZE, 0.0f, SHADOW_PLANE_SIZE, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f); m_pvVertex[1].Set(SHADOW_PLANE_SIZE, 0.0f, SHADOW_PLANE_SIZE, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f); @@ -121,7 +121,7 @@ CPlayerBase::CPlayerBase() { unsigned short * pIdx = m_pIndex; - // Ʒ. + // 아랫면. *pIdx++ = 0; *pIdx++ = 1; *pIdx++ = 3; @@ -133,11 +133,11 @@ CPlayerBase::CPlayerBase() { } CPlayerBase::~CPlayerBase() { - // By : Ecli666 ( On 2002-03-29 4:24:14 ) + // By : Ecli666 ( On 2002-03-29 오후 4:24:14 ) // // s_MngTex.Delete(m_pTexShadow); - // ~(By Ecli666 On 2002-03-29 4:24:14 ) + // ~(By Ecli666 On 2002-03-29 오후 4:24:14 ) delete m_pClanFont; m_pClanFont = NULL; delete m_pIDFont; @@ -158,7 +158,7 @@ CPlayerBase::~CPlayerBase() { CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Blow); if (m_pShapeExtraRef) { - m_pShapeExtraRef->m_bVisible = false; // Ⱥ̰ Ѵ.. + m_pShapeExtraRef->m_bVisible = false; // 안보이게 한다.. } } @@ -166,7 +166,7 @@ void CPlayerBase::Release() { m_AnimationDeque.clear(); m_Chr.Release(); - m_Chr.PartAlloc(PART_POS_COUNT); // ⺻ Ʈ ÷ .. + m_Chr.PartAlloc(PART_POS_COUNT); // 기본적으로 파트와 플러그 세팅.. m_Chr.PlugAlloc(PLUG_POS_COUNT); m_bSoundAllSet = false; @@ -179,56 +179,56 @@ void CPlayerBase::Release() { // CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Breathe_1); CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Blow); - m_pLooksRef = NULL; // ⺻ ⺻ ̺ - memset(m_pItemPlugBasics, 0, sizeof(m_pItemPlugBasics)); // ijͿ .. + m_pLooksRef = NULL; // 기본적인 모습과 기본 정보 참조 테이블 + memset(m_pItemPlugBasics, 0, sizeof(m_pItemPlugBasics)); // 캐릭터에 붙은 무기들.. memset(m_pItemPlugExts, 0, sizeof(m_pItemPlugExts)); - memset(m_pItemPartBasics, 0, sizeof(m_pItemPartBasics)); // ijͿ ʵ.. - memset(m_pItemPartExts, 0, sizeof(m_pItemPartExts)); // ijͿ ʵ.. + memset(m_pItemPartBasics, 0, sizeof(m_pItemPartBasics)); // 캐릭터에 붙은 갑옷들.. + memset(m_pItemPartExts, 0, sizeof(m_pItemPartExts)); // 캐릭터에 붙은 갑옷들.. m_iIDTarget = -1; - m_bGuardSuccess = false; //  ߴ ÷.. - m_bVisible = true; // ̴?? + m_bGuardSuccess = false; // 방어에 성공했는지에 대한 플래그.. + m_bVisible = true; // 보이는지?? - m_cvDuration.a = m_cvDuration.r = m_cvDuration.g = m_cvDuration.b = 1.0f; // ÷ - m_fDurationColorTimeCur = 0; // ð.. - m_fDurationColorTime = 0; // ӽð.. + m_cvDuration.a = m_cvDuration.r = m_cvDuration.g = m_cvDuration.b = 1.0f; // 지속 컬러 값 + m_fDurationColorTimeCur = 0; // 현재 시간.. + m_fDurationColorTime = 0; // 지속시간.. - m_fFlickeringFactor = 1.0f; // ڰŸ 1.0 ̸ ʴ´.... - m_fFlickeringTime = 0; // ڰŸ ð.. + m_fFlickeringFactor = 1.0f; // 깜박거림 알파 값 1.0 이면 깜박이지 않는다.... + m_fFlickeringTime = 0; // 깜박거림 시간.. - m_fTimeAfterDeath = 0; // ״ ϴ Ÿ̸ - 5 Ѱ?? ٷ ״´. + m_fTimeAfterDeath = 0; // 죽는 모션을 취하는 타이머 - 5초정도면 적당한가?? 그전에 공격을 받으면 바로 죽는다. m_eStateNext = m_eState = PSA_BASIC; - m_eStateMove = PSM_STOP; // ÷ .. - m_eStateDying = PSD_UNKNOWN; // - m_fTimeDying = 0; // ״ Ҷ ð.. + m_eStateMove = PSM_STOP; // 첨에 정지.. + m_eStateDying = PSD_UNKNOWN; // 죽을때 방법 + m_fTimeDying = 0; // 죽는 모션 취할때 지난 시간.. - m_fRotRadianPerSec = D3DXToRadian(270.0f); // ʴ ȸ Ȱ + m_fRotRadianPerSec = D3DXToRadian(270.0f); // 초당 회전 라디안값 m_fMoveSpeedPerSec = - 0; // ʴ .. ̰ ⺻̰ (ȱ, ޸, ڷ, ֵ) ؼ .. - m_fYawCur = 0; // ȸ.. + 0; // 초당 움직임 값.. 이값은 기본값이고 상태(걷기, 달리기, 뒤로, 저주등) 에 따라 가감해서 쓴다.. + m_fYawCur = 0; // 현재 회전값.. m_fYawToReach = 0; - m_fGravityCur = 0; // ߷°.. - m_fYNext = 0; // Ʈ Ȥ 浹 üũ ̰.. + m_fGravityCur = 0; // 중력값.. + m_fYNext = 0; // 오브젝트 혹은 지형의 충돌 체크에 따른 높이값.. - m_fScaleToSet = 1.0f; // ȭ.. + m_fScaleToSet = 1.0f; // 점차 스케일 값변화.. m_fScalePrev = 1.0f; - m_InfoBase.Init(); // ÷ 𸥴.. + m_InfoBase.Init(); // 첨엔 종족값을 모른다.. - m_pShapeExtraRef = NULL; // NPC ̳ Ʈ ̸ ͸ ؼ ,.. + m_pShapeExtraRef = NULL; // 이 NPC 가 성문이나 집등 오브젝트의 형태이면 이 포인터를 세팅해서 쓴,다.. m_fCastFreezeTime = 0.0f; - m_iSkillStep = 0; // ų ִٸ 0 ƴѰ̴... - m_fAttackDelta = 1.0f; // ų̳ ϴ ӵ.. 1.0 ⺻̰ Ŭ Ѵ. - m_fMoveDelta = 1.0f; // ų̳ ϴ ̵ ӵ 1.0 ⺻̰ Ŭ δ. - m_vDirDying.Set(0, 0, 1); // и .. + m_iSkillStep = 0; // 현재 스킬을 쓰고 있다면 0 이 아닌값이다... + m_fAttackDelta = 1.0f; // 스킬이나 마법에 의해 변하는 공격 속도.. 1.0 이 기본이고 클수록 더 빨리 공격한다. + m_fMoveDelta = 1.0f; // 스킬이나 마법에 의해 변하는 이동 속도 1.0 이 기본이고 클수록 더 빨리 움직인다. + m_vDirDying.Set(0, 0, 1); // 죽을때 밀리는 방향.. - m_bAnimationChanged = false; // ť ϸ̼ ϴ õȴ.. + m_bAnimationChanged = false; // 큐에 넣은 에니메이션이 변하는 순간만 세팅된다.. if (m_pShapeExtraRef) { - m_pShapeExtraRef->m_bVisible = false; // Ⱥ̰ Ѵ.. + m_pShapeExtraRef->m_bVisible = false; // 안보이게 한다.. } CGameBase::Release(); @@ -261,14 +261,14 @@ void CPlayerBase::SetSoundAndInitFont() { m_pSnd_Blow = CN3Base::s_SndMgr.CreateObj(100); } - // ⿡ شǴ ... + // 무기에 해당되는 사운드... __TABLE_ITEM_BASIC * pItemBasic = m_pItemPlugBasics[PLUG_POS_RIGHTHAND]; if (!pItemBasic) { pItemBasic = m_pItemPlugBasics[PLUG_POS_LEFTHAND]; } this->SetSoundPlug(pItemBasic); - // Font ʱȭ.. + // Font 초기화.. if (!m_pIDFont) { std::string szFontID; ::_LoadStringFromResource(IDS_FONT_ID, szFontID); @@ -276,7 +276,7 @@ void CPlayerBase::SetSoundAndInitFont() { m_pIDFont->InitDeviceObjects(s_lpD3DDev); m_pIDFont->RestoreDeviceObjects(); - m_pIDFont->SetText(m_InfoBase.szID.c_str(), D3DFONT_BOLD); // Ʈ ؽƮ . + m_pIDFont->SetText(m_InfoBase.szID.c_str(), D3DFONT_BOLD); // 폰트에 텍스트 지정. m_pIDFont->SetFontColor(m_InfoBase.crID); } } @@ -285,13 +285,13 @@ void CPlayerBase::SetSoundPlug(__TABLE_ITEM_BASIC * pItemBasic) { CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Attack_0); // CN3Base::s_SndMgr.ReleaseObj(&m_pSnd_Attack_1); - if (pItemBasic) // ־.. + if (pItemBasic) //사운드 넣어라.. { m_pSnd_Attack_0 = CN3Base::s_SndMgr.CreateObj(pItemBasic->dwSoundID0); - // m_pSnd_Attack_1 = CN3Base::s_SndMgr.CreateObj(pItemBasic->dwSoundID1); // ´ Ҹ.. + // m_pSnd_Attack_1 = CN3Base::s_SndMgr.CreateObj(pItemBasic->dwSoundID1); // 맞는 소리.. } else { - m_pSnd_Attack_0 = CN3Base::s_SndMgr.CreateObj(m_pLooksRef->iSndID_Attack0); // ֵθ Ҹ. - // m_pSnd_Attack_1 = CN3Base::s_SndMgr.CreateObj(m_pLooksRef->iSndID_Attack1); // ֵθ Ҹ. + m_pSnd_Attack_0 = CN3Base::s_SndMgr.CreateObj(m_pLooksRef->iSndID_Attack0); // 휘두르는 소리. + // m_pSnd_Attack_1 = CN3Base::s_SndMgr.CreateObj(m_pLooksRef->iSndID_Attack1); // 휘두르는 소리. } } @@ -333,14 +333,14 @@ void CPlayerBase::InfoStringSet(const std::string & szInfo, D3DCOLOR crFont) { return; } else { if (NULL == m_pInfoFont) { - // Ÿ ǥ Ʈ.. + // 기타 정보를 표시할 폰트.. std::string szFontInfo; ::_LoadStringFromResource(IDS_FONT_INFO, szFontInfo); m_pInfoFont = new CDFont(szFontInfo, 12); m_pInfoFont->InitDeviceObjects(s_lpD3DDev); m_pInfoFont->RestoreDeviceObjects(); } - m_pInfoFont->SetText(szInfo.c_str(), D3DFONT_BOLD); // Ʈ ؽƮ . + m_pInfoFont->SetText(szInfo.c_str(), D3DFONT_BOLD); // 폰트에 텍스트 지정. m_pInfoFont->SetFontColor(crFont); } } @@ -349,11 +349,11 @@ void CPlayerBase::BalloonStringSet(const std::string & szBalloon, D3DCOLOR crFon if (szBalloon.empty()) { delete m_pBalloonFont; m_pBalloonFont = NULL; - m_fTimeBalloon = 0; // dz ǥýð.. + m_fTimeBalloon = 0; // 풍선말 표시시간.. return; } else { if (NULL == m_pBalloonFont) { - // Ÿ ǥ Ʈ.. + // 기타 정보를 표시할 폰트.. std::string szFontBalloon; ::_LoadStringFromResource(IDS_FONT_BALLOON, szFontBalloon); m_pBalloonFont = new CDFont(szFontBalloon, 12); @@ -364,17 +364,17 @@ void CPlayerBase::BalloonStringSet(const std::string & szBalloon, D3DCOLOR crFon m_fTimeBalloon = szBalloon.size() * 0.2f; } - m_pBalloonFont->SetText(szBalloon.c_str(), 0); // Ʈ ؽƮ . + m_pBalloonFont->SetText(szBalloon.c_str(), 0); // 폰트에 텍스트 지정. m_pBalloonFont->SetFontColor(crFont); } void CPlayerBase::IDSet(int iID, const std::string & szID, D3DCOLOR crID) { m_InfoBase.iID = iID; - m_InfoBase.szID = szID; // ̸ ID üѴ. + m_InfoBase.szID = szID; // 이름으로 ID 를 대체한다. m_InfoBase.crID = crID; #ifdef _DEBUG - m_Chr.m_szName = szID; // ؼ ̸ ־.. ׷ ϴ.. + m_Chr.m_szName = szID; // 디버깅을 위해서 이름을 넣어논다.. 그래야 구별 가능하다.. #endif } @@ -382,7 +382,7 @@ void CPlayerBase::KnightsInfoSet(int iID, const std::string & szName, int iGrade char szPlug[128] = ""; if (iGrade > 0 && iGrade <= 5) { sprintf(szPlug, "Item\\ClanAddOn_%.3d_%d.n3cplug", m_InfoBase.eRace, - iGrade); // ÷ ̸ .. + iGrade); // 종족과 등급으로 플러그 이름을 만든다.. } CN3CPlugBase * pPlug = this->PlugSet(PLUG_POS_KNIGHTS_GRADE, szPlug, NULL, NULL); @@ -407,7 +407,7 @@ void CPlayerBase::KnightsInfoSet(int iID, const std::string & szName, int iGrade /* void CPlayerBase::RenderShadow() { -// By : Ecli666 ( On 2002-03-29 4:22:59 ) +// By : Ecli666 ( On 2002-03-29 오후 4:22:59 ) /* LPDIRECT3DTEXTURE9 lpTex = NULL; if(m_pTexShadow) lpTex = m_pTexShadow->Get(); @@ -438,23 +438,23 @@ void CPlayerBase::RenderShadow() for(int i = 0; i < 4; i++) m_vShadows[i].y = s_pTerrain->GetHeight(pAP->MtxWorld._41 + m_vShadows[i].x, pAP->MtxWorld._43 + m_vShadows[i].z); - return; // . + return; // 렌더링 안하지롱. */ -// ~(By Ecli666 On 2002-03-29 4:22:59 ) +// ~(By Ecli666 On 2002-03-29 오후 4:22:59 ) /* - // ׸ . + // 그림자 렌더링. // backup DWORD dwAlpha; s_lpD3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &dwAlpha); - // render state + // render state 세팅 if(FALSE == dwAlpha) s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); s_lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); s_lpD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - // texture state (alpha) + // texture state 세팅 (alpha) LPDIRECT3DTEXTURE9 lpTex = m_pTexShadow->Get(); s_lpD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); s_lpD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); @@ -484,10 +484,10 @@ void CPlayerBase::RenderChrInRect(CN3Chr * pChr, const RECT & Rect) { return; } - // 2002 2 15 Dino .. - // viewport 0 ( front buffer ) . + // 2002년 2월 15일 Dino 재수정.. + // viewport 영역을 0보다 작은곳에서부터 (즉 front buffer의 영역을 벗어나게) 지정할 수 없기 때문에 계산이 복잡해졌다. - RECT rcViewport; // viewport ٽ Ѵ. (front buffer ũ⸦  ʰ..) + RECT rcViewport; // viewport 영역을 다시 계산한다. (front buffer의 크기를 벗어나지 않게..) if (Rect.left < 0) { rcViewport.left = 0; } else { @@ -518,45 +518,45 @@ void CPlayerBase::RenderChrInRect(CN3Chr * pChr, const RECT & Rect) { vp.MinZ = 0.0f; vp.MaxZ = 1.0f; if (vp.Width <= 0 || vp.Height <= 0 || vp.Width > s_CameraData.vp.Width || vp.Height > s_CameraData.vp.Height) { - return; // front buffer WidthǴ Height ũ ׸ ʴ´. + return; // front buffer보다 Width또는 Height가 크면 그리지 않는다. } s_lpD3DDev->SetViewport(&vp); // set matrix __Matrix44 mtxProj, mtxView; - float fChrHeight = pChr->Height() + 0.2f; // ij Ű 20cm Ѱ + float fChrHeight = pChr->Height() + 0.2f; // 캐릭터의 키에 20cm정도 더한값 float fVCenter = fChrHeight * 0.5f; int iWidth = Rect.right - Rect.left; int iHeight = Rect.bottom - Rect.top; float fViewVolumeHeight = - fChrHeight * vp.Height / iHeight; // ij Ű(Ŭ Ŭ Ǵ ° ش.) + fChrHeight * vp.Height / iHeight; // 캐릭터의 키(클리핑 될 경우 클리핑 되는 비율에 맞게 좁혀준다.) float fViewVolumeWidth = fChrHeight * vp.Width / - iHeight; // δ pRect ° (Ŭ Ŭ Ǵ ° ش.) - // ̰ : fChrHeight * iWidth / iHeight * vp.Width / iWidth; + iHeight; // 가로는 pRect의 가로 세로 비율에 맞게 (클리핑 될 경우 클리핑 되는 비율에 맞게 좁혀준다.) + // 원래는 이거 : fChrHeight * iWidth / iHeight * vp.Width / iWidth; D3DXMatrixOrthoLH(&mtxProj, fViewVolumeWidth, fViewVolumeHeight, 0, 20); - float fCameraMoveX = ((fChrHeight * iWidth / iHeight) - fViewVolumeWidth) / 2.0f; // Ŭο ī޶ ̵ ġ + float fCameraMoveX = ((fChrHeight * iWidth / iHeight) - fViewVolumeWidth) / 2.0f; // 클리핑에 따른 카메라 이동 수치 float fCameraMoveY = (fChrHeight - fViewVolumeHeight) / 2.0f; if (rcViewport.left != Rect.left) { fCameraMoveX = - -fCameraMoveX; // © ׷ ϹǷ ī޶ (ī޶ -Z ٶ󺸱 ī޶ -X̴.) ̵ + -fCameraMoveX; // 왼쪽 영역이 짤리게 그려야 하므로 카메라를 오른쪽(카메라가 -Z축을 바라보기 때문에 카메라의 오른쪽은 -X쪽이다.)으로 이동 } if (rcViewport.top != Rect.top) { - fCameraMoveY = -fCameraMoveY; // © ׷ ϹǷ ī޶ Ʒ ̵ + fCameraMoveY = -fCameraMoveY; // 위쪽 영역이 짤리게 그려야 하므로 카메라를 아래쪽으로 이동 } - // D3DXMatrixLookAtLH( &mtxView, &D3DXVECTOR3( 0.0f + fCameraMoveX, fVCenter+2.0f + fCameraMoveY, 10.0f ), // ⼭ View matrix ī޶ ִ. Ÿ ٿ ƹ ġ ʴ´. - // &D3DXVECTOR3( 0.0f + fCameraMoveX, fVCenter + fCameraMoveY, 0.0f ), // fVCenter: ij Ű ߰ ٶ󺸱 + // D3DXMatrixLookAtLH( &mtxView, &D3DXVECTOR3( 0.0f + fCameraMoveX, fVCenter+2.0f + fCameraMoveY, 10.0f ), // 여기서 View matrix는 카메라 각도와 상관있다. 거리는 원근에 아무 영향을 미치지 않는다. + // &D3DXVECTOR3( 0.0f + fCameraMoveX, fVCenter + fCameraMoveY, 0.0f ), // fVCenter: 캐릭터 키의 중간을 바라보기 // &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) ); const __Vector3 & vChrPos = pChr->Pos(); D3DXVECTOR3 vEye(vChrPos.x + fCameraMoveX, vChrPos.y + fVCenter + 2.0f + fCameraMoveY, vChrPos.z + 10.0f); D3DXVECTOR3 vAt(vChrPos.x + fCameraMoveX, vChrPos.y + fVCenter + fCameraMoveY, vChrPos.z + 0.0f); D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f); D3DXMatrixLookAtLH(&mtxView, - &vEye, // ⼭ View matrix ī޶ ִ. Ÿ ٿ ƹ ġ ʴ´. - &vAt, // fVCenter: ij Ű ߰ ٶ󺸱 + &vEye, // 여기서 View matrix는 카메라 각도와 상관있다. 거리는 원근에 아무 영향을 미치지 않는다. + &vAt, // fVCenter: 캐릭터 키의 중간을 바라보기 &vUp); s_lpD3DDev->SetTransform(D3DTS_VIEW, &mtxView); s_lpD3DDev->SetTransform(D3DTS_PROJECTION, &mtxProj); @@ -564,7 +564,7 @@ void CPlayerBase::RenderChrInRect(CN3Chr * pChr, const RECT & Rect) { // backup render state DWORD dwFog, dwZEnable; //, dwLighting; s_lpD3DDev->GetRenderState(D3DRS_ZENABLE, &dwZEnable); - // s_lpD3DDev->GetRenderState( D3DRS_LIGHTING, &dwLighting ); // lighting ܺο ְ . + // s_lpD3DDev->GetRenderState( D3DRS_LIGHTING, &dwLighting ); // lighting은 외부에서 조정할 수 있게 하자. s_lpD3DDev->GetRenderState(D3DRS_FOGENABLE, &dwFog); // set render state @@ -582,7 +582,7 @@ void CPlayerBase::RenderChrInRect(CN3Chr * pChr, const RECT & Rect) { int iLODPrev = CN3Chr::LODDelta(); CN3Chr::LODDeltaSet(0); - pChr->m_nLOD = 1; // LOD 0 .(ִ ϰ..) + pChr->m_nLOD = 1; // LOD를 0으로 만든다.(최대한 디테일하게..) pChr->Render(); CN3Chr::LODDeltaSet(iLODPrev); @@ -613,24 +613,24 @@ void CPlayerBase::FlickerFactorSet(float fAlpha) { fAlpha = 1.0f; } - m_fFlickeringFactor = fAlpha; // ڰŸ 1.0 ̸ ʴ´.... - m_fFlickeringTime = 0; // ڰŸ ð.. + m_fFlickeringFactor = fAlpha; // 깜박거림 알파 값 1.0 이면 깜박이지 않는다.... + m_fFlickeringTime = 0; // 깜박거림 시간.. } void CPlayerBase::RotateTo(float fYaw, bool bImmediately) { int iLot = (int)(fYaw / __PI2); if (iLot) { - fYaw -= iLot * __PI2; // 0 ~ 360 ̷ ߰.. + fYaw -= iLot * __PI2; // 0 ~ 360 도 사이로 맞추고.. } iLot = (int)(fYaw / __PI); if (iLot) { - fYaw -= iLot * __PI2; // -180 ~ 180 ̷ .. + fYaw -= iLot * __PI2; // -180 ~ 180 사이로 맞춘다.. } m_fYawToReach = fYaw; if (bImmediately) { - m_fYawCur = fYaw; // ٷ ϸ.. + m_fYawCur = fYaw; // 바로 돌려야 하면.. } } @@ -644,16 +644,16 @@ void CPlayerBase::RotateTo(CPlayerBase * pOther) { vDir.Normalize(); float fYaw = ::_Yaw2D(vDir.x, vDir.z); - this->RotateTo(fYaw, false); // + this->RotateTo(fYaw, false); // 방향을 돌리고 } void CPlayerBase::TickYaw() { - if (m_fYawCur != m_fYawToReach && this->IsAlive()) // ȸ ؾ Ѵٸ.. ִ Ѹ... + if (m_fYawCur != m_fYawToReach && this->IsAlive()) // 회전을 해야 한다면.. 살아 있는 넘만... { - float fYawDiff = m_fYawToReach - m_fYawCur; // ȸ . - float fYawDelta = m_fRotRadianPerSec * s_fSecPerFrm; // ȸ + float fYawDiff = m_fYawToReach - m_fYawCur; // 회전값 차이. + float fYawDelta = m_fRotRadianPerSec * s_fSecPerFrm; // 회전할 양 if (T_Abs(fYawDiff) <= fYawDelta) { - m_fYawCur = m_fYawToReach; // ȸ .. ٷ + m_fYawCur = m_fYawToReach; // 회전할 양이 작으면.. 바로 세팅 } else { if (fYawDiff > 0) { if (fYawDiff < __PI) { @@ -669,51 +669,51 @@ void CPlayerBase::TickYaw() { } } - m_fYawCur += fYawDelta; // ȸ.. + m_fYawCur += fYawDelta; // 회전.. if (T_Abs(m_fYawCur) > __PI) { int iLot = (int)(m_fYawCur / __PI); if (iLot) { - m_fYawCur -= iLot * __PI2; // 0 ~ 360 ̷ ߰.. + m_fYawCur -= iLot * __PI2; // 0 ~ 360 도 사이로 맞추고.. } iLot = (int)(m_fYawCur / __PI); if (iLot) { - m_fYawCur -= iLot * __PI2; // -180 ~ 180 ̷ .. + m_fYawCur -= iLot * __PI2; // -180 ~ 180 사이로 맞춘다.. } } } } - // ȸ .. + // 회전값 적용.. __Quaternion qtRot; - qtRot.RotationAxis(0, 1, 0, m_fYawCur); // ȸ .... + qtRot.RotationAxis(0, 1, 0, m_fYawCur); // 회전 .... m_Chr.RotSet(qtRot); } void CPlayerBase::TickAnimation() { - // Ȱ ٰ, ϸ̼ǵ... ӵ + // 걷고 뛰고, 에니메이션등... 속도 적용 float fAniSpeedDelta = 1.0f; if (PSM_STOP != m_eStateMove) { - fAniSpeedDelta = m_fMoveDelta; // ̵̸ ǵ .. + fAniSpeedDelta = m_fMoveDelta; // 이동중이면 스피드 적용.. } else if (PSA_ATTACK == m_eState) { - fAniSpeedDelta = m_fAttackDelta; // ̸ ǵ .. + fAniSpeedDelta = m_fAttackDelta; // 공격중이면 공격 스피드 적용.. } __ASSERT(fAniSpeedDelta >= 0.1f && fAniSpeedDelta < 10.0f, "Invalid Animation Speed Delta!!!"); - m_Chr.AniSpeedDeltaSet(fAniSpeedDelta); // ϸ̼ ǵ .. - m_Chr.Tick(); // ϸ̼ ƽ.. + m_Chr.AniSpeedDeltaSet(fAniSpeedDelta); // 에니메이션 스피드 실제 적용.. + m_Chr.Tick(); // 에니메이션 틱.. - m_bAnimationChanged = false; // ť ϸ̼ ϴ õȴ.. - if (m_Chr.IsAnimEnd()) // ϸ̼ .. + m_bAnimationChanged = false; // 큐에 넣은 에니메이션이 변하는 순간만 세팅된다.. + if (m_Chr.IsAnimEnd()) // 에니메이션이 끝나면.. { - m_bAnimationChanged = true; // ť ϸ̼ ϴ õȴ.. - if (m_AnimationDeque.empty()) // ϸ̼ ũ .. + m_bAnimationChanged = true; // 큐에 넣은 에니메이션이 변하는 순간만 세팅된다.. + if (m_AnimationDeque.empty()) // 에니메이션 데크가 비어 있으면.. { CPlayerBase * pTarget = this->CharacterGetByID(m_iIDTarget, true); - this->Action(m_eStateNext, true, pTarget); // .. - } else // ϸ̼ ũ ʰ ų .. + this->Action(m_eStateNext, true, pTarget); // 상태 돌리기.. + } else // 에니메이션 데크가 비어 있지 않고 시킬 동작이 있으면.. { - e_Ani eAniToSet = m_AnimationDeque[0]; // ũ ϳ .. + e_Ani eAniToSet = m_AnimationDeque[0]; // 데크에서 하나 빼오고.. m_AnimationDeque.pop_front(); m_Chr.AniCurSet(eAniToSet); // TRACE(" Animation : %d\n", eAniToSet); @@ -734,7 +734,7 @@ void CPlayerBase::TickDurationColor() { int iPC = m_Chr.m_Parts.size(); for (int i = 0; i < iPC; i++) { pPart = m_Chr.m_Parts[i]; - pPart->m_Mtl = pPart->m_MtlOrg; // . + pPart->m_Mtl = pPart->m_MtlOrg; // 원래 색대로 돌린다. } } else { float fD = m_fDurationColorTimeCur / m_fDurationColorTime; @@ -761,17 +761,17 @@ void CPlayerBase::TickDurationColor() { void CPlayerBase::TickSound() { __Vector3 vPos = this->Position(); - if (PSA_ATTACK == m_eState) // ϶.. + if (PSA_ATTACK == m_eState) // 공격 일때.. { // if(m_pSnd_Attack_0 && m_Chr.NeedPlaySound0()) - // m_pSnd_Attack_0->Play(&vPos); // 1 ϶.. + // m_pSnd_Attack_0->Play(&vPos); // 공격 1 중일때.. // if(m_pSnd_Attack_1 && m_Chr.NeedPlaySound1()) - // m_pSnd_Attack_1->Play(&vPos); // 2 ϶.. + // m_pSnd_Attack_1->Play(&vPos); // 공격 2 중일때.. if (m_pSnd_Attack_0 && (m_Chr.NeedPlaySound0() || m_Chr.NeedPlaySound1())) { - m_pSnd_Attack_0->Play(&vPos); // 1 ϶.. + m_pSnd_Attack_0->Play(&vPos); // 공격 1 중일때.. } // if(m_pSnd_Attack_1 && m_Chr.NeedPlaySound1()) - // m_pSnd_Attack_1->Play(&vPos); // 2 ϶.. + // m_pSnd_Attack_1->Play(&vPos); // 공격 2 중일때.. } if (PSM_STOP == m_eStateMove) { @@ -796,15 +796,15 @@ void CPlayerBase::TickSound() { } } -void CPlayerBase::Tick() // ȸ, ϸ̼ Tick ó.. .. +void CPlayerBase::Tick() // 회전, 지정된 에니메이션 Tick 및 색깔 지정 처리.. 등등.. { - if (m_pShapeExtraRef) // Ʈ̸.. + if (m_pShapeExtraRef) // 오브젝트이면.. { m_pShapeExtraRef->Tick(FRAME_SELFPLAY); return; } - // ߷° . + // 중력값 적용. __Vector3 vPos = this->Position(); if (vPos.y > m_fYNext) { m_fGravityCur += 9.8f * CN3Base::s_fSecPerFrm; @@ -817,16 +817,16 @@ void CPlayerBase::TickSound() { m_fGravityCur = 0; } - // Ŀ + // 점차 커지는 스케일 적용 if (m_fScaleToSet != m_fScalePrev) { float fScale = m_Chr.Scale().y; - if (m_fScaleToSet > m_fScalePrev) // Ŀ Ѵ.. + if (m_fScaleToSet > m_fScalePrev) // 커져야 한다.. { fScale += (m_fScaleToSet - m_fScalePrev) * s_fSecPerFrm; if (fScale > m_fScaleToSet) { m_fScalePrev = fScale = m_fScaleToSet; } - } else // ۾ Ѵٸ.. + } else // 작아져야 한다면.. { fScale -= (m_fScalePrev - m_fScaleToSet) * s_fSecPerFrm; if (fScale < m_fScaleToSet) { @@ -841,13 +841,13 @@ void CPlayerBase::TickSound() { this->TickDurationColor(); this->TickSound(); - // ״ ó.. + // 죽는 것 처리.. if (m_fTimeAfterDeath > 0) { m_fTimeAfterDeath += - s_fSecPerFrm; // ״ ϴ Ÿ̸ - 5 Ѱ?? ٷ ״´. + s_fSecPerFrm; // 죽는 모션을 취하는 타이머 - 5초정도면 적당한가?? 그전에 공격을 받으면 바로 죽는다. } if (PSA_DYING == m_eState) { - if (PSD_DISJOINT == m_eStateDying || PSD_KNOCK_DOWN == m_eStateDying) // ڷ и.. + if (PSD_DISJOINT == m_eStateDying || PSD_KNOCK_DOWN == m_eStateDying) // 뒤로 밀린다.. { float fAD = 0; if (m_fTimeDying <= 0.2f) { @@ -858,22 +858,22 @@ void CPlayerBase::TickSound() { if (fAD > 0) { float fDelta = (fAD * (0.3f + 0.7f / m_Chr.Radius())); - vPos -= m_vDirDying * (fDelta * s_fSecPerFrm); // ġ ݺϰ и.. + vPos -= m_vDirDying * (fDelta * s_fSecPerFrm); // 덩치에 반비례하게 밀린다.. vPos.y = ACT_WORLD->GetHeightWithTerrain(vPos.x, vPos.z); m_Chr.PosSet(vPos); } } else { } - m_fTimeDying += s_fSecPerFrm; // ״ ϴ ð + m_fTimeDying += s_fSecPerFrm; // 죽는 동작을 취하는 시간 } - // dz ó.. + // 풍선말 처리.. if (m_fTimeBalloon > 0) { m_fTimeBalloon -= s_fSecPerFrm; if (m_fTimeBalloon < 0) { m_fTimeBalloon = 0; - this->BalloonStringSet("", 0); // ð ~!! + this->BalloonStringSet("", 0); // 시간 됬다~!! } } } @@ -884,7 +884,7 @@ void CPlayerBase::Render(float fSunAngle) { } #ifdef _DEBUG - if (m_pShapeExtraRef) // Ʈ ̸... + if (m_pShapeExtraRef) // 오브젝트 형식이면... { m_pShapeExtraRef->RenderCollisionMesh(); return; @@ -892,7 +892,7 @@ void CPlayerBase::Render(float fSunAngle) { #endif float fFactorToApply = 1.0f; - if (m_fTimeAfterDeath > TIME_CORPSE_REMAIN - TIME_CORPSE_REMOVE) { // ϰ .. + if (m_fTimeAfterDeath > TIME_CORPSE_REMAIN - TIME_CORPSE_REMOVE) { // 투명하게 만든다.. fFactorToApply = (TIME_CORPSE_REMAIN - m_fTimeAfterDeath) / TIME_CORPSE_REMOVE; } else if (m_fFlickeringFactor != 1.0f) { m_fFlickeringTime += s_fSecPerFrm; @@ -906,7 +906,7 @@ void CPlayerBase::Render(float fSunAngle) { } } - if (fFactorToApply != 0) // Ǿ Ѵٸ.. + if (fFactorToApply != 0) // 투명도가 적용되야 한다면.. { DWORD dwAlphaBlend, dwAlphaOP, dwAlphaArg1, dwTexFactor, dwSrcBlend, dwDestBlend; // , dwZEnable; @@ -915,20 +915,20 @@ void CPlayerBase::Render(float fSunAngle) { s_lpD3DDev->GetRenderState(D3DRS_SRCBLEND, &dwSrcBlend); s_lpD3DDev->GetRenderState(D3DRS_DESTBLEND, &dwDestBlend); // s_lpD3DDev->GetRenderState(D3DRS_ZENABLE, &dwZEnable); - s_lpD3DDev->GetRenderState(D3DRS_TEXTUREFACTOR, &dwTexFactor); // alpha factor + s_lpD3DDev->GetRenderState(D3DRS_TEXTUREFACTOR, &dwTexFactor); // alpha factor 설정 s_lpD3DDev->GetTextureStageState(0, D3DTSS_ALPHAOP, &dwAlphaOP); s_lpD3DDev->GetTextureStageState(0, D3DTSS_ALPHAARG1, &dwAlphaArg1); - DWORD dwFactorToApply = ((DWORD)(255.0f * fFactorToApply)) << 24; // .. + DWORD dwFactorToApply = ((DWORD)(255.0f * fFactorToApply)) << 24; // 투명도 계산.. - // render state + // render state 세팅 s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); s_lpD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); s_lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); // s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE); - s_lpD3DDev->SetRenderState(D3DRS_TEXTUREFACTOR, dwFactorToApply); // alpha factor + s_lpD3DDev->SetRenderState(D3DRS_TEXTUREFACTOR, dwFactorToApply); // alpha factor 설정 - // texture state (alpha) + // texture state 세팅(alpha) s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR); @@ -939,7 +939,7 @@ void CPlayerBase::Render(float fSunAngle) { s_lpD3DDev->SetRenderState(D3DRS_SRCBLEND, dwSrcBlend); s_lpD3DDev->SetRenderState(D3DRS_DESTBLEND, dwDestBlend); // s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, dwZEnable); - s_lpD3DDev->SetRenderState(D3DRS_TEXTUREFACTOR, dwTexFactor); // alpha factor + s_lpD3DDev->SetRenderState(D3DRS_TEXTUREFACTOR, dwTexFactor); // alpha factor 설정 s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, dwAlphaOP); s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, dwAlphaArg1); } else { @@ -951,7 +951,7 @@ void CPlayerBase::Render(float fSunAngle) { } #ifdef _DEBUG - // if(m_Chr.CollisionMesh()) // 浹 üũ ڽ.. + // if(m_Chr.CollisionMesh()) // 충돌 체크용 박스.. // { // s_lpD3DDev->SetTransform(D3DTS_WORLD, &(m_Chr.m_Matrix)); // m_Chr.CollisionMesh()->Render(0xffff0000); @@ -976,7 +976,7 @@ void CPlayerBase::Render(float fSunAngle) { __Vector3 vHead = this->HeadPosition(); vHead.y += this->Height() / 10.0f; if (PSA_SITDOWN == m_eState) { - vHead.y += this->RootPosition().y - this->Height() / 2.0f; // ɾ .. + vHead.y += this->RootPosition().y - this->Height() / 2.0f; // 앉아 있으면.. } POINT pt = ::_Convert3D_To_2DCoordinate(vHead, s_CameraData.mtxView, s_CameraData.mtxProjection, s_CameraData.vp.Width, s_CameraData.vp.Height); @@ -989,7 +989,7 @@ void CPlayerBase::Render(float fSunAngle) { m_pIDFont->DrawText(pt.x - (size.cx / 2) + 1, pt.y + 1, 0xff000000, 0); m_pIDFont->DrawText(pt.x - (size.cx / 2), pt.y, crFont, 0); - //Knight & clan .. + //Knight & clan 렌더링.. if (m_pClanFont && m_pClanFont->IsSetText()) { size = m_pClanFont->GetSize(); pt.y -= size.cy + 5; @@ -999,7 +999,7 @@ void CPlayerBase::Render(float fSunAngle) { m_pClanFont->DrawText(pt.x - (size.cx / 2), pt.y, crFont, 0); } - // Ƽ ... + // 파티 모집... if (m_pInfoFont && m_pInfoFont->IsSetText()) //->GetFontHeight() > 0) { size = m_pInfoFont->GetSize(); @@ -1010,11 +1010,11 @@ void CPlayerBase::Render(float fSunAngle) { m_pInfoFont->DrawText(pt.x - (size.cx / 2), pt.y, crFont, 0); } - // dz ޽.. + // 풍선 메시지.. if (m_pBalloonFont && m_pBalloonFont->IsSetText()) //->GetFontHeight()) { crFont = m_pBalloonFont->GetFontColor(); - if (m_fTimeBalloon < 2.0f) // õõ 帴ϰ ش.. + if (m_fTimeBalloon < 2.0f) // 천천히 흐릿하게 없앤다.. { DWORD crFont = m_pBalloonFont->GetFontColor(); crFont = (crFont & 0x00ffffff) | ((DWORD)(255 * (m_fTimeBalloon / 2.0f)) << 24); @@ -1092,69 +1092,69 @@ bool CPlayerBase::Action(e_StateAction eState, bool bLooping, CPlayerBase * pTar } } - // if(m_szName == "˶") + // if(m_szName == "알라딘") // { // bool bBReak = true; // std::string szSt1 = "??"; - // if(PSA_BASIC == m_eState) szSt1 = ""; - // else if(PSA_SPELLMAGIC == m_eState) szSt1 = "~"; + // if(PSA_BASIC == m_eState) szSt1 = "보통"; + // else if(PSA_SPELLMAGIC == m_eState) szSt1 = "매직쇼~"; // TRACE("%s(%.1f) - %s\n", m_szName.c_str(), CN3Base::TimeGet(), szSt1.c_str()); // } bool bNPC = (RACE_NPC == m_InfoBase.eRace ? true : false); - bool bNeedUpperAnimationOnly = false; // ü ϸ̼ ϴ°... -1 : ü, 0 : ü 1 : ü + bool bNeedUpperAnimationOnly = false; // 몸 전체에 에니메이션을 적요하는가... -1 : 전체, 0 : 하체 1 : 상체 bool bOnceAndFreeze = false; e_Ani eAni = ANI_UNKNOWN; e_Ani eAniToRestore = ANI_UNKNOWN; float fFreezeTime = 0.0f; e_StateAction eStatePrev = m_eState; - m_eStateNext = m_eState = eState; // ϴ ij .. + m_eStateNext = m_eState = eState; // 일단 캐릭터의 상태 유지.. switch (eState) { case PSA_BASIC: if (PSM_STOP == m_eStateMove) { - if (PSA_SITDOWN == eStatePrev) // ɾ ̸ִ.. + if (PSA_SITDOWN == eStatePrev) // 앉아 있던중이면.. { - eAni = ANI_STANDUP; // Ͼ. + eAni = ANI_STANDUP; // 일어선다. if (PSM_STOP == m_eStateMove) { - eAniToRestore = this->JudgeAnimationBreath(); // ߾ ⺻ڼ.. Ǵ. + eAniToRestore = this->JudgeAnimationBreath(); // 멈추어 있으면 기본자세.. 판단. } bOnceAndFreeze = true; } else { - eAni = this->JudgeAnimationBreath(); // ߾ ⺻ڼ.. Ǵ. + eAni = this->JudgeAnimationBreath(); // 멈추어 있으면 기본자세.. 판단. } } else if (PSM_WALK == m_eStateMove) { - eAni = this->JudgeAnimationWalk(); // Ȱ ȴ ڼ + eAni = this->JudgeAnimationWalk(); // 걷고 있으면 걷는 자세 } else if (PSM_RUN == m_eStateMove) { - eAni = this->JudgeAnimationRun(); // ٰ ... + eAni = this->JudgeAnimationRun(); // 뛰고 있으면... } else if (PSM_WALK_BACKWARD == m_eStateMove) { - eAni = this->JudgeAnimationWalkBackward(); // ڷ Ȱ ... + eAni = this->JudgeAnimationWalkBackward(); // 뒤로 걷고 있으면... } else { - eAni = this->JudgeAnimationBreath(); // ׹ۿ ?? + eAni = this->JudgeAnimationBreath(); // 그밖에 ?? } break; case PSA_ATTACK: if (pTarget) { if (pTarget->m_InfoBase.eNation == m_InfoBase.eNation) { - return false; // ̸ + return false; // 같은 국가이면 } - if (!bNPC && IsMovingNow()) // ÷̰̾.. ̵̾.. + if (!bNPC && IsMovingNow()) // 플레이어이고.. 이동중이었으면.. { if (m_pItemPlugBasics[0]) { - eAni = ANI_ATTACK_WITH_WEAPON_WHEN_MOVE; // տ ⸦ .. ϸ̼ ֱ.. + eAni = ANI_ATTACK_WITH_WEAPON_WHEN_MOVE; // 오른손에 무기를 들고 있으면.. 에니메이션 정해주기.. } else { - eAni = ANI_ATTACK_WITH_NAKED_WHEN_MOVE; // ϸ̼ ֱ.. + eAni = ANI_ATTACK_WITH_NAKED_WHEN_MOVE; // 에니메이션 정해주기.. } - bNeedUpperAnimationOnly = true; // ü ѹ ÷ϰ .. + bNeedUpperAnimationOnly = true; // 상체는 한번 플레이하고 멈춘다.. } else { - eAni = this->JudgeAnimationAttack(); // ϸ̼ ֱ.. + eAni = this->JudgeAnimationAttack(); // 에니메이션 정해주기.. } - if (!bLooping) // ƴϸ.. + if (!bLooping) // 루핑이 아니면.. { - m_eStateNext = PSA_BASIC; // ư ¸ + m_eStateNext = PSA_BASIC; // 돌아갈 상태를 기억 } } break; @@ -1164,35 +1164,35 @@ bool CPlayerBase::Action(e_StateAction eState, bool bLooping, CPlayerBase * pTar eAni = this->JudgeAnimationGuard(); if (!bNPC) { - bNeedUpperAnimationOnly = true; // NPC ƴϸ.. ü + bNeedUpperAnimationOnly = true; // NPC 가 아니면.. 상체 } - fFreezeTime = 1.5f; // ´. + fFreezeTime = 1.5f; // 좀 길게 막는다. } break; case PSA_STRUCK: { m_eStateNext = PSA_BASIC; eAni = this->JudgeAnimationStruck(); if (!bNPC) { - bNeedUpperAnimationOnly = true; // NPC ƴϸ.. ü + bNeedUpperAnimationOnly = true; // NPC 가 아니면.. 상체 } } break; case PSA_DYING: - m_eStateNext = PSA_DEATH; // δ..!! + m_eStateNext = PSA_DEATH; // 죽인다..!! m_eStateMove = PSM_STOP; eAni = this->JudgeAnimationDying(); - bOnceAndFreeze = true; // װ ٴڿ  ... + bOnceAndFreeze = true; // 죽고 바닥에 뻗어서 멈춰라... break; case PSA_DEATH: m_eStateNext = PSA_DEATH; - if (true == bForceSet) // ̴ Ÿ.. + if (true == bForceSet) // 강제로 걍 죽이는 거면.. { - eAni = this->JudgeAnimationDying(); // ״ ... - m_Chr.AniFixToLastFrame(eAni); // .. + eAni = this->JudgeAnimationDying(); // 죽는 동작... + m_Chr.AniFixToLastFrame(eAni); // 마지막 프레임으로 고정.. } - this->RegenerateCollisionMesh(); // ִ ּҰ ٽ ã 浹޽ø ٽ .. -> ŷ Ȯϰ ϱؼ̴. - return true; // ư!!! + this->RegenerateCollisionMesh(); // 최대 최소값을 다시 찾고 충돌메시를 다시 만든다.. -> 죽은 넘 피킹을 정확하게 하기위해서이다. + return true; // 돌아간다!!! case PSA_SITDOWN: eAni = ANI_SITDOWN; @@ -1212,29 +1212,29 @@ bool CPlayerBase::Action(e_StateAction eState, bool bLooping, CPlayerBase * pTar } float fBlendTime = FLT_MIN; - if (bForceSet) // ̸.. + if (bForceSet) // 강제 설정이면.. { - bNeedUpperAnimationOnly = false; // NPC ƴϸ.. ü + bNeedUpperAnimationOnly = false; // NPC 가 아니면.. 상체 fBlendTime = 0; m_Chr.m_FrmCtrl.Init(); } - // ϸ̼ .. - this->AnimationClear(); // ϸ̼ ť .. ׷ ٷ ϸ̼ . + // 에니메이션 세팅.. + this->AnimationClear(); // 에니메이션 큐의 내용을 지운다.. 그래야 바로 에니메이션이 나간다. if (ANI_UNKNOWN != eAniToRestore) { - this->AnimationAdd(eAniToRestore, false); // ϸ̼ ũ ִ´. + this->AnimationAdd(eAniToRestore, false); // 다음 에니메이션이 있으면 데크에 집어 넣는다. } - if (bNeedUpperAnimationOnly) { // ü Ѵ.. + if (bNeedUpperAnimationOnly) { // 상체만 한다.. m_Chr.AniUpperSet(eAni, fFreezeTime); - } else // ϸ̼.. + } else // 걍 에니메이션.. { m_Chr.AniCurSet(eAni, bOnceAndFreeze, fBlendTime, fFreezeTime); } - if (bForceSet && m_Chr.m_FrmCtrl.pAniData) // ̸.. + if (bForceSet && m_Chr.m_FrmCtrl.pAniData) // 강제 설정이면.. { - m_Chr.m_FrmCtrl.fFrmCur = m_Chr.m_FrmCtrl.pAniData->fFrmEnd; // Ѵ.. + m_Chr.m_FrmCtrl.fFrmCur = m_Chr.m_FrmCtrl.pAniData->fFrmEnd; // 끝프레임으로 강제 설정한다.. } return true; @@ -1264,7 +1264,7 @@ bool CPlayerBase::ActionMove(e_StateMove eMove) { return false; } - m_eStateNext = m_eState; // ư ¸ ¿ ° .. + m_eStateNext = m_eState; // 돌아갈 상태를 현재 상태와 맞게 강제 지정.. m_eStateMove = eMove; e_Ani eAni = ANI_UNKNOWN; @@ -1289,46 +1289,46 @@ bool CPlayerBase::ActionMove(e_StateMove eMove) { return false; } - this->Action(PSA_BASIC, true); // ϰ Ǵ.. + this->Action(PSA_BASIC, true); // 딴짓 못하게 건다.. - // ϸ̼ .. - this->AnimationClear(); // ϸ̼ ť .. ׷ ٷ ϸ̼ . - m_Chr.AniCurSet(eAni, false, FLT_MIN, 0, false); // ü ϸ̼ Ű ʰ Ȱų ڴ... + // 에니메이션 세팅.. + this->AnimationClear(); // 에니메이션 큐의 내용을 지운다.. 그래야 바로 에니메이션이 나간다. + m_Chr.AniCurSet(eAni, false, FLT_MIN, 0, false); // 상체 에니메이션을 중지시키지 않고 걷거나 뛴다... return true; } void CPlayerBase::ActionDying(e_StateDying eSD, const __Vector3 & vDir) { this->ActionMove(PSM_STOP); - this->Action(PSA_DYING, false); // ̰.. + this->Action(PSA_DYING, false); // 죽이고.. m_eStateDying = eSD; - m_vDirDying = vDir; // и .. + m_vDirDying = vDir; // 죽을때 밀리는 방향.. e_Ani eAni = ANI_DEAD_NEATLY; if (eSD == PSD_KEEP_POSITION) { if (RACE_NPC == m_InfoBase.eRace) { - eAni = ANI_NPC_DEAD0; // NPC ϰ + eAni = ANI_NPC_DEAD0; // NPC 일경우 } else { - eAni = ANI_DEAD_NEATLY; // ÷̾ ϰ.. + eAni = ANI_DEAD_NEATLY; // 플레이어 일경우.. } } else if (eSD == PSD_DISJOINT) { if (RACE_NPC == m_InfoBase.eRace) { - eAni = ANI_NPC_DEAD1; // NPC ϰ + eAni = ANI_NPC_DEAD1; // NPC 일경우 } else { - eAni = ANI_DEAD_ROLL; // ÷̾ ϰ.. ư ױ.. + eAni = ANI_DEAD_ROLL; // 플레이어 일경우.. 몸이 휙 돌아가서 죽기.. } - } else if (eSD == PSD_KNOCK_DOWN) // ڷ и ױ. + } else if (eSD == PSD_KNOCK_DOWN) // 뒤로 밀리며 죽기. { if (RACE_NPC == m_InfoBase.eRace) { - eAni = ANI_NPC_DEAD1; // NPC ϰ + eAni = ANI_NPC_DEAD1; // NPC 일경우 } else { - eAni = ANI_DEAD_KNOCKDOWN; // ÷̾ ϰ.. + eAni = ANI_DEAD_KNOCKDOWN; // 플레이어 일경우.. } } else { if (RACE_NPC == m_InfoBase.eRace) { - eAni = ANI_NPC_DEAD0; // NPC ϰ + eAni = ANI_NPC_DEAD0; // NPC 일경우 } else { - eAni = ANI_DEAD_NEATLY; // ÷̾ ϰ.. + eAni = ANI_DEAD_NEATLY; // 플레이어 일경우.. } } @@ -1337,7 +1337,7 @@ void CPlayerBase::ActionDying(e_StateDying eSD, const __Vector3 & vDir) { bool CPlayerBase::ProcessAttack(CPlayerBase * pTarget) { if (PSA_ATTACK != m_eState && m_iSkillStep == 0) { - return false; // ݻ° ƴϰ ų ߵ ƴϸ..ư. + return false; // 공격상태가 아니고 스킬 쓰는 중도 아니면..돌아간다. } if (NULL == pTarget) { return false; @@ -1346,10 +1346,10 @@ bool CPlayerBase::ProcessAttack(CPlayerBase * pTarget) { bool bAttackSuccess = false; bool bStrike = false; if (m_Chr.NeedStrike0() || m_Chr.NeedStrike1()) { - bStrike = true; // ± ϴ Ÿ̹.. + bStrike = true; // 맞기 시작하는 타이밍.. } - if (bStrike) // ´ Ÿ̸̹.. + if (bStrike) // 맞는 타이밍이면.. { __Vector3 vCol(0, 0, 0); CPlayerBase * pTarget = TargetPointerCheck(false); @@ -1357,16 +1357,16 @@ bool CPlayerBase::ProcessAttack(CPlayerBase * pTarget) { return false; } - if (false == this->CheckCollisionToTargetByPlug(pTarget, 0, &vCol)) // ÷׿ 浹üũ غ.. + if (false == this->CheckCollisionToTargetByPlug(pTarget, 0, &vCol)) // 플러그와 충돌체크를 먼저 해보고.. { - if (false == this->CheckCollisionToTargetByPlug(pTarget, 1, &vCol)) // ÷׿ 浹üũ غ.. + if (false == this->CheckCollisionToTargetByPlug(pTarget, 1, &vCol)) // 플러그와 충돌체크를 먼저 해보고.. { - const __Matrix44 * pMtxMine = m_Chr.MatrixGet(0); // Ʈ ִ Ÿij.. + const __Matrix44 * pMtxMine = m_Chr.MatrixGet(0); // 조인트가 있는 타겟캐릭터.. const __Matrix44 * pMtxTarget = pTarget->m_Chr.MatrixGet(0); __Vector3 v0, v1; if (pMtxMine) { - CN3CPlug * pPlug = m_Chr.Plug(0); // ... + CN3CPlug * pPlug = m_Chr.Plug(0); // 무기의 점과... if (pPlug) { __Matrix44 mtx = *(m_Chr.MatrixGet(pPlug->m_nJointIndex)); v0.Set(0.0f, pPlug->m_fTrace1, 0.0f); @@ -1383,11 +1383,11 @@ bool CPlayerBase::ProcessAttack(CPlayerBase * pTarget) { if (pMtxTarget) { v1 = pMtxTarget->Pos() + pTarget->Position(); - if (false == pTarget->CheckCollisionByBox(v0, v1, &vCol, NULL)) // ϳ 浹 üũ غ.. + if (false == pTarget->CheckCollisionByBox(v0, v1, &vCol, NULL)) // 직선 하나로 충돌 체크 해보고.. { __Vector3 vDir = v0 - v1; vDir.Normalize(); - vCol = v1 + vDir * (pTarget->Height() / 3.0f); // ȵǸ ij Ѵ.. + vCol = v1 + vDir * (pTarget->Height() / 3.0f); // 안되면 캐릭 사이의 값으로 한다.. } } else if (pTarget->m_pShapeExtraRef && pTarget->m_pShapeExtraRef->CollisionMesh()) { __Vector3 vDir = this->Direction(); @@ -1396,13 +1396,13 @@ bool CPlayerBase::ProcessAttack(CPlayerBase * pTarget) { CN3VMesh * pVMesh = pTarget->m_pShapeExtraRef->CollisionMesh(); if (NULL == pVMesh || false == pVMesh->CheckCollision(pTarget->m_pShapeExtraRef->m_Matrix, v0, v1, - &vCol)) // 浹 ޽ö 浹 .. + &vCol)) // 충돌 메시랑 충돌하지 않으면.. { v1 = pTarget->m_pShapeExtraRef->Pos(); v1.y += pTarget->Height() / 2.0f; vDir = v1 - v0; vDir.Normalize(); - vCol = v0 + vDir * Radius(); // ȵǸ ij Ѵ.. + vCol = v0 + vDir * Radius(); // 안되면 캐릭 사이의 값으로 한다.. } } else { return false; @@ -1411,47 +1411,47 @@ bool CPlayerBase::ProcessAttack(CPlayerBase * pTarget) { } if (pTarget->m_fTimeAfterDeath > 0 && false == pTarget->IsDead()) { - e_ItemClass eICR = this->ItemClass_RightHand(); // տ ⿡ ... + e_ItemClass eICR = this->ItemClass_RightHand(); // 오른손에 든 무기에 따라... e_StateDying eSD = PSD_KEEP_POSITION; if (ITEM_CLASS_SWORD_2H == eICR || ITEM_CLASS_AXE_2H == eICR || ITEM_CLASS_MACE_2H == eICR || ITEM_CLASS_POLEARM == eICR) { - eSD = PSD_DISJOINT; // ڵ ̸ ߷ ״´. + eSD = PSD_DISJOINT; // 투핸드 무기이면 잘려 죽는다. } else if (ITEM_CLASS_SWORD == eICR || ITEM_CLASS_AXE == eICR || ITEM_CLASS_MACE == eICR || ITEM_CLASS_SPEAR == eICR) { - eSD = PSD_KNOCK_DOWN; // ڵ ̸ + eSD = PSD_KNOCK_DOWN; // 원핸드 보통 무기이면 } __Vector3 vTarget = pTarget->Position(); if (pTarget->m_pSnd_Blow) { - pTarget->m_pSnd_Blow->Play(&vTarget); // ϰ ´ Ҹ.. + pTarget->m_pSnd_Blow->Play(&vTarget); // 퍽하고 무기 맞는 소리.. } - // Ӽ ٸ ȿ.... + //무기의 속성에 따라 다른 효과들.... bool bAffected = false; if (m_pItemPlugExts[PLUG_POS_RIGHTHAND]) { int iFXID = -1; if ((m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamageFire > 0) || (m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamageFire >= LIMIT_FX_DAMAGE)) { - iFXID = FXID_SWORD_FIRE_TARGET; // + iFXID = FXID_SWORD_FIRE_TARGET; // 불 } else if ((m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamageIce > 0) || (m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamageIce >= LIMIT_FX_DAMAGE)) { - iFXID = FXID_SWORD_ICE_TARGET; // ñ + iFXID = FXID_SWORD_ICE_TARGET; // 냉기 } else if ((m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamagePoison > 0) || (m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamagePoison >= LIMIT_FX_DAMAGE)) { - iFXID = FXID_SWORD_POISON_TARGET; // + iFXID = FXID_SWORD_POISON_TARGET; // 독 } else if ((m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamageThuner > 0) || (m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamageThuner >= LIMIT_FX_DAMAGE)) { - iFXID = FXID_SWORD_LIGHTNING_TARGET; // + iFXID = FXID_SWORD_LIGHTNING_TARGET; // 전격 } if (iFXID >= 0) { bAffected = true; - CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, iFXID, vCol); //ݹ... + CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, iFXID, vCol); //전격무기... } } if (m_pItemPlugExts[PLUG_POS_LEFTHAND] && !bAffected) { @@ -1459,43 +1459,43 @@ bool CPlayerBase::ProcessAttack(CPlayerBase * pTarget) { if ((m_pItemPlugExts[PLUG_POS_LEFTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamageFire > 0) || (m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamageFire >= LIMIT_FX_DAMAGE)) { - iFXID = FXID_SWORD_FIRE_TARGET; // + iFXID = FXID_SWORD_FIRE_TARGET; // 불 } else if ((m_pItemPlugExts[PLUG_POS_LEFTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamageIce > 0) || (m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamageIce >= LIMIT_FX_DAMAGE)) { - iFXID = FXID_SWORD_ICE_TARGET; // ñ + iFXID = FXID_SWORD_ICE_TARGET; // 냉기 } else if ((m_pItemPlugExts[PLUG_POS_LEFTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamagePoison > 0) || (m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamagePoison >= LIMIT_FX_DAMAGE)) { - iFXID = FXID_SWORD_POISON_TARGET; // + iFXID = FXID_SWORD_POISON_TARGET; // 독 } else if ((m_pItemPlugExts[PLUG_POS_LEFTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamageThuner > 0) || (m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamageThuner >= LIMIT_FX_DAMAGE)) { - iFXID = FXID_SWORD_LIGHTNING_TARGET; // + iFXID = FXID_SWORD_LIGHTNING_TARGET; // 전격 } if (iFXID >= 0) { bAffected = true; - CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, iFXID, vCol); // Ӽ .. + CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, iFXID, vCol); // 속성 붙은 무기.. } } if (!bAffected) { - CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, FXID_BLOOD, vCol); //Ϲݹ... + CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, FXID_BLOOD, vCol); //일반무기... } __Vector3 vDirDeath = this->Position() - vTarget; vDirDeath.Normalize(); - pTarget->ActionDying(eSD, vDirDeath); // ڸ װų + pTarget->ActionDying(eSD, vDirDeath); // 제자리에서 죽거나 } else if (pTarget->IsAlive()) { - if (false == pTarget->m_bGuardSuccess) //  ߴ ÷..  .. + if (false == pTarget->m_bGuardSuccess) // 방어에 성공했는지 플래그.. 방어에 실패했으면.. { __Vector3 vTarget = pTarget->Position(); if (pTarget->m_pSnd_Blow) { - pTarget->m_pSnd_Blow->Play(&vTarget); // ӽ÷ ´ Ҹ.. + pTarget->m_pSnd_Blow->Play(&vTarget); // 임시로 맞는 소리.. } - // Ӽ ٸ ȿ.... + //무기의 속성에 따라 다른 효과들.... bool bAffected = false; if (m_pItemPlugExts[PLUG_POS_RIGHTHAND]) { if ((m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byMagicOrRare == ITEM_UNIQUE && @@ -1503,25 +1503,25 @@ bool CPlayerBase::ProcessAttack(CPlayerBase * pTarget) { (m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamageFire >= LIMIT_FX_DAMAGE)) { bAffected = true; CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, FXID_SWORD_FIRE_TARGET, - vCol); //ҹ... + vCol); //불무기... } else if ((m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamageIce > 0) || (m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamageIce >= LIMIT_FX_DAMAGE)) { bAffected = true; CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, FXID_SWORD_ICE_TARGET, - vCol); //ñ⹫... + vCol); //냉기무기... } else if ((m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamagePoison > 0) || (m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamagePoison >= LIMIT_FX_DAMAGE)) { bAffected = true; CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, FXID_SWORD_POISON_TARGET, - vCol); //... + vCol); //독무기... } else if ((m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamageThuner > 0) || (m_pItemPlugExts[PLUG_POS_RIGHTHAND]->byDamageThuner >= LIMIT_FX_DAMAGE)) { bAffected = true; CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, FXID_SWORD_LIGHTNING_TARGET, - vCol); //ݹ... + vCol); //전격무기... } } if (m_pItemPlugExts[PLUG_POS_LEFTHAND] && !bAffected) { @@ -1530,47 +1530,47 @@ bool CPlayerBase::ProcessAttack(CPlayerBase * pTarget) { (m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamageFire >= LIMIT_FX_DAMAGE)) { bAffected = true; CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, FXID_SWORD_FIRE_TARGET, - vCol); //ҹ... + vCol); //불무기... } else if ((m_pItemPlugExts[PLUG_POS_LEFTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamageIce > 0) || (m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamageIce >= LIMIT_FX_DAMAGE)) { bAffected = true; CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, FXID_SWORD_ICE_TARGET, - vCol); //ñ⹫... + vCol); //냉기무기... } else if ((m_pItemPlugExts[PLUG_POS_LEFTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamagePoison > 0) || (m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamagePoison >= LIMIT_FX_DAMAGE)) { bAffected = true; CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, FXID_SWORD_POISON_TARGET, - vCol); //... + vCol); //독무기... } else if ((m_pItemPlugExts[PLUG_POS_LEFTHAND]->byMagicOrRare == ITEM_UNIQUE && m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamageThuner > 0) || (m_pItemPlugExts[PLUG_POS_LEFTHAND]->byDamageThuner >= LIMIT_FX_DAMAGE)) { bAffected = true; CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, FXID_SWORD_LIGHTNING_TARGET, - vCol); //ݹ... + vCol); //전격무기... } } if (!bAffected) { - CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, FXID_BLOOD, vCol); //Ϲݹ... + CGameProcedure::s_pFX->TriggerBundle(pTarget->IDNumber(), 0, FXID_BLOOD, vCol); //일반무기... } D3DCOLORVALUE crHit = {1.0f, 0.2f, 0.2f, 1.0f}; - pTarget->DurationColorSet(crHit, 0.3f); // ǻ 0.3ʵ.. + pTarget->DurationColorSet(crHit, 0.3f); // 뻘건색 0.3초동안.. - // int iRand = rand()%2; // ¾ Ҹ.. + // int iRand = rand()%2; // 얻어 맞아 신음 소리.. // if(iRand == 0) { if(pTarget->m_pSnd_Struck_0) pTarget->m_pSnd_Struck_0->Play(&vTarget); } // else if(iRand == 1) { if(pTarget->m_pSnd_Struck_1) pTarget->m_pSnd_Struck_1->Play(&vTarget); } if (pTarget->m_pSnd_Struck_0) { pTarget->m_pSnd_Struck_0->Play(&vTarget); } - if (0 == pTarget->m_iSkillStep) { // ų ƴϴ.. - pTarget->Action(PSA_STRUCK, false); // ƴϸ ´ Ѵ.. + if (0 == pTarget->m_iSkillStep) { // 스킬을 사용중이 아니다.. + pTarget->Action(PSA_STRUCK, false); // 죽은 넘이 아니면 얻어 맞는 동작을 한다.. } - } else // .. + } else // 방어 성공.. { - // if(0 == pTarget->m_iSkillStep) // ų ƴϴ.. + // if(0 == pTarget->m_iSkillStep) // 스킬을 사용중이 아니다.. // pTarget->Action(PSA_GUARD, false); } } @@ -1582,15 +1582,15 @@ bool CPlayerBase::ProcessAttack(CPlayerBase * pTarget) { e_Ani CPlayerBase::JudgeAnimationAttack() { e_Ani eAni = ANI_BREATH; - if (RACE_NPC == m_InfoBase.eRace) // NPC ϰ + if (RACE_NPC == m_InfoBase.eRace) // NPC 일경우 { eAni = (e_Ani)(ANI_NPC_ATTACK0 + rand() % 2); - } else // ÷̾ ϰ.. + } else // 플레이어 일경우.. { - if (-1 != m_iIDTarget) // Ÿ .. + if (-1 != m_iIDTarget) // 타겟이 있으면.. { - e_ItemClass eICR = this->ItemClass_RightHand(); // ⿡ .. - if (ITEM_CLASS_STAFF == eICR) // ϰ â Ѵ. ??? + e_ItemClass eICR = this->ItemClass_RightHand(); // 오른손 무기에 따라서.. + if (ITEM_CLASS_STAFF == eICR) // 지팡이 일경우 창 공격으로 한다. ??? { eAni = ANI_DAGGER_ATTACK_A0; } else { @@ -1605,18 +1605,18 @@ e_Ani CPlayerBase::JudgeAnimationAttack() { e_Ani CPlayerBase::JudgeAnimationBreath() { e_Ani eAni = ANI_BREATH; - if (RACE_NPC == m_InfoBase.eRace) // NPC ϰ + if (RACE_NPC == m_InfoBase.eRace) // NPC 일경우 { if (rand() % 10 != 0) { eAni = ANI_NPC_BREATH; } else { eAni = (e_Ani)(ANI_NPC_TALK0 + rand() % 4); } - } else // ÷̾ ϰ.. + } else // 플레이어 일경우.. { CPlayerBase * pTarget = TargetPointerCheck(false); - if (pTarget && pTarget->m_InfoBase.eNation != m_InfoBase.eNation) // Ÿ ְ ٸ.. + if (pTarget && pTarget->m_InfoBase.eNation != m_InfoBase.eNation) // 타겟이 있고 국가가 다르면.. { e_ItemClass eICR = this->ItemClass_RightHand(); e_ItemClass eICL = this->ItemClass_LeftHand(); @@ -1631,14 +1631,14 @@ e_Ani CPlayerBase::JudgeAnimationBreath() { (ITEM_CLASS_AXE == eICR && ITEM_CLASS_AXE == eICL) || (ITEM_CLASS_SWORD == eICR && ITEM_CLASS_AXE == eICL) || (ITEM_CLASS_AXE == eICR && ITEM_CLASS_SWORD == eICL)) { - if (ITEM_CLASS_SWORD == eICR) // Ǵ.. + if (ITEM_CLASS_SWORD == eICR) // 오른손 기준으로 무기 무게 판단.. { if (fIWR < WEAPON_WEIGHT_STAND_SWORD) { eAni = ANI_DUAL_BREATH_A; } else { eAni = ANI_DUAL_BREATH_B; } - } else // if(ITEM_CLASS_AXE == eICR) // Ǵ.. + } else // if(ITEM_CLASS_AXE == eICR) // 오른손 기준으로 무기 무게 판단.. { if (fIWR < WEAPON_WEIGHT_STAND_AXE) { eAni = ANI_DUAL_BREATH_A; @@ -1646,16 +1646,16 @@ e_Ani CPlayerBase::JudgeAnimationBreath() { eAni = ANI_DUAL_BREATH_B; } } - } else if (ITEM_CLASS_DAGGER == eICR) { // ܰ + } else if (ITEM_CLASS_DAGGER == eICR) { // 단검 eAni = ANI_DAGGER_BREATH_A; - } else if (ITEM_CLASS_SWORD == eICR) // Į + } else if (ITEM_CLASS_SWORD == eICR) // 걍 보통칼 { if (fIWR < WEAPON_WEIGHT_STAND_SWORD) { eAni = ANI_SWORD_BREATH_A; } else { eAni = ANI_SWORD_BREATH_B; } - } else if (ITEM_CLASS_SWORD_2H == eICR) { // + } else if (ITEM_CLASS_SWORD_2H == eICR) { // 양수검 eAni = ANI_SWORD2H_BREATH_A; } else if (ITEM_CLASS_AXE == eICR) { if (fIWR < WEAPON_WEIGHT_STAND_AXE) { @@ -1663,7 +1663,7 @@ e_Ani CPlayerBase::JudgeAnimationBreath() { } else { eAni = ANI_AXE_BREATH_B; } - } else if (ITEM_CLASS_AXE_2H == eICR || ITEM_CLASS_MACE_2H == eICR) { // Ȥ б.. + } else if (ITEM_CLASS_AXE_2H == eICR || ITEM_CLASS_MACE_2H == eICR) { // 양손 도끼 혹은 둔기.. eAni = ANI_BLUNT2H_BREATH_A; } else if (ITEM_CLASS_MACE == eICR) { if (fIWR < WEAPON_WEIGHT_STAND_BLUNT) { @@ -1671,23 +1671,23 @@ e_Ani CPlayerBase::JudgeAnimationBreath() { } else { eAni = ANI_BLUNT_BREATH_B; } - } else if (ITEM_CLASS_SPEAR == eICR) { // â + } else if (ITEM_CLASS_SPEAR == eICR) { // 창 eAni = ANI_SPEAR_BREATH_A; } else if (ITEM_CLASS_POLEARM == eICR) { eAni = ANI_POLEARM_BREATH_A; - } else if (eICR == ITEM_CLASS_UNKNOWN && eICL == ITEM_CLASS_BOW) { // ޼ ϴ Ȱ.. + } else if (eICR == ITEM_CLASS_UNKNOWN && eICL == ITEM_CLASS_BOW) { // 왼손 장착하는 활.. eAni = ANI_BOW_BREATH; - } else if (eICR == ITEM_CLASS_BOW_CROSS && eICL == ITEM_CLASS_UNKNOWN) { // ϴ .. + } else if (eICR == ITEM_CLASS_BOW_CROSS && eICL == ITEM_CLASS_UNKNOWN) { // 오른손 장착하는 석궁.. eAni = ANI_CROSS_BOW_BREATH; - } else if (eICR == ITEM_CLASS_LAUNCHER && eICL >= ITEM_CLASS_UNKNOWN) { // ϴ â ó.. + } else if (eICR == ITEM_CLASS_LAUNCHER && eICL >= ITEM_CLASS_UNKNOWN) { // 오른손 장착하는 창 런처.. eAni = ANI_LAUNCHER_BREATH; - } else if (eICR == ITEM_CLASS_UNKNOWN && eICL >= ITEM_CLASS_SHIELD) // ޼ ϴ .. + } else if (eICR == ITEM_CLASS_UNKNOWN && eICL >= ITEM_CLASS_SHIELD) // 왼손 장착하는 방패.. { eAni = ANI_SHIELD_BREATH_A; - } else if (eICR == ITEM_CLASS_STAFF) // .. + } else if (eICR == ITEM_CLASS_STAFF) // 지팡이.. { - eAni = ANI_BREATH; // .. - } else // .. + eAni = ANI_BREATH; // 걍숨쉰다.. + } else // 무기 없다.. { eAni = ANI_NAKED_BREATH_A; } @@ -1700,48 +1700,48 @@ e_Ani CPlayerBase::JudgeAnimationBreath() { } e_Ani CPlayerBase:: - JudgeAnimationWalk() // ȱ Ǵϱ.. ۰ Ÿ ִ³Ŀ ٸ ϸ̼ ε . + JudgeAnimationWalk() // 걷기 모드판단하기.. 가진 아이템과 타겟이 있는냐에 따라 다른 에니메이션 인덱스를 리턴. { e_Ani eAni = ANI_WALK; - if (RACE_NPC == m_InfoBase.eRace) // NPC ϰ + if (RACE_NPC == m_InfoBase.eRace) // NPC 일경우 { eAni = ANI_NPC_WALK; - } else // ÷̾ ϰ.. + } else // 플레이어 일경우.. { - eAni = ANI_WALK; // ڸ ⿡ ٸ ϸ̼ ǴѴ. + eAni = ANI_WALK; // 이 자리에 가진 무기에 따라 다른 에니메이션을 판단한다. } return eAni; } e_Ani CPlayerBase:: - JudgeAnimationRun() // ȱ Ǵϱ.. ۰ Ÿ ִ³Ŀ ٸ ϸ̼ ε . + JudgeAnimationRun() // 걷기 모드판단하기.. 가진 아이템과 타겟이 있는냐에 따라 다른 에니메이션 인덱스를 리턴. { e_Ani eAni = ANI_RUN; - if (RACE_NPC == m_InfoBase.eRace) // NPC ϰ + if (RACE_NPC == m_InfoBase.eRace) // NPC 일경우 { eAni = ANI_NPC_RUN; - } else // ÷̾ ϰ.. + } else // 플레이어 일경우.. { - eAni = ANI_RUN; // ڸ ⿡ ٸ ϸ̼ ǴѴ. + eAni = ANI_RUN; // 이 자리에 가진 무기에 따라 다른 에니메이션을 판단한다. } return eAni; } e_Ani CPlayerBase:: - JudgeAnimationWalkBackward() // ȱ Ǵϱ.. ۰ Ÿ ִ³Ŀ ٸ ϸ̼ ε . + JudgeAnimationWalkBackward() // 걷기 모드판단하기.. 가진 아이템과 타겟이 있는냐에 따라 다른 에니메이션 인덱스를 리턴. { e_Ani eAni = ANI_WALK_BACKWARD; - if (RACE_NPC == m_InfoBase.eRace) // NPC ϰ + if (RACE_NPC == m_InfoBase.eRace) // NPC 일경우 { eAni = ANI_NPC_WALK_BACKWARD; - } else // ÷̾ ϰ.. + } else // 플레이어 일경우.. { - eAni = ANI_WALK_BACKWARD; // ڸ ⿡ ٸ ϸ̼ ǴѴ. + eAni = ANI_WALK_BACKWARD; // 이 자리에 가진 무기에 따라 다른 에니메이션을 판단한다. } return eAni; @@ -1749,33 +1749,33 @@ e_Ani CPlayerBase:: e_Ani CPlayerBase::JudgeAnimationStruck() { if (RACE_NPC == m_InfoBase.eRace) { - return (e_Ani)(ANI_NPC_STRUCK0 + rand() % 3); // NPC ϰ + return (e_Ani)(ANI_NPC_STRUCK0 + rand() % 3); // NPC 일경우 } else { - return (e_Ani)(ANI_STRUCK0 + rand() % 3); // ÷̾ ϰ.. + return (e_Ani)(ANI_STRUCK0 + rand() % 3); // 플레이어 일경우.. } } e_Ani CPlayerBase::JudgeAnimationGuard() { if (RACE_NPC == m_InfoBase.eRace) { - return ANI_NPC_GUARD; // NPC ϰ + return ANI_NPC_GUARD; // NPC 일경우 } else { - return ANI_GUARD; // ÷̾ ϰ.. + return ANI_GUARD; // 플레이어 일경우.. } } e_Ani CPlayerBase::JudgeAnimationDying() { if (RACE_NPC == m_InfoBase.eRace) { - return (e_Ani)(ANI_NPC_DEAD0); // NPC ϰ + return (e_Ani)(ANI_NPC_DEAD0); // NPC 일경우 } else { - return (e_Ani)(ANI_DEAD_NEATLY + rand() % 3); // ÷̾ ϰ.. + return (e_Ani)(ANI_DEAD_NEATLY + rand() % 3); // 플레이어 일경우.. } } e_Ani CPlayerBase::JudgetAnimationSpellMagic() { if (RACE_NPC == m_InfoBase.eRace) { - return (e_Ani)(m_iMagicAni); // NPC ϰ + return (e_Ani)(m_iMagicAni); // NPC 일경우 } else { - return (e_Ani)(m_iMagicAni); // ÷̾ ϰ.. + return (e_Ani)(m_iMagicAni); // 플레이어 일경우.. } } @@ -1794,26 +1794,26 @@ bool CPlayerBase::CheckCollisionToTargetByPlug(CPlayerBase * pTarget, int nPlug, } CN3CPlug * pPlug = m_Chr.Plug(nPlug); if (NULL == pPlug) { - return false; // Ⱑ ʴ´.. + return false; // 장착한 무기가 없으면 하지 않는다.. } // berserk // if(pPlug->m_ePlugType == PLUGTYPE_CLOAK) return false; // CN3CPlug *pPlugNormal = (CN3CPlug*)pPlug; - // if(pPlugNormal->m_fTrace0 >= pPlugNormal->m_fTrace1) return false; // ų ̻ϸ 浹üũ ʴ´. + // if(pPlugNormal->m_fTrace0 >= pPlugNormal->m_fTrace1) return false; // 무기의 길이 정보가 없거나 이상하면 충돌체크 하지 않는다. if (pPlug->m_fTrace0 >= pPlug->m_fTrace1) { - return false; // ų ̻ϸ 浹üũ ʴ´. + return false; // 무기의 길이 정보가 없거나 이상하면 충돌체크 하지 않는다. } if (PSA_DYING == pTarget->State() || PSA_DEATH == pTarget->State()) { - return false; // װ ִ ̳ 浹üũ ʴ´.. + return false; // 쓰러져 죽고 있는 넘이나 쓰러진 넘은 충돌체크 하지 않는다.. } //////////////////////////////////////////////////////////////////////// - // Į ƴϸ 浹üũ ʴ´. + // 칼 궤적이 남는 시점이 아니면 충돌체크를 하지 않는다. // __AnimData* pAni = m_Chr.AniCur(0); // if(NULL == pAni) return false; // float fFrmCur = m_Chr.FrmCur(0); // if(fFrmCur < pAni->fFrmPlugTraceStart || fFrmCur > pAni->fFrmPlugTraceEnd) return false; - // Į ƴϸ 浹üũ ʴ´. + // 칼 궤적이 남는 시점이 아니면 충돌체크를 하지 않는다. //////////////////////////////////////////////////////////////////////// __Vector3 v1, v2, v3; @@ -1830,7 +1830,7 @@ bool CPlayerBase::CheckCollisionToTargetByPlug(CPlayerBase * pTarget, int nPlug, v2 *= mtx; v2 *= m_Chr.m_Matrix; - v2 += (v2 - v1) * 1.0f; // ̸ ι + v2 += (v2 - v1) * 1.0f; // 길이를 두배로 #ifdef _DEBUG /* CGameProcedure::s_pEng->BeginScene(); @@ -1838,12 +1838,12 @@ bool CPlayerBase::CheckCollisionToTargetByPlug(CPlayerBase * pTarget, int nPlug, __Vector3 vLines[2] = { v1, v2 }; __Matrix44 mtxTmp; mtxTmp.Identity(); CN3Base::s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtxTmp); - CN3Base::RenderLines(vLines, 1, (D3DCOLOR)0xffff8080); // ׷.. + CN3Base::RenderLines(vLines, 1, (D3DCOLOR)0xffff8080); // 선을 그려본다.. if(pChrDestination && pChrDestination->CollisionMesh()) { CN3Base::s_lpD3DDev->SetTransform(D3DTS_WORLD, &(pChrDestination->m_Matrix)); - pChrDestination->CollisionMesh()->Render((D3DCOLOR)0xffff0000); // 浹 ڽ ׷. + pChrDestination->CollisionMesh()->Render((D3DCOLOR)0xffff0000); // 충돌 박스를 그려본다. } CGameProcedure::s_pEng->EndScene(); CGameProcedure::s_pEng->Present(CN3Base::s_hWndBase); @@ -1857,7 +1857,7 @@ bool CPlayerBase::CheckCollisionToTargetByPlug(CPlayerBase * pTarget, int nPlug, } } - return pTarget->CheckCollisionByBox(v1, v2, pVCol, NULL); // ij 浹 üũ ڿ 浹 üũ.. + return pTarget->CheckCollisionByBox(v1, v2, pVCol, NULL); // 캐릭터 충돌 체크 상자와 충돌 체크.. } CN3CPlugBase * CPlayerBase::PlugSet(e_PlugPosition ePos, const std::string & szFN, __TABLE_ITEM_BASIC * pItemBasic, @@ -1877,9 +1877,9 @@ CN3CPlugBase * CPlayerBase::PlugSet(e_PlugPosition ePos, const std::string & szF m_pItemPlugExts[ePos] = pItemExt; if (pItemBasic) { if (pItemBasic->byClass == ITEM_CLASS_SHIELD) { - iJoint = m_pLooksRef->iJointLH2; // + iJoint = m_pLooksRef->iJointLH2; // 방패인 경우 } else { - iJoint = m_pLooksRef->iJointLH; // ޼ .. + iJoint = m_pLooksRef->iJointLH; // 왼손 끝.. } } } else if (PLUG_POS_KNIGHTS_GRADE == ePos) { @@ -1897,10 +1897,10 @@ CN3CPlugBase * CPlayerBase::PlugSet(e_PlugPosition ePos, const std::string & szF } if (PLUG_POS_LEFTHAND == ePos || PLUG_POS_RIGHTHAND == ePos) { - float fScale = m_Chr.Height() / 1.8f; // Ű ؼ ũ Ű. ⺻Ű 1.8 ̴. + float fScale = m_Chr.Height() / 1.8f; // 키에 비례해서 크게 키운다. 기본키는 1.8 미터이다. fScale *= pPlug->Scale().y / m_Chr.Scale().y; pPlug->ScaleSet(__Vector3(fScale, fScale, fScale)); - pPlug->m_nJointIndex = iJoint; // ٴ ġ ϱ.. + pPlug->m_nJointIndex = iJoint; // 붙는 위치 정하기.. } // else if(PLUG_POS_BACK == ePos) // { @@ -1909,15 +1909,15 @@ CN3CPlugBase * CPlayerBase::PlugSet(e_PlugPosition ePos, const std::string & szF // } if (pPlug && NULL == pItemBasic && NULL == pItemExt) { - pPlug->TexOverlapSet(""); // ⺻ ̸.. + pPlug->TexOverlapSet(""); // 기본 착용이면.. } ////////////////////////////////////////////////////////////////////////////////////////////////////////// // - // plug ȿ ٿ..^^ + // plug 효과 붙여라..^^ if (pItemExt) { if ((pItemExt->byMagicOrRare == ITEM_UNIQUE && pItemExt->byDamageFire > 0) || - (pItemExt->byDamageFire >= LIMIT_FX_DAMAGE)) // 17 ߰ - + (pItemExt->byDamageFire >= LIMIT_FX_DAMAGE)) // 17 추가데미지 - 불 { CN3CPlug * pCPlug = (CN3CPlug *)pPlug; __TABLE_FX * pFXMain = s_pTbl_FXSource->Find(FXID_SWORD_FIRE_MAIN); @@ -1936,7 +1936,7 @@ CN3CPlugBase * CPlayerBase::PlugSet(e_PlugPosition ePos, const std::string & szF } pCPlug->InitFX(szFXMain, szFXTail, 0xffffff00); } else if ((pItemExt->byMagicOrRare == ITEM_UNIQUE && pItemExt->byDamageIce > 0) || - (pItemExt->byDamageIce >= LIMIT_FX_DAMAGE)) // 18 ߰ - + (pItemExt->byDamageIce >= LIMIT_FX_DAMAGE)) // 18 추가데미지 - 얼음 { CN3CPlug * pCPlug = (CN3CPlug *)pPlug; __TABLE_FX * pFXMain = s_pTbl_FXSource->Find(FXID_SWORD_ICE_MAIN); @@ -1956,7 +1956,7 @@ CN3CPlugBase * CPlayerBase::PlugSet(e_PlugPosition ePos, const std::string & szF pCPlug->InitFX(szFXMain, szFXTail, 0xff0000ff); } else if ((pItemExt->byMagicOrRare == ITEM_UNIQUE && pItemExt->byDamageThuner > 0) || - (pItemExt->byDamageThuner >= LIMIT_FX_DAMAGE)) // 19 ߰ - + (pItemExt->byDamageThuner >= LIMIT_FX_DAMAGE)) // 19 추가데미지 - 전격 { CN3CPlug * pCPlug = (CN3CPlug *)pPlug; __TABLE_FX * pFXMain = s_pTbl_FXSource->Find(FXID_SWORD_LIGHTNING_MAIN); @@ -1976,7 +1976,7 @@ CN3CPlugBase * CPlayerBase::PlugSet(e_PlugPosition ePos, const std::string & szF pCPlug->InitFX(szFXMain, szFXTail, 0xffffffff); } else if ((pItemExt->byMagicOrRare == ITEM_UNIQUE && pItemExt->byDamagePoison > 0) || - (pItemExt->byDamagePoison >= LIMIT_FX_DAMAGE)) // 20 ߰ - + (pItemExt->byDamagePoison >= LIMIT_FX_DAMAGE)) // 20 추가데미지 - 독 { CN3CPlug * pCPlug = (CN3CPlug *)pPlug; __TABLE_FX * pFXMain = s_pTbl_FXSource->Find(FXID_SWORD_POISON_MAIN); @@ -2010,21 +2010,21 @@ CN3CPart * CPlayerBase::PartSet(e_PartPosition ePos, const std::string & szFN, _ return NULL; } - if (PART_POS_UPPER == ePos) // ü Ư ó ʿ.. + if (PART_POS_UPPER == ePos) // 상체일 경우 특별한 처리가 필요.. { - if (pItemBasic) // + if (pItemBasic) // 입히는 경우 { if (pItemBasic->byIsRobeType && - m_Chr.Part(PART_POS_LOWER)) // κ Ÿ ¥ ̰ Ʒ ԰ .. + m_Chr.Part(PART_POS_LOWER)) // 로브 타입의 통짜 윗옷이고 아래에 뭔가 입고 있으면.. { this->PartSet(PART_POS_LOWER, "", m_pItemPartBasics[PART_POS_LOWER], - m_pItemPartExts[PART_POS_LOWER]); // Ʒ ش.. + m_pItemPartExts[PART_POS_LOWER]); // 아래를 비워준다.. } - } else // ü + } else // 상체를 벗는 경우 { - if (m_pItemPartBasics[ePos] && m_pItemPartBasics[ePos]->byIsRobeType) // ߴ κ.. + if (m_pItemPartBasics[ePos] && m_pItemPartBasics[ePos]->byIsRobeType) // 전에 착용했던게 로브면.. { - if (m_pItemPartBasics[PART_POS_LOWER]) // ü .. + if (m_pItemPartBasics[PART_POS_LOWER]) // 하체에 아이템이 입혀있으면.. { std::string szFN2; e_PartPosition ePartPos2 = PART_POS_UNKNOWN; @@ -2033,32 +2033,32 @@ CN3CPart * CPlayerBase::PartSet(e_PartPosition ePos, const std::string & szFN, _ CGameProcedure::MakeResrcFileNameForUPC(m_pItemPartBasics[PART_POS_LOWER], &szFN2, NULL, ePartPos2, ePlugPos2); this->PartSet(PART_POS_LOWER, szFN2, m_pItemPartBasics[PART_POS_LOWER], - m_pItemPartExts[PART_POS_LOWER]); // ü .. - } else // ü ԰ ־ ٸ.. + m_pItemPartExts[PART_POS_LOWER]); // 하체에 전의 옷을 입힌다.. + } else // 하체에 입고 있었던 아이템이 없다면.. { __TABLE_PLAYER_LOOKS * pLooks = - s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); // User Player Character Skin ü .. + s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); // User Player Character Skin 구조체 포인터.. this->PartSet(PART_POS_LOWER, pLooks->szPartFNs[PART_POS_LOWER], NULL, - NULL); // ü ⺻ . + NULL); // 하체에 기본옷을 입힌다. } } } - } else if (PART_POS_LOWER == ePos) // ü .. + } else if (PART_POS_LOWER == ePos) // 하체일 경우.. { - if (pItemBasic) // ϴ + if (pItemBasic) // 착용하는 경우 { if (m_pItemPartBasics[PART_POS_UPPER] && - m_pItemPartBasics[PART_POS_UPPER]->byIsRobeType) // ü ߴ κ.. + m_pItemPartBasics[PART_POS_UPPER]->byIsRobeType) // 전에 상체에 착용했던게 로브면.. { m_pItemPartBasics[ePos] = pItemBasic; m_pItemPartExts[ePos] = pItemExt; - return m_Chr.PartSet(ePos, ""); // ü (?) ư. + return m_Chr.PartSet(ePos, ""); // 하체는 벗기고(?) 돌아간다. } } } CN3CPart * pPart = NULL; - if (szFN.empty()) // ̸ °Ÿ.. ⺻ .. + if (szFN.empty()) // 파일 이름이 없는거면.. 기본 착용.. { if (PART_POS_HAIR_HELMET == ePos) { this->InitHair(); @@ -2068,7 +2068,7 @@ CN3CPart * CPlayerBase::PartSet(e_PartPosition ePos, const std::string & szFN, _ pPart = m_Chr.Part(ePos); } else { __TABLE_PLAYER_LOOKS * pLooks = - s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); // Player Character Skin ü .. + s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); // Player Character Skin 구조체 포인터.. if (pLooks) { pPart = m_Chr.PartSet(ePos, pLooks->szPartFNs[ePos]); if (pPart) { @@ -2080,11 +2080,11 @@ CN3CPart * CPlayerBase::PartSet(e_PartPosition ePos, const std::string & szFN, _ pPart = m_Chr.PartSet(ePos, szFN); } - m_pItemPartBasics[ePos] = pItemBasic; // + m_pItemPartBasics[ePos] = pItemBasic; // 아이템 적용 m_pItemPartExts[ePos] = pItemExt; if (pPart && NULL == pItemBasic && NULL == pItemExt) { - pPart->TexOverlapSet(""); // ⺻ ̸.. + pPart->TexOverlapSet(""); // 기본 착용이면.. } return pPart; @@ -2107,7 +2107,7 @@ void CPlayerBase::DurabilitySet(e_ItemSlot eSlot, int iDurability) { int iDuMax = m_pItemPlugBasics[ePos]->siMaxDurability + m_pItemPlugExts[ePos]->siMaxDurability; if (iDuMax <= 0) { - __ASSERT(0, "ִ "); + __ASSERT(0, "최대 내구력 없음"); return; } @@ -2143,7 +2143,7 @@ void CPlayerBase::DurabilitySet(e_ItemSlot eSlot, int iDurability) { if (pPart) { if (m_pItemPartBasics[ePartPos] && m_pItemPartExts[ePartPos]) { int iDuMax = m_pItemPartBasics[ePartPos]->siMaxDurability + - m_pItemPartExts[ePartPos]->siMaxDurability; // ⺻ + Ȯ + m_pItemPartExts[ePartPos]->siMaxDurability; // 기본내구력 + 확장 내구력 int iPercentage = iDurability * 100 / iDuMax; std::string szFN; @@ -2172,16 +2172,16 @@ bool CPlayerBase::InitChr(__TABLE_PLAYER_LOOKS * pTbl) { m_Chr.JointSet(pTbl->szJointFN); m_Chr.AniCtrlSet(pTbl->szAniFN); - if (RACE_NPC != m_InfoBase.eRace) // ,ü غ.. + if (RACE_NPC != m_InfoBase.eRace) // 상,하체 따로 놀 준비.. { - m_Chr.JointPartSet(0, 16, 23); // ü - m_Chr.JointPartSet(1, 1, 15); // ü + m_Chr.JointPartSet(0, 16, 23); // 하체 + m_Chr.JointPartSet(1, 1, 15); // 상체 } return true; } -void CPlayerBase::RegenerateCollisionMesh() // ִ ּҰ ٽ ã 浹޽ø ٽ .. +void CPlayerBase::RegenerateCollisionMesh() // 최대 최소값을 다시 찾고 충돌메시를 다시 만든다.. { m_Chr.FindMinMax(); __Matrix44 mtxInverse; @@ -2193,7 +2193,7 @@ bool CPlayerBase::InitChr(__TABLE_PLAYER_LOOKS * pTbl) { CPlayerBase * CPlayerBase::TargetPointerCheck(bool bMustAlive) { CPlayerBase * pTarget = this->CharacterGetByID(m_iIDTarget, bMustAlive); - // if(pTarget && (PSA_DEATH == pTarget->State())) pTarget = NULL; //ŷ ؼ õ ij ߰ ϰ + // if(pTarget && (PSA_DEATH == pTarget->State())) pTarget = NULL; //픽킹에 의해서 선택된 캐릭을 중간의 임의적으로 수정 못하게 막음 // if(NULL == pTarget) { m_iIDTarget = -1; } return pTarget; @@ -2213,8 +2213,8 @@ bool CPlayerBase::JointPosGet(int nJointIdx, __Vector3 & vPos) { void CPlayerBase::AnimationAdd(e_Ani eAni, bool bImmediately) { if (bImmediately) { - this->AnimationClear(); // ũ .. - m_Chr.AniCurSet(eAni); // ٷ .. + this->AnimationClear(); // 데크에서 지우고.. + m_Chr.AniCurSet(eAni); // 바로 세팅.. } else { m_AnimationDeque.push_back(eAni); } @@ -2243,7 +2243,7 @@ void CPlayerBase::RenderShadow(float fAngle) { return; } - int iLODTemp = m_Chr.m_nLOD; // ׸ڴ ϸ ٿ ´.. + int iLODTemp = m_Chr.m_nLOD; // 그림자는 부하를 적게 줄여 찍는다.. iLODTemp += 2; if (iLODTemp >= MAX_CHR_LOD) { return; @@ -2280,7 +2280,7 @@ void CPlayerBase::RenderShadow(float fAngle) { m_vTVertex[i] *= mV; } - // ij ũ⿡ ijϸ Ѵ.. + // 캐릭터의 크기에 따라 스캐일링 한다.. float fScale = Height() * Radius(); m_fShaScale = 1.0f; __Matrix44 mtPos; @@ -2300,7 +2300,7 @@ void CPlayerBase::RenderShadow(float fAngle) { } } - // ¾ ġ ؼ ֱ⸸ ϸ ȴ.. + // 태양 위치를 제대로 계산해서 넣기만 하면 된다.. if ((fAngle < 4.0f) || (fAngle > 6.1f)) { if (fAngle > 3.14f) { fAngle -= 3.14f; @@ -2336,7 +2336,7 @@ void CPlayerBase::RenderShadow(float fAngle) { CalcPlug(m_Chr.Plug(i), m_Chr.MatrixGet(m_Chr.Plug(i)->m_nJointIndex), mVvar, vLP); } - // ϱ δ.. + // 렌더링하기 전에 스케일을 줄인다.. if (fScale > 6.6f) { for (int i = 0; i < 4; i++) { m_vTVertex[i] = m_pvVertex[i]; diff --git a/src/game/PlayerBase.h b/src/game/PlayerBase.h index 34839a29..93dd6418 100644 --- a/src/game/PlayerBase.h +++ b/src/game/PlayerBase.h @@ -10,15 +10,15 @@ #include "N3Base/N3Chr.h" #include -// By : Ecli666 ( On 2002-07-22 9:59:19 ) +// By : Ecli666 ( On 2002-07-22 오전 9:59:19 ) // -#define SHADOW_SIZE 32 // 2 ¼ ȴ.. +#define SHADOW_SIZE 32 // 2의 승수만 된다.. #define SHADOW_PLANE_SIZE 4.6f -#define SHADOW_COLOR 0xa; // 16 ڸ.. -// ~(By Ecli666 On 2002-07-22 9:59:19 ) +#define SHADOW_COLOR 0xa; // 16진수 한자리.. 알파 +// ~(By Ecli666 On 2002-07-22 오전 9:59:19 ) -const float TIME_CORPSE_REMAIN = 90.0f; // ü ð.. -const float TIME_CORPSE_REMOVE = 10.0f; // 鼭 ٽð.. +const float TIME_CORPSE_REMAIN = 90.0f; // 시체가 남는 시간.. +const float TIME_CORPSE_REMOVE = 10.0f; // 투명해지면서 없앨시간.. class CDFont; class CN3SndObj; @@ -30,76 +30,76 @@ class CPlayerBase : public CGameBase { protected: e_PlayerType m_ePlayerType; // Player Type ... Base, NPC, OTher, MySelf - std::deque m_AnimationDeque; // ϸ̼ ť... tick 鼭 ʴ Ѵ.. - bool m_bAnimationChanged; // ť ϸ̼ ϴ õȴ.. + std::deque m_AnimationDeque; // 에니메이션 큐... 여기다 집어 넣으면 tick 을 돌면서 차례대로 한다.. + bool m_bAnimationChanged; // 큐에 넣은 에니메이션이 변하는 순간만 세팅된다.. - CN3Chr m_Chr; // ij ⺻ ü... - __TABLE_PLAYER_LOOKS * m_pLooksRef; // ⺻ ̺ - ijͿ ҽ , ġ, ϵ.. - __TABLE_ITEM_BASIC * m_pItemPartBasics[PART_POS_COUNT]; // ijͿ .. - __TABLE_ITEM_EXT * m_pItemPartExts[PART_POS_COUNT]; // ijͿ .. - __TABLE_ITEM_BASIC * m_pItemPlugBasics[PLUG_POS_COUNT]; // ijͿ .. - __TABLE_ITEM_EXT * m_pItemPlugExts[PLUG_POS_COUNT]; // ijͿ .. + CN3Chr m_Chr; // 캐릭터 기본 객체... + __TABLE_PLAYER_LOOKS * m_pLooksRef; // 기본 참조 테이블 - 캐릭터에 관한 리소스 정보, 관절 위치, 사운드 파일등등.. + __TABLE_ITEM_BASIC * m_pItemPartBasics[PART_POS_COUNT]; // 캐릭터에 붙은 무기들.. + __TABLE_ITEM_EXT * m_pItemPartExts[PART_POS_COUNT]; // 캐릭터에 붙은 무기들.. + __TABLE_ITEM_BASIC * m_pItemPlugBasics[PLUG_POS_COUNT]; // 캐릭터에 붙은 무기들.. + __TABLE_ITEM_EXT * m_pItemPlugExts[PLUG_POS_COUNT]; // 캐릭터에 붙은 무기들.. // ID - CDFont * m_pClanFont; // clan or knights..̸ µ Font.. -.-; - CDFont * m_pIDFont; // ID µ Font.. -.-; - CDFont * m_pInfoFont; // Ƽ .. Ÿ ǥ.. - CDFont * m_pBalloonFont; // dz ǥ... - float m_fTimeBalloon; // dz ǥ ð.. - - e_StateAction m_eState; // ൿ .. - e_StateAction m_eStatePrev; // õ ൿ .. - e_StateAction m_eStateNext; // õ ൿ .. - e_StateMove m_eStateMove; // ̴ .. - e_StateDying m_eStateDying; //  ״°..?? - float m_fTimeDying; // ״ ϴ ð.. + CDFont * m_pClanFont; // clan or knights..이름 찍는데 쓰는 Font.. -.-; + CDFont * m_pIDFont; // ID 찍는데 쓰는 Font.. -.-; + CDFont * m_pInfoFont; // 파티원 모집등.. 기타 정보 표시.. + CDFont * m_pBalloonFont; // 풍선말 표시... + float m_fTimeBalloon; // 풍선말 표시 시간.. + + e_StateAction m_eState; // 행동 상태.. + e_StateAction m_eStatePrev; // 직전에 세팅된 행동 상태.. + e_StateAction m_eStateNext; // 직전에 세팅된 행동 상태.. + e_StateMove m_eStateMove; // 움직이는 상태.. + e_StateDying m_eStateDying; // 죽을때 어떻게 죽는가..?? + float m_fTimeDying; // 죽는 모션을 취하는 시간.. // by tigger - // By : Ecli666 ( On 2002-03-29 4:22:25 ) + // By : Ecli666 ( On 2002-03-29 오후 4:22:25 ) // - // CN3Texture* m_pTexShadow; // ׸ ؽó... - // __VertexXyzT1 m_vShadows[4]; // ׸ .. + // CN3Texture* m_pTexShadow; // 그림자 텍스처... + // __VertexXyzT1 m_vShadows[4]; // 그림자 폴리곤.. - // ~(By Ecli666 On 2002-03-29 4:22:25 ) + // ~(By Ecli666 On 2002-03-29 오후 4:22:25 ) - D3DCOLORVALUE m_cvDuration; // ÷ - float m_fDurationColorTimeCur; // ð.. - float m_fDurationColorTime; // ӽð.. + D3DCOLORVALUE m_cvDuration; // 지속 컬러 값 + float m_fDurationColorTimeCur; // 현재 시간.. + float m_fDurationColorTime; // 지속시간.. - float m_fFlickeringFactor; // ڰŸ.. - float m_fFlickeringTime; // ڰŸ ð.. + float m_fFlickeringFactor; // 깜박거림.. + float m_fFlickeringTime; // 깜박거림 시간.. - float m_fRotRadianPerSec; // ʴ ȸ Ȱ + float m_fRotRadianPerSec; // 초당 회전 라디안값 float - m_fMoveSpeedPerSec; // ʴ .. ̰ ⺻̰ (ȱ, ޸, ڷ, ֵ) ؼ .. + m_fMoveSpeedPerSec; // 초당 움직임 값.. 이값은 기본값이고 상태(걷기, 달리기, 뒤로, 저주등) 에 따라 가감해서 쓴다.. - float m_fYawCur; // ȸ.. - float m_fYawToReach; // ȸ ǥ Tick ȸѴ.. + float m_fYawCur; // 현재 회전값.. + float m_fYawToReach; // 이 회전값을 목표로 Tick 에서 회전한다.. - float m_fYNext; // Ʈ Ȥ 浹 üũ ̰.. - float m_fGravityCur; // ߷°.. + float m_fYNext; // 오브젝트 혹은 지형의 충돌 체크에 따른 높이값.. + float m_fGravityCur; // 중력값.. - float m_fScaleToSet; // ȭ.. + float m_fScaleToSet; // 점차 스케일 값변화.. float m_fScalePrev; public: - class CN3ShapeExtra * m_pShapeExtraRef; // NPC ̳ Ʈ ̸ ͸ ؼ ,.. + class CN3ShapeExtra * m_pShapeExtraRef; // 이 NPC 가 성문이나 집등 오브젝트의 형태이면 이 포인터를 세팅해서 쓴,다.. int m_iMagicAni; - int m_iIDTarget; // Ÿ ID... - int m_iDroppedItemID; // Ʈ - bool m_bGuardSuccess; //  ߴ ÷.. - bool m_bVisible; // ̴?? + int m_iIDTarget; // 타겟 ID... + int m_iDroppedItemID; // 죽은후 떨어트린 아이템 + bool m_bGuardSuccess; // 방어에 성공했는지에 대한 플래그.. + bool m_bVisible; // 보이는지?? - __InfoPlayerBase m_InfoBase; // ij .. - __Vector3 m_vPosFromServer; // ֱٿ Լ ġ.. + __InfoPlayerBase m_InfoBase; // 캐릭터 정보.. + __Vector3 m_vPosFromServer; // 최근에 서버에게서 받은 현재 위치.. - float m_fTimeAfterDeath; // ð - 5 Ѱ?? ٷ ״´. + float m_fTimeAfterDeath; // 죽은지 지난시간 - 5초정도면 적당한가?? 그전에 공격을 받으면 바로 죽는다. - int m_iSkillStep; // ų ִٸ 0 ƴѰ̴... - float m_fAttackDelta; // ų̳ ϴ ӵ.. 1.0 ⺻̰ Ŭ Ѵ. - float m_fMoveDelta; // ų̳ ϴ ̵ ӵ 1.0 ⺻̰ Ŭ δ. - __Vector3 m_vDirDying; // и .. + int m_iSkillStep; // 현재 스킬을 쓰고 있다면 0 이 아닌값이다... + float m_fAttackDelta; // 스킬이나 마법에 의해 변하는 공격 속도.. 1.0 이 기본이고 클수록 더 빨리 공격한다. + float m_fMoveDelta; // 스킬이나 마법에 의해 변하는 이동 속도 1.0 이 기본이고 클수록 더 빨리 움직인다. + __Vector3 m_vDirDying; // 죽을때 밀리는 방향.. //sound.. bool m_bSoundAllSet; @@ -117,8 +117,8 @@ class CPlayerBase : public CGameBase { float m_fCastFreezeTime; - // Լ... - // By : Ecli666 ( On 2002-03-29 1:32:12 ) + // 함수... + // By : Ecli666 ( On 2002-03-29 오후 1:32:12 ) // CBitset m_bitset[SHADOW_SIZE]; // Used in Quake3.. ^^ __VertexT1 m_pvVertex[4]; @@ -134,10 +134,10 @@ class CPlayerBase : public CGameBase { protected: void RenderShadow(float fSunAngle); - // ~(By Ecli666 On 2002-03-29 1:32:12 ) + // ~(By Ecli666 On 2002-03-29 오후 1:32:12 ) virtual bool ProcessAttack( - CPlayerBase * pTarget); // ƾ ó.. Ÿ ͸ ϰ 浹üũ ϸ 浹ϸ .. + CPlayerBase * pTarget); // 공격 루틴 처리.. 타겟 포인터를 구하고 충돌체크까지 하며 충돌하면 참을 리턴.. public: const __Matrix44 * JointMatrixGet(int nJointIndex) { return m_Chr.MatrixGet(nJointIndex); } @@ -149,57 +149,57 @@ class CPlayerBase : public CGameBase { virtual void SetSoundAndInitFont(); void SetSoundPlug(__TABLE_ITEM_BASIC * pItemBasic); void ReleaseSoundAndFont(); - void RegenerateCollisionMesh(); // ִ ּҰ ٽ ã 浹޽ø ٽ .. - e_StateAction State() { return m_eState; } // ൿ ... - e_StateMove StateMove() { return m_eStateMove; } // ̴ + void RegenerateCollisionMesh(); // 최대 최소값을 다시 찾고 충돌메시를 다시 만든다.. + e_StateAction State() { return m_eState; } // 행동 상태... + e_StateMove StateMove() { return m_eStateMove; } // 움직이는 상태 e_ItemClass ItemClass_RightHand() { if (m_pItemPlugBasics[PLUG_POS_RIGHTHAND]) { - return (e_ItemClass)(m_pItemPlugBasics[PLUG_POS_RIGHTHAND]->byClass); // Ÿ - + return (e_ItemClass)(m_pItemPlugBasics[PLUG_POS_RIGHTHAND]->byClass); // 아이템 타입 - 오른손 } else { return ITEM_CLASS_UNKNOWN; } } e_ItemClass ItemClass_LeftHand() { if (m_pItemPlugBasics[PLUG_POS_LEFTHAND]) { - return (e_ItemClass)(m_pItemPlugBasics[PLUG_POS_LEFTHAND]->byClass); // Ÿ - + return (e_ItemClass)(m_pItemPlugBasics[PLUG_POS_LEFTHAND]->byClass); // 아이템 타입 - 오른손 } else { return ITEM_CLASS_UNKNOWN; } } e_Ani - JudgeAnimationBreath(); // Ǵϱ.. ۰ Ÿ ִ³Ŀ ٸ ϸ̼ ε . - e_Ani JudgeAnimationWalk(); // ȱ Ǵϱ.. ۰ Ÿ ִ³Ŀ ٸ ϸ̼ ε . - e_Ani JudgeAnimationRun(); // ȱ Ǵϱ.. ۰ Ÿ ִ³Ŀ ٸ ϸ̼ ε . + JudgeAnimationBreath(); // 숨쉬기 모션 판단하기.. 가진 아이템과 타겟이 있는냐에 따라 다른 에니메이션 인덱스를 리턴. + e_Ani JudgeAnimationWalk(); // 걷기 모드판단하기.. 가진 아이템과 타겟이 있는냐에 따라 다른 에니메이션 인덱스를 리턴. + e_Ani JudgeAnimationRun(); // 걷기 모드판단하기.. 가진 아이템과 타겟이 있는냐에 따라 다른 에니메이션 인덱스를 리턴. e_Ani - JudgeAnimationWalkBackward(); // ȱ Ǵϱ.. ۰ Ÿ ִ³Ŀ ٸ ϸ̼ ε . - e_Ani JudgeAnimationAttack(); // Ǵϱ.. ۿ ٸ ϸ̼ ε . - e_Ani JudgeAnimationStruck(); // NPC ؼ ϸ̼ ε - e_Ani JudgeAnimationGuard(); // Ǵϱ. NPC ؼ ϸ̼ ε - e_Ani JudgeAnimationDying(); // NPC ؼ ϸ̼ ε - e_Ani JudgetAnimationSpellMagic(); // - - bool IsDead() { return (PSA_DYING == m_eState || PSA_DEATH == m_eState); } // ׾ִ? - bool IsAlive() { return !IsDead(); } // ִ? + JudgeAnimationWalkBackward(); // 걷기 모드판단하기.. 가진 아이템과 타겟이 있는냐에 따라 다른 에니메이션 인덱스를 리턴. + e_Ani JudgeAnimationAttack(); // 공격 모션 판단하기.. 가진 아이템에 따라 다른 에니메이션 인덱스를 리턴. + e_Ani JudgeAnimationStruck(); // 단지 NPC 와 유저를 구별해서 에니메이션 인덱스를 리턴 + e_Ani JudgeAnimationGuard(); // 막는 동작 판단하기. 단지 NPC 와 유저를 구별해서 에니메이션 인덱스를 리턴 + e_Ani JudgeAnimationDying(); // 단지 NPC 와 유저를 구별해서 에니메이션 인덱스를 리턴 + e_Ani JudgetAnimationSpellMagic(); // 마법 동작 + + bool IsDead() { return (PSA_DYING == m_eState || PSA_DEATH == m_eState); } // 죽어있는지? + bool IsAlive() { return !IsDead(); } // 살아있는지? bool IsMovingNow() { if (PSM_WALK == m_eStateMove || PSM_RUN == m_eStateMove || PSM_WALK_BACKWARD == m_eStateMove) { return true; } return false; - } // ̰ ִ? + } // 움직이고 있는지? void AnimationAdd(e_Ani eAni, bool bImmediately); void AnimationClear() { m_AnimationDeque.clear(); } int AnimationCountRemain() { return m_AnimationDeque.size() + 1; } - bool IsAnimationChange() { return m_bAnimationChanged; } // ť ϸ̼ ϴ õȴ.. + bool IsAnimationChange() { return m_bAnimationChanged; } // 큐에 넣은 에니메이션이 변하는 순간만 세팅된다.. bool Action(e_StateAction eState, bool bLooping, CPlayerBase * pTarget = NULL, - bool bForceSet = false); // ൿ ̺ ൿ Ѵ.. - bool ActionMove(e_StateMove eMove); // ̱.. - void ActionDying(e_StateDying eSD, const __Vector3 & vDir); // ״ ϱ.. + bool bForceSet = false); // 행동 테이블에 따른 행동을 한다.. + bool ActionMove(e_StateMove eMove); // 움직이기.. + void ActionDying(e_StateDying eSD, const __Vector3 & vDir); // 죽는 방법 결정하기.. - float Yaw() { return m_fYawCur; } // ȸ.. + float Yaw() { return m_fYawCur; } // 회전값.. float MoveSpeed() { return m_fMoveSpeedPerSec; } __Vector3 Position() const { return m_Chr.Pos(); } void PositionSet(const __Vector3 & vPos, bool bForcely) { @@ -217,14 +217,14 @@ class CPlayerBase : public CGameBase { void ScaleSetGradually(float fScale) { m_fScaleToSet = fScale; m_fScalePrev = m_Chr.Scale().y; - } // ȭ.. + } // 점차 스케일 변화.. __Vector3 Direction(); __Quaternion Rotation() { return m_Chr.Rot(); } void RotateTo(float fYaw, bool bImmediately); - void RotateTo(CPlayerBase * pOther); // ̳ ٶ󺻴. + void RotateTo(CPlayerBase * pOther); // 이넘을 바라본다. float Height(); float Radius(); - __Vector3 HeadPosition(); // ׻ ϴ Ӹġ ´.. + __Vector3 HeadPosition(); // 항상 변하는 머리위치를 가져온다.. __Vector3 RootPosition() { if (!m_Chr.m_MtxJoints.empty()) { return m_Chr.m_MtxJoints[0].Pos(); @@ -238,19 +238,19 @@ class CPlayerBase : public CGameBase { __Vector3 Center(); void DurationColorSet(const _D3DCOLORVALUE & color, - float fDurationTime); // ÷ ϴ ð ϸ鼭 ư. + float fDurationTime); // 컬러를 정하는 시간대로 유지하면서 원래색대로 돌아간다. void FlickerFactorSet(float fAlpha); void InfoStringSet(const std::string & szInfo, D3DCOLOR crFont); void BalloonStringSet(const std::string & szBalloon, D3DCOLOR crFont); void IDSet(int iID, const std::string & szID, D3DCOLOR crID); virtual void KnightsInfoSet(int iID, const std::string & szName, int iGrade, int iRank); - const std::string & IDString() { return m_InfoBase.szID; } // ID Character ̸ Ѵ. + const std::string & IDString() { return m_InfoBase.szID; } // ID 는 Character 포인터의 이름으로 대신한다. int IDNumber() { return m_InfoBase.iID; } CPlayerBase * TargetPointerCheck(bool bMustAlive); //////////////////// - // 浹 üũ Լ... + // 충돌 체크 함수들... bool CheckCollisionByBox(const __Vector3 & v0, const __Vector3 & v1, __Vector3 * pVCol, __Vector3 * pVNormal); bool CheckCollisionToTargetByPlug(CPlayerBase * pTarget, int nPlug, __Vector3 * pVCol); @@ -265,15 +265,15 @@ class CPlayerBase : public CGameBase { __TABLE_ITEM_EXT * pItemExt); virtual void DurabilitySet(e_ItemSlot eSlot, int iDurability); - void TickYaw(); // ȸ ó. - void TickAnimation(); // ϸ̼ ó. - void TickDurationColor(); // ij ȭ ó. - void TickSound(); // Sound ó.. + void TickYaw(); // 회전값 처리. + void TickAnimation(); // 에니메이션 처리. + void TickDurationColor(); // 캐릭터 색깔 변화 처리. + void TickSound(); // Sound 처리.. virtual void Tick(); virtual void Render(float fSunAngle); virtual void RenderCollisionMesh() { m_Chr.RenderCollisionMesh(); } - void RenderChrInRect(CN3Chr * pChr, const RECT & Rect); // Dino ߰, 簢ȿ ij͸ ׸. + void RenderChrInRect(CN3Chr * pChr, const RECT & Rect); // Dino 추가, 지정된 사각형안에 캐릭터를 그린다. void Release(); diff --git a/src/game/PlayerMySelf.cpp b/src/game/PlayerMySelf.cpp index 359795f9..e181f9b7 100644 --- a/src/game/PlayerMySelf.cpp +++ b/src/game/PlayerMySelf.cpp @@ -28,16 +28,16 @@ CPlayerMySelf::CPlayerMySelf() { m_ePlayerType = PLAYER_MYSELF; // Player Type ... Base, NPC, OTher, MySelf - m_bRunning = false; // ٴ.. - m_bMoveContinous = false; // ̴.. - m_bAttackContinous = false; // ϴ .. - m_bSitDown = false; // ɾִ .... - m_bRecruitParty = false; // Ƽ?? + m_bRunning = false; // 뛰는지.. + m_bMoveContinous = false; // 계속 움직이는지.. + m_bAttackContinous = false; // 계속 공격하는 상태인지.. + m_bSitDown = false; // 앉아있는 상태인지.... + m_bRecruitParty = false; // 파티모집중?? - m_bStun = false; // .. - m_fStunTime = 0.0f; // ð.. + m_bStun = false; // 기절.. + m_fStunTime = 0.0f; // 기절한 시간.. - m_fAttackTimeRecent = CN3Base::TimeGet(); // ֱٿ ð.. + m_fAttackTimeRecent = CN3Base::TimeGet(); // 최근에 공격한 시간.. m_bTempMoveTurbo = false; m_InfoExt.Init(); @@ -46,11 +46,11 @@ CPlayerMySelf::CPlayerMySelf() { m_ChrInv.PartAlloc(PART_POS_COUNT); m_ChrInv.PlugAlloc(PLUG_POS_COUNT); - m_iSendRegeneration = 0; // ѹ ٽ Ⱥ ÷ + m_iSendRegeneration = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 m_dwMagicID = 0xffffffff; m_fCastingTime = 0.0f; - m_pObjectTarget = NULL; // Ÿ Ʈ .. + m_pObjectTarget = NULL; // 타겟 오브젝트 포인터.. } CPlayerMySelf::~CPlayerMySelf() {} @@ -63,16 +63,16 @@ void CPlayerMySelf::Release() { m_bTargetOrPosMove = false; m_iMoveTarget = -1; - m_bRunning = false; // ٴ.. - m_bMoveContinous = false; // ̴.. - m_bAttackContinous = false; // ϴ .. - m_bSitDown = false; // ɾִ .... - m_bRecruitParty = false; // Ƽ?? + m_bRunning = false; // 뛰는지.. + m_bMoveContinous = false; // 계속 움직이는지.. + m_bAttackContinous = false; // 계속 공격하는 상태인지.. + m_bSitDown = false; // 앉아있는 상태인지.... + m_bRecruitParty = false; // 파티모집중?? - m_bStun = false; // .. - m_fStunTime = 0.0f; // ð.. + m_bStun = false; // 기절.. + m_fStunTime = 0.0f; // 기절한 시간.. - m_fAttackTimeRecent = CN3Base::TimeGet(); // ֱٿ ð.. + m_fAttackTimeRecent = CN3Base::TimeGet(); // 최근에 공격한 시간.. m_bTempMoveTurbo = false; m_InfoExt.Init(); @@ -82,7 +82,7 @@ void CPlayerMySelf::Release() { m_ChrInv.PartAlloc(PART_POS_COUNT); m_ChrInv.PlugAlloc(PLUG_POS_COUNT); - m_pObjectTarget = NULL; // Ÿ Ʈ .. + m_pObjectTarget = NULL; // 타겟 오브젝트 포인터.. CPlayerBase::Release(); } @@ -106,43 +106,43 @@ void CPlayerMySelf::Tick() { BOOL bAnim = TRUE; if (PSA_DEATH == - m_eState) // ״ ̰... ״ ϸ̼ .. // ѹ ٽ Ⱥ ÷ + m_eState) // 죽는 상태이고... 죽는 에니메이션이 끝나면.. // 한번 보내면 다시 죽을때까지 안보내는 플래그 { if (0 == m_iSendRegeneration) { // std::string szMsg; ::_LoadStringFromResource(IDS_REGENERATION, szMsg); - // CGameProcedure::MessageBoxPost(szMsg, "", MB_OK, BEHAVIOR_REGENERATION); // ٽ ޽ .. + // CGameProcedure::MessageBoxPost(szMsg, "", MB_OK, BEHAVIOR_REGENERATION); // 다시 생성 메시지 보냄.. // CLogWriter::Write("Dead!!!"); m_iSendRegeneration = 1; } return; } - if (m_fTimeAfterDeath > 0) // ׿ Ѵ.. + if (m_fTimeAfterDeath > 0) // 강제로 죽여야 한다.. { if (m_fTimeAfterDeath > 3.0f) { - this->Action(PSA_DYING, false); // 3 ʰ ״´. + this->Action(PSA_DYING, false); // 3 초가 지나야 죽는다. } - CPlayerBase::Tick(); // ȸ, ϸ̼ Tick ó.. .. + CPlayerBase::Tick(); // 회전, 지정된 에니메이션 Tick 및 색깔 지정 처리.. 등등.. return; } - if (IsDead()) // ¸ ư. + if (IsDead()) // 죽은 상태면 돌아간다. { CGameProcedure::s_pProcMain->CommandEnableAttackContinous(false, NULL); - CPlayerBase::Tick(); // ȸ, ϸ̼ Tick ó.. .. + CPlayerBase::Tick(); // 회전, 지정된 에니메이션 Tick 및 색깔 지정 처리.. 등등.. return; } //////////////////////////////////////////////////////////////////////////////// - // ÷̾ ̴° ٸѵ ٸ Ưϰ ó.. + // 내 플레이어는 움직이는게 다른넘들과 다르기 때문에 특별하게 처리.. if (PSM_WALK == m_eStateMove || PSM_WALK_BACKWARD == m_eStateMove || - PSM_RUN == m_eStateMove) // յڷ ɾų ޷. + PSM_RUN == m_eStateMove) // 앞뒤로 걸어가거나 달려가면. { - this->MoveSpeedCalculationAndCheckCollision(); // ̴ ӵ 浹üũ... - if (0 == m_fMoveSpeedPerSec) // ӵ 浹üũ Ŵ... + this->MoveSpeedCalculationAndCheckCollision(); // 움직이는 속도 및 충돌체크... + if (0 == m_fMoveSpeedPerSec) // 속도가 없으면 충돌체크 결과 못가는 거다... { this->ActionMove(PSM_STOP); - CGameProcedure::s_pProcMain->MsgSend_Move(false, false); // Ŷ .. + CGameProcedure::s_pProcMain->MsgSend_Move(false, false); // 정지 패킷 보내기.. } __Vector3 vPos = this->Position(); @@ -159,7 +159,7 @@ void CPlayerMySelf::Tick() { CPlayerBase::m_pSnd_MyMove = NULL; m_fMoveSpeedPerSec = 0; } - // ÷̾ ̴° ٸѵ ٸ Ưϰ ó.. + // 내 플레이어는 움직이는게 다른넘들과 다르기 때문에 특별하게 처리.. //////////////////////////////////////////////////////////////////////////////// CPlayerBase * pTarget = NULL; @@ -171,83 +171,83 @@ void CPlayerMySelf::Tick() { } else { float fTime = CN3Base::TimeGet(); - // Ȱ, ų óѴ.. + // 활쏘기, 석궁 쏘기 등 스킬로 처리한다.. if ((m_pItemPlugBasics[PLUG_POS_LEFTHAND] && ITEM_CLASS_BOW == m_pItemPlugBasics[PLUG_POS_LEFTHAND]->byClass) || (m_pItemPlugBasics[PLUG_POS_LEFTHAND] && ITEM_CLASS_BOW_LONG == m_pItemPlugBasics[PLUG_POS_LEFTHAND]->byClass) || (m_pItemPlugBasics[PLUG_POS_RIGHTHAND] && ITEM_CLASS_BOW_CROSS == m_pItemPlugBasics[PLUG_POS_RIGHTHAND]->byClass)) { - __TABLE_UPC_SKILL * pSkill = s_pTbl_Skill->Find(102003); // ų ̺ ⺻ Ȱ ų ã + __TABLE_UPC_SKILL * pSkill = s_pTbl_Skill->Find(102003); // 스킬 테이블에서 기본 활 스킬을 찾고 if (pSkill) { - if (pTarget->IsAlive()) //ӽ ִ ¿... + if (pTarget->IsAlive()) //임시 유저가 살아 있는 상태에서만... { float fInterval = (pSkill->iCastTime / 10.f) + 0.15f; if (m_fAttackDelta > 0) { fInterval /= m_fAttackDelta; } - if (fTime > m_fAttackTimeRecent + fInterval) // .. ! + if (fTime > m_fAttackTimeRecent + fInterval) // 공격 간격이 넘으면.. 공격! { if (CGameProcedure::s_pProcMain->m_pMagicSkillMng->MsgSend_MagicProcess( - m_iIDTarget, pSkill)) { // ų Ŷ ⿡ ϸ. + m_iIDTarget, pSkill)) { // 스킬 패킷 보내기에 성공하면. TRACE("%.2f\n", fTime - m_fAttackTimeRecent); } - m_fAttackTimeRecent = fTime; // ֱٿ ð.. + m_fAttackTimeRecent = fTime; // 최근에 공격한 시간.. } } } } else if (m_pItemPlugBasics[PLUG_POS_RIGHTHAND] && - ITEM_CLASS_LAUNCHER == m_pItemPlugBasics[PLUG_POS_RIGHTHAND]->byClass) // â ̸.. + ITEM_CLASS_LAUNCHER == m_pItemPlugBasics[PLUG_POS_RIGHTHAND]->byClass) // 투창용 아이템이면.. { - __TABLE_UPC_SKILL * pSkill = s_pTbl_Skill->Find(102009); // ų ̺ ⺻ Ȱ ų ã - if (pSkill && fTime > m_fAttackTimeRecent + (pSkill->iCastTime / 10.f)) // .. ! + __TABLE_UPC_SKILL * pSkill = s_pTbl_Skill->Find(102009); // 스킬 테이블에서 기본 활 스킬을 찾고 + if (pSkill && fTime > m_fAttackTimeRecent + (pSkill->iCastTime / 10.f)) // 공격 간격이 넘으면.. 공격! { - if (pTarget->IsAlive()) //ӽ ִ ¿ + if (pTarget->IsAlive()) //임시 유저가 살아 있는 상태에서만 { CGameProcedure::s_pProcMain->m_pMagicSkillMng->MsgSend_MagicProcess( - m_iIDTarget, pSkill); // ų Ŷ ⿡ ϸ. + m_iIDTarget, pSkill); // 스킬 패킷 보내기에 성공하면. TRACE("%.2f\n", fTime - m_fAttackTimeRecent); - m_fAttackTimeRecent = fTime; // ֱٿ ð.. + m_fAttackTimeRecent = fTime; // 최근에 공격한 시간.. } } - } else // ̸.. + } else // 걍 공격이면.. { float fIntervalTable = 1.0f; - if (m_pItemPlugBasics[PLUG_POS_RIGHTHAND] && m_pItemPlugExts[PLUG_POS_RIGHTHAND]) // + if (m_pItemPlugBasics[PLUG_POS_RIGHTHAND] && m_pItemPlugExts[PLUG_POS_RIGHTHAND]) // 공격 간격 정의 { fIntervalTable = (m_pItemPlugBasics[PLUG_POS_RIGHTHAND]->siAttackInterval / 100.0f) * (m_pItemPlugExts[PLUG_POS_RIGHTHAND]->siAttackIntervalPercentage / - 100.0f); // 100 1 110 ̸ 1.1 ʵ.. ۼƮ ... + 100.0f); // 100 은 1초 110 이면 1.1 초등.. 퍼센트로 간다... } float fInterval = fIntervalTable; if (m_fAttackDelta > 0) { fInterval /= - m_fAttackDelta; // ų̳ ϴ ӵ.. 1.0 ⺻̰ Ŭ Ѵ. + m_fAttackDelta; // 스킬이나 마법에 의해 변하는 공격 속도.. 1.0 이 기본이고 클수록 더 빨리 공격한다. } - if (fTime > m_fAttackTimeRecent + fInterval) // .. ! + if (fTime > m_fAttackTimeRecent + fInterval) // 공격 간격이 넘으면.. 공격! { bool bCastingNow = CGameProcedure::s_pProcMain->m_pMagicSkillMng->IsCasting(); - if (false == bCastingNow) // ij ̸ Ŷ ʴ´. + if (false == bCastingNow) // 캐스팅 중이면 공격 패킷을 보내지 않는다. { bool bAttackable = IsAttackableTarget(pTarget); - if (bAttackable) // .. + if (bAttackable) // 공격 가능.. { - float fDistance = s_pPlayer->DistanceExceptRadius(pTarget); // ݰŸ + float fDistance = s_pPlayer->DistanceExceptRadius(pTarget); // 공격거리 CGameProcedure::s_pProcMain->MsgSend_Attack(pTarget->IDNumber(), fIntervalTable, fDistance); if (m_iSkillStep == 0 && PSA_ATTACK != m_eState && - m_fFlickeringFactor == 1.0f) { // ų ° ƴѵ .. - this->Action(PSA_ATTACK, true, pTarget); // ̾ƴϸ Ѵ.. + m_fFlickeringFactor == 1.0f) { // 스킬을 쓰는게 아닌데 공격하지 않으면.. + this->Action(PSA_ATTACK, true, pTarget); // 공격 중이아니면 공격한다.. } - m_fAttackTimeRecent = fTime; // ֱٿ ð.. + m_fAttackTimeRecent = fTime; // 최근에 공격한 시간.. } else { if (CGameProcedure::s_pEng->ViewPoint() == VP_THIRD_PERSON) { - CGameProcedure::s_pPlayer->RotateTo(pTarget); // . + CGameProcedure::s_pPlayer->RotateTo(pTarget); // 방향을 돌린다. - float fDist = (pTarget->Position() - m_Chr.Pos()).Magnitude(); // Ÿ ϰ.. + float fDist = (pTarget->Position() - m_Chr.Pos()).Magnitude(); // 공격 거리를 구하고.. float fDistLimit = this->AttackableDistance(pTarget); if (fDist > fDistLimit && !m_bTargetOrPosMove) { @@ -256,53 +256,53 @@ void CPlayerMySelf::Tick() { } } if (m_iSkillStep == 0 && - PSA_SITDOWN != m_eState) { // ų ° ƴѵ ɾִ ° ƴϸ.. - this->Action(PSA_BASIC, true); // ⺻ڼ.. + PSA_SITDOWN != m_eState) { // 스킬을 쓰는게 아닌데 앉아있는 상태가 아니면.. + this->Action(PSA_BASIC, true); // 기본자세.. } } } } } - if (fTime == m_fAttackTimeRecent) { // .. + if (fTime == m_fAttackTimeRecent) { // 공격했으면.. CGameProcedure::s_pProcMain->CommandSitDown(false, - false); // .. ɾִ ¿ װ ִ.. + false); // 일으켜 세운다.. 앉아있는 상태에서 버그가 있다.. } } } - if (m_bStun) // .. + if (m_bStun) // 기절해 있으면.. { - m_fStunTime -= s_fSecPerFrm; // ð ó.. + m_fStunTime -= s_fSecPerFrm; // 기절 시간 처리.. if (m_fStunTime < 0) { - this->StunRelease(); // Ǯֱ.. + this->StunRelease(); // 기절 풀어주기.. } } - if (PSA_ATTACK == m_eState || m_iSkillStep != 0) // ̰ų ų ̸.. + if (PSA_ATTACK == m_eState || m_iSkillStep != 0) // 공격 중이거나 스킬 사용중이면.. { if (!pTarget) { - pTarget = TargetPointerCheck(false); // Ÿ ͸ ´.. + pTarget = TargetPointerCheck(false); // 타겟 포인터를 얻어온다.. } CPlayerBase::ProcessAttack( - pTarget); // ݿ ƾ ó.. ϸ̼ ð 浹 óһ Ŷ ó Ѵ.. + pTarget); // 공격에 관한 루틴 처리.. 에니메이션 세팅과 충돌만 처리할뿐 패킷은 처리 안한다.. } if (m_dwMagicID != 0xffffffff) { m_fCastingTime += CN3Base::s_fSecPerFrm; } - CPlayerBase::Tick(); // ȸ, ϸ̼ Tick ó.. .. + CPlayerBase::Tick(); // 회전, 지정된 에니메이션 Tick 및 색깔 지정 처리.. 등등.. } void CPlayerMySelf::Render(float fSunAngle) { - // LOD + 1 + // 강제로 LOD 레벨 + 1 m_Chr.m_nLOD--; if (m_Chr.m_nLOD < 0) { m_Chr.m_nLOD = 0; } - int iLODDeltaPrev = CN3Chr::LODDelta(); // ij ϰ ׸.. + int iLODDeltaPrev = CN3Chr::LODDelta(); // 내캐릭은 좀더 정교하게 그리자.. CN3Chr::LODDeltaSet(0); CPlayerBase::Render(fSunAngle); CN3Chr::LODDeltaSet(iLODDeltaPrev); @@ -313,10 +313,10 @@ bool CPlayerMySelf::ToggleAttackContinous() { return false; } - if (false == m_bAttackContinous) // Ÿ ִ .. + if (false == m_bAttackContinous) // 타겟이 있는지 본다.. { CPlayerNPC * pTarget = s_pOPMgr->CharacterGetByID(m_iIDTarget, true); - if (pTarget) // && !IsOutOfAttackRange(pTarget)) // Ÿ ְ + if (pTarget) // && !IsOutOfAttackRange(pTarget)) // 타겟이 있고 공격 가능한 범위에 있을때만 { this->m_bAttackContinous = true; } @@ -328,7 +328,7 @@ bool CPlayerMySelf::ToggleAttackContinous() { } bool CPlayerMySelf::ToggleRunMode() { - m_bRunning = !m_bRunning; // ٴ.. + m_bRunning = !m_bRunning; // 뛰는지.. if (true == m_bRunning) { if (PSM_WALK == m_eStateMove) { m_eStateMove = PSM_RUN; @@ -345,12 +345,12 @@ bool CPlayerMySelf::ToggleRunMode() { } void CPlayerMySelf::ToggleMoveMode() { - m_bMoveContinous = !m_bMoveContinous; // ̴.. + m_bMoveContinous = !m_bMoveContinous; // 계속 움직이는지.. int nAni = ANI_BREATH; - if (m_bMoveContinous) // ϸ.. + if (m_bMoveContinous) // 계속 움직여야 하면.. { - if (m_bRunning) // ٸ.. + if (m_bRunning) // 뛰면.. { m_eStateMove = PSM_RUN; nAni = ANI_RUN; @@ -359,24 +359,24 @@ void CPlayerMySelf::ToggleMoveMode() { nAni = ANI_WALK; } - float fSpeed = this->MoveSpeedCalculationAndCheckCollision(); // ̴ ӵ 浹üũ... - if (0 == fSpeed) // ... + float fSpeed = this->MoveSpeedCalculationAndCheckCollision(); // 움직이는 속도 및 충돌체크... + if (0 == fSpeed) // 갈수 없으면... { m_bMoveContinous = false; m_eStateMove = PSM_STOP; m_eState = PSA_BASIC; nAni = - this->JudgeAnimationBreath(); // Ÿ . ִ ⿡ ⺻ ϸ̼ Ǵ.. ⺻ ϸ̼ + this->JudgeAnimationBreath(); // 타겟이 있으면. 들고 있는 무기에 따라 기본 에니메이션 판다.. 없으면 걍 기본 에니메이션 } } else { m_eStateMove = PSM_STOP; m_eState = PSA_BASIC; nAni = - this->JudgeAnimationBreath(); // Ÿ . ִ ⿡ ⺻ ϸ̼ Ǵ.. ⺻ ϸ̼ + this->JudgeAnimationBreath(); // 타겟이 있으면. 들고 있는 무기에 따라 기본 에니메이션 판다.. 없으면 걍 기본 에니메이션 } this->AnimationClear(); - m_Chr.AniCurSet(nAni); // ° Ȱ ڱ, ߱ + m_Chr.AniCurSet(nAni); // 통째로 걷고 뒤기, 멈추기 적용 } __Vector3 CPlayerMySelf::NextPos(float fTimeAfter) { @@ -387,7 +387,7 @@ __Vector3 CPlayerMySelf::NextPos(float fTimeAfter) { return vNextPos; } -void CPlayerMySelf::RotAdd(const float fRotRadianPerSec) // y ʴ ȸϴ ӵ ־ش. +void CPlayerMySelf::RotAdd(const float fRotRadianPerSec) // y 축을 기준으로 초당 회전하는 속도를 넣어준다. { m_fYawCur += fRotRadianPerSec * s_fSecPerFrm; @@ -397,7 +397,7 @@ __Vector3 CPlayerMySelf::NextPos(float fTimeAfter) { if (m_fYawCur <= -D3DXToRadian(180.0f) * 2) { m_fYawCur += D3DXToRadian(180.0f) * 2; } - m_fYawToReach = m_fYawCur; // ٷ .. + m_fYawToReach = m_fYawCur; // 바로 돌린다.. } void CPlayerMySelf::InventoryChrRender(const RECT & Rect) { @@ -427,7 +427,7 @@ void CPlayerMySelf::InventoryChrRender(const RECT & Rect) { lgt0.Diffuse.r = 220/255.0f; lgt0.Diffuse.g = 255/255.0f; lgt0.Diffuse.b = 220/255.0f; CN3Base::s_lpD3DDev->SetLight(0, &lgt0); - //ij .. + //캐릭터 찍기.. // __Matrix44 mtxproj, mtxview, mtxworld, mtxprojback, mtxviewback, mtxworldback; @@ -448,7 +448,7 @@ void CPlayerMySelf::InventoryChrRender(const RECT & Rect) { /////////////////////////////////////////////////////////////// -// 2d ǥ .. +// 2d 좌표 구함.. // 2d -> 3d.. __Vector3 vPos; @@ -489,7 +489,7 @@ void CPlayerMySelf::InventoryChrRender(const RECT & Rect) { CN3Base::s_lpD3DDev->SetRenderState( D3DRS_FOGENABLE , dwUsefog ); for ( int i = 0; i < 8; i++ ) CN3Base::s_lpD3DDev->LightEnable(i, bLight[i]); */ - // Ʒ dino + // 아래로 dino수정 // backup render state DWORD dwLighting; D3DLIGHT9 BackupLight0; @@ -510,7 +510,7 @@ void CPlayerMySelf::InventoryChrRender(const RECT & Rect) { } s_lpD3DDev->LightEnable(0, TRUE); - // 0 light + // 0번 light 설정 D3DLIGHT9 Light0; memset(&Light0, 0, sizeof(D3DLIGHT9)); Light0.Type = D3DLIGHT_POINT; @@ -522,10 +522,10 @@ void CPlayerMySelf::InventoryChrRender(const RECT & Rect) { Light0.Diffuse.b = 220 / 255.0f; s_lpD3DDev->SetLight(0, &Light0); - // ij ġ + // 캐릭터 위치와 방향 세팅 m_ChrInv.PosSet(__Vector3(0, 0, 0)); __Quaternion qt; - qt.RotationAxis(0.0f, 1.0f, 0.0f, D3DXToRadian(18.0f)); // ణ 񽺵ϰ ְ.. + qt.RotationAxis(0.0f, 1.0f, 0.0f, D3DXToRadian(18.0f)); // 약간 비스듬하게 서있게.. m_ChrInv.RotSet(qt); // render @@ -551,7 +551,7 @@ void CPlayerMySelf::InventoryChrAnimationInitialize() { int iAniTmp = m_ChrInv.AniCtrl()->Count() - 1; m_ChrInv.AniCurSet(iAniTmp, false, 0); m_ChrInv.AniCurSet(ANI_BREATH, false, 0); - m_ChrInv.Tick(); // ѹ ش.. + m_ChrInv.Tick(); // 한번 해준다.. } CN3CPlugBase * CPlayerMySelf::PlugSet(e_PlugPosition ePos, const std::string & szFN, __TABLE_ITEM_BASIC * pItemBasic, @@ -566,15 +566,15 @@ CN3CPlugBase * CPlayerMySelf::PlugSet(e_PlugPosition ePos, const std::string & s m_pItemPlugExts[ePos] = pItemExt; if (pItemBasic) { if (pItemBasic->byClass == ITEM_CLASS_SHIELD) { - iJoint = m_pLooksRef->iJointLH2; // + iJoint = m_pLooksRef->iJointLH2; // 방패인 경우 } else { - iJoint = m_pLooksRef->iJointLH; // ޼ .. + iJoint = m_pLooksRef->iJointLH; // 왼손 끝.. } } } else if (PLUG_POS_KNIGHTS_GRADE == ePos) { m_pItemPlugBasics[ePos] = pItemBasic; m_pItemPlugExts[ePos] = pItemExt; - iJoint = m_pLooksRef->iJointRH - 2; // ȸ + iJoint = m_pLooksRef->iJointRH - 2; // 오른쪽 팔목 } else if (PLUG_POS_BACK == ePos) { //m_pItemBasicPlugRefs[PLUG_POS_BACK] = pItem; } else { @@ -586,12 +586,12 @@ CN3CPlugBase * CPlayerMySelf::PlugSet(e_PlugPosition ePos, const std::string & s return NULL; } - if (PLUG_POS_LEFTHAND == ePos || PLUG_POS_RIGHTHAND == ePos) // Ű ؼ ũ Ű. ⺻Ű 1.8 ̴. + if (PLUG_POS_LEFTHAND == ePos || PLUG_POS_RIGHTHAND == ePos) // 키에 비례해서 크게 키운다. 기본키는 1.8 미터이다. { float fScale = m_Chr.Height() / 1.8f; fScale *= pPlug->Scale().y / m_Chr.Scale().y; pPlug->ScaleSet(__Vector3(fScale, fScale, fScale)); - pPlug->m_nJointIndex = iJoint; // ȣ .. + pPlug->m_nJointIndex = iJoint; // 관절 번호 세팅.. } // else if(PLUG_POS_BACK == ePos) // { @@ -610,21 +610,21 @@ CN3CPart * CPlayerMySelf::PartSet(e_PartPosition ePos, const std::string & szFN, return NULL; } - if (PART_POS_UPPER == ePos) // ü Ư ó ʿ.. + if (PART_POS_UPPER == ePos) // 상체일 경우 특별한 처리가 필요.. { - if (pItemBasic) // + if (pItemBasic) // 입히는 경우 { if (pItemBasic->byIsRobeType && - m_Chr.Part(PART_POS_LOWER)) // κ Ÿ ¥ ̰ Ʒ ԰ .. + m_Chr.Part(PART_POS_LOWER)) // 로브 타입의 통짜 윗옷이고 아래에 뭔가 입고 있으면.. { - m_ChrInv.PartSet(PART_POS_LOWER, ""); // Ʒ ش.. + m_ChrInv.PartSet(PART_POS_LOWER, ""); // 아래를 비워준다.. m_Chr.PartSet(PART_POS_LOWER, ""); } - } else // ü + } else // 상체를 벗는 경우 { - if (m_pItemPartBasics[ePos] && m_pItemPartBasics[ePos]->byIsRobeType) // ߴ κ.. + if (m_pItemPartBasics[ePos] && m_pItemPartBasics[ePos]->byIsRobeType) // 전에 착용했던게 로브면.. { - if (m_pItemPartBasics[PART_POS_LOWER]) // ü .. + if (m_pItemPartBasics[PART_POS_LOWER]) // 하체에 아이템이 입혀있으면.. { std::string szFN2; e_PartPosition ePartPos2 = PART_POS_UNKNOWN; @@ -632,33 +632,33 @@ CN3CPart * CPlayerMySelf::PartSet(e_PartPosition ePos, const std::string & szFN, CGameProcedure::MakeResrcFileNameForUPC(m_pItemPartBasics[PART_POS_LOWER], &szFN2, NULL, ePartPos2, ePlugPos2); - m_ChrInv.PartSet(PART_POS_LOWER, szFN2); // ü .. + m_ChrInv.PartSet(PART_POS_LOWER, szFN2); // 하체에 전의 옷을 입힌다.. m_Chr.PartSet(PART_POS_LOWER, szFN2); - } else // ü ԰ ־ ٸ.. + } else // 하체에 입고 있었던 아이템이 없다면.. { __TABLE_PLAYER_LOOKS * pLooks = - s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); // User Player Character Skin ü .. - m_ChrInv.PartSet(PART_POS_LOWER, pLooks->szPartFNs[PART_POS_LOWER]); // ü ⺻ . - m_Chr.PartSet(PART_POS_LOWER, pLooks->szPartFNs[PART_POS_LOWER]); // ü ⺻ . + s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); // User Player Character Skin 구조체 포인터.. + m_ChrInv.PartSet(PART_POS_LOWER, pLooks->szPartFNs[PART_POS_LOWER]); // 하체에 기본옷을 입힌다. + m_Chr.PartSet(PART_POS_LOWER, pLooks->szPartFNs[PART_POS_LOWER]); // 하체에 기본옷을 입힌다. } } } - } else if (PART_POS_LOWER == ePos) // ü .. + } else if (PART_POS_LOWER == ePos) // 하체일 경우.. { - // ϰ ǰ... + // 아이템을 착용하건 벗건간에... if (m_pItemPartBasics[PART_POS_UPPER] && - m_pItemPartBasics[PART_POS_UPPER]->byIsRobeType) // ü ߴ κ.. + m_pItemPartBasics[PART_POS_UPPER]->byIsRobeType) // 전에 상체에 착용했던게 로브면.. { - m_pItemPartBasics[ePos] = pItemBasic; // + m_pItemPartBasics[ePos] = pItemBasic; // 아이템 적용 m_pItemPartExts[ePos] = pItemExt; m_ChrInv.PartSet(ePos, ""); - m_Chr.PartSet(ePos, ""); // ü (?).. - return NULL; // ư. + m_Chr.PartSet(ePos, ""); // 하체는 벗기고(?).. + return NULL; // 돌아간다. } } CN3CPart * pPart = NULL; - if (szFN.empty()) // ̸ °Ÿ.. ⺻ .. + if (szFN.empty()) // 파일 이름이 없는거면.. 기본 착용.. { if (PART_POS_HAIR_HELMET == ePos) { this->InitHair(); @@ -668,7 +668,7 @@ CN3CPart * CPlayerMySelf::PartSet(e_PartPosition ePos, const std::string & szFN, pPart = m_Chr.Part(ePos); } else { __TABLE_PLAYER_LOOKS * pLooks = - s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); // Player Character Skin ü .. + s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); // Player Character Skin 구조체 포인터.. if (pLooks) { m_ChrInv.PartSet(ePos, pLooks->szPartFNs[ePos]); pPart = m_Chr.PartSet(ePos, pLooks->szPartFNs[ePos]); @@ -682,7 +682,7 @@ CN3CPart * CPlayerMySelf::PartSet(e_PartPosition ePos, const std::string & szFN, pPart = m_Chr.PartSet(ePos, szFN); } - m_pItemPartBasics[ePos] = pItemBasic; // + m_pItemPartBasics[ePos] = pItemBasic; // 아이템 적용 m_pItemPartExts[ePos] = pItemExt; return pPart; @@ -695,7 +695,7 @@ bool CPlayerMySelf::InitChr(__TABLE_PLAYER_LOOKS * pTbl) { m_ChrInv.AniCtrlSet(pTbl->szAniFN); float fScale = 2.1f / m_Chr.Height(); - m_ChrInv.ScaleSet(fScale, fScale, fScale); // κ丮 â  ũ⸦ ٿش.. + m_ChrInv.ScaleSet(fScale, fScale, fScale); // 인벤토리 창에 들어가게 크기를 줄여준다.. return true; } @@ -705,12 +705,12 @@ float CPlayerMySelf::AttackableDistance(CPlayerBase * pTarget) { return 0; } - float fDistLimit = (m_Chr.Radius() + pTarget->Radius()) / 2.0f; // Ÿ.. + float fDistLimit = (m_Chr.Radius() + pTarget->Radius()) / 2.0f; // 공격 거리제한.. if (m_pItemPlugBasics[0]) { - fDistLimit += m_pItemPlugBasics[0]->siAttackRange / 10.0f; // .. + fDistLimit += m_pItemPlugBasics[0]->siAttackRange / 10.0f; // 아이템을 들고 있으면.. } else if (m_pItemPlugBasics[1] && ITEM_POS_TWOHANDLEFT == - m_pItemPlugBasics[1]->byAttachPoint) { // ޼տ ڵ巹Ʈ(Ȱ) .. + m_pItemPlugBasics[1]->byAttachPoint) { // 왼손에 투핸드레프트(활) 아이템을 들고 있으면.. fDistLimit += m_pItemPlugBasics[1]->siAttackRange / 10.0f; } @@ -723,29 +723,29 @@ float CPlayerMySelf::DistanceExceptRadius(CPlayerBase * pTarget) { } float fDist = (pTarget->Position() - m_Chr.Pos()).Magnitude(); - float fDistRadius = (m_Chr.Radius() + pTarget->Radius()) / 2.0f; // Ÿ.. + float fDistRadius = (m_Chr.Radius() + pTarget->Radius()) / 2.0f; // 공격 거리제한.. return fDist - fDistRadius; } bool CPlayerMySelf::IsAttackableTarget(CPlayerBase * pTarget, bool bMesureAngle) { if (m_fFlickeringFactor != 1.0f) { - return false; //Ȱؼ ̴ Ҽ . + return false; //부활해서 깜빡이는 경우는 공격할수 없다. } if (NULL == pTarget || pTarget->IsDead()) { - return false; // ij ϰ - ױ ij Ѵ.. + return false; //죽은 상태의 캐릭은 공격하지 못하게 - 단 죽기 직전의 캐릭은 제외한다.. } if (pTarget->m_InfoBase.eNation == m_InfoBase.eNation) { - return false; // ̴.. + return false; // 같은 국가이다.. } - float fDist = (pTarget->Position() - m_Chr.Pos()).Magnitude(); // Ÿ ϰ.. + float fDist = (pTarget->Position() - m_Chr.Pos()).Magnitude(); // 공격 거리를 구하고.. float fDistLimit = this->AttackableDistance(pTarget); if (fDist > fDistLimit) { - return false; // Ÿ ̻ ư. + return false; // 거리가 일정이상 떨어져 있으면 돌아간다. } - if (bMesureAngle) // .. + if (bMesureAngle) // 각도를 본다.. { __Vector3 vDir = this->Direction(); vDir.y = 0; @@ -766,27 +766,27 @@ bool CPlayerMySelf::IsAttackableTarget(CPlayerBase * pTarget, bool bMesureAngle) bool CPlayerMySelf::CheckCollision() { float fSpeed = - m_fMoveSpeedPerSec * CN3Base::s_fSecPerFrm; // ̴ ӵ..ӿ Ǿ ӵ̴. + m_fMoveSpeedPerSec * CN3Base::s_fSecPerFrm; // 현재 움직이는 속도..프레임에 따라 계산되어 나오는 속도이다. if (0 == fSpeed) { - return false; // 浹üũ ʴ´. + return false; // 움직이지 않으면 충돌체크 하지 않는다. } __Vector3 vPos = this->Position(); - __Vector3 vDir(0, 0, 1); // ȸ ϰ.. + __Vector3 vDir(0, 0, 1); // 회전값을 구하고.. __Matrix44 mtxRot = this->Rotation(); - vDir *= mtxRot; // ȸ ϰ. + vDir *= mtxRot; // 회전에 따른 방향을 구하고. if (fSpeed < 0) { fSpeed *= -1.0f; vDir *= -1.0f; } - __Vector3 vPosNext = vPos + (vDir * fSpeed); // ġ .. + __Vector3 vPosNext = vPos + (vDir * fSpeed); // 다음 위치 계산.. if (false == ACT_WORLD->IsInTerrainWithTerrain(vPosNext.x, vPosNext.z, vPos)) { - return true; // ȿ .. + return true; // 경계 안에 있지 않으면.. } ////////////////////////////////// - // ٸ ÷̾ üũ.. + // 다른 플레이어와 체크.. CPlayerOther * pUPC = NULL; float fHeightSum, fMag; it_UPC it = s_pOPMgr->m_UPCs.begin(), itEnd = s_pOPMgr->m_UPCs.end(); @@ -794,44 +794,44 @@ bool CPlayerMySelf::CheckCollision() { pUPC = it->second; if (pUPC->IsDead()) { - continue; //׾ ִ ijʹ 浹üũ ʴ´. + continue; //죽어 있는 상태의 캐릭터는 충돌체크를 하지 않는다. } if (m_InfoBase.eNation == pUPC->m_InfoBase.eNation) { - continue; // ... + continue; // 같은 국가... } fMag = (pUPC->Position() - vPos).Magnitude(); if (fMag < 32.0f) { fHeightSum = (pUPC->Height() + m_Chr.Height()) / 2.5f; - if (fMag < fHeightSum) // Ÿ Ű պ .. + if (fMag < fHeightSum) // 거리가 키의 합보다 작으면.. { - float fMag2 = (pUPC->Position() - vPosNext).Magnitude(); // ġ . + float fMag2 = (pUPC->Position() - vPosNext).Magnitude(); // 다음위치가 더 가까우면. if (fMag2 < fMag) { return true; } } } } - // ٸ ÷̾ üũ.. + // 다른 플레이어와 체크.. ////////////////////////////////// // __TABLE_ZONE* pZoneInfo = s_pTbl_Zones->Find(m_InfoExt.iZoneCur); // if(pZoneInfo && pZoneInfo->bNPCCollisionCheck) //this_zone - // Ǿ 浹 üũ Ѵ. + //적국 엔피씨는 충돌 체크를 한다. CPlayerNPC * pNPC = NULL; it_NPC it_N = s_pOPMgr->m_NPCs.begin(), it_NEnd = s_pOPMgr->m_NPCs.end(); for (; it_N != it_NEnd; it_N++) { pNPC = it_N->second; if (pNPC->m_pShapeExtraRef) { - continue; // ̸ 浹üũ ʴ´.. + continue; // 성문등의 형태이면 충돌체크를 하지 않는다.. } if (m_InfoBase.eNation == pNPC->m_InfoBase.eNation) { - continue; // ... + continue; // 같은 국가... } if (m_InfoBase.eNation == NATION_KARUS && pNPC->m_InfoBase.eNation != NATION_ELMORAD) { - continue; // Ǿ 浹 üũ Ѵ. + continue; // 적국 엔피씨는 충돌 체크를 한다. } if (m_InfoBase.eNation == NATION_ELMORAD && pNPC->m_InfoBase.eNation != NATION_KARUS) { continue; // @@ -840,9 +840,9 @@ bool CPlayerMySelf::CheckCollision() { fMag = (pNPC->Position() - vPos).Magnitude(); if (fMag < 32.0f) { fHeightSum = (pNPC->Height() + m_Chr.Height()) / 2.5f; - if (fMag < fHeightSum) // Ÿ Ű պ .. + if (fMag < fHeightSum) // 거리가 키의 합보다 작으면.. { - float fMag2 = (pNPC->Position() - vPosNext).Magnitude(); // ġ . + float fMag2 = (pNPC->Position() - vPosNext).Magnitude(); // 다음위치가 더 가까우면. if (fMag2 < fMag) { return true; } @@ -850,49 +850,49 @@ bool CPlayerMySelf::CheckCollision() { } } //for( - // Ʈ 浹üũ.. + // 오브젝트와 충돌체크.. __Vector3 vPos2 = vPos, vCol, vNormal; if (!s_pWorldMgr->IsIndoor()) { - vPos2.y += 0.5f; // ij ߳̿ 0.5 浹üũѴ. + vPos2.y += 0.5f; // 캐릭터 발높이에서 0.5 미터 높이 위에서 충돌체크한다. } else { vPos2.y += - 0.6f; // ij ߳̿ 0.6 浹üũѴ. Լ 0.6 PvsMgr m_fVolumeOffs.. ^^ + 0.6f; // 캐릭터 발높이에서 0.6 미터 높이 위에서 충돌체크한다. 이 함수 내에서 쓰는 0.6은 PvsMgr의 m_fVolumeOffs.. ^^ } bool bColShape = ACT_WORLD->CheckCollisionWithShape(vPos2, vDir, fSpeed, &vCol, &vNormal); if (bColShape) { - return true; // Ʈ 浹 + return true; // 오브젝트와 충돌값이 있으면 } //////////////////////////////////////////////////////////////////////////////// - // Ʈ ̰ ϱ.. - float fYTerrain = ACT_WORLD->GetHeightWithTerrain(vPosNext.x, vPosNext.z); // ̰.. + // 지면과 오브젝트의 높이값 구하기.. + float fYTerrain = ACT_WORLD->GetHeightWithTerrain(vPosNext.x, vPosNext.z); // 지면의 높이값.. float fYClimb = ACT_WORLD->GetHeightNearstPosWithShape(vPosNext, CN3Base::s_fSecPerFrm * 30.0f, - &vNormal); // 浹 üũ Ʈ ̰.. - vNormal.y = 0; // ̷ 縦 ִ.. + &vNormal); // 충돌 체크 오브젝트의 높이값.. + vNormal.y = 0; // 이래야 정상적인 경사를 얻을수 있다.. if (!s_pWorldMgr->IsIndoor()) { if (fYClimb > fYTerrain && fYClimb < vPosNext.y + ((30.0f / CN3Base::s_fFrmPerSec) * - 0.5f)) // 浹 üũ Ʈ ̰ ְ 츸 ̰ + 0.5f)) // 충돌 체크 오브젝트 높이값이 있고 지형보다 높을 경우만 높이값 적용 { - if (vNormal.Magnitude() > MAX_INCLINE_CLIMB && vNormal.Dot(vDir) <= 0.0f) // üũ.. + if (vNormal.Magnitude() > MAX_INCLINE_CLIMB && vNormal.Dot(vDir) <= 0.0f) // 경사 체크.. { return true; } m_fYNext = fYClimb; } else { - // 簡 45 üũ + // 지형의 경사가 45 도 이하인지 체크 if (true == ACT_WORLD->CheckInclineWithTerrain(vPosNext, vDir, MAX_INCLINE_CLIMB)) { return true; } - m_fYNext = fYTerrain; // ġ ߰.. + m_fYNext = fYTerrain; // 다음 위치를 맞추고.. } - } else // ϴ.. + } else // 일단.. { if ((fYClimb > fYTerrain) && (fYClimb < vPosNext.y + 0.6f)) { m_fYNext = fYClimb; } else { - m_fYNext = fYTerrain; // ġ ߰.. + m_fYNext = fYTerrain; // 다음 위치를 맞추고.. } if ((m_fYNext > vPos.y + 0.6f) || (m_fYNext < vPos.y - 0.6f * 2.0f)) { @@ -901,25 +901,25 @@ bool CPlayerMySelf::CheckCollision() { } } - // else // ö󰥼 ̸ üũ.. + // else // 올라갈수 없는 곳이면 지형과의 기울기 체크.. // { - // // ؼ.. ⿡ ٸ ӵ + // // 방향을 구해서.. 기울기에 따라 다른 속도를 적용 // s_pTerrain->GetNormal(vPos.x, vPos.z, vNormal); // vNormal.Normalize(); // vNormal.y = 0.0f; // float fM = vNormal.Magnitude(); // float fD = vNormal.Dot(vDir); // if(fSpeed < 0) fD *= -1.0f; - // if(fD < 0) fSpeed *= 1.0f - (fM / 0.7071f); // ⿡ + // if(fD < 0) fSpeed *= 1.0f - (fM / 0.7071f); // 기울기에 따른 팩터 적용 // - // vPosNext = vPos + (vDir * fSpeed); // ġ .. + // vPosNext = vPos + (vDir * fSpeed); // 다음 위치 계산.. // m_fYNext = s_pTerrain->GetHeight(vPosNext.x, vPosNext.z); // } this->PositionSet(vPosNext, false); /////////////////////////////////////////////////////////////// - // ij 浹 üũ.. + // 캐릭터 충돌 체크.. // int iSize = s_pOPMgr->m_OPCs.size(); // it_UPC it = s_pOPMgr->m_OPCs.begin(); // for( int i = 0; i < iSize; i++, it++ ) @@ -933,7 +933,7 @@ bool CPlayerMySelf::CheckCollision() { void CPlayerMySelf::InitFace() { __TABLE_PLAYER_LOOKS * pLooks = s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); - if (pLooks && !pLooks->szPartFNs[PART_POS_FACE].empty()) // ְ ̸ .. + if (pLooks && !pLooks->szPartFNs[PART_POS_FACE].empty()) // 아이템이 있고 얼굴 이름이 있으면.. { char szBuff[256] = "", szDir[128] = "", szFName[128] = "", szExt[16] = ""; ::_splitpath(pLooks->szPartFNs[PART_POS_FACE].c_str(), NULL, szDir, szFName, szExt); @@ -944,7 +944,7 @@ void CPlayerMySelf::InitFace() { void CPlayerMySelf::InitHair() { __TABLE_PLAYER_LOOKS * pLooks = s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); - if (pLooks && !pLooks->szPartFNs[PART_POS_HAIR_HELMET].empty()) // ְ ̸ .. + if (pLooks && !pLooks->szPartFNs[PART_POS_HAIR_HELMET].empty()) // 아이템이 있고 얼굴 이름이 있으면.. { char szBuff[256] = "", szDir[128] = "", szFName[128] = "", szExt[16] = ""; ::_splitpath(pLooks->szPartFNs[PART_POS_HAIR_HELMET].c_str(), NULL, szDir, szFName, szExt); @@ -978,7 +978,7 @@ void CPlayerMySelf::KnightsInfoSet(int iID, const std::string & szName, int iGra m_pClanFont->RestoreDeviceObjects(); } - m_pClanFont->SetText(m_InfoExt.szKnights.c_str(), D3DFONT_BOLD); // Ʈ ؽƮ . + m_pClanFont->SetText(m_InfoExt.szKnights.c_str(), D3DFONT_BOLD); // 폰트에 텍스트 지정. m_pClanFont->SetFontColor(KNIGHTS_FONT_COLOR); } } @@ -998,13 +998,13 @@ void CPlayerMySelf::SetSoundAndInitFont() { m_pClanFont->RestoreDeviceObjects(); } - m_pClanFont->SetText(m_InfoExt.szKnights.c_str(), D3DFONT_BOLD); // Ʈ ؽƮ . + m_pClanFont->SetText(m_InfoExt.szKnights.c_str(), D3DFONT_BOLD); // 폰트에 텍스트 지정. m_pClanFont->SetFontColor(KNIGHTS_FONT_COLOR); } } float CPlayerMySelf:: - MoveSpeedCalculationAndCheckCollision() // ӵ ϰ ӵ 浹 üũ Ѵ. ϰ 0 ̸ 浹̴.. + MoveSpeedCalculationAndCheckCollision() // 속도를 구하고 그 속도로 충돌 체크를 한다. 리턴값이 0 이면 충돌이다.. { m_fMoveSpeedPerSec = MOVE_SPEED_WHEN_WALK; if (PSM_RUN == m_eStateMove) { @@ -1014,14 +1014,14 @@ float CPlayerMySelf:: } else if (PSM_WALK_BACKWARD == m_eStateMove) { m_fMoveSpeedPerSec *= -1.0f; } - m_fMoveSpeedPerSec *= m_fMoveDelta; // ̵ ӵ ϱ⿡ ... ش. + m_fMoveSpeedPerSec *= m_fMoveDelta; // 이동 속도 변하기에 따라서... 곱해준다. - if (m_bTempMoveTurbo) // ߿ ÷... + if (m_bTempMoveTurbo) // 개발용 플래그... { m_fMoveSpeedPerSec *= 10.0f; } - if (this->CheckCollision()) // 浹 üũ.. + if (this->CheckCollision()) // 충돌 체크면.. { if (CGameProcedure::s_pProcMain) { CGameProcedure::s_pProcMain->CommandMove(MD_STOP, true); @@ -1029,7 +1029,7 @@ float CPlayerMySelf:: // m_fMoveSpeedPerSec = 0; } - // ؼ.. ⿡ ٸ ӵ + // 방향을 구해서.. 기울기에 따라 다른 속도를 적용 /* __Vector3 vDir = this->Direction(); __Vector3 vPos = m_Chr.Pos(), vNormal(0,1,0); s_pTerrain->GetNormal(vPos.x, vPos.z, vNormal); @@ -1041,24 +1041,24 @@ float CPlayerMySelf:: // if (fM > MAX_INCLINE_CLIMB && fD <= 0.0f ) // { // } - if(fD < 0) fSpeed *= 1.0f - (fM / 0.7071f); // ⿡ + if(fD < 0) fSpeed *= 1.0f - (fM / 0.7071f); // 기울기에 따른 팩터 적용 */ return m_fMoveSpeedPerSec; } -void CPlayerMySelf::Stun(float fTime) // ð Ű. +void CPlayerMySelf::Stun(float fTime) // 일정한 시간동안 기절 시키기. { - m_bStun = true; // .. - m_fStunTime = fTime; // ð.. + m_bStun = true; // 기절.. + m_fStunTime = fTime; // 기절한 시간.. - CGameProcedure::s_pProcMain->CommandEnableAttackContinous(false, NULL); // ߰.. - CGameProcedure::s_pProcMain->CommandMove(MD_STOP, true); // ߰ ϰ.. + CGameProcedure::s_pProcMain->CommandEnableAttackContinous(false, NULL); // 공격 멈추고.. + CGameProcedure::s_pProcMain->CommandMove(MD_STOP, true); // 움직임을 멈추게 하고.. } -void CPlayerMySelf::StunRelease() // Ǯ.. +void CPlayerMySelf::StunRelease() // 기절 풀기.. { - m_bStun = false; // .. - m_fStunTime = 0.0f; // ð.. + m_bStun = false; // 기절.. + m_fStunTime = 0.0f; // 기절한 시간.. } void CPlayerMySelf::TargetOrPosMove() { @@ -1074,7 +1074,7 @@ void CPlayerMySelf::TargetOrPosMove() { m_vTargetPos = pTarget->Position(); } else { this->ActionMove(PSM_STOP); - CGameProcedure::s_pProcMain->MsgSend_Move(false, false); // Ŷ .. + CGameProcedure::s_pProcMain->MsgSend_Move(false, false); // 정지 패킷 보내기.. } } @@ -1083,24 +1083,24 @@ void CPlayerMySelf::TargetOrPosMove() { vDir.Normalize(); float fYaw = ::_Yaw2D(vDir.x, vDir.z); - this->RotateTo(fYaw, true); // + this->RotateTo(fYaw, true); // 방향을 돌리고 if (m_iMoveTarget >= 0) { CPlayerNPC * pTarget = s_pOPMgr->CharacterGetByID(m_iMoveTarget, true); - float fDist = (pTarget->Position() - m_Chr.Pos()).Magnitude(); // Ÿ ϰ.. + float fDist = (pTarget->Position() - m_Chr.Pos()).Magnitude(); // 공격 거리를 구하고.. float fDistLimit = this->AttackableDistance(pTarget); if (fDist < fDistLimit) { CGameProcedure::s_pProcMain->CommandEnableAttackContinous(true, pTarget); this->ActionMove(PSM_STOP); - CGameProcedure::s_pProcMain->MsgSend_Move(false, false); // Ŷ .. + CGameProcedure::s_pProcMain->MsgSend_Move(false, false); // 정지 패킷 보내기.. } } else { float fDist = (m_vTargetPos - Position()).Magnitude(); if (fDist < 0.5f) { this->ActionMove(PSM_STOP); - CGameProcedure::s_pProcMain->MsgSend_Move(false, false); // Ŷ .. + CGameProcedure::s_pProcMain->MsgSend_Move(false, false); // 정지 패킷 보내기.. } } } diff --git a/src/game/PlayerMySelf.h b/src/game/PlayerMySelf.h index e8b400a3..f0ce6810 100644 --- a/src/game/PlayerMySelf.h +++ b/src/game/PlayerMySelf.h @@ -10,54 +10,54 @@ ////////////////////////////////////////////////////////////////////// class CPlayerMySelf : public CPlayerBase { protected: - bool m_bRunning; // ٴ.. - float m_fAttackTimeRecent; // ֱٿ ð.. + bool m_bRunning; // 뛰는지.. + float m_fAttackTimeRecent; // 최근에 공격한 시간.. - __Vector3 m_vCollisionOffsets[3]; // 㸮 κ 2 浹 üũ + Ӹ κ 1 浹 üũ.. + __Vector3 m_vCollisionOffsets[3]; // 허리 부분 2개의 충돌 체크 + 머리 부분 1개의 충돌 체크.. public: __InfoPlayerMySelf m_InfoExt; - CN3Chr m_ChrInv; // ij ⺻ ü... - bool m_bMoveContinous; // ̴.. - bool m_bAttackContinous; // ϴ .. - bool m_bSitDown; // ɾִ .... - bool m_bRecruitParty; // Ƽ ?? + CN3Chr m_ChrInv; // 캐릭터 기본 객체... + bool m_bMoveContinous; // 계속 움직이는지.. + bool m_bAttackContinous; // 계속 공격하는 상태인지.. + bool m_bSitDown; // 앉아있는 상태인지.... + bool m_bRecruitParty; // 파티 모집중?? - bool m_bStun; // .. - float m_fStunTime; // ð.. + bool m_bStun; // 기절.. + float m_fStunTime; // 기절한 시간.. - int m_iSendRegeneration; // ѹ ٽ Ⱥ ÷ 0 ϶ ޽ ڽ .. - bool m_bTempMoveTurbo; // ӽ÷ ڵ.. ̰ Ѵ.. Tick . + int m_iSendRegeneration; // 한번 보내면 다시 죽을때까지 안보내는 플래그 0 일때는 메시지 박스를 띄운다.. + bool m_bTempMoveTurbo; // 개발을 위해 임시로 넣은 코드.. 무지 빠르게 움직이게 한다.. Tick 참조. - DWORD m_dwMagicID; // ִ .. - float m_fCastingTime; // ֹ Ŵ ð.. + DWORD m_dwMagicID; // 쓰고 있는 마법.. + float m_fCastingTime; // 마법 주문 거는 시간.. - class CN3Shape * m_pObjectTarget; // Ÿ Ʈ .. + class CN3Shape * m_pObjectTarget; // 타겟 오브젝트 포인터.. - bool m_bTargetOrPosMove; // Ÿ̳ ̵ - int m_iMoveTarget; // Ÿ ̵ - __Vector3 m_vTargetPos; // ̵ ġ + bool m_bTargetOrPosMove; // 타겟이나 지점 이동 여부 + int m_iMoveTarget; // 타겟 아이디 + __Vector3 m_vTargetPos; // 이동할 지점 위치 void SetMoveTargetID(int iID); void SetMoveTargetPos(__Vector3 vPos); public: void TargetOrPosMove(); - void Stun(float fTime); // ð Ű. - void StunRelease(); // Ǯ.. + void Stun(float fTime); // 일정한 시간동안 기절 시키기. + void StunRelease(); // 기절 풀기.. float - MoveSpeedCalculationAndCheckCollision(); // ӵ ϰ ӵ 浹 üũ Ѵ. ϰ 0 ̸ 浹̴.. + MoveSpeedCalculationAndCheckCollision(); // 속도를 구하고 그 속도로 충돌 체크를 한다. 리턴값이 0 이면 충돌이다.. - void InitFace(); // ִ ʱȭ Ѵ.. - void InitHair(); // ִ Ӹī ʱȭ Ѵ.. + void InitFace(); // 갖고 있는 정보로 얼굴을 초기화 한다.. + void InitHair(); // 갖고 있는 정보로 머리카락을 초기화 한다.. void KnightsInfoSet(int iID, const std::string & szName, int iGrade, int iRank); void SetSoundAndInitFont(); float AttackableDistance(CPlayerBase * pTarget); float DistanceExceptRadius(CPlayerBase * pTarget); - bool IsAttackableTarget(CPlayerBase * pTarget, bool bMesureAngle = true); // ִ.. + bool IsAttackableTarget(CPlayerBase * pTarget, bool bMesureAngle = true); // 공격 가능한 범위에 있는지.. bool IsRunning() { return m_bRunning; } - bool CheckCollision(); // ̴ ó 浹üũ Ѵ. 浹Ǵ° ʴ´. + bool CheckCollision(); // 움직이는 처리와 충돌체크를 한다. 충돌되는게 있으면 움직이지 않는다. //.. bool InitChr(__TABLE_PLAYER_LOOKS * pTblUPC); CN3CPart * PartSet(e_PartPosition ePos, const std::string & szFN, __TABLE_ITEM_BASIC * pItemBasic, @@ -69,7 +69,7 @@ class CPlayerMySelf : public CPlayerBase { void Render(float fSunAngle); __Vector3 NextPos(float fTimeAfter); - void RotAdd(const float fRotRadianPerSec); // y ʴ ȸϴ ӵ ־ش. + void RotAdd(const float fRotRadianPerSec); // y 축을 기준으로 초당 회전하는 속도를 넣어준다. bool ToggleAttackContinous(); bool ToggleRunMode(); diff --git a/src/game/PlayerNPC.cpp b/src/game/PlayerNPC.cpp index 0c489c03..e1df6880 100644 --- a/src/game/PlayerNPC.cpp +++ b/src/game/PlayerNPC.cpp @@ -16,29 +16,29 @@ CPlayerNPC::CPlayerNPC() { m_ePlayerType = PLAYER_NPC; // Player Type ... Base, NPC, OTher, MySelf - m_vPosFromServer = m_Chr.Pos(); // ġ. + m_vPosFromServer = m_Chr.Pos(); // 서버에게 받은 위치. } CPlayerNPC::~CPlayerNPC() {} void CPlayerNPC::Tick() { - if (m_pShapeExtraRef) // Ʈ̸.. + if (m_pShapeExtraRef) // 오브젝트이면.. { CPlayerBase::Tick(); return; } - if (m_fTimeAfterDeath > 0) // ׾ϰų ̸... + if (m_fTimeAfterDeath > 0) // 죽어야하거나 죽은 넘이면... { if (m_fTimeAfterDeath > 3.0f) { - this->Action(PSA_DYING, false); // 5 ʰ ״´. + this->Action(PSA_DYING, false); // 5 초가 지나야 죽는다. } - CPlayerBase::Tick(); // ȸ, ϸ̼ Tick ó.. .. + CPlayerBase::Tick(); // 회전, 지정된 에니메이션 Tick 및 색깔 지정 처리.. 등등.. return; } __Vector3 vPos = m_Chr.Pos(); - if (m_vPosFromServer.x != vPos.x || m_vPosFromServer.z != vPos.z) // Ѵ. + if (m_vPosFromServer.x != vPos.x || m_vPosFromServer.z != vPos.z) // 조금 더 가야한다. { if (m_fMoveSpeedPerSec == 0) { __Vector3 vT1(m_vPosFromServer.x, 0, m_vPosFromServer.z), vT2(vPos.x, 0, vPos.z); @@ -48,66 +48,66 @@ void CPlayerNPC::Tick() { __Vector3 vOffset = m_vPosFromServer - vPos; vOffset.y = 0; __Vector3 vDir = vOffset; - vDir.Normalize(); // .. + vDir.Normalize(); // 방향.. - float fSpeedAbsolute = (m_fMoveSpeedPerSec > 0) ? m_fMoveSpeedPerSec : -m_fMoveSpeedPerSec; // ӵ 밪 - float fDist = vOffset.Magnitude(); // Ÿ - if (fDist < fSpeedAbsolute * CN3Base::s_fSecPerFrm) // ̴ Ÿ ٿ°Ÿ.. + float fSpeedAbsolute = (m_fMoveSpeedPerSec > 0) ? m_fMoveSpeedPerSec : -m_fMoveSpeedPerSec; // 속도 절대값 + float fDist = vOffset.Magnitude(); // 거리 + if (fDist < fSpeedAbsolute * CN3Base::s_fSecPerFrm) // 움직이는 거리가 거의 다온거면.. { - vPos.x = m_vPosFromServer.x; // ġ ְ.. - vPos.z = m_vPosFromServer.z; // ġ ְ.. - // m_fMoveSpeedPerSec = 0; // ̴ ӵ 0! - this->ActionMove(PSM_STOP); // ̴ ó.. + vPos.x = m_vPosFromServer.x; // 위치를 고정해주고.. + vPos.z = m_vPosFromServer.z; // 위치를 고정해주고.. + // m_fMoveSpeedPerSec = 0; // 움직이는 속도를 0으로! + this->ActionMove(PSM_STOP); // 움직이는 모션 처리.. } else { float fYaw = - (m_fMoveSpeedPerSec < 0) ? ::_Yaw2D(-vDir.x, -vDir.z) : ::_Yaw2D(vDir.x, vDir.z); // ؼ.. - this->RotateTo(fYaw, false); // .. + (m_fMoveSpeedPerSec < 0) ? ::_Yaw2D(-vDir.x, -vDir.z) : ::_Yaw2D(vDir.x, vDir.z); // 방향을 계산해서.. + this->RotateTo(fYaw, false); // 진행 방향으로 돌리고.. - e_StateMove eMove = PSM_STOP; // ... - // ÷̾ ȴ ӵ ġ ݺ.. + e_StateMove eMove = PSM_STOP; // 움직임... + // 플레이어면 걷는 속도가 기준 나머지는 덩치에 반비례.. float fStandWalk = ((PLAYER_OTHER == m_ePlayerType) ? (MOVE_SPEED_WHEN_WALK * 2.0f) : (MOVE_SPEED_WHEN_WALK * m_Chr.Radius() * 2.0f)); if (m_fMoveSpeedPerSec < 0) { - eMove = PSM_WALK_BACKWARD; // ڷ ȱ.. + eMove = PSM_WALK_BACKWARD; // 뒤로 걷기.. } else if (m_fMoveSpeedPerSec < fStandWalk) { - eMove = PSM_WALK; // ȱ.. + eMove = PSM_WALK; // 앞으로 걷기.. } else { - eMove = PSM_RUN; // if(fDN > 5.0f) // ġ Ÿ ̸̻ پ. + eMove = PSM_RUN; // if(fDN > 5.0f) // 다음 위치의 거리가 일정 이상이면 뛰어간다. } - this->ActionMove(eMove); // ̴ ó.. + this->ActionMove(eMove); // 움직이는 모션 처리.. - vPos += vDir * (fSpeedAbsolute * s_fSecPerFrm); // ̵.. + vPos += vDir * (fSpeedAbsolute * s_fSecPerFrm); // 이동.. } - float fYTerrain = ACT_WORLD->GetHeightWithTerrain(vPos.x, vPos.z); // ̰.. - float fYMesh = ACT_WORLD->GetHeightNearstPosWithShape(vPos, 1.0f); // 浹 üũ Ʈ ̰.. + float fYTerrain = ACT_WORLD->GetHeightWithTerrain(vPos.x, vPos.z); // 지면의 높이값.. + float fYMesh = ACT_WORLD->GetHeightNearstPosWithShape(vPos, 1.0f); // 충돌 체크 오브젝트의 높이값.. if (fYMesh != -FLT_MAX && fYMesh > fYTerrain && fYMesh < m_fYNext + 1.0f) { - m_fYNext = fYMesh; // ö󰥼 ִ Ʈ̰ ̰ 麸 . + m_fYNext = fYMesh; // 올라갈수 있는 오브젝트이고 높이값이 지면보다 높으면. } else { m_fYNext = fYTerrain; } - this->PositionSet(vPos, false); // ġ .. + this->PositionSet(vPos, false); // 위치 최종 적용.. } - if (PSA_ATTACK == m_eState || m_iSkillStep != 0) // ̰ų ų ̸.. + if (PSA_ATTACK == m_eState || m_iSkillStep != 0) // 공격 중이거나 스킬 사용중이면.. { CPlayerBase * pTarget = this->TargetPointerCheck(false); CPlayerBase::ProcessAttack( - pTarget); // ݿ ƾ ó.. ϸ̼ ð 浹 óһ Ŷ ó Ѵ.. + pTarget); // 공격에 관한 루틴 처리.. 에니메이션 세팅과 충돌만 처리할뿐 패킷은 처리 안한다.. } - CPlayerBase::Tick(); // ȸ. ̵, ϸ̼ ƽ.. ٲ óѴ. + CPlayerBase::Tick(); // 회전. 이동, 에니메이션 틱.. 상태 바뀜 등을 처리한다. } void CPlayerNPC::MoveTo(float fPosX, float fPosY, float fPosZ, float fSpeed, int iMoveMode) { m_vPosFromServer.Set(fPosX, fPosY, fPosZ); if (m_pShapeExtraRef) { - return; // Ʈ ̸ ϼ .. + return; // 오브젝트 형식이면 움직일수가 없다.. } - // iMoveMode : ̴ .. 0 - 1 ӽ 2 - 1ʸ ѹ ӿ.. + // iMoveMode : 현재 움직이는 상태.. 0 -정지 1 움직임시작 2 - 1초마다 한번 연속움직임.. if (0 == iMoveMode) { - } else if (iMoveMode) // .. // + } else if (iMoveMode) // 움직임 시작.. // 계속 움직임 { m_fMoveSpeedPerSec = fSpeed; __Vector3 vPos = m_Chr.Pos(); @@ -117,14 +117,14 @@ void CPlayerNPC::MoveTo(float fPosX, float fPosY, float fPosZ, float fSpeed, int if (fSpeed) { m_fMoveSpeedPerSec *= ((vPosS - vPos).Magnitude() / (fSpeed * PACKET_INTERVAL_MOVE)) * - 0.85f; // ӵ.. ȭ ׷.. ణ ٿִ ĩϴ° ϱ ؼ̴.. + 0.85f; // 속도보간.. 동기화때문에 그런다.. 약간 줄여주는 이유는 멈칫하는걸 방지하기 위해서이다.. } else { m_fMoveSpeedPerSec = ((vPosS - vPos).Magnitude() / (fSpeed * PACKET_INTERVAL_MOVE)) * - 0.85f; // ӵ.. ȭ ׷.. ణ ٿִ ĩϴ° ϱ ؼ̴.. + 0.85f; // 속도보간.. 동기화때문에 그런다.. 약간 줄여주는 이유는 멈칫하는걸 방지하기 위해서이다.. } if (fSpeed < 0) { - m_fMoveSpeedPerSec *= -1.0f; // ڷ .. + m_fMoveSpeedPerSec *= -1.0f; // 뒤로 간다.. } } else { // __ASSERT(0, "Invalid Move Mode"); diff --git a/src/game/PlayerNPC.h b/src/game/PlayerNPC.h index 16059dfd..6fdf2226 100644 --- a/src/game/PlayerNPC.h +++ b/src/game/PlayerNPC.h @@ -15,7 +15,7 @@ class CPlayerNPC : public CPlayerBase { friend class CPlayerOtherMgr; public: - void MoveTo(float fPosX, float fPosY, float fPosZ, float fMoveSpeed, int iMoveMode); // ġ ̵.. + void MoveTo(float fPosX, float fPosY, float fPosZ, float fMoveSpeed, int iMoveMode); // 이 위치로 이동.. virtual void Tick(); CPlayerNPC(); diff --git a/src/game/PlayerOther.cpp b/src/game/PlayerOther.cpp index f6f84df7..6143f768 100644 --- a/src/game/PlayerOther.cpp +++ b/src/game/PlayerOther.cpp @@ -25,7 +25,7 @@ CPlayerOther::~CPlayerOther() {} void CPlayerOther::Tick() { if (m_bSit) { - CPlayerBase::Tick(); // ȸ, ϸ̼ Tick ó.. .. + CPlayerBase::Tick(); // 회전, 지정된 에니메이션 Tick 및 색깔 지정 처리.. 등등.. } else { CPlayerNPC::Tick(); } @@ -40,13 +40,13 @@ bool CPlayerOther::Init(e_Race eRace, int iFace, int iHair, DWORD * pdwItemIDs, m_InfoExt.iFace = iFace; m_InfoExt.iHair = iHair; - // Ŷ ij͸ ġ..(?) ش.. , ... - __TABLE_PLAYER_LOOKS * pLooks = s_pTbl_UPC_Looks->Find(eRace); // ̺ ⺻ Ų .. + // 이제 패킷에 따라 캐릭터를 치장..(?) 시켜준다.. 아이템장착, 무기 장착등... + __TABLE_PLAYER_LOOKS * pLooks = s_pTbl_UPC_Looks->Find(eRace); // 테이블에서 기본 스킨 .. if (NULL == pLooks) { CLogWriter::Write("CPlayerOther::Init() Basic Resource Pointer is NULL Race(%d)", eRace); return false; } - this->InitChr(pLooks); // .. + this->InitChr(pLooks); // 관절 세팅.. for (int i = 0; i < MAX_ITEM_SLOT_OPC; i++) { std::string szFN; @@ -72,11 +72,11 @@ bool CPlayerOther::Init(e_Race eRace, int iFace, int iHair, DWORD * pdwItemIDs, ePart = PART_POS_FEET; szFN = pLooks->szPartFNs[4]; } else if (5 == i) { - } // + } // 망토 // else if(6 == i) { ePlug = PLUG_POS_RIGHTHAND; } // else if(7 == i) { ePlug = PLUG_POS_LEFTHAND; } } else { - pItem = s_pTbl_Items_Basic->Find(pdwItemIDs[i] / 1000 * 1000); // ÷̾ .. + pItem = s_pTbl_Items_Basic->Find(pdwItemIDs[i] / 1000 * 1000); // 유저 플레이어 아이템 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { pItemExt = s_pTbl_Items_Exts[pItem->byExtIndex]->Find(pdwItemIDs[i] % 1000); } @@ -86,7 +86,7 @@ bool CPlayerOther::Init(e_Race eRace, int iFace, int iHair, DWORD * pdwItemIDs, } e_ItemType eType = CGameProcedure::MakeResrcFileNameForUPC(pItem, &szFN, NULL, ePart, - ePlug); // ҽ ̸ .. + ePlug); // 리소스 파일 이름을 만들고.. if (0 == i) { ePart = PART_POS_UPPER; @@ -104,7 +104,7 @@ bool CPlayerOther::Init(e_Race eRace, int iFace, int iHair, DWORD * pdwItemIDs, ePart = PART_POS_FEET; eSlot = ITEM_SLOT_SHOES; } else if (5 == i) { - } // + } // 망토 else if (6 == i) { ePlug = PLUG_POS_RIGHTHAND; eSlot = ITEM_SLOT_HAND_RIGHT; @@ -116,7 +116,7 @@ bool CPlayerOther::Init(e_Race eRace, int iFace, int iHair, DWORD * pdwItemIDs, if (PART_POS_UPPER == ePart || PART_POS_LOWER == ePart || PART_POS_HANDS == ePart || PART_POS_FEET == ePart) { this->PartSet(ePart, szFN, pItem, pItemExt); - } else if (PART_POS_HAIR_HELMET == ePart) // Ӹī Ȥ ̸.. + } else if (PART_POS_HAIR_HELMET == ePart) // 머리카락 혹은 헬멧이면.. { this->PartSet(ePart, szFN, pItem, pItemExt); } else if (5 == i) { @@ -129,10 +129,10 @@ bool CPlayerOther::Init(e_Race eRace, int iFace, int iHair, DWORD * pdwItemIDs, } } - // .. + // 얼굴은 따로하자.. this->InitFace(); CN3CPart * pPartHairHelmet = this->Part(PART_POS_HAIR_HELMET); - if (pPartHairHelmet->FileName().empty()) { // 信 شǴ° .. Ӹī ̱.. + if (pPartHairHelmet->FileName().empty()) { // 헬멧에 해당되는게 없으면.. 머리카락 붙이기.. this->InitHair(); } @@ -141,7 +141,7 @@ bool CPlayerOther::Init(e_Race eRace, int iFace, int iHair, DWORD * pdwItemIDs, void CPlayerOther::InitFace() { __TABLE_PLAYER_LOOKS * pItem = s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); - if (pItem && !pItem->szPartFNs[PART_POS_FACE].empty()) // ְ ̸ .. + if (pItem && !pItem->szPartFNs[PART_POS_FACE].empty()) // 아이템이 있고 얼굴 이름이 있으면.. { char szBuff[256] = "", szDir[128] = "", szFName[128] = "", szExt[16] = ""; ::_splitpath(pItem->szPartFNs[PART_POS_FACE].c_str(), NULL, szDir, szFName, szExt); @@ -152,7 +152,7 @@ void CPlayerOther::InitFace() { void CPlayerOther::InitHair() { __TABLE_PLAYER_LOOKS * pItem = s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); - if (pItem && !pItem->szPartFNs[PART_POS_HAIR_HELMET].empty()) // ְ ̸ .. + if (pItem && !pItem->szPartFNs[PART_POS_HAIR_HELMET].empty()) // 아이템이 있고 얼굴 이름이 있으면.. { char szBuff[256] = "", szDir[128] = "", szFName[128] = "", szExt[16] = ""; ::_splitpath(pItem->szPartFNs[PART_POS_HAIR_HELMET].c_str(), NULL, szDir, szFName, szExt); @@ -188,7 +188,7 @@ void CPlayerOther::KnightsInfoSet(int iID, const std::string & szName, int iGrad m_pClanFont->RestoreDeviceObjects(); } - m_pClanFont->SetText(m_InfoExt.szKnights.c_str(), D3DFONT_BOLD); // Ʈ ؽƮ . + m_pClanFont->SetText(m_InfoExt.szKnights.c_str(), D3DFONT_BOLD); // 폰트에 텍스트 지정. m_pClanFont->SetFontColor(KNIGHTS_FONT_COLOR); } } @@ -203,12 +203,12 @@ void CPlayerOther::SetSoundAndInitFont() { if (!m_pClanFont) { std::string szFontID; ::_LoadStringFromResource(IDS_FONT_ID, szFontID); - m_pClanFont = new CDFont(szFontID, 12); // ۰ .. + m_pClanFont = new CDFont(szFontID, 12); // 좀 작게 만든다.. m_pClanFont->InitDeviceObjects(s_lpD3DDev); m_pClanFont->RestoreDeviceObjects(); } - m_pClanFont->SetText(m_InfoExt.szKnights.c_str(), D3DFONT_BOLD); // Ʈ ؽƮ . + m_pClanFont->SetText(m_InfoExt.szKnights.c_str(), D3DFONT_BOLD); // 폰트에 텍스트 지정. m_pClanFont->SetFontColor(KNIGHTS_FONT_COLOR); } } diff --git a/src/game/PlayerOther.h b/src/game/PlayerOther.h index 4fd7449a..5d696324 100644 --- a/src/game/PlayerOther.h +++ b/src/game/PlayerOther.h @@ -11,7 +11,7 @@ class CPlayerOther : public CPlayerNPC { friend class CPlayerOtherMgr; public: - __InfoPlayerOther m_InfoExt; // ij Ȯ.. + __InfoPlayerOther m_InfoExt; // 캐릭터 정보 확장.. bool m_bSit; public: diff --git a/src/game/PlayerOtherMgr.cpp b/src/game/PlayerOtherMgr.cpp index 5f98519b..a4e2da32 100644 --- a/src/game/PlayerOtherMgr.cpp +++ b/src/game/PlayerOtherMgr.cpp @@ -11,7 +11,7 @@ ////////////////////////////////////////////////////////////////////// CPlayerOtherMgr::CPlayerOtherMgr() { - m_iChrCountToRender = 0; // Ǵ ij īƮ + m_iChrCountToRender = 0; // 렌더링되는 캐릭 카운트 } CPlayerOtherMgr::~CPlayerOtherMgr() { @@ -56,7 +56,7 @@ void CPlayerOtherMgr::Release() { // ////////////////////////////////////////////////////////////////////// void CPlayerOtherMgr::Tick(const __Vector3 & vPosPlayer) { - // ڵ ij LOD .. + // 자동 캐릭터 LOD 조절.. int iLOD = 0; int iLODTotal = 0; @@ -68,12 +68,12 @@ void CPlayerOtherMgr::Tick(const __Vector3 & vPosPlayer) { pNPC->Tick(); iLOD = pNPC->LODLevel(); if (iLOD >= 0 && iLOD < MAX_CHR_LOD) { - iLODTotal += MAX_CHR_LOD - iLOD; // ڵ LOD Ҷ ʿ .. + iLODTotal += MAX_CHR_LOD - iLOD; // 자동 LOD 계산할때 필요한 값.. } float fDist = pNPC->Distance(vPosPlayer); if (fDist < SOUND_RANGE_TO_SET) { - pNPC->SetSoundAndInitFont(); // SOUND_RANGE ȿ . + pNPC->SetSoundAndInitFont(); // SOUND_RANGE 안에 있으면. } else if (fDist > SOUND_RANGE_TO_RELEASE) { pNPC->ReleaseSoundAndFont(); } @@ -87,7 +87,7 @@ void CPlayerOtherMgr::Tick(const __Vector3 & vPosPlayer) { pNPC->Tick(); iLOD = pNPC->LODLevel(); if (iLOD >= 0 && iLOD < MAX_CHR_LOD) { - iLODTotal += MAX_CHR_LOD - iLOD; // ڵ LOD Ҷ ʿ .. + iLODTotal += MAX_CHR_LOD - iLOD; // 자동 LOD 계산할때 필요한 값.. } if (PSA_DEATH == pNPC->State()) { @@ -96,7 +96,7 @@ void CPlayerOtherMgr::Tick(const __Vector3 & vPosPlayer) { } else { float fDist = pNPC->Distance(vPosPlayer); if (fDist < SOUND_RANGE_TO_SET) { - pNPC->SetSoundAndInitFont(); // SOUND_RANGE ȿ . + pNPC->SetSoundAndInitFont(); // SOUND_RANGE 안에 있으면. } else if (fDist > SOUND_RANGE_TO_RELEASE) { pNPC->ReleaseSoundAndFont(); } @@ -104,7 +104,7 @@ void CPlayerOtherMgr::Tick(const __Vector3 & vPosPlayer) { } } - // ó.. + // 죽은놈 처리.. CPlayerBase * pCorpse = NULL; it_NPC it3 = m_Corpses.begin(), itEnd3 = m_Corpses.end(); for (; it3 != itEnd3;) { @@ -114,19 +114,19 @@ void CPlayerOtherMgr::Tick(const __Vector3 & vPosPlayer) { pCorpse->Tick(); iLOD = pCorpse->LODLevel(); if (iLOD >= 0 && iLOD < MAX_CHR_LOD) { - iLODTotal += MAX_CHR_LOD - iLOD; // ڵ LOD Ҷ ʿ .. + iLODTotal += MAX_CHR_LOD - iLOD; // 자동 LOD 계산할때 필요한 값.. } - if (pCorpse->m_fTimeAfterDeath >= TIME_CORPSE_REMAIN) // ð .. + if (pCorpse->m_fTimeAfterDeath >= TIME_CORPSE_REMAIN) // 죽은지 일정한 시간이 지나면.. { T_Delete(pCorpse); - it3 = m_Corpses.erase(it3); // .. + it3 = m_Corpses.erase(it3); // 죽은놈 지우고.. } else { it3++; } } - // ڵ ij LOD .. + // 자동 캐릭터 LOD 조절.. int iLODDelta = 0; if (iLODTotal >= 100) { iLODDelta = 3; @@ -151,7 +151,7 @@ void CPlayerOtherMgr::Render(float fSunAngle) { // pUPC->Render(true, fSunAngle); // } - // ī޶ Ÿ + // 카메라 거리순으로 정렬 int iUPCSize = m_UPCs.size(); if (iUPCSize > 0) { std::vector UPCs; @@ -179,7 +179,7 @@ void CPlayerOtherMgr::Render(float fSunAngle) { // // pNPC->Render(true, fSunAngle); // } - // ī޶ Ÿ + // 카메라 거리순으로 정렬 int iNPCSize = m_NPCs.size(); if (iNPCSize > 0) { std::vector NPCs; @@ -195,7 +195,7 @@ void CPlayerOtherMgr::Render(float fSunAngle) { } } - // .. + // 죽은놈도 렌더링.. // CPlayerBase* pCorpse = NULL; // it_NPC it3 = m_Corpses.begin(), itEnd3 = m_Corpses.end(); // for(; it3 != itEnd3; it3++) @@ -203,7 +203,7 @@ void CPlayerOtherMgr::Render(float fSunAngle) { // pCorpse = it3->second; // pCorpse->Render(false, fSunAngle); // } - // ī޶ Ÿ + // 카메라 거리순으로 정렬 int iCorpseSize = m_Corpses.size(); if (iCorpseSize > 0) { std::vector Corpses; @@ -259,7 +259,7 @@ CPlayerOther * CPlayerOtherMgr::PickUPC(int ixScreen, int iyScreen, int & iIDRes vPos, vDir); if (!m_UPCs.empty()) { - // ī޶ Ÿ + // 카메라 거리순으로 정렬 std::vector UPCs; UPCs.reserve(m_UPCs.size()); it_UPC it = m_UPCs.begin(), itEnd = m_UPCs.end(); @@ -272,7 +272,7 @@ CPlayerOther * CPlayerOtherMgr::PickUPC(int ixScreen, int iyScreen, int & iIDRes for (int i = 0; i < UPCs.size(); i++) { pUPC = UPCs[i]; if (pUPC->LODLevel() < 0 || pUPC->LODLevel() >= MAX_CHR_LOD) { - continue; // Level Of Detail ° . + continue; // Level Of Detail 이 없는건 지나간다. } CN3VMesh * pvMesh = pUPC->m_Chr.CollisionMesh(); @@ -294,7 +294,7 @@ CPlayerNPC * CPlayerOtherMgr::PickNPC(int ixScreen, int iyScreen, int & iIDResul vPos, vDir); if (!m_NPCs.empty()) { - // ī޶ Ÿ + // 카메라 거리순으로 정렬 std::vector NPCs; it_NPC it = m_NPCs.begin(), itEnd = m_NPCs.end(); NPCs.reserve(m_NPCs.size()); @@ -303,11 +303,11 @@ CPlayerNPC * CPlayerOtherMgr::PickNPC(int ixScreen, int iyScreen, int & iIDResul } qsort(&(NPCs[0]), NPCs.size(), 4, SortByCameraDistance); - CPlayerNPC * pNPC = NULL; // NPC ... + CPlayerNPC * pNPC = NULL; // NPC 를 먼저 찍어본다... for (int i = 0; i < NPCs.size(); i++) { pNPC = NPCs[i]; if (pNPC->LODLevel() < 0 || pNPC->LODLevel() >= MAX_CHR_LOD) { - continue; // Level Of Detail ° . + continue; // Level Of Detail 이 없는건 지나간다. } CN3VMesh * pvMesh = NULL; @@ -346,7 +346,7 @@ CPlayerNPC * CPlayerOtherMgr::PickCorpse(int ixScreen, int iyScreen, int & iIDRe ::_Convert2D_To_3DCoordinate(ixScreen, iyScreen, s_CameraData.mtxView, s_CameraData.mtxProjection, s_CameraData.vp, vPos, vDir); - // ī޶ Ÿ + // 카메라 거리순으로 정렬 std::vector Corpses; Corpses.reserve(m_Corpses.size()); it_NPC it = m_Corpses.begin(), itEnd = m_Corpses.end(); @@ -359,7 +359,7 @@ CPlayerNPC * CPlayerOtherMgr::PickCorpse(int ixScreen, int iyScreen, int & iIDRe for (int i = 0; i < Corpses.size(); i++) { pCorpse = Corpses[i]; if (pCorpse->LODLevel() < 0 || pCorpse->LODLevel() >= MAX_CHR_LOD) { - continue; // Level Of Detail ° . + continue; // Level Of Detail 이 없는건 지나간다. } CN3VMesh * pvMesh = pCorpse->m_Chr.CollisionMesh(); @@ -412,10 +412,10 @@ void CPlayerOtherMgr::CorpseRemove(CPlayerNPC * pCorpse, bool bRemoveImmediately } if (bRemoveImmediately) { - pCorpse->m_fTimeAfterDeath = TIME_CORPSE_REMAIN; // ð ÷ ٷ ش.. + pCorpse->m_fTimeAfterDeath = TIME_CORPSE_REMAIN; // 죽은 시간을 늘려서 바로 없애준다.. } else { pCorpse->m_fTimeAfterDeath = - TIME_CORPSE_REMAIN - TIME_CORPSE_REMOVE; // ð̴.. Tick Ѵ.. + TIME_CORPSE_REMAIN - TIME_CORPSE_REMOVE; // 자 이제 없어질 시간이다.. 나머지는 Tick 에서 한다.. } } @@ -424,15 +424,15 @@ void CPlayerOtherMgr::CorpseAdd(CPlayerNPC * pNPC) { return; } std::pair result = m_Corpses.insert(val_NPC(pNPC->IDNumber(), pNPC)); - if (false == result.second) // ߺǾ.. + if (false == result.second) // 중복되었으면.. { - T_Delete(result.first->second); // ǰ ְ.. - result.first->second = pNPC; // ִ´... + T_Delete(result.first->second); // 전의걸 지워주고.. + result.first->second = pNPC; // 새로 포인터 넣는다... } } CPlayerNPC * CPlayerOtherMgr::CorpseGetNearstNPC(bool bMustHaveItem, e_Nation eNation, - const __Vector3 & vPosPlayer) // ü .. + const __Vector3 & vPosPlayer) // 가장 가까운 적 시체 가져오기.. { CPlayerNPC * pTarget = NULL; float fDistMin = FLT_MAX, fDistTmp = 0; @@ -463,37 +463,37 @@ void CPlayerOtherMgr::MoveToCorpsesForcely(CPlayerNPC * pNPC, bool bErase) { } int iID = pNPC->IDNumber(); - pNPC->Action(PSA_DEATH, false, NULL, true); // δ.. + pNPC->Action(PSA_DEATH, false, NULL, true); // 강제로 죽인다.. if (bErase) { - pNPC->m_fTimeAfterDeath = TIME_CORPSE_REMAIN - 10.0f; // ð ... + pNPC->m_fTimeAfterDeath = TIME_CORPSE_REMAIN - 10.0f; // 죽은 시간을 세팅... } else { pNPC->m_fTimeAfterDeath = 0.1f; } - it_UPC it = m_UPCs.find(iID); // User ãƺ... + it_UPC it = m_UPCs.find(iID); // User를 찾아보고... if (it != m_UPCs.end()) { - if (bErase) //϶ ü - { //ߺ ؼ ij͸ ü . + if (bErase) //삭제일때는 시체로 만든다 + { //중복으로 인해서 캐릭터를 시체로 만든다. CPlayerOther * pUPC = it->second; - this->CorpseAdd(pUPC); // ü .. - m_UPCs.erase(it); // ʿ . + this->CorpseAdd(pUPC); // 시체로 만들고.. + m_UPCs.erase(it); // 맵에서 지운다. } // CPlayerOther* pUPC = it->second; - // this->CorpseAdd(pUPC); // ü .. - // m_UPCs.erase(it); // ʿ . + // this->CorpseAdd(pUPC); // 시체로 만들고.. + // m_UPCs.erase(it); // 맵에서 지운다. } else { it_NPC it2 = m_NPCs.find(iID); if (it2 != m_NPCs.end()) { CPlayerNPC * pNPC = it2->second; - this->CorpseAdd(pNPC); // ü .. - m_NPCs.erase(it2); // ʿ . + this->CorpseAdd(pNPC); // 시체로 만들고.. + m_NPCs.erase(it2); // 맵에서 지운다. } } } CPlayerNPC * CPlayerOtherMgr::CharacterGetByNearstEnemy(e_Nation eNation, - const __Vector3 & vPosPlayer) // .. + const __Vector3 & vPosPlayer) // 가장 가까운 적 가져오기.. { CPlayerNPC * pTarget = NULL; float fDistMin = FLT_MAX, fDistTmp = 0; @@ -530,13 +530,13 @@ CPlayerNPC * CPlayerOtherMgr::CharacterGetByNearstEnemy(e_Nation eNatio return pTarget; } -bool CPlayerOtherMgr::CharacterDelete(int iID) // User, NPC .. +bool CPlayerOtherMgr::CharacterDelete(int iID) // User, NPC 안 가리고 지운다.. { - it_UPC it = m_UPCs.find(iID); // User ãƺ... + it_UPC it = m_UPCs.find(iID); // User를 찾아보고... if (it != m_UPCs.end()) { CPlayerOther * pUPC = it->second; delete pUPC; - m_UPCs.erase(it); // ʿ . + m_UPCs.erase(it); // 맵에서 지운다. return true; } @@ -544,7 +544,7 @@ CPlayerNPC * CPlayerOtherMgr::CharacterGetByNearstEnemy(e_Nation eNatio if (it2 != m_NPCs.end()) { CPlayerNPC * pNPC = it2->second; delete pNPC; - m_NPCs.erase(it2); // ʿ . + m_NPCs.erase(it2); // 맵에서 지운다. return true; } @@ -559,7 +559,7 @@ int CPlayerOtherMgr::SortByCameraDistance(const void * pArg1, const void * pArg2 float fDist2 = (CN3Base::s_CameraData.vEye - pPlayer2->Position()).Magnitude(); if (fDist1 < fDist2) { - return -1; // true; + return -1; // 가까우면 true; } else if (fDist1 > fDist2) { return 1; } else { @@ -568,15 +568,15 @@ int CPlayerOtherMgr::SortByCameraDistance(const void * pArg1, const void * pArg2 } void CPlayerOtherMgr::CorpseAdd(int iID) { - it_UPC it = m_UPCs.find(iID); // User ãƺ... + it_UPC it = m_UPCs.find(iID); // User를 찾아보고... if (it != m_UPCs.end()) { CPlayerOther * pUPC = it->second; - pUPC->Action(PSA_DEATH, false, NULL, true); // δ.. - pUPC->m_fTimeAfterDeath = TIME_CORPSE_REMAIN - 10.0f; // ð ... + pUPC->Action(PSA_DEATH, false, NULL, true); // 강제로 죽인다.. + pUPC->m_fTimeAfterDeath = TIME_CORPSE_REMAIN - 10.0f; // 죽은 시간을 세팅... - this->CorpseAdd(pUPC); // ü .. - m_UPCs.erase(it); // ʿ . + this->CorpseAdd(pUPC); // 시체로 만들고.. + m_UPCs.erase(it); // 맵에서 지운다. } } @@ -587,9 +587,9 @@ CPlayerNPC * CPlayerOtherMgr::PickAllPrecisely(int ixScreen, int iyScreen, int & ::_Convert2D_To_3DCoordinate(ixScreen, iyScreen, s_CameraData.mtxView, s_CameraData.mtxProjection, s_CameraData.vp, vPos, vDir); - CPlayerNPC * pNPC = NULL; // NPC ٴ ij + CPlayerNPC * pNPC = NULL; // NPC라기 보다는 캐릭터 포인터 - // ī޶ Ÿ + // 카메라 거리순으로 정렬 std::vector NPCs; std::vector NUPCBufs; if (!m_NPCs.empty() || !m_UPCs.empty()) { @@ -614,7 +614,7 @@ CPlayerNPC * CPlayerOtherMgr::PickAllPrecisely(int ixScreen, int iyScreen, int & continue; } if (pNPC->LODLevel() < 0 || pNPC->LODLevel() >= MAX_CHR_LOD) { - continue; // Level Of Detail ° . + continue; // Level Of Detail 이 없는건 지나간다. } CN3VMesh * pvMesh = NULL; @@ -651,9 +651,9 @@ CPlayerNPC * CPlayerOtherMgr::PickAllPrecisely(int ixScreen, int iyScreen, int & } //////////////////////////////////////////////////////////////////////////// - // NPC UPC 浹üũ ϰ Ǹ UPC ־ - // ڿ ִ NPC ãƳ UPC NPC ÿ ī޶ Ͽ - // 浹 üũ Ȯ ij͸ ã ִ. + // NPC와 UPC를 따로 충돌체크를 하게 되면 UPC가 나와 가까이 있어도 + // 뒤에 있는 NPC를 먼저 찾아내기 때문에 UPC와 NPC를 동시에 카메라에 정렬하여 + // 충돌 체크를 해줘야 정확한 캐릭터를 찾아 낼수가 있다. //////////////////////////////////////////////////////////////////////////// int iBufCnt = NUPCBufs.size(); @@ -672,7 +672,7 @@ CPlayerNPC * CPlayerOtherMgr::PickAllPrecisely(int ixScreen, int iyScreen, int & for (int i = 0; i < iBufCnt; i++) { pNPC = NUPCBufs[i]; if (pNPC->LODLevel() < 0 || pNPC->LODLevel() >= MAX_CHR_LOD) { - continue; // Level Of Detail ° . + continue; // Level Of Detail 이 없는건 지나간다. } CN3VMesh * pvMesh = NULL; @@ -699,7 +699,7 @@ CPlayerNPC * CPlayerOtherMgr::PickNPCPrecisely(int ixScreen, int iyScreen, int & vPos, vDir); if (!m_NPCs.empty()) { - // ī޶ Ÿ + // 카메라 거리순으로 정렬 std::vector NPCs; it_NPC it = m_NPCs.begin(), itEnd = m_NPCs.end(); NPCs.reserve(m_NPCs.size()); @@ -708,11 +708,11 @@ CPlayerNPC * CPlayerOtherMgr::PickNPCPrecisely(int ixScreen, int iyScreen, int & } qsort(&(NPCs[0]), NPCs.size(), 4, SortByCameraDistance); - CPlayerNPC * pNPC = NULL; // NPC ... + CPlayerNPC * pNPC = NULL; // NPC 를 먼저 찍어본다... for (int i = 0; i < NPCs.size(); i++) { pNPC = NPCs[i]; if (pNPC->LODLevel() < 0 || pNPC->LODLevel() >= MAX_CHR_LOD) { - continue; // Level Of Detail ° . + continue; // Level Of Detail 이 없는건 지나간다. } CN3VMesh * pvMesh = NULL; @@ -754,7 +754,7 @@ CPlayerOther * CPlayerOtherMgr::PickUPCPrecisely(int ixScreen, int iyScreen, int vPos, vDir); if (!m_UPCs.empty()) { - // ī޶ Ÿ + // 카메라 거리순으로 정렬 std::vector UPCs; UPCs.reserve(m_UPCs.size()); it_UPC it = m_UPCs.begin(), itEnd = m_UPCs.end(); @@ -767,7 +767,7 @@ CPlayerOther * CPlayerOtherMgr::PickUPCPrecisely(int ixScreen, int iyScreen, int for (int i = 0; i < UPCs.size(); i++) { pUPC = UPCs[i]; if (pUPC->LODLevel() < 0 || pUPC->LODLevel() >= MAX_CHR_LOD) { - continue; // Level Of Detail ° . + continue; // Level Of Detail 이 없는건 지나간다. } if (pUPC->m_Chr.CheckCollisionPrecisely(ixScreen, iyScreen, pvPick) != -1) { diff --git a/src/game/PlayerOtherMgr.h b/src/game/PlayerOtherMgr.h index 8ee4b31b..cd90da2b 100644 --- a/src/game/PlayerOtherMgr.h +++ b/src/game/PlayerOtherMgr.h @@ -26,11 +26,11 @@ class CPlayerOtherMgr : public CGameBase { public: // std::list m_NPCs; // NPC // std::list m_UPCs; // User Player Character - // std::list m_Corpses; // .. ״ ϸ̼ ð Ѵ.. + // std::list m_Corpses; // 죽은놈.. 죽는 에니메이션 및 시간이 지나면 없어지게 한다.. std::map m_NPCs; // NPC std::map m_UPCs; // User Player Character - std::map m_Corpses; // .. ״ ϸ̼ ð Ѵ.. - int m_iChrCountToRender; // Ǵ ij īƮ + std::map m_Corpses; // 죽은놈.. 죽는 에니메이션 및 시간이 지나면 없어지게 한다.. + int m_iChrCountToRender; // 렌더링되는 캐릭 카운트 public: bool IsValidCharacter(CPlayerBase * pCharacter); @@ -38,30 +38,30 @@ class CPlayerOtherMgr : public CGameBase { void Render(float fSunAngle); void NPCAdd(CPlayerNPC * pNPC); - bool NPCDelete(int iID); // ID ġϴ NPC Ʈ .. ҽ + bool NPCDelete(int iID); // 고유 ID 와 일치하는 NPC를 리스트에서 제거.. 및 리소스 해제 void UPCAdd(CPlayerOther * pPlayer); - bool UPCDelete(int iID); // ID ġϴ NPC Ʈ .. ҽ + bool UPCDelete(int iID); // 고유 ID 와 일치하는 NPC를 리스트에서 제거.. 및 리소스 해제 - // CPlayerOther* UPCGetByName(const char* szID); // User Player Character NPC ؼ ͸ ´. + // CPlayerOther* UPCGetByName(const char* szID); // User Player Character 와 NPC 를 조사해서 포인터를 가져온다. CPlayerOther * UPCGetByID(int iID, - bool bFromAliveOnly); // User Player Character NPC ؼ ͸ ´. - // CPlayerNPC* NPCGetByName(const char* szID); // User Player Character NPC ؼ ͸ ´. + bool bFromAliveOnly); // User Player Character 와 NPC 를 조사해서 포인터를 가져온다. + // CPlayerNPC* NPCGetByName(const char* szID); // User Player Character 와 NPC 를 조사해서 포인터를 가져온다. CPlayerNPC * NPCGetByID(int iID, - bool bFromAliveOnly); // User Player Character NPC ؼ ͸ ´. + bool bFromAliveOnly); // User Player Character 와 NPC 를 조사해서 포인터를 가져온다. CPlayerNPC * NPCGetByPos(const __Vector3 & vPos); - CPlayerNPC * CharacterGetByID(int iID, bool bFromAliveOnly); // User, NPC ´.. - CPlayerNPC * CharacterGetByNearstEnemy(e_Nation eNation, const __Vector3 & vPosPlayer); // .. - bool CharacterDelete(int iID); // User, NPC .. + CPlayerNPC * CharacterGetByID(int iID, bool bFromAliveOnly); // User, NPC 안 가리고 가져온다.. + CPlayerNPC * CharacterGetByNearstEnemy(e_Nation eNation, const __Vector3 & vPosPlayer); // 가장 가까운 적 가져오기.. + bool CharacterDelete(int iID); // User, NPC 안 가리고 지운다.. - CPlayerBase * CorpseGetByID(int iID); // ü鿡 Player Character NPC ؼ ͸ ´. + CPlayerBase * CorpseGetByID(int iID); // 시체들에서 Player Character 와 NPC 를 조사해서 포인터를 가져온다. void CorpseRemove(CPlayerNPC * pCorpse, bool bRemoveImmediately = false); void CorpseAdd(CPlayerNPC * pNPC); void CorpseAdd(int iID); CPlayerNPC * CorpseGetNearstNPC(bool bMustHaveItem, e_Nation eNation, - const __Vector3 & vPosPlayer); // ü .. - void MoveToCorpsesForcely(CPlayerNPC * pNPC, bool bErase); // ̵ ġų ϸ ü .. + const __Vector3 & vPosPlayer); // 가장 가까운 적 시체 가져오기.. + void MoveToCorpsesForcely(CPlayerNPC * pNPC, bool bErase); // 아이디가 겹치거나 하면 강제로 시체를 만든다.. - //.. Picking PlayerOther .. + //.. Picking된 PlayerOther 계산.. CPlayerNPC * Pick(int ixScreen, int iyScreen, int & iIDResult, __Vector3 * pvPick = NULL); CPlayerNPC * PickNPC(int ixScreen, int iyScreen, int & iIDResult, __Vector3 * pvPick = NULL); CPlayerOther * PickUPC(int ixScreen, int iyScreen, int & iIDResult, __Vector3 * pvPick = NULL); @@ -69,7 +69,7 @@ class CPlayerOtherMgr : public CGameBase { CPlayerNPC * PickNPCPrecisely(int ixScreen, int iyScreen, int & iIDResult, __Vector3 * pvPick = NULL); CPlayerOther * PickUPCPrecisely(int ixScreen, int iyScreen, int & iIDResult, __Vector3 * pvPick = NULL); CPlayerNPC * PickAllPrecisely(int ixScreen, int iyScreen, int & iIDResult, __Vector3 * pvPick); - CPlayerNPC * PickCorpse(int ixScreen, int iyScreen, int & iIDResult); // ü Ŭ.. + CPlayerNPC * PickCorpse(int ixScreen, int iyScreen, int & iIDResult); // 시체중 클릭.. static int SortByCameraDistance(const void * pArg1, const void * pArg2); void ReleaseUPCs(); @@ -131,9 +131,9 @@ inline CPlayerNPC * CPlayerOtherMgr::CharacterGetByID(int iID, bool bFromAliveOn return 0; } - CPlayerNPC * pBPC = this->NPCGetByID(iID, bFromAliveOnly); // NPC ߿ ãƺ.. + CPlayerNPC * pBPC = this->NPCGetByID(iID, bFromAliveOnly); // 먼저 NPC 중에서 찾아보고.. if (NULL == pBPC) { - pBPC = this->UPCGetByID(iID, bFromAliveOnly); // User 鵵 ãƺ.. + pBPC = this->UPCGetByID(iID, bFromAliveOnly); // 없음 User 들도 찾아본다.. } return pBPC; @@ -141,10 +141,10 @@ inline CPlayerNPC * CPlayerOtherMgr::CharacterGetByID(int iID, bool bFromAliveOn inline void CPlayerOtherMgr::UPCAdd(CPlayerOther * pUPC) { it_UPC it = m_UPCs.find(pUPC->IDNumber()); - if (it == m_UPCs.end()) // ߺȰ .. + if (it == m_UPCs.end()) // 중복된게 없으면.. { m_UPCs.insert(val_UPC(pUPC->IDNumber(), pUPC)); - } else // ߺǾ.. + } else // 중복되었으면.. { T_Delete(it->second); it->second = pUPC; @@ -164,10 +164,10 @@ inline bool CPlayerOtherMgr::UPCDelete(int iID) { inline void CPlayerOtherMgr::NPCAdd(CPlayerNPC * pNPC) { it_NPC it = m_NPCs.find(pNPC->IDNumber()); - if (it == m_NPCs.end()) // ߺȰ .. + if (it == m_NPCs.end()) // 중복된게 없으면.. { m_NPCs.insert(val_NPC(pNPC->IDNumber(), pNPC)); - } else // ߺǾ.. + } else // 중복되었으면.. { T_Delete(it->second); it->second = pNPC; diff --git a/src/game/PortalVolume.cpp b/src/game/PortalVolume.cpp index 0b351fae..eaf116d9 100644 --- a/src/game/PortalVolume.cpp +++ b/src/game/PortalVolume.cpp @@ -33,7 +33,7 @@ CPortalVolume::CPortalVolume() unsigned short * pIdx = m_pIndex; - // Ʒ. + // 아랫면. *pIdx++ = 0; *pIdx++ = 1; *pIdx++ = 3; @@ -41,7 +41,7 @@ CPortalVolume::CPortalVolume() *pIdx++ = 3; *pIdx++ = 1; - // ո.. + // 앞면.. *pIdx++ = 7; *pIdx++ = 3; *pIdx++ = 6; @@ -49,7 +49,7 @@ CPortalVolume::CPortalVolume() *pIdx++ = 6; *pIdx++ = 3; - // .. + // 왼쪽.. *pIdx++ = 4; *pIdx++ = 0; *pIdx++ = 7; @@ -57,7 +57,7 @@ CPortalVolume::CPortalVolume() *pIdx++ = 7; *pIdx++ = 0; - // .. + // 오른쪽.. *pIdx++ = 6; *pIdx++ = 2; *pIdx++ = 5; @@ -65,7 +65,7 @@ CPortalVolume::CPortalVolume() *pIdx++ = 5; *pIdx++ = 2; - // ޸.. + // 뒷면.. *pIdx++ = 5; *pIdx++ = 1; *pIdx++ = 4; @@ -73,7 +73,7 @@ CPortalVolume::CPortalVolume() *pIdx++ = 4; *pIdx++ = 1; - // .. + // 윗면.. *pIdx++ = 4; *pIdx++ = 7; *pIdx++ = 5; @@ -199,7 +199,7 @@ void CPortalVolume::RenderShape() { pSI->m_pShape->m_bDontRender = false; pSI->m_pShape->Render(); - // εҶ ̸ .. + // 로딩할때 미리 계산해 놓은 월드 행렬 적용.. __Matrix44 mtxBackup; CN3Base::s_lpD3DDev->GetTransform(D3DTS_WORLD, &mtxBackup); CN3Base::s_lpD3DDev->SetTransform(D3DTS_WORLD, &pSI->m_pShape->m_Matrix); @@ -281,7 +281,7 @@ void CPortalVolume::RenderCollision() { while (ciit != m_lpShapeColPartList.end()) { pCI = *ciit++; - // .. + // 행렬 계산.. __Matrix44 mtxWorld; mtxWorld.Identity(); @@ -314,11 +314,11 @@ bool CPortalVolume::Load(HANDLE hFile) { char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; - // ڽ ε.. + // 자신의 데이터 로드.. DWORD dwNum; std::string strSrc, strDest; - // ũ ε.. ϴ б .. + // 링크된 갯수를 로드.. 일단 읽구 버린다.. int iLinkedCount = 0, iTID, iEWT; ReadFile(hFile, &iLinkedCount, sizeof(int), &dwNum, NULL); for (int i = 0; i < iLinkedCount; i++) { @@ -326,14 +326,14 @@ bool CPortalVolume::Load(HANDLE hFile) { ReadFile(hFile, &iEWT, sizeof(int), &dwNum, NULL); } - // ũ Shape ε.. + // 링크된 Shape 갯수 로드.. int iCount = 0; ReadFile(hFile, &iCount, sizeof(int), &dwNum, NULL); for (int i = 0; i < iCount; i++) { ShapeInfo * pSI = new ShapeInfo; ReadFile(hFile, &pSI->m_iID, sizeof(int), &dwNum, NULL); - // ڿ .. + // 문자열 길이.. strSrc = CPvsMgr::ReadDecryptString(hFile); _splitpath(strSrc.c_str(), szDrive, szDir, szFName, szExt); strDest = szFName; @@ -344,7 +344,7 @@ bool CPortalVolume::Load(HANDLE hFile) { ReadFile(hFile, &pSI->m_iEventType, sizeof(int), &dwNum, NULL); ReadFile(hFile, &pSI->m_iNPC_ID, sizeof(int), &dwNum, NULL); ReadFile(hFile, &pSI->m_iNPC_Status, sizeof(int), &dwNum, NULL); - if (pSI->m_iEventID || pSI->m_iEventType || pSI->m_iNPC_ID || pSI->m_iNPC_Status) { // ̺Ʈ + if (pSI->m_iEventID || pSI->m_iEventType || pSI->m_iNPC_ID || pSI->m_iNPC_Status) { // 이벤트가 있으면 pSI->m_pShape = CPvsMgr::s_MngShapeExt.Get(m_pManager->GetIndoorFolderPath() + strDest); } else { pSI->m_pShape = CPvsMgr::s_MngShape.Get(m_pManager->GetIndoorFolderPath() + strDest); @@ -361,7 +361,7 @@ bool CPortalVolume::Load(HANDLE hFile) { for (int i = 0; i < iCount; i++) { ReadFile(hFile, &IDAP.m_iID, sizeof(int), &dwNum, NULL); ReadFile(hFile, &IDAP.m_iPriority, sizeof(int), &dwNum, NULL); - __ASSERT(IDAP.m_iPriority != -1, "߸ "); + __ASSERT(IDAP.m_iPriority != -1, "잘못된 파일"); m_piVisibleIDList.push_back(IDAP); } @@ -698,7 +698,7 @@ BOOL CPortalVolume::PickWideWithTerrain(int x, int y, __Vector3 & vPick) { pVec.Cross(vEdge1, vEdge2); pVec.Normalize(); pVec.y = 0.0f; - if (pVec.Magnitude() < m_fPickIncline) { // .. + if (pVec.Magnitude() < m_fPickIncline) { // 기울기.. return TRUE; } else { int kk = 0; @@ -715,7 +715,7 @@ CN3Shape * CPortalVolume::PickWithShape(int iXScreen, int iYScreen, bool bMustHa ::_Convert2D_To_3DCoordinate(iXScreen, iYScreen, s_CameraData.mtxView, s_CameraData.mtxProjection, s_CameraData.vp, vPos, vDir); - // Ÿ .. + // 거리순으로 정렬.. std::vector Shapes; ShapeInfo * pSI = NULL; CPortalVolume * pVol = NULL; @@ -737,7 +737,7 @@ CN3Shape * CPortalVolume::PickWithShape(int iXScreen, int iYScreen, bool bMustHa for (int i = 0; i < iSC; i++) { ShapeInfo * pShr = Shapes[i]; if (bMustHaveEvent && Shapes[i]->m_iEventID <= 0) { - continue; // ̺Ʈ ־ Ѵٸ... + continue; // 이벤트가 있어야 한다면... } Shapes[i]->m_pShape->PosSet(Shapes[i]->Pos()); Shapes[i]->m_pShape->RotSet(Shapes[i]->Rot()); @@ -779,14 +779,14 @@ CN3Shape * CPortalVolume::ShapeGetByIDWithShape(int iID) { return NULL; } -bool CPortalVolume::CheckCollisionWithShape(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol, // 浹 - __Vector3 * pvNormal, // 浹Ѹ - __Vector3 * pVec) // 浹 __Vector3[3] +bool CPortalVolume::CheckCollisionWithShape(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol, // 충돌 지점 + __Vector3 * pvNormal, // 충돌한면의 법선벡터 + __Vector3 * pVec) // 충돌한 면 의 폴리곤 __Vector3[3] { - __Vector3 vPosNext = vPos + (vDir * fSpeedPerSec); // ġ + __Vector3 vPosNext = vPos + (vDir * fSpeedPerSec); // 다음 위치 float fMcs = (vPosNext - vPos).Magnitude(); bool bCollision = false; diff --git a/src/game/PortalVolume.h b/src/game/PortalVolume.h index c8ab8b4b..92100e72 100644 --- a/src/game/PortalVolume.h +++ b/src/game/PortalVolume.h @@ -23,11 +23,11 @@ typedef struct tagShapeInfo : public CN3Transform { int m_iID; std::string m_strShapeFile; - int m_iBelong; // Ҽ - 0:Ҽ 1: 2:ī罺 3:?? .... + int m_iBelong; // 소속 - 0:소속 없음 1:엘모라드 2:카루스 3:?? .... int m_iEventID; // Event ID int m_iEventType; // Event Type - int m_iNPC_ID; // NPC Ʈ NPC ID - int m_iNPC_Status; // NPC Ʈ Default Status + int m_iNPC_ID; // NPC 로 쓰는 오브젝트일 경우 NPC ID + int m_iNPC_Status; // NPC 로 쓰는 오브젝트일 경우 Default Status CN3Shape * m_pShape; @@ -117,15 +117,15 @@ class CPortalVolume : public CN3Transform { e_ExtBool m_eRenderType; - const float m_fOffs; // Ϲ ɼ.. - const float m_fHeightOffs; // ɼ.. - const float m_fVolOffs; // Volume ɼ.. - const float m_fPickIncline; // ŷ üũ.. - const float m_fCameraOffs; // ī޶ .. + const float m_fOffs; // 일반적인 옵셋.. + const float m_fHeightOffs; // 높이 옵셋.. + const float m_fVolOffs; // Volume 법위 옵셋.. + const float m_fPickIncline; // 픽킹 기울기 체크.. + const float m_fCameraOffs; // 카메라 높이.. ////////////////////////////////////////////////////////////////////////////////////// std::list m_plShapeInfoList; - std::list m_piVisibleIDList; // ε忡 ʿ ߰ .. + std::list m_piVisibleIDList; // 로드에 필요한 중간 데이터.. std::list m_lpShapePartList; std::list<__ColIndex *> m_lpShapeColPartList; std::list m_pVisiblePvsList; @@ -134,7 +134,7 @@ class CPortalVolume : public CN3Transform { __Vector3 m_pvVertex[8]; unsigned short m_pIndex[36]; - int m_iPriority; //.. 100 ʱȭ.. + int m_iPriority; //.. 100 정도로 초기화.. private: void DeleteAllPvsObj(); @@ -154,12 +154,12 @@ class CPortalVolume : public CN3Transform { BOOL PickWideWithTerrain(int x, int y, __Vector3 & vPick); CN3Shape * PickWithShape(int iXScreen, int iYScreen, bool bMustHaveEvent, __Vector3 * pvPick = NULL); CN3Shape * ShapeGetByIDWithShape(int iID); - bool CheckCollisionWithShape(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol, // 浹 - __Vector3 * pvNormal, // 浹Ѹ - __Vector3 * pVec); // 浹 __Vector3[3] + bool CheckCollisionWithShape(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol, // 충돌 지점 + __Vector3 * pvNormal, // 충돌한면의 법선벡터 + __Vector3 * pVec); // 충돌한 면 의 폴리곤 __Vector3[3] public: CPortalVolume(); diff --git a/src/game/PvsMgr.cpp b/src/game/PvsMgr.cpp index a45a5e6f..d0bbd7cc 100644 --- a/src/game/PvsMgr.cpp +++ b/src/game/PvsMgr.cpp @@ -134,10 +134,10 @@ bool CPvsMgr::Load(HANDLE hFile) { return LoadOldVersion(hFile, iT); } - // N3Scene ȭ.. Ⱦ.. -.-; + // N3Scene 화일.. 안쓴다.. -.-; std::string strSrc = ReadDecryptString(hFile), strDest; - // ü ̵.. Ƚ.. -.-; + // 전체 이동값.. 안슨다.. -.-; ReadFile(hFile, &iT, sizeof(int), &dwNum, NULL); ReadFile(hFile, &iT, sizeof(int), &dwNum, NULL); ReadFile(hFile, &iT, sizeof(int), &dwNum, NULL); @@ -151,7 +151,7 @@ bool CPvsMgr::Load(HANDLE hFile) { ShapeInfo * pSI = new ShapeInfo; ReadFile(hFile, &pSI->m_iID, sizeof(int), &dwNum, NULL); - // ڿ .. + // 문자열 길이.. strSrc = ReadDecryptString(hFile); _splitpath(strSrc.c_str(), szDrive, szDir, szFName, szExt); strDest = szFName; @@ -213,7 +213,7 @@ CPortalVolume * CPvsMgr::GetPortalVolPointerByID(int iID) { iter it = m_pPvsList.begin(); while (it != m_pPvsList.end()) { - // ڽ .. + // 자신의 데이터 저장.. pVol = *it++; if (pVol->m_iID == iID) { return pVol; @@ -408,12 +408,12 @@ CN3Shape * CPvsMgr::PickWithShape(int iXScreen, int iYScreen, bool bMustHaveEven return m_pCurVol->PickWithShape(iXScreen, iYScreen, bMustHaveEvent, pvPick); } -bool CPvsMgr::CheckCollisionWithShape(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol, // 浹 - __Vector3 * pvNormal, // 浹Ѹ - __Vector3 * pVec) // 浹 __Vector3[3] +bool CPvsMgr::CheckCollisionWithShape(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol, // 충돌 지점 + __Vector3 * pvNormal, // 충돌한면의 법선벡터 + __Vector3 * pVec) // 충돌한 면 의 폴리곤 __Vector3[3] { if (!m_pCurVol) { Tick(); diff --git a/src/game/PvsMgr.h b/src/game/PvsMgr.h index a65b6a47..24cb59a0 100644 --- a/src/game/PvsMgr.h +++ b/src/game/PvsMgr.h @@ -21,7 +21,7 @@ class CPvsMgr : public CN3BaseFileAccess { friend class CPortalVolume; const std::string m_IndoorFolder; - const float m_fVolumeOffs; // Volume üũ .. + const float m_fVolumeOffs; // Volume 체크 높이.. std::list m_pPvsList; @@ -56,12 +56,12 @@ class CPvsMgr : public CN3BaseFileAccess { BOOL PickWideWithTerrain(int x, int y, __Vector3 & vPick); CN3Shape * PickWithShape(int iXScreen, int iYScreen, bool bMustHaveEvent, __Vector3 * pvPick = NULL); CN3Shape * ShapeGetByIDWithShape(int iID); - bool CheckCollisionWithShape(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol, // 浹 - __Vector3 * pvNormal, // 浹Ѹ - __Vector3 * pVec); // 浹 __Vector3[3] + bool CheckCollisionWithShape(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol, // 충돌 지점 + __Vector3 * pvNormal, // 충돌한면의 법선벡터 + __Vector3 * pVec); // 충돌한 면 의 폴리곤 __Vector3[3] public: CPvsMgr(); diff --git a/src/game/ServerMesh.cpp b/src/game/ServerMesh.cpp index 1b7b3c54..a0e9677b 100644 --- a/src/game/ServerMesh.cpp +++ b/src/game/ServerMesh.cpp @@ -30,7 +30,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { D3DCOLOR color = D3DCOLOR_RGBA(50, 25, 25, 0); - // .. + // 제일 왼쪽.. ixposL = ixpos - SGRID_SIZE; izposL = izpos - SGRID_SIZE; ixposR = ixpos - SGRID_SIZE; @@ -50,7 +50,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 0); - // ι°.. + // 왼쪽 두번째.. ixposL = ixpos; izposL = izpos - SGRID_SIZE; @@ -71,7 +71,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 6); - // °.. + // 왼쪽 세번째.. ixposL = ixpos + SGRID_SIZE; izposL = izpos - SGRID_SIZE; @@ -92,7 +92,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 12); - // ʿ .. + // 왼쪽에서 끝.. ixposL = ixpos + SGRID_SIZE * 2; izposL = izpos - SGRID_SIZE; @@ -113,7 +113,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 18); - // ؿ ù°.. + // 밑에서 첫번째.. ixposL = ixpos - SGRID_SIZE; izposL = izpos - SGRID_SIZE; @@ -134,7 +134,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 24); - // ؿ ι°.. + // 밑에서 두번째.. ixposL = ixpos - SGRID_SIZE; izposL = izpos; @@ -155,7 +155,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 30); - // ؿ °.. + // 밑에서 세번째.. ixposL = ixpos - SGRID_SIZE; izposL = izpos + SGRID_SIZE; @@ -176,7 +176,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 36); - // ؿ °.. + // 밑에서 끝번째.. ixposL = ixpos - SGRID_SIZE; izposL = izpos + SGRID_SIZE * 2; diff --git a/src/game/SharedMem.cpp b/src/game/SharedMem.cpp index 4511a090..5268724a 100644 --- a/src/game/SharedMem.cpp +++ b/src/game/SharedMem.cpp @@ -60,16 +60,16 @@ void CSharedMemQueue::SetReadData() { char * InData = Rxd->Data + Rxd->Tail; if (*InData != 0x7f) { (Rxd->Tail)++; - TRACE("Start "); - // AfxMessageBox("Start ", NULL, MB_OK); + TRACE("Start가 없음"); + // AfxMessageBox("Start가 없음", NULL, MB_OK); return; } memcpy((char *)&size, InData + 1, 2); memcpy(abIn, InData + 3, size); if (*(InData + size + 3) != 0x7e) { - TRACE("Stop "); + TRACE("Stop가 없음"); } - // AfxMessageBox("Stop ",NULL, MB_OK); + // AfxMessageBox("Stop가 없음",NULL, MB_OK); Rxd->Tail += size + 4; SendMessage(m_hwnd, WM_RECEIVEDATA, size, 0); } @@ -96,7 +96,7 @@ BOOL CSharedMemQueue::PutData(char * pBuf, WORD size) { return TRUE; } -//޼ hwnd +//메세지를 전달할 hwnd설정 void CSharedMemQueue::SetHwnd(HWND hwnd) { m_hwnd = hwnd; } diff --git a/src/game/SharedMem.h b/src/game/SharedMem.h index 162ced68..1aa99000 100644 --- a/src/game/SharedMem.h +++ b/src/game/SharedMem.h @@ -26,11 +26,11 @@ class CSharedMemQueue //:public CObject BOOL IsPartner(); BOOL CreateSmq(BOOL Server); - // Ÿ ۿ Ѵ. + //읽은 데이타를 버퍼에 저장한다. void SetReadData(); - // Ÿ ۿ ´. + //읽은 데이타를 버퍼에 가져온다. void GetReadData(LPSTR data, int nLength); - //޼縦 ÷ Ѵ. + //메세재를 보낼 윈도우 플래를 설정한다. void SetHwnd(HWND hwnd); void CloseSmq(); BOOL IsData(); @@ -39,8 +39,8 @@ class CSharedMemQueue //:public CObject HANDLE m_hrMMFile; HANDLE m_hsMMFile; char * m_lpMMFile; - HWND m_hwnd; //޼ ÷ - BYTE abIn[1024 + 1]; //Ʈ Ÿ + HWND m_hwnd; //메세지를 전달할 윈도우 플러그 + BYTE abIn[1024 + 1]; //컴포트에서 들어오는 데이타 BOOL fConnected; _SMQ_HEADER *Txd, *Rxd; }; diff --git a/src/game/SubProcPerTrade.cpp b/src/game/SubProcPerTrade.cpp index 5cd29add..fe062551 100644 --- a/src/game/SubProcPerTrade.cpp +++ b/src/game/SubProcPerTrade.cpp @@ -70,7 +70,7 @@ void CSubProcPerTrade::InitPerTradeDlg(CUIManager * pUIManager) { int iW = CN3Base::s_CameraData.vp.Width; RECT rc; - e_Nation eNation = s_pPlayer->m_InfoBase.eNation; // .... + e_Nation eNation = s_pPlayer->m_InfoBase.eNation; // 국가.... __TABLE_UI_RESRC * pTbl = s_pTbl_UI->Find(eNation); // UIPerTradeDlg.. ^^ @@ -91,7 +91,7 @@ void CSubProcPerTrade::InitPerTradeDlg(CUIManager * pUIManager) { m_pUITradeEditDlg->m_pSubProcPerTrade = this; m_pUITradeEditDlg->LoadFromFile(pTbl->szPersonalTradeEdit); m_pUITradeEditDlg->SetStyle(UISTYLE_ALWAYSTOP); - // ġ .. + // 위치 계산 .. int iXPos, iYPos; int iH = CN3Base::s_CameraData.vp.Height; iXPos = (iW / 2) - (m_pUITradeEditDlg->GetRegion().right - m_pUITradeEditDlg->GetRegion().left) / 2; @@ -101,20 +101,20 @@ void CSubProcPerTrade::InitPerTradeDlg(CUIManager * pUIManager) { m_pUITradeEditDlg->SetUIType(UI_TYPE_BASE); m_pUITradeEditDlg->SetState(UI_STATE_COMMON_NONE); - // ϴ Ƚ.. ^^ + // 일단은 돈 아이콘으로 픽스.. ^^ m_pUITradeEditDlg->m_pArea = (CN3UIArea *)m_pUITradeEditDlg->GetChildByID("area_trade_icon"); __ASSERT(m_pUITradeEditDlg->m_pArea, "NULL UI Component!!"); m_pUITradeEditDlg->m_pImageOfIcon = new CN3UIImage; m_pUITradeEditDlg->m_pImageOfIcon->Init(m_pUITradeEditDlg); - // ڿ ã.. ̵ ã ɹۿ .. . - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. - pItem = s_pTbl_Items_Basic->Find(dwGold); // .. + // 돈 아이콘 문자열 찾기.. 아이디로 찾는 기능밖에 없다.. ㅠ.ㅠ + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. + pItem = s_pTbl_Items_Basic->Find(dwGold); // 열 데이터 얻기.. std::string szIconFN; e_PartPosition ePart; e_PlugPosition ePlug; - CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, ePlug); // ۿ ̸  + CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, ePlug); // 아이템에 따른 파일 이름을 만들어서 m_pUITradeEditDlg->m_pImageOfIcon->SetTex(szIconFN); float fUVAspect = (float)45.0f / (float)64.0f; m_pUITradeEditDlg->m_pImageOfIcon->SetUVRect(0, 0, fUVAspect, fUVAspect); @@ -132,7 +132,7 @@ void CSubProcPerTrade::EnterWaitMsgFromServerStatePerTradeReq() { m_ePerTradeState = PER_TRADE_STATE_WAIT_FOR_REQ; - // ޽ ڽ ؽƮ ǥ.. + // 메시지 박스 텍스트 표시.. char szBuff[256] = ""; std::string szFmt; ::_LoadStringFromResource(IDS_PERSONAL_TRADE_FMT_WAIT, szFmt); @@ -145,7 +145,7 @@ void CSubProcPerTrade::EnterWaitMsgFromServerStatePerTradeReq() { void CSubProcPerTrade::EnterWaitMsgFromServerStatePerTradeReq(std::string szName) { m_ePerTradeState = PER_TRADE_STATE_WAIT_FOR_REQ; - // ޽ ڽ ؽƮ ǥ.. + // 메시지 박스 텍스트 표시.. char szBuff[256] = ""; std::string szFmt; ::_LoadStringFromResource(IDS_PERSONAL_TRADE_FMT_WAIT, szFmt); @@ -155,7 +155,7 @@ void CSubProcPerTrade::EnterWaitMsgFromServerStatePerTradeReq(std::string szName SecureCodeBegin(); } -void CSubProcPerTrade::EnterWaitMyDecisionToPerTrade(int iOtherID) // ŸοԼ ŷ û .. +void CSubProcPerTrade::EnterWaitMyDecisionToPerTrade(int iOtherID) // 내가 타인에게서 아이템 거래를 신청 받은 상태.. { CPlayerOther * pTarget = s_pOPMgr->UPCGetByID(iOtherID, false); if (NULL == pTarget) { @@ -165,7 +165,7 @@ void CSubProcPerTrade::EnterWaitMsgFromServerStatePerTradeReq(std::string szName m_iOtherID = iOtherID; m_ePerTradeState = PER_TRADE_STATE_WAIT_FOR_MY_DECISION_AGREE_OR_DISAGREE; - // ޽ ڽ ؽƮ ǥ.. + // 메시지 박스 텍스트 표시.. char szBuff[256] = ""; std::string szFmt; ::_LoadStringFromResource(IDS_PERSONAL_TRADE_PERMIT, szFmt); @@ -178,28 +178,28 @@ void CSubProcPerTrade::EnterWaitMsgFromServerStatePerTradeReq(std::string szName /////////////////////////////////////////////////////////////////////// void CSubProcPerTrade::SecureCodeBegin() { - // 1.ŷ ̸ ŷ û ʵȴ.. -> ش κ.. ok - // 2.ŷ ߿ ŷ û .. -> ش κ.. ok + // 1.상거래 중이면 개인 거래 신청이 않된다.. -> 해당 부분.. ok + // 2.상거래 중에 개인 거래 신청을 받으면 거절.. -> 해당 부분.. ok - // 3. ̰ ִ ̸ .. + // 3.유저가 움직이고 있는 중이면 멈춘다.. if (s_pPlayer->IsMovingNow()) { - s_pPlayer->ToggleMoveMode(); // ڵ .. + s_pPlayer->ToggleMoveMode(); // 자동 전진 토글.. } - // 4. Ŵ ݴ´.. - // κ丮 ̸.. + // 4.아이콘 매니저 윈도우는 모두 닫는다.. + // 인벤토리 윈도우이면.. if (CGameProcedure::s_pProcMain->m_pUIInventory->IsVisible()) { CGameProcedure::s_pProcMain->m_pUIInventory->Close(); } - // Drop Item ̸.. + // Drop Item 윈도우이면.. if (CGameProcedure::s_pProcMain->m_pUIDroppedItemDlg->IsVisible()) { CGameProcedure::s_pProcMain->m_pUIDroppedItemDlg->LeaveDroppedState(); } - // 5.Dz ´.. -> ش κ.. ok (ŰԷ° ޽..) + // 5.인풋을 막는다.. -> 해당 부분.. ok (키입력과 메시지..) - // 6.ŷâ Control Clear.. + // 6.거래창의 편집 Control의 값을 Clear.. CN3UIString * pStrMy = (CN3UIString *)m_pUIPerTradeDlg->GetChildByID("string_money_my"); __ASSERT(pStrMy, "NULL UI Component!!"); CN3UIString * pStrOther = (CN3UIString *)m_pUIPerTradeDlg->GetChildByID("string_money_other"); @@ -207,7 +207,7 @@ void CSubProcPerTrade::SecureCodeBegin() { pStrMy->SetString("0"); pStrOther->SetString("0"); - // 7. ŷ â óũ ư .. + // 7.개인 거래 창의 처크 버튼들 원래대로.. CN3UIButton * pButtonMy = (CN3UIButton *)m_pUIPerTradeDlg->GetChildByID("btn_trade_my"); __ASSERT(pButtonMy, "NULL UI Component!!"); pButtonMy->SetState(UI_STATE_BUTTON_NORMAL); @@ -215,7 +215,7 @@ void CSubProcPerTrade::SecureCodeBegin() { __ASSERT(pButtonOther, "NULL UI Component!!"); pButtonOther->SetState(UI_STATE_BUTTON_NORMAL); - // 8. ŷ ư Click . uif ü .. + // 8.상대방 거래 버튼은 Click할 수 없다. uif 자체 기능.. } /////////////////////////////////////////////////////////////////////// @@ -236,18 +236,18 @@ void CSubProcPerTrade::FinalizePerTrade() { } } -void CSubProcPerTrade::PerTradeCompleteSuccess() // ŷ .. +void CSubProcPerTrade::PerTradeCompleteSuccess() // 개인 거래 최종 성공.. { - // ŷ â ִ .. + // 개인 거래 창에 있는 아이템 삭제.. for (int i = 0; i < MAX_ITEM_PER_TRADE; i++) { if (m_pUIPerTradeDlg->m_pPerTradeMy[i] != NULL) { __IconItemSkill * spItem; spItem = m_pUIPerTradeDlg->m_pPerTradeMy[i]; - // Ŵ .. + // 매니저에서 제거.. m_pUIPerTradeDlg->RemoveChild(spItem->pUIIcon); - // ҽ .. + // 리소스 제거.. spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -260,10 +260,10 @@ void CSubProcPerTrade::FinalizePerTrade() { __IconItemSkill * spItem; spItem = m_pUIPerTradeDlg->m_pPerTradeOther[i]; - // Ŵ .. + // 매니저에서 제거.. m_pUIPerTradeDlg->RemoveChild(spItem->pUIIcon); - // ҽ .. + // 리소스 제거.. spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -276,44 +276,44 @@ void CSubProcPerTrade::FinalizePerTrade() { m_pUIPerTradeDlg->LeavePerTradeState(); } -void CSubProcPerTrade::PerTradeCompleteCancel() // ŷ .. +void CSubProcPerTrade::PerTradeCompleteCancel() // 개인 거래 취소.. { - int64_t iGold; // ŷâ .. - int64_t iMyMoney; // κ丮 .. + int64_t iGold; // 거래창의 값.. + int64_t iMyMoney; // 인벤토리의 값.. if ((int)m_ePerTradeState >= (int)PER_TRADE_STATE_NORMAL) { - // ˻ Ѵ.. - // ŷ â ´.. + // 먼저 돈을 검사 한다.. + // 거래 창의 내 현재 돈을 얻어 온다.. CN3UIString * pStrMy = (CN3UIString *)m_pUIPerTradeDlg->GetChildByID("string_money_my"); __ASSERT(pStrMy, "NULL UI Component!!"); iGold = pStrMy->GetStringAsInt({','}); - // ´.. + // 현재 내가 가진 돈을 얻어 온다.. iMyMoney = s_pPlayer->m_InfoExt.iGold; - // Ѵ.. + // 돈을 복구 한다.. iMyMoney += iGold; s_pPlayer->m_InfoExt.iGold = iMyMoney; - // ״ ˻Ѵ.. - // ۵ .. + // 그다음 아이템을 검사한다.. + // 아이템들을 원래 대로.. for (int i = 0; i < MAX_ITEM_PER_TRADE; i++) { if (m_pUIPerTradeDlg->m_pPerTradeMy[i] != NULL) { if ((m_pUIPerTradeDlg->m_pPerTradeMy[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (m_pUIPerTradeDlg->m_pPerTradeMy[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) { - // Ȱ̳ .. + // 활이나 물약등 아이템인 경우.. __IconItemSkill * spItem; spItem = m_pUIPerTradeDlg->m_pPerTradeMy[i]; - // ִٸ.. + // 기존에 아이콘이 있다면.. if (m_pUIPerTradeDlg->m_pPerTradeInv[m_pUIPerTradeDlg->m_iBackupiOrder[i]]) { - // Ʈ ϰ.. + // 숫자 업데이트 하고.. m_pUIPerTradeDlg->m_pPerTradeInv[m_pUIPerTradeDlg->m_iBackupiOrder[i]]->iCount += m_pUIPerTradeDlg->m_pPerTradeMy[i]->iCount; - // Ŵ .. + // 매니저에서 제거.. m_pUIPerTradeDlg->RemoveChild(spItem->pUIIcon); - // ҽ .. + // 리소스 제거.. spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -321,17 +321,17 @@ void CSubProcPerTrade::FinalizePerTrade() { spItem = NULL; m_pUIPerTradeDlg->m_pPerTradeMy[i] = NULL; } - // ٸ ״ ̵Ѵ.. + // 없다면 그대로 이동한다.. else { __IconItemSkill * spItem; spItem = m_pUIPerTradeDlg->m_pPerTradeMy[i]; spItem->pUIIcon->SetParent(m_pUIPerTradeDlg); - // κ丮 쿡 ϰ.. + // 인벤토리 윈도우에 세팅하고.. m_pUIPerTradeDlg->m_pPerTradeInv[m_pUIPerTradeDlg->m_iBackupiOrder[i]] = spItem; - // ŷ 쿡 Ŭ.. + // 내 거래 윈도우에서 클리어.. m_pUIPerTradeDlg->m_pPerTradeMy[i] = NULL; CN3UIArea * pArea; @@ -349,10 +349,10 @@ void CSubProcPerTrade::FinalizePerTrade() { spItem->pUIIcon->SetParent(m_pUIPerTradeDlg); - // κ丮 쿡 ϰ.. + // 인벤토리 윈도우에 세팅하고.. m_pUIPerTradeDlg->m_pPerTradeInv[m_pUIPerTradeDlg->m_iBackupiOrder[i]] = spItem; - // ŷ 쿡 Ŭ.. + // 내 거래 윈도우에서 클리어.. m_pUIPerTradeDlg->m_pPerTradeMy[i] = NULL; CN3UIArea * pArea; @@ -370,10 +370,10 @@ void CSubProcPerTrade::FinalizePerTrade() { __IconItemSkill * spItem; spItem = m_pUIPerTradeDlg->m_pPerTradeOther[i]; - // Ŵ .. + // 매니저에서 제거.. m_pUIPerTradeDlg->RemoveChild(spItem->pUIIcon); - // ҽ .. + // 리소스 제거.. spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -389,69 +389,69 @@ void CSubProcPerTrade::FinalizePerTrade() { /////////////////////////////////////////////////////////////////////// -void CSubProcPerTrade::LeavePerTradeState(e_PerTradeResultCode ePTRC) // ŷ ҵǴ ¸ .. +void CSubProcPerTrade::LeavePerTradeState(e_PerTradeResultCode ePTRC) // 아이템 거래가 취소되는 상태를 정의.. { - BYTE byBuff[4]; // Ŷ .. - int iOffset = 0; // Ŷ .. + BYTE byBuff[4]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. char szBuf[256] = ""; std::string szMsg; switch (ePTRC) { - case PER_TRADE_RESULT_MY_CANCEL: // ŷ û ŷ û .. - // Ŷ  .. + case PER_TRADE_RESULT_MY_CANCEL: // 거래를 신청한 내가 거래 신청을 취소.. + // 서버에게 패킷 만들어서 날림.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_PER_TRADE); CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_PER_TRADE_CANCEL); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보냄.. - // .. + // 뒷 마무리.. PerTradeCompleteCancel(); FinalizePerTrade(); - TRACE(" ŷ ҵ.. ..\n"); + TRACE("내가 거래를 취소 상대방과 내가 취소됨.. 서버에게 보냄..\n"); break; - case PER_TRADE_RESULT_MY_DISAGREE: // ŷ û ŷ û .. - // Ŷ  .. + case PER_TRADE_RESULT_MY_DISAGREE: // 거래를 신청받은 내가 거래 신청을 취소.. + // 서버에게 패킷 만들어서 날림.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_PER_TRADE); CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_PER_TRADE_AGREE); CAPISocket::MP_AddByte(byBuff, iOffset, 0x00); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보냄.. - // .. + // 뒷 마무리.. FinalizePerTrade(); - TRACE(" ŷ .. ҵ ..\n"); + TRACE("내가 거래를 거절.. 상대방과 내가 취소됨 서버에게 보냄..\n"); break; - case PER_TRADE_RESULT_OTHER_DISAGREE: // ŷ û ŷ û .. - TRACE(" ŷ .. \n"); + case PER_TRADE_RESULT_OTHER_DISAGREE: // 거래를 신청받은 상대방이 거래 신청을 취소.. + TRACE("상대방이 거래를 거절.. \n"); //this_ui - // ޽ ڽ ؽƮ ǥ.. + // 메시지 박스 텍스트 표시.. ::_LoadStringFromResource(IDS_OTHER_PER_TRADE_ID_NO, szMsg); CGameProcedure::s_pProcMain->MsgOutput(szMsg, 0xffff3b3b); // ::_LoadStringFromResource(IDS_OTHER_PER_TRADE_NO, szMsg); // sprintf(szBuf, szMsg.c_str(), // (s_pOPMgr->UPCGetByID(s_pPlayer->m_iIDTarget, false))->IDString().c_str()); // CGameProcedure::s_pProcMain->MsgOutput(szBuf, 0xffff3b3b); - // .. + // 뒷 마무리.. FinalizePerTrade(); break; } } -void CSubProcPerTrade::ProcessProceed(e_PerTradeProceedCode ePTPC) // ŷ ӵǴ ¸ .. +void CSubProcPerTrade::ProcessProceed(e_PerTradeProceedCode ePTPC) // 아이템 거래가 계속되는 상태를 정의.. { - BYTE byBuff[4]; // Ŷ .. - int iOffset = 0; // Ŷ .. + BYTE byBuff[4]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. switch (ePTPC) { - case PER_TRADE_RESULT_MY_AGREE: // ŷ û ŷ û .. - // Ŷ  .. + case PER_TRADE_RESULT_MY_AGREE: // 거래를 신청받은 내가 거래 신청을 허락.. + // 서버에게 패킷 만들어서 날림.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_PER_TRADE); CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_PER_TRADE_AGREE); CAPISocket::MP_AddByte(byBuff, iOffset, 0x01); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보냄.. CGameProcedure::MessageBoxClose(m_szMsg); m_szMsg = ""; @@ -460,7 +460,7 @@ void CSubProcPerTrade::FinalizePerTrade() { PerTradeCoreStart(); break; - case PER_TRADE_RESULT_OTHER_AGREE: // ŷ û ŷ û .. + case PER_TRADE_RESULT_OTHER_AGREE: // 거래를 신청받은 상대방이 거래 신청을 허락.. CGameProcedure::MessageBoxClose(m_szMsg); m_szMsg = ""; @@ -507,22 +507,22 @@ void CSubProcPerTrade::RequestItemCountEdit() { void CSubProcPerTrade::ItemCountEditOK() { std::string szGold; - int64_t iGold; // ŷâ .. - int64_t iGoldOffset; // â .. - int64_t iMyMoney; // κ丮 .. + int64_t iGold; // 거래창의 값.. + int64_t iGoldOffset; // 편집창의 값.. + int64_t iMyMoney; // 인벤토리의 값.. - // ŷ â ´.. + // 거래 창의 내 현재 돈을 얻어 온다.. CN3UIString * pStrMy = (CN3UIString *)m_pUIPerTradeDlg->GetChildByID("string_money_my"); __ASSERT(pStrMy, "NULL UI Component!!"); iGold = pStrMy->GetStringAsInt({','}); - // Է â  + // 입력 창의 값을 얻어서 iGoldOffset = m_pUITradeEditDlg->GetQuantity(); // Gold Offset Backup.. m_iGoldOffsetBackup = iGoldOffset; - // ´.. + // 현재 내가 가진 돈을 얻어 온다.. iMyMoney = s_pPlayer->m_InfoExt.iGold; if (iGoldOffset <= 0) { @@ -532,11 +532,11 @@ void CSubProcPerTrade::ItemCountEditOK() { return; } - // Ų.. + // 돈을 감소 시킨다.. iMyMoney -= iGoldOffset; s_pPlayer->m_InfoExt.iGold = iMyMoney; - // ǥ.. κ丮.. + // 돈 표시.. 인벤토리.. szGold = ::_FormatCoins(iMyMoney); CN3UIString * pString = NULL; pString = (CN3UIString *)CGameProcedure::s_pProcMain->m_pUIInventory->GetChildByID("text_gold"); @@ -548,26 +548,26 @@ void CSubProcPerTrade::ItemCountEditOK() { m_pUIPerTradeDlg->m_pStrMyGold->SetString(szGold); } - // ǥ.. ŷ â.. + // 돈 표시.. 개인 거래 창.. iGold += iGoldOffset; pStrMy->SetString(::_FormatCoins(iGold)); - // Ѵ.. - BYTE byBuff[16]; // Ŷ .. - int iOffset = 0; // Ŷ .. + // 서버에게 전송한다.. + BYTE byBuff[16]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. - // Ŷ  .. + // 서버에게 패킷 만들어서 날림.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_PER_TRADE); CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_PER_TRADE_ADD); CAPISocket::MP_AddByte(byBuff, iOffset, 0xff); CAPISocket::MP_AddDword(byBuff, iOffset, dwGold); CAPISocket::MP_AddInt64(byBuff, iOffset, iGoldOffset); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보냄.. m_pUITradeEditDlg->SetQuantity(0); - // ¸ ȭŰ.. â ݰ.. + // 상태를 변화시키고.. 창을 닫고.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = true; m_ePerTradeState = PER_TRADE_STATE_NORMAL; m_ePerTradeItemKindBackup = PER_TRADE_ITEM_MONEY; @@ -579,7 +579,7 @@ void CSubProcPerTrade::ItemCountEditOK() { void CSubProcPerTrade::ItemCountEditCancel() { m_pUITradeEditDlg->SetQuantity(0); - // ¸ ȭŰ.. â ݰ.. + // 상태를 변화시키고.. 창을 닫고.. m_ePerTradeState = PER_TRADE_STATE_NORMAL; m_pUITradeEditDlg->Close(); @@ -588,19 +588,19 @@ void CSubProcPerTrade::ItemCountEditCancel() { /////////////////////////////////////////////////////////////////////// -void CSubProcPerTrade::PerTradeMyDecision() // ŷ ߴ.. +void CSubProcPerTrade::PerTradeMyDecision() // 내가 거래를 결정 했다.. { - // Ѵ.. - BYTE byBuff[4]; // Ŷ .. - int iOffset = 0; // Ŷ .. + // 서버에게 전송한다.. + BYTE byBuff[4]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. - // Ŷ  .. + // 서버에게 패킷 만들어서 날림.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_PER_TRADE); CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_PER_TRADE_DECIDE); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보냄.. - // ư Disable.. + // 내 결정 버튼 Disable.. CN3UIButton * pButton = (CN3UIButton *)m_pUIPerTradeDlg->GetChildButtonByName("btn_trade_my"); if (pButton) { pButton->SetState(UI_STATE_BUTTON_DISABLE); @@ -611,15 +611,15 @@ void CSubProcPerTrade::ItemCountEditCancel() { void CSubProcPerTrade::SecureJobStuffByMyDecision() { m_ePerTradeState = PER_TRADE_STATE_MY_TRADE_DECISION_DONE; - // 1. κ丮 Icon .. + // 1. 인벤토리 영역 Icon 움직임 방지.. PerTradeCoreInvDisable(); - // 2. Էâ Ŭ .. ش κ.. + // 2. 돈 입력창 클릭 방지.. 해당 부분.. - // 3. ÷ ư .. ش κ.. + // 3. 올려놓는 버튼 금지.. 해당 부분.. } -void CSubProcPerTrade::PerTradeOtherDecision() // ٸ ŷ ߴ.. +void CSubProcPerTrade::PerTradeOtherDecision() // 다른 사람이 거래를 결정 했다.. { CN3UIButton * pButtonOther = (CN3UIButton *)m_pUIPerTradeDlg->GetChildByID("btn_trade_other"); __ASSERT(pButtonOther, "NULL UI Component!!"); @@ -629,49 +629,49 @@ void CSubProcPerTrade::SecureJobStuffByMyDecision() { /////////////////////////////////////////////////////////////////////// void CSubProcPerTrade::ReceiveMsgPerTradeReq(int iOtherID) { - EnterWaitMyDecisionToPerTrade(iOtherID); // ŸοԼ ŷ û .. + EnterWaitMyDecisionToPerTrade(iOtherID); // 내가 타인에게서 아이템 거래를 신청 받은 상태.. } void CSubProcPerTrade::ReceiveMsgPerTradeAgree(BYTE bResult) { switch (bResult) { - case 0x01: // .. + case 0x01: // 성공.. ProcessProceed(PER_TRADE_RESULT_OTHER_AGREE); break; - case 0x00: // .. + case 0x00: // 실패.. LeavePerTradeState(PER_TRADE_RESULT_OTHER_DISAGREE); break; } } void CSubProcPerTrade::ReceiveMsgPerTradeAdd(BYTE bResult) { - // ¸ ȭŰ.. â ݰ.. + // 상태를 변화시키고.. 창을 닫고.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; std::string szGold; - int64_t iGold; // ŷâ .. - int64_t iMyMoney; // κ丮 .. + int64_t iGold; // 거래창의 값.. + int64_t iMyMoney; // 인벤토리의 값.. switch (bResult) { case 0x01: break; - case 0x00: // .. Ѵ.. - // ۾ .. + case 0x00: // 실패 했을 경우.. 복구한다.. + // 전에 작업한 아이템 종류가 돈인 경우.. switch (m_ePerTradeItemKindBackup) { case PER_TRADE_ITEM_MONEY: { - // ŷ â ´.. + // 거래 창의 내 현재 돈을 얻어 온다.. CN3UIString * pStrMy = (CN3UIString *)m_pUIPerTradeDlg->GetChildByID("string_money_my"); __ASSERT(pStrMy, "NULL UI Component!!"); iGold = pStrMy->GetStringAsInt({','}); - // ´.. + // 현재 내가 가진 돈을 얻어 온다.. iMyMoney = s_pPlayer->m_InfoExt.iGold; - // Ų.. + // 돈을 증가 시킨다.. iMyMoney += m_iGoldOffsetBackup; s_pPlayer->m_InfoExt.iGold = iMyMoney; - // ǥ.. κ丮.. + // 돈 표시.. 인벤토리.. szGold = ::_FormatCoins(iMyMoney); CN3UIString * pString = NULL; pString = (CN3UIString *)CGameProcedure::s_pProcMain->m_pUIInventory->GetChildByID("text_gold"); @@ -683,36 +683,36 @@ void CSubProcPerTrade::ReceiveMsgPerTradeAdd(BYTE bResult) { m_pUIPerTradeDlg->m_pStrMyGold->SetString(szGold); } - // ǥ.. ŷ â.. + // 돈 표시.. 개인 거래 창.. iGold -= m_iGoldOffsetBackup; pStrMy->SetString(::_FormatCoins(iGold)); } break; case PER_TRADE_ITEM_OTHER: { - // ۾ .. + // 전에 작업한 아이템 종류가 아이템인 경우.. if ((m_pUIPerTradeDlg->m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] ->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (m_pUIPerTradeDlg->m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] ->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) { - // Ȱ̳ .. + // 활이나 물약등 아이템인 경우.. bool bFound = false; - // κ丮 .. .. + // 인벤토리에 아이템이 없어진 경우.. 만든다.. if (!m_pUIPerTradeDlg->m_pPerTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]) { bFound = true; - // κ丮 ش.. + // 인벤토리에 만들고 아이템의 갯수를 정해준다.. __IconItemSkill *spItem, *spItemNew = NULL; spItem = m_pUIPerTradeDlg->m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]; - // 0.. + // 아이콘이 없으면 아이콘을 만드록 갯수는 0으로.. spItemNew = new __IconItemSkill; spItemNew->pItemBasic = spItem->pItemBasic; spItemNew->pItemExt = spItem->pItemExt; - spItemNew->szIconFN = spItem->szIconFN; // ̸ .. + spItemNew->szIconFN = spItem->szIconFN; // 아이콘 파일 이름 복사.. spItemNew->iCount = m_pUIPerTradeDlg->m_iBackupiCount; spItemNew->iDurability = spItem->iDurability; - // ҽ .. + // 아이콘 리소스 만들기.. spItemNew->pUIIcon = new CN3UIIcon; float fUVAspect = (float)45.0f / (float)64.0f; spItemNew->pUIIcon->Init(m_pUIPerTradeDlg); @@ -732,7 +732,7 @@ void CSubProcPerTrade::ReceiveMsgPerTradeAdd(BYTE bResult) { m_pUIPerTradeDlg->m_pPerTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = spItemNew; - // ŷâ ִ .. .. + // 내 거래창의 아이템이 있는 경우 .. 갯수 갱신.. if (m_pUIPerTradeDlg->m_iBackupiCount != m_pUIPerTradeDlg->m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] ->iCount) { @@ -741,7 +741,7 @@ void CSubProcPerTrade::ReceiveMsgPerTradeAdd(BYTE bResult) { } } - // ŷâ Կ .. Ѵ.. + // 아이콘이 내 거래창의 슬롯에 생긴경우.. 삭제한다.. if (m_pUIPerTradeDlg->m_iBackupiCount == m_pUIPerTradeDlg->m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]->iCount) { bFound = true; @@ -749,10 +749,10 @@ void CSubProcPerTrade::ReceiveMsgPerTradeAdd(BYTE bResult) { __IconItemSkill * spItem; spItem = m_pUIPerTradeDlg->m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]; - // Ŵ .. + // 매니저에서 제거.. m_pUIPerTradeDlg->RemoveChild(spItem->pUIIcon); - // ҽ .. + // 리소스 제거.. spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -760,16 +760,16 @@ void CSubProcPerTrade::ReceiveMsgPerTradeAdd(BYTE bResult) { spItem = NULL; m_pUIPerTradeDlg->m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] = NULL; - // κ丮 ִ .. .. + // 인벤토리에 아이템이 있는 경우.. 갯수 갱신.. if (m_pUIPerTradeDlg->m_pPerTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]) { m_pUIPerTradeDlg->m_pPerTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] ->iCount += m_pUIPerTradeDlg->m_iBackupiCount; } } - // Ѱ ƴϸ.. Ѵ.. + // 위에서 갯수 보정한게 아니면.. 갯수만 보정한다.. if (!bFound) { - // ŷâ κ丮 ش.. + // 내 거래창과 인벤토리의 아이템의 갯수를 정해준다.. m_pUIPerTradeDlg->m_pPerTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] ->iCount += m_pUIPerTradeDlg->m_iBackupiCount; @@ -781,10 +781,10 @@ void CSubProcPerTrade::ReceiveMsgPerTradeAdd(BYTE bResult) { spItem = CN3UIWndBase::m_sRecoveryJobInfo.pItemSource; spItem->pUIIcon->SetParent(m_pUIPerTradeDlg); - // κ丮 쿡 ϰ.. + // 인벤토리 윈도우에 세팅하고.. m_pUIPerTradeDlg->m_pPerTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = spItem; - // ŷ 쿡 Ŭ.. + // 내 거래 윈도우에서 클리어.. m_pUIPerTradeDlg->m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] = NULL; CN3UIArea * pArea; @@ -803,32 +803,32 @@ void CSubProcPerTrade::ReceiveMsgPerTradeAdd(BYTE bResult) { void CSubProcPerTrade::ReceiveMsgPerTradeOtherAdd(int iItemID, int iCount, int iDurability) { int64_t iGold; - int iDestiOrder; // ŷâ .. + int iDestiOrder; // 거래창의 값.. if (iItemID == dwGold) { - // ŷ â ٸ ´.. + // 거래 창의 다른 사람의 현재 돈을 얻어 온다.. CN3UIString * pStrOther = (CN3UIString *)m_pUIPerTradeDlg->GetChildByID("string_money_other"); __ASSERT(pStrOther, "NULL UI Component!!"); iGold = pStrOther->GetStringAsInt({','}); - // .. + // 돈을 더한 다음.. iGold += iCount; - // ǥ.. ŷ â.. + // 돈 표시.. 개인 거래 창.. pStrOther->SetString(::_FormatCoins(iGold)); } else { - //  ִ Ȯ, ڸ .. + // 아이템이 들어갈 수 있는지 확인, 아이템이 들어 가는 자리 계산.. bool bFound = false; - //  ֱ.. + // 아이템 만들어서 넣기.. __TABLE_ITEM_BASIC * pItem = NULL; __TABLE_ITEM_EXT * pItemExt = NULL; - pItem = s_pTbl_Items_Basic->Find(iItemID / 1000 * 1000); // .. + pItem = s_pTbl_Items_Basic->Find(iItemID / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { pItemExt = CGameBase::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iItemID % 1000); } if (NULL == pItem || NULL == pItemExt) { - __ASSERT(0, " ̺ !!"); + __ASSERT(0, "아이템 포인터 테이블에 없음!!"); return; } @@ -843,9 +843,9 @@ void CSubProcPerTrade::ReceiveMsgPerTradeOtherAdd(int iItemID, int iCount, int i } } - // ã.. + // 못찾았으면.. if (!bFound) { - // κ丮 󽽷 ã .. + // 인벤토리 빈슬롯을 찾아 들어간다.. for (i = 0; i < MAX_ITEM_PER_TRADE; i++) { if (!m_pUIPerTradeDlg->m_pPerTradeOther[i]) { bFound = true; @@ -854,12 +854,12 @@ void CSubProcPerTrade::ReceiveMsgPerTradeOtherAdd(int iItemID, int iCount, int i } } - if (!bFound) { // ã .. + if (!bFound) { // 빈 슬롯을 찾지 못했으면.. return; } } - if (m_pUIPerTradeDlg->m_pPerTradeOther[iDestiOrder]) // ش ġ .. + if (m_pUIPerTradeDlg->m_pPerTradeOther[iDestiOrder]) // 해당 위치에 아이콘이 있으면.. { m_pUIPerTradeDlg->m_pPerTradeOther[iDestiOrder]->iCount += iCount; } else { @@ -867,14 +867,14 @@ void CSubProcPerTrade::ReceiveMsgPerTradeOtherAdd(int iItemID, int iCount, int i e_PartPosition ePart; e_PlugPosition ePlug; CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 __IconItemSkill * spItem; spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = iCount; spItem->iDurability = iDurability; float fUVAspect = (float)45.0f / (float)64.0f; @@ -890,7 +890,7 @@ void CSubProcPerTrade::ReceiveMsgPerTradeOtherAdd(int iItemID, int iCount, int i pArea = m_pUIPerTradeDlg->GetChildAreaByiOrder(UI_AREA_TYPE_PER_TRADE_OTHER, i); if (pArea) { spItem->pUIIcon->SetRegion(pArea->GetRegion()); - // .. + // 움직일 수 없다.. RECT rect = {0, 0, 0, 0}; spItem->pUIIcon->SetMoveRect(rect); } @@ -906,21 +906,21 @@ void CSubProcPerTrade::ReceiveMsgPerTradeOtherAdd(int iItemID, int iCount, int i } if (!bFound) { - return; // ãǷ.. .. + return; // 못 찾았으므로.. 실패.. } std::string szIconFN; e_PartPosition ePart; e_PlugPosition ePlug; CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 __IconItemSkill * spItem; spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = 1; spItem->iDurability = iDurability; float fUVAspect = (float)45.0f / (float)64.0f; @@ -936,7 +936,7 @@ void CSubProcPerTrade::ReceiveMsgPerTradeOtherAdd(int iItemID, int iCount, int i pArea = m_pUIPerTradeDlg->GetChildAreaByiOrder(UI_AREA_TYPE_PER_TRADE_OTHER, i); if (pArea) { spItem->pUIIcon->SetRegion(pArea->GetRegion()); - // .. + // 움직일 수 없다.. RECT rect = {0, 0, 0, 0}; spItem->pUIIcon->SetMoveRect(rect); } @@ -965,18 +965,18 @@ void CSubProcPerTrade::ReceiveMsgPerTradeDoneSuccessBegin(int64_t iTotalGold) { void CSubProcPerTrade::ReceiveMsgPerTradeDoneItemMove(BYTE bItemPos, int iItemID, int iCount, int iDurability) { __IconItemSkill * spItem; - // κ丮 INV ߰.. - //  ִ Ȯ.. + // 아이템 인벤토리 INV 영역에 추가.. + // 아이템이 들어갈 수 있는지 확인.. if (m_pUIPerTradeDlg->m_pPerTradeInv[bItemPos] != NULL) { if (iItemID != (m_pUIPerTradeDlg->m_pPerTradeInv[bItemPos]->pItemBasic->dwID / 1000 * 1000) + (m_pUIPerTradeDlg->m_pPerTradeInv[bItemPos]->pItemExt->dwID % 1000)) { - // Ŭ.. + // 기존 아이콘을 클리어.. spItem = m_pUIPerTradeDlg->m_pPerTradeInv[bItemPos]; - // Ŵ .. + // 매니저에서 제거.. m_pUIPerTradeDlg->RemoveChild(spItem->pUIIcon); - // ҽ .. + // 리소스 제거.. spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -984,12 +984,12 @@ void CSubProcPerTrade::ReceiveMsgPerTradeDoneItemMove(BYTE bItemPos, int iItemID spItem = NULL; m_pUIPerTradeDlg->m_pPerTradeInv[bItemPos] = NULL; - // ̵ .. + // 서버가 준 아이디로 아이콘을 만든다.. goto Make_Icon; } switch (m_pUIPerTradeDlg->m_pPerTradeInv[bItemPos]->pItemBasic->byContable) { - case UIITEM_TYPE_COUNTABLE: // ȭ .. + case UIITEM_TYPE_COUNTABLE: // 화살 같은 종류.. m_pUIPerTradeDlg->m_pPerTradeInv[bItemPos]->iCount += iCount; if (m_pUIPerTradeDlg->m_pPerTradeInv[bItemPos]->iCount > UIITEM_COUNT_MANY) { m_pUIPerTradeDlg->m_pPerTradeInv[bItemPos]->iCount = UIITEM_COUNT_MANY; @@ -997,7 +997,7 @@ void CSubProcPerTrade::ReceiveMsgPerTradeDoneItemMove(BYTE bItemPos, int iItemID return; break; - case UIITEM_TYPE_COUNTABLE_SMALL: // ర .. + case UIITEM_TYPE_COUNTABLE_SMALL: // 물약같은 종류.. m_pUIPerTradeDlg->m_pPerTradeInv[bItemPos]->iCount += iCount; if (m_pUIPerTradeDlg->m_pPerTradeInv[bItemPos]->iCount > UIITEM_COUNT_FEW) { m_pUIPerTradeDlg->m_pPerTradeInv[bItemPos]->iCount = UIITEM_COUNT_FEW; @@ -1009,27 +1009,27 @@ void CSubProcPerTrade::ReceiveMsgPerTradeDoneItemMove(BYTE bItemPos, int iItemID Make_Icon: - //  ֱ.. + // 아이템 만들어서 넣기.. __TABLE_ITEM_BASIC * pItem = NULL; __TABLE_ITEM_EXT * pItemExt = NULL; - pItem = s_pTbl_Items_Basic->Find(iItemID / 1000 * 1000); // .. + pItem = s_pTbl_Items_Basic->Find(iItemID / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { pItemExt = CGameBase::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iItemID % 1000); } if (NULL == pItem || NULL == pItemExt) { - __ASSERT(0, " ̺ !!"); + __ASSERT(0, "아이템 포인터 테이블에 없음!!"); return; } std::string szIconFN; e_PartPosition ePart; e_PlugPosition ePlug; - CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, ePlug); // ۿ ̸  + CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, ePlug); // 아이템에 따른 파일 이름을 만들어서 spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = iCount; spItem->iDurability = iDurability; @@ -1057,7 +1057,7 @@ void CSubProcPerTrade::ReceiveMsgPerTradeDoneItemMove(BYTE bItemPos, int iItemID } void CSubProcPerTrade::ReceiveMsgPerTradeDoneSuccessEnd() { - // .. + // 뒷 마무리.. PerTradeCompleteSuccess(); FinalizePerTrade(); @@ -1070,24 +1070,24 @@ void CSubProcPerTrade::ReceiveMsgPerTradeDoneSuccessEnd() { } void CSubProcPerTrade::ReceiveMsgPerTradeDoneFail() { - // ޽ ڽ ؽƮ ǥ.. + // 메시지 박스 텍스트 표시.. if (s_pOPMgr->UPCGetByID(m_iOtherID, false) != NULL) { std::string szMsg; ::_LoadStringFromResource(IDS_PER_TRADE_FAIL, szMsg); CGameProcedure::s_pProcMain->MsgOutput(szMsg, 0xffffffff); - // ޽ ڽ ؽƮ ǥ.. + // 메시지 박스 텍스트 표시.. ::_LoadStringFromResource(IDS_ITEM_TOOMANY_OR_HEAVY, szMsg); CGameProcedure::s_pProcMain->MsgOutput(szMsg, 0xffff3b3b); } - // .. + // 뒷 마무리.. PerTradeCompleteCancel(); FinalizePerTrade(); } void CSubProcPerTrade::ReceiveMsgPerTradeCancel() { - // ޽ ڽ ؽƮ ǥ.. + // 메시지 박스 텍스트 표시.. if (s_pOPMgr->UPCGetByID(m_iOtherID, false) != NULL) { std::string szFmt; ::_LoadStringFromResource(IDS_OTHER_PER_TRADE_CANCEL, szFmt); @@ -1096,7 +1096,7 @@ void CSubProcPerTrade::ReceiveMsgPerTradeCancel() { CGameProcedure::s_pProcMain->MsgOutput(szBuf, 0xffff3b3b); } - // .. + // 뒷 마무리.. PerTradeCompleteCancel(); FinalizePerTrade(); } diff --git a/src/game/SubProcPerTrade.h b/src/game/SubProcPerTrade.h index 2ed43ae1..1bd846dd 100644 --- a/src/game/SubProcPerTrade.h +++ b/src/game/SubProcPerTrade.h @@ -4,33 +4,33 @@ #pragma once -enum e_PerTradeState { // ŷ .. - PER_TRADE_STATE_NONE = 0, // ƹ͵ ƴ.. - PER_TRADE_STATE_WAIT_FOR_REQ, // 濡 ûϰ ٸ.. - PER_TRADE_STATE_WAIT_FOR_MY_DECISION_AGREE_OR_DISAGREE, // 濡Լ ûް ٸ.. - PER_TRADE_STATE_NORMAL, // ŷ .. - PER_TRADE_STATE_ADD_AND_WAIT_FROM_SERVER, // ϰ ٸ.. - PER_TRARE_STATE_EDITTING, // ŷ ݾ̳ .. - PER_TRADE_STATE_MY_TRADE_DECISION_DONE, // ŷ ư .. +enum e_PerTradeState { // 아이템 개인 거래 상태.. + PER_TRADE_STATE_NONE = 0, // 아무것도 아님.. + PER_TRADE_STATE_WAIT_FOR_REQ, // 상대방에게 요청하고 응답을 기다림.. + PER_TRADE_STATE_WAIT_FOR_MY_DECISION_AGREE_OR_DISAGREE, // 상대방에게서 요청받고 내 결정을 기다림.. + PER_TRADE_STATE_NORMAL, // 아이템 개인 거래 정상적인 상태.. + PER_TRADE_STATE_ADD_AND_WAIT_FROM_SERVER, // 아이템을 더하고 서버로 부터 응답을 기다림.. + PER_TRARE_STATE_EDITTING, // 아이템 개인 거래 금액이나 갯수등 편집중.. + PER_TRADE_STATE_MY_TRADE_DECISION_DONE, // 내 거래 버튼 누른 상태.. }; -enum e_PerTradeResultCode { // ŷ Ǵ ڵ .. - PER_TRADE_RESULT_MY_DISAGREE = 0, // ŷ û ŷ û .. - PER_TRADE_RESULT_OTHER_DISAGREE, // ŷ û ŷ û .. - PER_TRADE_RESULT_MY_CANCEL, // ŷ û ŷ û .. +enum e_PerTradeResultCode { // 아이템 거래가 해제되는 코드 정의.. + PER_TRADE_RESULT_MY_DISAGREE = 0, // 거래를 신청받은 내가 거래 신청을 취소.. + PER_TRADE_RESULT_OTHER_DISAGREE, // 거래를 신청받은 상대방이 거래 신청을 취소.. + PER_TRADE_RESULT_MY_CANCEL, // 거래를 신청한 내가 거래 신청을 취소.. }; -enum e_PerTradeProceedCode { // ŷ ӵǴ ¸ .. - PER_TRADE_RESULT_MY_AGREE = 0, // ŷ û ŷ û .. - PER_TRADE_RESULT_OTHER_AGREE, // ŷ û ŷ û .. +enum e_PerTradeProceedCode { // 아이템 거래가 계속되는 상태를 정의.. + PER_TRADE_RESULT_MY_AGREE = 0, // 거래를 신청받은 내가 거래 신청을 허락.. + PER_TRADE_RESULT_OTHER_AGREE, // 거래를 신청받은 상대방이 거래 신청을 허락.. }; enum e_PerTradeItemKindBackup { - PER_TRADE_ITEM_MONEY = 0, // ŷâ ADD ̴.. - PER_TRADE_ITEM_OTHER, // ŷâ ADD ̴.. + PER_TRADE_ITEM_MONEY = 0, // 전에 개인 거래창으로 ADD한 것이 돈이다.. + PER_TRADE_ITEM_OTHER, // 전에 개인 거래창으로 ADD한 것이 아이템이다.. }; -const DWORD dwGold = 900000000; // ... +const DWORD dwGold = 900000000; // 음... class CUIManager; class CUIPerTradeDlg; @@ -60,13 +60,13 @@ class CSubProcPerTrade : public CGameBase { void InitPerTradeDlg(CUIManager * pUIManager); - void EnterWaitMsgFromServerStatePerTradeReq(); // ŷ Ÿο û .. - void EnterWaitMsgFromServerStatePerTradeReq(std::string szName); // ŷ Ÿο û .. - void EnterWaitMyDecisionToPerTrade(int iOtherID); // ŸοԼ ŷ û .. - void LeavePerTradeState(e_PerTradeResultCode ePTRC); // ŷ ° Ǵ ڵ.. - void ProcessProceed(e_PerTradeProceedCode ePTPC); // ŷ ӵǴ ¸ .. + void EnterWaitMsgFromServerStatePerTradeReq(); // 내가 아이템 거래를 타인에게 신청한 상태.. + void EnterWaitMsgFromServerStatePerTradeReq(std::string szName); // 내가 아이템 거래를 타인에게 신청한 상태.. + void EnterWaitMyDecisionToPerTrade(int iOtherID); // 내가 타인에게서 아이템 거래를 신청 받은 상태.. + void LeavePerTradeState(e_PerTradeResultCode ePTRC); // 아이템 거래 상태가 해제되는 코드.. + void ProcessProceed(e_PerTradeProceedCode ePTPC); // 아이템 거래가 계속되는 상태를 정의.. - void SecureCodeBegin(); // ȣ ڵ.. + void SecureCodeBegin(); // 보호 코드.. void PerTradeCoreStart(); void PerTradeCoreInvDisable(); @@ -75,12 +75,12 @@ class CSubProcPerTrade : public CGameBase { void ItemCountEditOK(); void ItemCountEditCancel(); - void FinalizePerTrade(); // ״ ó.. - void PerTradeCompleteSuccess(); // ŷ .. - void PerTradeCompleteCancel(); // ŷ .. + void FinalizePerTrade(); // 말 그대로 최종 뒷처리.. + void PerTradeCompleteSuccess(); // 개인 거래 최종 성공.. + void PerTradeCompleteCancel(); // 개인 거래 취소.. - void PerTradeMyDecision(); // ŷ ߴ.. - void PerTradeOtherDecision(); // ٸ ŷ ߴ.. + void PerTradeMyDecision(); // 내가 거래를 결정 했다.. + void PerTradeOtherDecision(); // 다른 사람이 거래를 결정 했다.. void SecureJobStuffByMyDecision(); diff --git a/src/game/UICharacterCreate.cpp b/src/game/UICharacterCreate.cpp index 95e89762..75182c38 100644 --- a/src/game/UICharacterCreate.cpp +++ b/src/game/UICharacterCreate.cpp @@ -65,7 +65,7 @@ void CUICharacterCreate::Release() { bool CUICharacterCreate::Load(HANDLE hFile) { CN3UIBase::Load(hFile); - // ij ʱȭ.. + // 캐릭터 초기화.. __InfoPlayerBase * pInfoBase = &(CGameBase::s_pPlayer->m_InfoBase); __InfoPlayerMySelf * pInfoExt = &(CGameBase::s_pPlayer->m_InfoExt); @@ -195,7 +195,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { __InfoPlayerBase * pInfoBase = &(CGameBase::s_pPlayer->m_InfoBase); __InfoPlayerMySelf * pInfoExt = &(CGameBase::s_pPlayer->m_InfoExt); - // .. + //종족 고르기.. e_Nation eNation = pInfoBase->eNation; e_Race eRacePrev = pInfoBase->eRace; bool bNeedUpdateRaceButtons = false; @@ -226,10 +226,10 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } } - if (bNeedUpdateRaceButtons) // ٲ.. + if (bNeedUpdateRaceButtons) // 몬가 바뀌었으면.. { - if (eRacePrev != pInfoBase->eRace) { // ٲ.. - CGameProcedure::s_pProcCharacterCreate->SetChr(); // ij .. + if (eRacePrev != pInfoBase->eRace) { // 종족을 바꿨을때만.. + CGameProcedure::s_pProcCharacterCreate->SetChr(); // 캐릭터 세팅.. } this->UpdateRaceAndClassButtons(pInfoBase->eRace); } @@ -239,12 +239,12 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (pSender->m_szID == "btn_cancel") { CGameProcedure::ProcActiveSet( - (CGameProcedure *)CGameProcedure::s_pProcCharacterSelect); // ij ν Ѵ.. + (CGameProcedure *)CGameProcedure::s_pProcCharacterSelect); // 캐릭터 선택 프로시저로 한다.. return true; } else if (pSender->m_szID == "btn_create" && m_pEdit_Name) { - CGameBase::s_pPlayer->IDSet(0, m_pEdit_Name->GetString(), 0); // ̸ ־ְ... - return CGameProcedure::s_pProcCharacterCreate->MsgSendCharacterCreate(); // ij ޽ ... - } else if (pSender == m_pBtn_Face_Left) // + CGameBase::s_pPlayer->IDSet(0, m_pEdit_Name->GetString(), 0); // 이름을 넣어주고... + return CGameProcedure::s_pProcCharacterCreate->MsgSendCharacterCreate(); // 캐릭터 만들기 메시지 보내기... + } else if (pSender == m_pBtn_Face_Left) // 얼굴 { pInfoExt->iFace--; if (pInfoExt->iFace < 0) { @@ -255,7 +255,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (pInfoExt->iFace > 3) { pInfoExt->iFace = 3; } - } else if (pSender == m_pBtn_Hair_Left) // Ӹī.. + } else if (pSender == m_pBtn_Hair_Left) // 머리카락.. { pInfoExt->iHair--; if (pInfoExt->iHair < 0) { @@ -269,15 +269,15 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } if (iFacePrev != pInfoExt->iFace) { - CGameBase::s_pPlayer->InitFace(); // ٲ.. + CGameBase::s_pPlayer->InitFace(); // 얼굴이 바뀌면.. } if (iHairPrev != pInfoExt->iHair) { - CGameBase::s_pPlayer->InitHair(); // Ӹī ٲ.. + CGameBase::s_pPlayer->InitHair(); // 머리카락이 바뀌면.. } - // .. + //직업 고르기.. bool bNeedUpdateClassButton = false; - if (pSender == m_pBtn_Classes[0]) // + if (pSender == m_pBtn_Classes[0]) // 전사 { if (NATION_KARUS == eNation) { pInfoBase->eClass = CLASS_KA_WARRIOR; @@ -285,7 +285,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { pInfoBase->eClass = CLASS_EL_WARRIOR; } bNeedUpdateClassButton = true; - } else if (pSender == m_pBtn_Classes[1]) // α + } else if (pSender == m_pBtn_Classes[1]) // 로그 { if (NATION_KARUS == eNation) { pInfoBase->eClass = CLASS_KA_ROGUE; @@ -293,7 +293,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { pInfoBase->eClass = CLASS_EL_ROGUE; } bNeedUpdateClassButton = true; - } else if (pSender == m_pBtn_Classes[2]) // + } else if (pSender == m_pBtn_Classes[2]) // 마법사 { if (NATION_KARUS == eNation) { pInfoBase->eClass = CLASS_KA_WIZARD; @@ -301,7 +301,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { pInfoBase->eClass = CLASS_EL_WIZARD; } bNeedUpdateClassButton = true; - } else if (pSender == m_pBtn_Classes[3]) // + } else if (pSender == m_pBtn_Classes[3]) // 사제 { if (NATION_KARUS == eNation) { pInfoBase->eClass = CLASS_KA_PRIEST; @@ -315,8 +315,8 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { this->UpdateClassButtons(pInfoBase->eClass); } - //ġ ø.. - if (pSender->m_szID == "btn_str_right") // + //수치 올리기.. + if (pSender->m_szID == "btn_str_right") // 힘 { if (m_iBonusPoint > 0) { pInfoExt->iStrength++; @@ -329,7 +329,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { m_pStr_Bonus->SetStringAsInt(m_iBonusPoint); } } - } else if (pSender->m_szID == "btn_sta_right") // ü + } else if (pSender->m_szID == "btn_sta_right") // 체력 { if (m_iBonusPoint > 0) { pInfoExt->iStamina++; @@ -342,7 +342,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { m_pStr_Bonus->SetStringAsInt(m_iBonusPoint); } } - } else if (pSender->m_szID == "btn_dex_right") // ø + } else if (pSender->m_szID == "btn_dex_right") // 민첩 { if (m_iBonusPoint > 0) { pInfoExt->iDexterity++; @@ -355,7 +355,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { m_pStr_Bonus->SetStringAsInt(m_iBonusPoint); } } - } else if (pSender->m_szID == "btn_int_right") // + } else if (pSender->m_szID == "btn_int_right") // 지능 { if (m_iBonusPoint > 0) { pInfoExt->iIntelligence++; @@ -368,7 +368,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { m_pStr_Bonus->SetStringAsInt(m_iBonusPoint); } } - } else if (pSender->m_szID == "btn_map_right") // + } else if (pSender->m_szID == "btn_map_right") // 마력 { if (m_iBonusPoint > 0) { pInfoExt->iMagicAttak++; @@ -385,8 +385,8 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { __TABLE_NEW_CHR * pTbl = CGameProcedure::s_pProcCharacterCreate->m_Tbl_InitValue.Find(pInfoBase->eRace); if (pTbl) { - //ġ .. - if (pSender->m_szID == "btn_str_left") // + //수치 내리기.. + if (pSender->m_szID == "btn_str_left") // 힘 { if (m_iBonusPoint < m_iMaxBonusPoint && pInfoExt->iStrength > pTbl->iStr) { pInfoExt->iStrength--; @@ -399,7 +399,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { m_pStr_Bonus->SetStringAsInt(m_iBonusPoint); } } - } else if (pSender->m_szID == "btn_sta_left") // ü + } else if (pSender->m_szID == "btn_sta_left") // 체력 { if (m_iBonusPoint < m_iMaxBonusPoint && pInfoExt->iStamina > pTbl->iSta) { pInfoExt->iStamina--; @@ -412,7 +412,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { m_pStr_Bonus->SetStringAsInt(m_iBonusPoint); } } - } else if (pSender->m_szID == "btn_dex_left") // ø + } else if (pSender->m_szID == "btn_dex_left") // 민첩 { if (m_iBonusPoint < m_iMaxBonusPoint && pInfoExt->iDexterity > pTbl->iDex) { pInfoExt->iDexterity--; @@ -425,7 +425,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { m_pStr_Bonus->SetStringAsInt(m_iBonusPoint); } } - } else if (pSender->m_szID == "btn_int_left") // + } else if (pSender->m_szID == "btn_int_left") // 지능 { if (m_iBonusPoint < m_iMaxBonusPoint && pInfoExt->iIntelligence > pTbl->iInt) { pInfoExt->iIntelligence--; @@ -438,7 +438,7 @@ bool CUICharacterCreate::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { m_pStr_Bonus->SetStringAsInt(m_iBonusPoint); } } - } else if (pSender->m_szID == "btn_map_left") // + } else if (pSender->m_szID == "btn_map_left") // 마력 { if (m_iBonusPoint < m_iMaxBonusPoint && pInfoExt->iMagicAttak > pTbl->iMAP) { pInfoExt->iMagicAttak--; @@ -518,27 +518,27 @@ DWORD CUICharacterCreate::MouseProc(DWORD dwFlags, const POINT & ptCur, const PO return CN3UIBase::MouseProc(dwFlags, ptCur, ptOld); } -void CUICharacterCreate::UpdateRaceAndClassButtons(e_Race eRace) // ư ٽ .. +void CUICharacterCreate::UpdateRaceAndClassButtons(e_Race eRace) // 종족에 따라 직업 버튼 다시 설정.. { - eUI_STATE eUIStateRaces[4] = {UI_STATE_BUTTON_NORMAL, // 0 + eUI_STATE eUIStateRaces[4] = {UI_STATE_BUTTON_NORMAL, // 종족 0 UI_STATE_BUTTON_NORMAL, UI_STATE_BUTTON_NORMAL, UI_STATE_BUTTON_NORMAL}; - eUI_STATE eUIStateClasses[4] = {UI_STATE_BUTTON_DISABLE, // 0 + eUI_STATE eUIStateClasses[4] = {UI_STATE_BUTTON_DISABLE, // 직업 0 UI_STATE_BUTTON_DISABLE, UI_STATE_BUTTON_DISABLE, UI_STATE_BUTTON_DISABLE}; switch (eRace) { - case RACE_EL_BABARIAN: // 縸 + case RACE_EL_BABARIAN: // 전사만 가능 eUIStateRaces[0] = UI_STATE_BUTTON_DOWN; eUIStateClasses[0] = UI_STATE_BUTTON_NORMAL; break; - case RACE_EL_MAN: // + case RACE_EL_MAN: // 모든 직업 가능 eUIStateRaces[1] = UI_STATE_BUTTON_DOWN; eUIStateClasses[0] = UI_STATE_BUTTON_NORMAL; eUIStateClasses[1] = UI_STATE_BUTTON_NORMAL; eUIStateClasses[2] = UI_STATE_BUTTON_NORMAL; eUIStateClasses[3] = UI_STATE_BUTTON_NORMAL; break; - case RACE_EL_WOMEN: // + case RACE_EL_WOMEN: // 모든 직업 가능 eUIStateRaces[2] = UI_STATE_BUTTON_DOWN; eUIStateClasses[0] = UI_STATE_BUTTON_NORMAL; eUIStateClasses[1] = UI_STATE_BUTTON_NORMAL; @@ -546,20 +546,20 @@ DWORD CUICharacterCreate::MouseProc(DWORD dwFlags, const POINT & ptCur, const PO eUIStateClasses[3] = UI_STATE_BUTTON_NORMAL; break; - case RACE_KA_ARKTUAREK: // 縸 + case RACE_KA_ARKTUAREK: // 전사만 가능 eUIStateRaces[0] = UI_STATE_BUTTON_DOWN; eUIStateClasses[0] = UI_STATE_BUTTON_NORMAL; break; - case RACE_KA_TUAREK: // α, + case RACE_KA_TUAREK: // 로그, 사제 가능 eUIStateRaces[1] = UI_STATE_BUTTON_DOWN; eUIStateClasses[1] = UI_STATE_BUTTON_NORMAL; eUIStateClasses[3] = UI_STATE_BUTTON_NORMAL; break; - case RACE_KA_WRINKLETUAREK: // 縸 .. + case RACE_KA_WRINKLETUAREK: // 마법사만 가능.. eUIStateRaces[2] = UI_STATE_BUTTON_DOWN; eUIStateClasses[2] = UI_STATE_BUTTON_NORMAL; break; - case RACE_KA_PURITUAREK: // .. + case RACE_KA_PURITUAREK: // 사제만 가능.. eUIStateRaces[3] = UI_STATE_BUTTON_DOWN; eUIStateClasses[3] = UI_STATE_BUTTON_NORMAL; break; @@ -568,7 +568,7 @@ DWORD CUICharacterCreate::MouseProc(DWORD dwFlags, const POINT & ptCur, const PO break; } - // ⺻ ǵ ʱȭ.. + // 기본 요건들 초기화.. __InfoPlayerBase * pInfoBase = &(CGameBase::s_pPlayer->m_InfoBase); pInfoBase->eRace = eRace; pInfoBase->eClass = CLASS_UNKNOWN; @@ -595,7 +595,7 @@ DWORD CUICharacterCreate::MouseProc(DWORD dwFlags, const POINT & ptCur, const PO } void CUICharacterCreate::UpdateClassButtons(e_Class eClass) { - eUI_STATE eUIStates[MAX_CLASS_SELECT] = {UI_STATE_BUTTON_NORMAL, // 0 + eUI_STATE eUIStates[MAX_CLASS_SELECT] = {UI_STATE_BUTTON_NORMAL, // 직업 0 UI_STATE_BUTTON_NORMAL, UI_STATE_BUTTON_NORMAL, UI_STATE_BUTTON_NORMAL}; bool bVisibles[MAX_STATS] = {false, false, false, false, false}; @@ -604,26 +604,26 @@ void CUICharacterCreate::UpdateClassButtons(e_Class eClass) { case CLASS_EL_WARRIOR: case CLASS_KA_WARRIOR: eUIStates[0] = UI_STATE_BUTTON_DOWN; - bVisibles[0] = true; // - bVisibles[1] = true; // ü + bVisibles[0] = true; // 힘 + bVisibles[1] = true; // 체력 break; case CLASS_EL_ROGUE: case CLASS_KA_ROGUE: eUIStates[1] = UI_STATE_BUTTON_DOWN; - bVisibles[0] = true; // - bVisibles[2] = true; // ø + bVisibles[0] = true; // 힘 + bVisibles[2] = true; // 민첩 break; case CLASS_EL_WIZARD: case CLASS_KA_WIZARD: eUIStates[2] = UI_STATE_BUTTON_DOWN; - bVisibles[3] = true; // - bVisibles[4] = true; // + bVisibles[3] = true; // 지능 + bVisibles[4] = true; // 마력 break; case CLASS_EL_PRIEST: case CLASS_KA_PRIEST: eUIStates[3] = UI_STATE_BUTTON_DOWN; - bVisibles[0] = true; // - bVisibles[3] = true; // + bVisibles[0] = true; // 힘 + bVisibles[3] = true; // 지능 break; } diff --git a/src/game/UICharacterCreate.h b/src/game/UICharacterCreate.h index b3526745..a98440a5 100644 --- a/src/game/UICharacterCreate.h +++ b/src/game/UICharacterCreate.h @@ -13,7 +13,7 @@ class CN3UIImage; const int MAX_RACE_SELECT = 4; const int MAX_CLASS_SELECT = 4; -const int MAX_STATS = 5; // , ü, ø, , +const int MAX_STATS = 5; // 힘, 체력, 민첩, 지능, 마력 class CUICharacterCreate : public CN3UIBase { public: diff --git a/src/game/UICharacterSelect.cpp b/src/game/UICharacterSelect.cpp index b23400c2..205b7c4c 100644 --- a/src/game/UICharacterSelect.cpp +++ b/src/game/UICharacterSelect.cpp @@ -48,7 +48,7 @@ bool CUICharacterSelect::Load(HANDLE hFile) { m_pBtnDelete = this->GetChildByID("bt_delete"); __ASSERT(m_pBtnDelete, "NULL UI Component!!"); - // ġ ȭ ػ󵵿 ° ٲٱ... + // 위치를 화면 해상도에 맞게 바꾸기... POINT pt; RECT rc = this->GetRegion(); float fRatio = (float)s_CameraData.vp.Width / (rc.right - rc.left); @@ -110,7 +110,7 @@ bool CUICharacterSelect::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { CGameProcedure::s_pProcCharacterSelect->DojobRight(); } else if (pSender->m_szID == "bt_exit") // Elmorad { - // CGameProcedure::ProcActiveSet((CGameProcedure*)CGameProcedure::s_pProcLogIn); // α ư.. + // CGameProcedure::ProcActiveSet((CGameProcedure*)CGameProcedure::s_pProcLogIn); // 로그인으로 돌아간다.. std::string szMsg; ::_LoadStringFromResource(IDS_CONFIRM_EXIT_GAME, szMsg); CGameProcedure::MessageBoxPost(szMsg, "", MB_YESNO, BEHAVIOR_EXIT); @@ -187,7 +187,7 @@ DWORD CUICharacterSelect::MouseProc(DWORD dwFlags, const POINT & ptCur, const PO return dwRet; } - // UI ̴ ڵ + // UI 움직이는 코드 if (UI_STATE_COMMON_MOVE == m_eState) { if (dwFlags & UI_MOUSE_LBCLICKED) { SetState(UI_STATE_COMMON_NONE); @@ -198,13 +198,13 @@ DWORD CUICharacterSelect::MouseProc(DWORD dwFlags, const POINT & ptCur, const PO return dwRet; } - if (false == IsIn(ptCur.x, ptCur.y)) // ̸ + if (false == IsIn(ptCur.x, ptCur.y)) // 영역 밖이면 { if (false == IsIn(ptOld.x, ptOld.y)) { - return dwRet; // ǥ ̸ + return dwRet; // 이전 좌표도 영역 밖이면 } } else { - // tool tip + // tool tip 관련 if (s_pTooltipCtrl) { s_pTooltipCtrl->SetText(m_szToolTip); } @@ -214,18 +214,18 @@ DWORD CUICharacterSelect::MouseProc(DWORD dwFlags, const POINT & ptCur, const PO return dwRet; } - // child ޼ + // child에게 메세지 전달 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); DWORD dwChildRet = pChild->MouseProc(dwFlags, ptCur, ptOld); - if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // ̰쿡 հ Ŀ ̴. + if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // 이경우에는 먼가 포커스를 받은 경우이다. dwRet |= (UI_MOUSEPROC_CHILDDONESOMETHING | UI_MOUSEPROC_DONESOMETHING); return dwRet; } } - // UI ̴ ڵ + // UI 움직이는 코드 if (UI_STATE_COMMON_MOVE != m_eState && PtInRect(&m_rcMovable, ptCur) && (dwFlags & UI_MOUSE_LBCLICK)) { SetState(UI_STATE_COMMON_MOVE); dwRet |= UI_MOUSEPROC_DONESOMETHING; diff --git a/src/game/UIChat.cpp b/src/game/UIChat.cpp index b3e52eb1..de6bcabe 100644 --- a/src/game/UIChat.cpp +++ b/src/game/UIChat.cpp @@ -17,7 +17,7 @@ // Construction/Destruction ////////////////////////////////////////////////////////////////////// -CUIChat::CUIChat() // ıڿ Release ҷ ֳ?? +CUIChat::CUIChat() //생성자 와 파괴자에서 Release안 불러 주나?? { m_pChatOut = NULL; m_pScrollbar = NULL; @@ -51,7 +51,7 @@ CUIChat::~CUIChat() { if (m_ppUILines) { delete[] m_ppUILines; m_ppUILines = NULL; - } // m_ppUILines[n] ʹ ޸ ҴǾ ־ θ ɶ ڵ ϹǷ Ѵ. + } // m_ppUILines[n]의 포인터는 메모리 할당되어 있어도 부모가 해제될때 자동으로 해제하므로 안지워야 한다. ChatListItor itor; // for(int i = 0; i < CHAT_BUFFER_COUNT; i++) @@ -91,7 +91,7 @@ void CUIChat::Release() { if (m_ppUILines) { delete[] m_ppUILines; m_ppUILines = NULL; - } // m_ppUILines[n] ʹ ޸ ҴǾ ־ θ ɶ ڵ ϹǷ Ѵ. + } // m_ppUILines[n]의 포인터는 메모리 할당되어 있어도 부모가 해제될때 자동으로 해제하므로 안지워야 한다. ZeroMemory(&m_rcChatOutRegion, sizeof(m_rcChatOutRegion)); ChatListItor itor; @@ -153,12 +153,12 @@ bool CUIChat::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } if (N3_CHAT_UNKNOWN != eCM) { - this->ChangeChattingMode(eCM); // ä 尡 ٲ.. + this->ChangeChattingMode(eCM); // 채팅 모드가 바뀌면.. } } else if (dwMsg == UIMSG_SCROLLBAR_POS) { - // ũѹٿ ´ ä Line + // 스크롤바에 맞는 채팅 Line 설정 int iCurLinePos = m_pScrollbar->GetCurrentPos(); SetTopLine(iCurLinePos); } @@ -166,10 +166,10 @@ bool CUIChat::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { //son, chat_in else if (dwMsg == UIMSG_EDIT_RETURN) { CN3UIEdit * pEdit = (CN3UIEdit *)pSender; - //ä m_pEdit->SetString(""); ع Ŀ m_pEdit->GetString();ؼ Ͱ - // ȿ Ͱ ǹǷ .. + //채팅 m_pEdit->SetString(""); 해버린 후에는 m_pEdit->GetString();해서 얻어온 포인터가 + // 유효하지 않은 포인터가 되므로 주의.. - // buffer īص. + // buffer에 카피해둠. m_szString = m_pEdit->GetString(); int iStrLen = m_szString.size(); if (iStrLen > 0) { @@ -182,13 +182,13 @@ bool CUIChat::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { CGameProcedure::s_pProcMain->MsgSend_ChatSelectTarget(szID); CGameProcedure::s_pProcMain->MsgSend_Chat(N3_CHAT_PRIVATE, &(m_szString[1])); } - } else if (iStrLen > 1 && '#' == m_szString[0]) // Ƽ + } else if (iStrLen > 1 && '#' == m_szString[0]) // 파티 { CGameProcedure::s_pProcMain->MsgSend_Chat(N3_CHAT_PARTY, &(m_szString[1])); - } else if (iStrLen > 1 && '$' == m_szString[0]) // Ŭ + } else if (iStrLen > 1 && '$' == m_szString[0]) // 클랜 { CGameProcedure::s_pProcMain->MsgSend_Chat(N3_CHAT_CLAN, &(m_szString[1])); - } else if (iStrLen > 1 && '!' == m_szString[0]) // ġ + } else if (iStrLen > 1 && '!' == m_szString[0]) // 외치기 { CGameProcedure::s_pProcMain->MsgSend_Chat(N3_CHAT_SHOUT, &(m_szString[1])); } else { @@ -197,7 +197,7 @@ bool CUIChat::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } } - // ȭ鿡 ǥõǴ ۾ . + // 화면에 표시되는 글씨는 지운다. // this->SetString(""); // ::SetWindowText(s_hWndEdit, ""); @@ -220,7 +220,7 @@ void CUIChat::CreateLines() { m_ppUILines = NULL; } SIZE size; - if (m_pChatOut && m_pChatOut->GetTextExtent("", lstrlen(""), &size) && size.cy > 0) { + if (m_pChatOut && m_pChatOut->GetTextExtent("가", lstrlen("가"), &size) && size.cy > 0) { m_iChatLineCount = (m_rcChatOutRegion.bottom - m_rcChatOutRegion.top) / size.cy; } else { return; @@ -260,12 +260,12 @@ bool CUIChat::Load(HANDLE hFile) { m_rcChatOutRegion = m_pChatOut->GetRegion(); CreateLines(); - __ASSERT(0 < m_iChatLineCount, "äâ ʹ ۾ƿ"); + __ASSERT(0 < m_iChatLineCount, "채팅창이 너무 작아요"); //son, chat_in m_pEdit = (CN3UIEdit *)GetChildByID("edit0"); __ASSERT(m_pEdit, "NULL UI Component!!"); - m_pEdit->SetMaxString(256); // ä ڿ .. + m_pEdit->SetMaxString(256); // 채팅 문자열 길이 제한.. //son, chat_in m_pBtn_Normal = GetChildByID("btn_normal"); @@ -283,7 +283,7 @@ bool CUIChat::Load(HANDLE hFile) { // TODO: Implement chat modes. UI has multiple btn_check_. //m_pBtn_Check = GetChildByID("btn_check"); __ASSERT(m_pBtn_Check, "NULL UI Component!!"); - this->ChangeChattingMode(N3_CHAT_NORMAL); // ä ̴.. + this->ChangeChattingMode(N3_CHAT_NORMAL); // 보통 채팅 모드이다.. return true; } @@ -343,14 +343,14 @@ void CUIChat::AddChatMsg(e_ChatMode eCM, const std::string & szString, D3DCOLOR // break; // } - // Ϲ ChatBuffer ֱ + // 일반 ChatBuffer에 넣기 // if(CHAT_BUFFER_NORMAL != eCB) // { __ChatInfo * pChatInfo = new __ChatInfo(szString, color); // m_ChatBuffers[CHAT_BUFFER_NORMAL].push_back(pChatInfo); m_ChatBuffer.push_back(pChatInfo); - // if (m_ChatBuffers[CHAT_BUFFER_NORMAL].size() > 255) // 255 տ - if (m_ChatBuffer.size() > 255) // 255 տ + // if (m_ChatBuffers[CHAT_BUFFER_NORMAL].size() > 255) // 255개가 넘으면 앞에서부터 지우기 + if (m_ChatBuffer.size() > 255) // 255개가 넘으면 앞에서부터 지우기 { // __ChatInfo* pTemp = m_ChatBuffers[CHAT_BUFFER_NORMAL].front(); __ChatInfo * pTemp = m_ChatBuffer.front(); @@ -361,36 +361,36 @@ void CUIChat::AddChatMsg(e_ChatMode eCM, const std::string & szString, D3DCOLOR // m_ChatBuffers[CHAT_BUFFER_NORMAL].pop_front(); m_ChatBuffer.pop_front(); } - // this->AddLineBuffer(CHAT_BUFFER_NORMAL, szString, color); // line buffer ֱ - this->AddLineBuffer(szString, color); // line buffer ֱ + // this->AddLineBuffer(CHAT_BUFFER_NORMAL, szString, color); // line buffer 에 넣기 + this->AddLineBuffer(szString, color); // line buffer 에 넣기 // } - // ChatBuffer ֱ + // ChatBuffer에 넣기 // __ChatInfo* pChatInfo = new __ChatInfo(szString, color); // m_ChatBuffers[eCB].push_back(pChatInfo); - // if (m_ChatBuffers[eCB].size() > 255) // 255 տ + // if (m_ChatBuffers[eCB].size() > 255) // 255개가 넘으면 앞에서부터 지우기 // { // __ChatInfo* pTemp = m_ChatBuffers[eCB].front(); // if (pTemp) delete pTemp; // // m_ChatBuffers[eCB].pop_front(); // } - // this->AddLineBuffer(eCB, szString, color); // line buffer ֱ + // this->AddLineBuffer(eCB, szString, color); // line buffer 에 넣기 - this->AdjustScroll(); // ũ ũ ġ .. + this->AdjustScroll(); // 스크롤 바 및 스크롤 위치등 조정.. } void CUIChat::AdjustScroll() { - // Line buffer - int iCurLinePos = m_pScrollbar->GetCurrentPos(); // scroll bar Ű ִ line + // Line buffer 갯수 조절 + int iCurLinePos = m_pScrollbar->GetCurrentPos(); // 현재 scroll bar가 가리키고 있는 line BOOL bAutoScroll = (m_pScrollbar->GetMaxPos() == iCurLinePos) ? TRUE : FALSE; - // while (m_LineBuffers[m_eChatBuffer].size() > MAX_CHAT_LINES && 0 < iCurLinePos) // MAX_CHAT_LINES ִ line ( ũѹٰ 0 line Ƿ 500 ѱ ִ) + // while (m_LineBuffers[m_eChatBuffer].size() > MAX_CHAT_LINES && 0 < iCurLinePos) // MAX_CHAT_LINES은 최대 line의 수 (단 스크롤바가 0인 곳에 있으면 line을 지우지 않으므로 500개를 넘길 수 있다) while ( m_LineBuffer.size() > MAX_CHAT_LINES && - 0 < iCurLinePos) // MAX_CHAT_LINES ִ line ( ũѹٰ 0 line Ƿ 500 ѱ ִ) + 0 < iCurLinePos) // MAX_CHAT_LINES은 최대 line의 수 (단 스크롤바가 0인 곳에 있으면 line을 지우지 않으므로 500개를 넘길 수 있다) { - // + // 한줄 지우기 // __ChatInfo* pTemp = m_LineBuffers[m_eChatBuffer].front(); __ChatInfo * pTemp = m_LineBuffer.front(); if (pTemp) { @@ -407,9 +407,9 @@ void CUIChat::AdjustScroll() { if (iMaxScrollPos < 0) { iMaxScrollPos = 0; } - m_pScrollbar->SetRange(0, iMaxScrollPos); // scroll bar range + m_pScrollbar->SetRange(0, iMaxScrollPos); // scroll bar range 설정 - // ڵ ũ̸ + // 자동으로 스크롤이면 if (bAutoScroll) { iCurLinePos = iMaxScrollPos; } @@ -417,10 +417,10 @@ void CUIChat::AdjustScroll() { iCurLinePos = 0; } - // ũѹ ġ 缳 + // 스크롤바 현재 위치 재설정 m_pScrollbar->SetCurrentPos(iCurLinePos); - // ũѹٿ ´ ä Line + // 스크롤바에 맞는 채팅 Line 설정 SetTopLine(iCurLinePos); } @@ -433,7 +433,7 @@ void CUIChat::AddLineBuffer(const std::string & szString, D3DCOLOR color) { __ASSERT(m_pChatOut, ""); const int iStrLen = szString.size(); - // line buffer ֱ + // line buffer 넣기 SIZE size; if (FALSE == m_pChatOut->GetTextExtent(szString, iStrLen, &size)) { __ASSERT(0, "no device context"); @@ -442,7 +442,7 @@ void CUIChat::AddLineBuffer(const std::string & szString, D3DCOLOR color) { const int iRegionWidth = m_rcChatOutRegion.right - m_rcChatOutRegion.left; - // ڸ ڵ,  ڴ ڸ ؿ ٿ.. + // 글자 자르는 코드, 영역 밖으로 벗어나는 글자는 자르고 밑에 줄에.. int iCX = 0; int iCount = 0; int iLineStart = 0; @@ -459,7 +459,7 @@ void CUIChat::AddLineBuffer(const std::string & szString, D3DCOLOR color) { int iLineLength = iCount - iLineStart + 1; std::string szLine; pLineInfo->szChat = szString.substr(iLineStart, iLineLength); - } // ӵ \n pszLine = NULL ִ. + } // 연속된 \n일 경우 pszLine = NULL이 될 수 있다. ++iCount; iLineStart = iCount; @@ -467,16 +467,16 @@ void CUIChat::AddLineBuffer(const std::string & szString, D3DCOLOR color) { } else { int iCC = 0; if (0x80 & szString[iCount]) { - iCC = 2; // 2BYTE + iCC = 2; // 2BYTE 문자 } else { - iCC = 1; // 1BYTE + iCC = 1; // 1BYTE 문자 } BOOL bFlag = m_pChatOut->GetTextExtent(&(szString[iCount]), iCC, &size); __ASSERT(bFlag, "cannot get size of dfont"); - if ((iCX + size.cx) > iRegionWidth) // ̰ Ѿ + if ((iCX + size.cx) > iRegionWidth) // 가로 길이가 넘었으면 { - // ߰ϱ + // 한 라인 더 추가하기 int iLineLength = iCount - iLineStart; if (iLineLength > 0) { @@ -487,19 +487,19 @@ void CUIChat::AddLineBuffer(const std::string & szString, D3DCOLOR color) { pLineInfo->color = color; pLineInfo->szChat = szString.substr(iLineStart, iLineLength); } else { - __ASSERT(iRegionWidth > 15, "ʹ Ƽ ѱڵ "); + __ASSERT(iRegionWidth > 15, "너무 좁아서 한글자도 찍을 수가 없다"); break; } iLineStart = iCount; iCX = 0; } - // ϱ + // 글자 더하기 iCount += iCC; iCX += size.cx; } } - // ó + // 맨 마지막 출 처리 int iLineLength = iStrLen - iLineStart; if (iLineLength > 0) { __ChatInfo * pLineInfo = new __ChatInfo; @@ -524,7 +524,7 @@ void CUIChat::SetTopLine(int iTopLine) { iTopLine = iLineBufferSize; } - // ټ ʷ ӽùۿ ϰ string + // 앞줄서부터 차례로 임시버퍼에 저장하고 string 길이 측정 __ChatInfo ** ppLineInfos = new __ChatInfo *[m_iChatLineCount]; ZeroMemory(ppLineInfos, sizeof(__ChatInfo *) * m_iChatLineCount); @@ -539,8 +539,8 @@ void CUIChat::SetTopLine(int iTopLine) { } __ASSERT(m_ppUILines, "null pointer"); - // տ ° ʷ ۿ ֱ - int iRealLine = i; // µǴ + // 앞에서부터 맞게 차례로 각각 버퍼에 넣기 + int iRealLine = i; // 실제 출력되는 줄 수 int iRealLineCount = 0; for (int i = 0; i < iRealLine; ++i) { ++iRealLineCount; @@ -554,17 +554,17 @@ void CUIChat::SetTopLine(int iTopLine) { if (NULL == m_ppUILines[i]) { continue; } - m_ppUILines[i]->SetString(""); // ĭ + m_ppUILines[i]->SetString(""); // 나머지는 빈칸 만들기 } delete[] ppLineInfos; } -void CUIChat::RecalcLineBuffers() // äâ  ȣָ line buffer ٽ ؼ ־ش. +void CUIChat::RecalcLineBuffers() // 채팅창 사이즈가 변했을때 호출해주면 line buffer를 다시 계산해서 넣어준다. { int iMaxScrollPos = 0; // for(int i = 0; i < CHAT_BUFFER_COUNT; i++) // { - // line buffer ʱȭϱ + // line buffer 초기화하기 ChatListItor itor; // for(itor = m_LineBuffers[i].begin(); m_LineBuffers[i].end() != itor; ++itor) for (itor = m_LineBuffer.begin(); m_LineBuffer.end() != itor; ++itor) { @@ -576,7 +576,7 @@ void CUIChat::SetTopLine(int iTopLine) { // m_LineBuffers[i].clear(); m_LineBuffer.clear(); - // Line buffer ٽ ֱ + // Line buffer 다시 넣기 // for(itor = m_ChatBuffers[i].begin(); m_ChatBuffers[i].end() != itor; ++itor) for (itor = m_ChatBuffer.begin(); m_ChatBuffer.end() != itor; ++itor) { __ChatInfo * pChatBuff = (*itor); @@ -586,11 +586,11 @@ void CUIChat::SetTopLine(int iTopLine) { } } - // Line buffer - // while (m_LineBuffers[i].size() > MAX_CHAT_LINES) // MAX_CHAT_LINES ִ line - while (m_LineBuffer.size() > MAX_CHAT_LINES) // MAX_CHAT_LINES ִ line + // Line buffer 갯수 조절 + // while (m_LineBuffers[i].size() > MAX_CHAT_LINES) // MAX_CHAT_LINES은 최대 line의 수 + while (m_LineBuffer.size() > MAX_CHAT_LINES) // MAX_CHAT_LINES은 최대 line의 수 { - // + // 한줄 지우기 // __ChatInfo* pLineBuff = m_LineBuffers[i].front(); __ChatInfo * pLineBuff = m_LineBuffer.front(); if (pLineBuff) { @@ -608,14 +608,14 @@ void CUIChat::SetTopLine(int iTopLine) { // } // } - // ũѹ ġ 缳 + // 스크롤바 현재 위치 재설정 if (iMaxScrollPos < 0) { iMaxScrollPos = 0; } - m_pScrollbar->SetRange(0, iMaxScrollPos); // scroll bar range + m_pScrollbar->SetRange(0, iMaxScrollPos); // scroll bar range 설정 m_pScrollbar->SetCurrentPos(iMaxScrollPos); - // ũѹٿ ´ ä Line + // 스크롤바에 맞는 채팅 Line 설정 SetTopLine(iMaxScrollPos); } @@ -636,7 +636,7 @@ void CUIChat::KillFocus() { } BOOL CUIChat::IsChatMode() { - return ((m_pEdit && GetFocusedEdit() == m_pEdit) ? TRUE : FALSE); // TRUE --> üø尡 ƴҶ + return ((m_pEdit && GetFocusedEdit() == m_pEdit) ? TRUE : FALSE); // TRUE --> 체팅모드가 아닐때 } //son, chat_in @@ -658,19 +658,19 @@ BOOL CUIChat::MoveOffset(int iOffsetX, int iOffsetY) { if (0 == iOffsetX && 0 == iOffsetY) { return FALSE; } - // ui + // ui 영역 m_rcRegion.left += iOffsetX; m_rcRegion.top += iOffsetY; m_rcRegion.right += iOffsetX; m_rcRegion.bottom += iOffsetY; - // movable + // movable 영역 m_rcMovable.left += iOffsetX; m_rcMovable.top += iOffsetY; m_rcMovable.right += iOffsetX; m_rcMovable.bottom += iOffsetY; - // children ǥ + // children 좌표 갱신 CN3UIBase * pCUI = NULL; // Child UI... for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { pCUI = (*itor); @@ -691,10 +691,10 @@ BOOL CUIChat::MoveOffset(int iOffsetX, int iOffsetY) { void CUIChat::SetRegion(const RECT & Rect) { CN3UIBase::SetRegion(Rect); - // ڽĵ ġѴ. - // m_rcChatOutRegion = ; // ä ٽ ش. - //CreateLines(); // ä  ϰ ٽ . - //RecalcLineBuffers(); // ۸ ٽ ְ ۾ ǥѴ. + // 자식들을 적당히 배치한다. + // m_rcChatOutRegion = ; // 채팅 출력 영역을 다시 지정해준다. + //CreateLines(); // 채팅 라인을 몇줄 들어갈지 계산하고 다시 만든다. + //RecalcLineBuffers(); // 라인 버퍼를 다 지우고 다시 만들어주고 글씨를 표시한다. } void CUIChat::ChangeChattingMode(e_ChatMode eCM) { @@ -750,7 +750,7 @@ void CUIChat::ChangeChattingMode(e_ChatMode eCM) { } } - // if(eCBPrev != m_eChatBuffer) this->AdjustScroll(); // ä 尡 ޶.. + // if(eCBPrev != m_eChatBuffer) this->AdjustScroll(); // 채팅 모드가 달라지면.. } void CUIChat::ChatListenEnable() { @@ -776,8 +776,8 @@ void CUIChat::ChatListenEnable() { bool CUIChat::OnKeyPress(int iKey) { switch (iKey) { - case DIK_ESCAPE: { //hotkey Ŀ ٸ ui Ƿ DIK_ESCAPE Ŀ ٽ - //ִ ٸ ̸ ݾش. + case DIK_ESCAPE: { //hotkey가 포커스 잡혀있을때는 다른 ui를 닫을수 없으므로 DIK_ESCAPE가 들어오면 포커스를 다시잡고 + //열려있는 다른 유아이를 닫아준다. CGameProcedure::s_pUIMgr->ReFocusUI(); //this_ui CN3UIBase * pFocus = CGameProcedure::s_pUIMgr->GetFocusedUI(); if (pFocus && pFocus != this) { diff --git a/src/game/UIChat.h b/src/game/UIChat.h index b93c52d9..b433115b 100644 --- a/src/game/UIChat.h +++ b/src/game/UIChat.h @@ -10,8 +10,8 @@ //enum e_ChatBuffer { CHAT_BUFFER_NORMAL = 0, CHAT_BUFFER_PRIVATE, CHAT_BUFFER_PARTY, CHAT_BUFFER_KNIGHTS, CHAT_BUFFER_COUNT }; struct __ChatInfo { - std::string szChat; // ڿ - D3DCOLOR color; // ڿ + std::string szChat; // 문자열 + D3DCOLOR color; // 문자열 색깔 __ChatInfo(){}; __ChatInfo(const std::string & szChat_Arg, D3DCOLOR color_Arg) { @@ -27,20 +27,20 @@ const int MAX_CHAT_LINES = 100; class CUIChat : public CN3UIBase { protected: - // ChatList m_ChatBuffers[CHAT_BUFFER_COUNT]; // ä packet buffer - // ChatList m_LineBuffers[CHAT_BUFFER_COUNT]; // Line buffer - ChatList m_ChatBuffer; // ä packet buffer - ChatList m_LineBuffer; // Line buffer - ChatList m_ContinueMsg; // ִ ޽ buffer + // ChatList m_ChatBuffers[CHAT_BUFFER_COUNT]; // 채팅 packet기준으로 된 buffer + // ChatList m_LineBuffers[CHAT_BUFFER_COUNT]; // Line 기준으로 된 buffer + ChatList m_ChatBuffer; // 채팅 packet기준으로 된 buffer + ChatList m_LineBuffer; // Line 기준으로 된 buffer + ChatList m_ContinueMsg; // 지속적으로 공지해주는 메시지 buffer int m_iCurContinueMsg; - CN3UIString * m_pNoticeTitle; // äâ ٿ ǥõ ... + CN3UIString * m_pNoticeTitle; // 채팅창 맨윗줄에 표시될 공지... CN3UIString * - m_pChatOut; // ä µǴ UIString ( m_Child ), ۾ü ʱ Ѵ. - CN3UIScrollBar * m_pScrollbar; // scrollbar ( m_Child ) - int m_iChatLineCount; // äâ µǴ line (äâ  ٽ .) - RECT m_rcChatOutRegion; // ä µǴ - CN3UIString ** m_ppUILines; // ä µǴ UIString 迭(äâ  ϹǷ 迭 Ѵ. + m_pChatOut; // 채팅이 출력되는 UIString 참조포인터(실제 m_Child로 관리), 글씨체와 초기 영역만 참조한다. + CN3UIScrollBar * m_pScrollbar; // scrollbar 참조포인터(실제 m_Child로 관리) + int m_iChatLineCount; // 채팅창에 출력되는 line의 수(채팅창 사이즈가 변했을때 다시 계산해주자.) + RECT m_rcChatOutRegion; // 채팅이 출력되는 영역 + CN3UIString ** m_ppUILines; // 채팅이 출력되는 UIString 배열포인터(채팅창 사이즈가 변하므로 배열도 변한다. CN3UIEdit * m_pEdit; //son, chat_in std::string m_szString; //son, chat_in @@ -61,23 +61,23 @@ class CUIChat : public CN3UIBase { bool m_bChatParty; bool m_bKillFocus; - // e_ChatBuffer m_eChatBuffer; // ä ǥ .. ۰ ִ.. + // e_ChatBuffer m_eChatBuffer; // 채팅 표시 모드 .. 버퍼가 나누어져있다.. /* - ChatList m_MsgBuffer; // ä packet buffer - ChatList m_MsgLineBuffer; // Line buffer + ChatList m_MsgBuffer; // 채팅 packet기준으로 된 buffer + ChatList m_MsgLineBuffer; // Line 기준으로 된 buffer - CN3UIString* m_pMsgOut; // ä µǴ UIString ( m_Child ) - CN3UIScrollBar* m_pMsgScrollbar; // scrollbar ( m_Child ) - int m_iMsgLineCount; // äâ µǴ line (äâ  ٽ .) + CN3UIString* m_pMsgOut; // 채팅이 출력되는 UIString 참조포인터(실제 m_Child로 관리) + CN3UIScrollBar* m_pMsgScrollbar; // scrollbar 참조포인터(실제 m_Child로 관리) + int m_iMsgLineCount; // 채팅창에 출력되는 line의 수(채팅창 사이즈가 변했을때 다시 계산해주자.) */ protected: - void SetTopLine(int iTopLine); // ش. - // void AddLineBuffer(e_ChatBuffer eCB, const std::string& szString, D3DCOLOR color); // line ۸ ش.(ʹ ˾Ƽ 2ٷ ش.) + void SetTopLine(int iTopLine); // 맨 윗줄을 지정해준다. + // void AddLineBuffer(e_ChatBuffer eCB, const std::string& szString, D3DCOLOR color); // line 버퍼를 만들어준다.(너무 길면 알아서 2줄로 만들어준다.) void AddLineBuffer(const std::string & szString, - D3DCOLOR color); // line ۸ ش.(ʹ ˾Ƽ 2ٷ ش.) - void RecalcLineBuffers(); // äâ  ȣָ line buffer ٽ ؼ ־ش. + D3DCOLOR color); // line 버퍼를 만들어준다.(너무 길면 알아서 2줄로 만들어준다.) + void RecalcLineBuffers(); // 채팅창 사이즈가 변했을때 호출해주면 line buffer를 다시 계산해서 넣어준다. void CreateLines(); // Operations @@ -90,21 +90,21 @@ class CUIChat : public CN3UIBase { void SetEnableKillFocus(bool bKillFocus) { m_bKillFocus = bKillFocus; } void ChatListenEnable(); void ChangeChattingMode(e_ChatMode eCM); - virtual BOOL MoveOffset(int iOffsetX, int iOffsetY); // Offsetŭ ̵ش.(region, children, move rect ̵) + virtual BOOL MoveOffset(int iOffsetX, int iOffsetY); // Offset만큼 이동해준다.(region, children, move rect 이동) virtual bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); virtual void Release(); virtual bool Load(HANDLE hFile); virtual void SetRegion( const RECT & - Rect); // ( Ҷ ȣȴ. ܼ ̵ ȣ ʴ´.(̵ܼ MoveOffset ȣ)) + Rect); // 영역 지정(사이즈가 변할때 호출된다. 단순 이동은 호출되지 않는다.(단순이동은 MoveOffset이 호출)) void SetString(const std::string & szChat); void SetCaretPos(int iPos); const std::string & GetString() const { return m_szString; } //son, chat_in void AddChatMsg(e_ChatMode eCM, const std::string & szString, - D3DCOLOR color = 0xffffffff); // ä ޼ ϰ ˸ · ȭ鿡 ش. + D3DCOLOR color = 0xffffffff); // 채팅 메세지를 저장하고 알맞은 형태로 화면에 출력해준다. void AddContinueMsg(e_ChatMode eCM, const std::string & szString, D3DCOLOR color = 0xffffffff); - void AdjustScroll(); // ũ ġ .. + void AdjustScroll(); // 스크롤 위치등 조정.. BOOL IsChatMode(); void SetFocus(); diff --git a/src/game/UIClassChange.cpp b/src/game/UIClassChange.cpp index 5d4f71f0..fe6a89d5 100644 --- a/src/game/UIClassChange.cpp +++ b/src/game/UIClassChange.cpp @@ -220,7 +220,7 @@ bool CUIClassChange::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { break; } - CGameProcedure::s_pProcMain->m_pUIVar->UpdateAllStates(pInfoBase, pInfoExt); // â ġ + CGameProcedure::s_pProcMain->m_pUIVar->UpdateAllStates(pInfoBase, pInfoExt); // 상태창 수치를 모두 적용 BYTE byBuff[4]; int iOffset = 0; @@ -231,7 +231,7 @@ bool CUIClassChange::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { CGameProcedure::s_pProcMain->m_pUISkillTreeDlg->InitIconUpdate(); - // ϴ .. Ű ش.. + // 전직하는 순간.. 핫키 정보를 모두 없앤다.. CGameProcedure::s_pProcMain->m_pUIHotKeyDlg->ClassChangeHotkeyFlush(); Close(); } @@ -257,7 +257,7 @@ void CUIClassChange::RestorePrevClass() { pInfoBase->eClass = m_eClass; CGameProcedure::s_pProcMain->m_pUISkillTreeDlg->InitIconUpdate(); - CGameProcedure::s_pProcMain->m_pUIVar->UpdateAllStates(pInfoBase, pInfoExt); // â ġ + CGameProcedure::s_pProcMain->m_pUIVar->UpdateAllStates(pInfoBase, pInfoExt); // 상태창 수치를 모두 적용 } void CUIClassChange::ChangeToWarningState() { diff --git a/src/game/UICmd.cpp b/src/game/UICmd.cpp index 6c415c86..43ad216b 100644 --- a/src/game/UICmd.cpp +++ b/src/game/UICmd.cpp @@ -18,27 +18,27 @@ ////////////////////////////////////////////////////////////////////// CUICmd::CUICmd() { - m_pBtn_Exit = NULL; // - - m_pBtn_Act = NULL; //ൿ - m_pBtn_Act_Walk = NULL; //ȱ - m_pBtn_Act_Run = NULL; //޸ - m_pBtn_Act_Stop = NULL; // - m_pBtn_Act_Attack = NULL; // - - m_pBtn_Act_StandUp = NULL; // Ͼ. - m_pBtn_Act_SitDown = NULL; // ɱ - - m_pBtn_Camera = NULL; //ī޶ - m_pBtn_Inventory = NULL; // â - m_pBtn_Party_Invite = NULL; //Ƽ ʴ - m_pBtn_Party_Disband = NULL; //Ƽ Ż - m_pBtn_Option = NULL; //ɼ - m_pBtn_Quest = NULL; //Ʈ - m_pBtn_Character = NULL; //ڱ â - m_pBtn_Skill = NULL; //ųƮ Ǵ â - m_pBtn_Belong = NULL; //Ҽ - m_pBtn_Map = NULL; // ̴ϸ + m_pBtn_Exit = NULL; //나가기 + + m_pBtn_Act = NULL; //행동 + m_pBtn_Act_Walk = NULL; //걷기 + m_pBtn_Act_Run = NULL; //달리기 + m_pBtn_Act_Stop = NULL; //서기 + m_pBtn_Act_Attack = NULL; //공격 + + m_pBtn_Act_StandUp = NULL; // 일어서기. + m_pBtn_Act_SitDown = NULL; // 앉기 + + m_pBtn_Camera = NULL; //카메라 + m_pBtn_Inventory = NULL; //아이템 창 + m_pBtn_Party_Invite = NULL; //파티 초대 + m_pBtn_Party_Disband = NULL; //파티 탈퇴 + m_pBtn_Option = NULL; //옵션 + m_pBtn_Quest = NULL; //퀘스트 + m_pBtn_Character = NULL; //자기 정보창 + m_pBtn_Skill = NULL; //스킬트리 또는 마법창 + m_pBtn_Belong = NULL; //소속 기사단 + m_pBtn_Map = NULL; // 미니맵 } CUICmd::~CUICmd() { @@ -59,7 +59,7 @@ bool CUICmd::Load(HANDLE hFile) { m_pBtn_Act_SitDown = GetChildByID("btn_sit"); //__ASSERT(m_pBtn_Act_SitDown, "NULL UI Component!!"); if (m_pBtn_Act_StandUp) { - m_pBtn_Act_StandUp->SetVisible(false); // Ͼ ư ̸ ׿´.. + m_pBtn_Act_StandUp->SetVisible(false); // 일어서기 버튼은 미리 죽여놓는다.. } m_pBtn_Character = GetChildByID("btn_character"); //__ASSERT(m_pBtn_Character, "NULL UI Component!!"); @@ -125,14 +125,14 @@ bool CUICmd::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } else if (pSender == m_pBtn_Camera) { - CGameProcedure::s_pProcMain->CommandCameraChange(); // ī޶ ٲٱ.. + CGameProcedure::s_pProcMain->CommandCameraChange(); // 카메라 시점 바꾸기.. } else if (pSender == m_pBtn_Party_Invite) { CPlayerOther * pUPC = CGameProcedure::s_pOPMgr->UPCGetByID(CGameProcedure::s_pPlayer->m_iIDTarget, true); - if (pUPC && pUPC->m_InfoBase.eNation == CGameProcedure::s_pPlayer->m_InfoBase.eNation) // üũ + if (pUPC && pUPC->m_InfoBase.eNation == CGameProcedure::s_pPlayer->m_InfoBase.eNation) // 국가 체크 { - CGameProcedure::s_pProcMain->MsgSend_PartyOrForceCreate(0, pUPC->IDString()); // Ƽ ʴϱ.. + CGameProcedure::s_pProcMain->MsgSend_PartyOrForceCreate(0, pUPC->IDString()); // 파티 초대하기.. } } @@ -144,24 +144,24 @@ bool CUICmd::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { int iMemberIndex = -1; CPlayerBase * pTarget = NULL; pMain->PartyOrForceConditionGet(bIAmLeader, bIAmMemberOfParty, iMemberIndex, - pTarget); // Ƽ Ȳ .. + pTarget); // 파티의 상황을 보고.. std::string szMsg; - if (bIAmLeader) // .. + if (bIAmLeader) // 내가 리더면.. { if (iMemberIndex > 0) { - ::_LoadStringFromResource(IDS_PARTY_CONFIRM_DISCHARGE, szMsg); // Ƽ ѾƳ? + ::_LoadStringFromResource(IDS_PARTY_CONFIRM_DISCHARGE, szMsg); // 파티에서 쫓아낼까여? szMsg = pTarget->IDString() + szMsg; } else { - ::_LoadStringFromResource(IDS_PARTY_CONFIRM_DESTROY, szMsg); // Ƽ ǰ? + ::_LoadStringFromResource(IDS_PARTY_CONFIRM_DESTROY, szMsg); // 파티 뽀갤까여? } } else if (bIAmMemberOfParty) { - ::_LoadStringFromResource(IDS_PARTY_CONFIRM_LEAVE, szMsg); // Ƽ ? + ::_LoadStringFromResource(IDS_PARTY_CONFIRM_LEAVE, szMsg); // 파티에서 나갈까여? } if (!szMsg.empty()) { CGameProcedure::MessageBoxPost(szMsg, "", MB_YESNO, - BEHAVIOR_PARTY_DISBAND); // Ƽ ü,,Żϱ..Ȯ + BEHAVIOR_PARTY_DISBAND); // 파티 해체,축출,탈퇴하기..확인 } } @@ -188,7 +188,7 @@ bool CUICmd::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { /* void CUICmd::SetVisibleActButtons(bool bVisible) { - //ൿ + //행동 if(m_pBtn_Act_Walk) m_pBtn_Act_Walk->SetVisible(bVisible); if(m_pBtn_Act_Run) m_pBtn_Act_Run->SetVisible(bVisible); if(m_pBtn_Act_Stop) m_pBtn_Act_Stop->SetVisible(bVisible); @@ -201,7 +201,7 @@ void CUICmd::SetVisibleActButtons(bool bVisible) /* void CUICmd::SetVisibleOptButtons(bool bVisible) { - //ɼ + //옵션 if(m_pBtn_Opt_Quest) m_pBtn_Opt_Quest->SetVisible(bVisible); if(m_pBtn_Character) m_pBtn_Character->SetVisible(bVisible); if(m_pBtn_Skill) m_pBtn_Skill->SetVisible(bVisible); @@ -213,23 +213,23 @@ void CUICmd::SetVisibleOptButtons(bool bVisible) void CUICmd::UpdatePartyButtons(bool bIAmLeader, bool bIAmMemberOfParty, int iMemberIndex, const CPlayerBase * pTarget) { bool bInvite = true; - if (bIAmLeader) // ̸.. + if (bIAmLeader) // 내가 리더이면.. { - if (pTarget) // Ÿ ְ.. + if (pTarget) // 타겟이 있고.. { if (iMemberIndex > 0) { - bInvite = false; // Ÿ Ƽ̸.. ϰ. + bInvite = false; // 타겟이 파티원이면..축출 가능하게. } else { bInvite = true; } } else { - bInvite = false; // ִ.. + bInvite = false; // 리더도 나갈수 있다.. } } else { if (bIAmMemberOfParty) { - bInvite = false; // ƴ Ƽ ִ ̸.. Ż𰡴.. + bInvite = false; // 리더는 아니지만 파티에 들어있는 상태이면.. 탈퇴가능.. } else { - bInvite = true; // Ƽ ȵ ִٸ ʴ ... + bInvite = true; // 파티에 안들어 있다면 초대 가능... } } @@ -243,8 +243,8 @@ void CUICmd::UpdatePartyButtons(bool bIAmLeader, bool bIAmMemberOfParty, int iMe bool CUICmd::OnKeyPress(int iKey) { switch (iKey) { - case DIK_ESCAPE: { //hotkey Ŀ ٸ ui Ƿ DIK_ESCAPE Ŀ ٽ - //ִ ٸ ̸ ݾش. + case DIK_ESCAPE: { //hotkey가 포커스 잡혀있을때는 다른 ui를 닫을수 없으므로 DIK_ESCAPE가 들어오면 포커스를 다시잡고 + //열려있는 다른 유아이를 닫아준다. CGameProcedure::s_pUIMgr->ReFocusUI(); //this_ui CN3UIBase * pFocus = CGameProcedure::s_pUIMgr->GetFocusedUI(); if (pFocus && pFocus != this) { diff --git a/src/game/UICmd.h b/src/game/UICmd.h index 911c8c4c..89c6aa26 100644 --- a/src/game/UICmd.h +++ b/src/game/UICmd.h @@ -8,27 +8,27 @@ class CUICmd : public CN3UIBase { public: - CN3UIBase * m_pBtn_Exit; // - - CN3UIBase * m_pBtn_Act; //ൿ - CN3UIBase * m_pBtn_Act_Walk; //ȱ - CN3UIBase * m_pBtn_Act_Run; //޸ - CN3UIBase * m_pBtn_Act_Stop; // - CN3UIBase * m_pBtn_Act_Attack; // - - CN3UIBase * m_pBtn_Act_StandUp; // Ͼ. - CN3UIBase * m_pBtn_Act_SitDown; // ɱ - - CN3UIBase * m_pBtn_Camera; //ī޶ - CN3UIBase * m_pBtn_Inventory; // â - CN3UIBase * m_pBtn_Party_Invite; //Ƽ ʴ - CN3UIBase * m_pBtn_Party_Disband; //Ƽ Ż - CN3UIBase * m_pBtn_Option; //ɼ - CN3UIBase * m_pBtn_Quest; //Ʈ - CN3UIBase * m_pBtn_Character; //ڱ â - CN3UIBase * m_pBtn_Skill; //ųƮ Ǵ â - CN3UIBase * m_pBtn_Belong; //Ҽ - CN3UIBase * m_pBtn_Map; // ̴ϸ + CN3UIBase * m_pBtn_Exit; //나가기 + + CN3UIBase * m_pBtn_Act; //행동 + CN3UIBase * m_pBtn_Act_Walk; //걷기 + CN3UIBase * m_pBtn_Act_Run; //달리기 + CN3UIBase * m_pBtn_Act_Stop; //서기 + CN3UIBase * m_pBtn_Act_Attack; //공격 + + CN3UIBase * m_pBtn_Act_StandUp; // 일어서기. + CN3UIBase * m_pBtn_Act_SitDown; // 앉기 + + CN3UIBase * m_pBtn_Camera; //카메라 + CN3UIBase * m_pBtn_Inventory; //아이템 창 + CN3UIBase * m_pBtn_Party_Invite; //파티 초대 + CN3UIBase * m_pBtn_Party_Disband; //파티 탈퇴 + CN3UIBase * m_pBtn_Option; //옵션 + CN3UIBase * m_pBtn_Quest; //퀘스트 + CN3UIBase * m_pBtn_Character; //자기 정보창 + CN3UIBase * m_pBtn_Skill; //스킬트리 또는 마법창 + CN3UIBase * m_pBtn_Belong; //소속 기사단 + CN3UIBase * m_pBtn_Map; // 미니맵 public: bool OnKeyPress(int iKey); diff --git a/src/game/UICreateClanName.cpp b/src/game/UICreateClanName.cpp index 7482c4b9..6732a09e 100644 --- a/src/game/UICreateClanName.cpp +++ b/src/game/UICreateClanName.cpp @@ -69,8 +69,8 @@ bool CUICreateClanName::MakeClan() { void CUICreateClanName::MsgSend_MakeClan() { int iLn = 20; iLn = m_szClanName.size(); - BYTE byBuff[40]; // Ŷ .. - int iOffset = 0; // Ŷ .. + BYTE byBuff[40]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_KNIGHTS); CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_KNIGHTS_CREATE); CAPISocket::MP_AddShort(byBuff, iOffset, (BYTE)iLn); diff --git a/src/game/UIDead.cpp b/src/game/UIDead.cpp index 62c085bf..6cb189d5 100644 --- a/src/game/UIDead.cpp +++ b/src/game/UIDead.cpp @@ -128,7 +128,7 @@ DWORD CUIDead::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptOld return dwRet; } - // UI ̴ ڵ + // UI 움직이는 코드 if (UI_STATE_COMMON_MOVE == m_eState) { if (dwFlags & UI_MOUSE_LBCLICKED) { SetState(UI_STATE_COMMON_NONE); @@ -139,25 +139,25 @@ DWORD CUIDead::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptOld return dwRet; } - if (false == IsIn(ptCur.x, ptCur.y)) // ̸ + if (false == IsIn(ptCur.x, ptCur.y)) // 영역 밖이면 { if (false == IsIn(ptOld.x, ptOld.y)) { - return dwRet; // ǥ ̸ + return dwRet; // 이전 좌표도 영역 밖이면 } - dwRet |= UI_MOUSEPROC_PREVINREGION; // ǥ ̾. + dwRet |= UI_MOUSEPROC_PREVINREGION; // 이전 좌표는 영역 안이었다. } else { - // tool tip + // tool tip 관련 if (s_pTooltipCtrl) { s_pTooltipCtrl->SetText(m_szToolTip); } } - dwRet |= UI_MOUSEPROC_INREGION; // ̹ ǥ ̴. + dwRet |= UI_MOUSEPROC_INREGION; // 이번 좌표는 영역 안이다. if (m_pChildUI && m_pChildUI->IsVisible()) { return dwRet; } - // child ޼ + // child에게 메세지 전달 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); DWORD dwChildRet = 0; @@ -173,17 +173,17 @@ DWORD CUIDead::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptOld } } - if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // ̰쿡 հ Ŀ ̴. - // (Ʒ ڵ dialog ϴ ؾ Ѵ. Ƴ) - // m_Children.erase(itor); // 켱 Ʈ - // m_Children.push_front(pChild); // Ǿտ ִ´. ׸ ߿ ׸ Ϸ + if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // 이경우에는 먼가 포커스를 받은 경우이다. + // (아래 코드는 dialog를 관리하는 곳에서 해야 한다. 따라서 막아놓음) + // m_Children.erase(itor); // 우선 리스트에서 지우고 + // m_Children.push_front(pChild); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하려고 dwRet |= (UI_MOUSEPROC_CHILDDONESOMETHING | UI_MOUSEPROC_DONESOMETHING); return dwRet; } } - // UI ̴ ڵ + // UI 움직이는 코드 if (UI_STATE_COMMON_MOVE != m_eState && PtInRect(&m_rcMovable, ptCur) && (dwFlags & UI_MOUSE_LBCLICK)) { SetState(UI_STATE_COMMON_MOVE); dwRet |= UI_MOUSEPROC_DONESOMETHING; @@ -212,7 +212,7 @@ void CUIDead::MsgSend_Revival(BYTE byType) { } if (CGameProcedure::s_pPlayer->m_iSendRegeneration >= 2) { - return; // ѹ ٽ Ⱥ ÷ + return; // 한번 보내면 다시 죽을때까지 안보내는 플래그 } BYTE byBuff[4]; @@ -220,11 +220,11 @@ void CUIDead::MsgSend_Revival(BYTE byType) { CAPISocket::MP_AddByte(byBuff, iOffset, N3_REGENE); CAPISocket::MP_AddByte(byBuff, iOffset, byType); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. CLogWriter::Write("Send Regeneration"); - CGameProcedure::s_pPlayer->m_iSendRegeneration = 2; // ѹ ٽ Ⱥ ÷ - TRACE(" - ٽ Ƴ\n"); + CGameProcedure::s_pPlayer->m_iSendRegeneration = 2; // 한번 보내면 다시 죽을때까지 안보내는 플래그 + TRACE("보냄 - 다시 살아나기\n"); m_bProcessing = true; } @@ -238,15 +238,15 @@ void CUIDead::MsgRecv_Revival(DataPack * pDataPack, int & iOffset) { vPosPlayer.y = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; CGameProcedure::s_pProcMain->InitPlayerPosition( - vPosPlayer); // ÷̾ ġ ʱȭ.. , ⺻ ϰ Ѵ. - CGameProcedure::s_pPlayer->RegenerateCollisionMesh(); // 浹 ޽ø ٽ .. + vPosPlayer); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. + CGameProcedure::s_pPlayer->RegenerateCollisionMesh(); // 충돌 메시를 다시 만든다.. - CGameProcedure::s_pPlayer->m_iSendRegeneration = 0; // ѹ ٽ Ⱥ ÷ - CGameProcedure::s_pPlayer->m_fTimeAfterDeath = 0; // ѹ ٽ Ⱥ ÷ - TRACE(" - ٽ Ƴ(%.1f, %.1f)\n", vPosPlayer.x, vPosPlayer.z); + CGameProcedure::s_pPlayer->m_iSendRegeneration = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 + CGameProcedure::s_pPlayer->m_fTimeAfterDeath = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 + TRACE("받음 - 다시 살아나기(%.1f, %.1f)\n", vPosPlayer.x, vPosPlayer.z); // - // & ȿ ʱȭ.. + //마법 & 효과 초기화.. if (CGameProcedure::s_pProcMain->m_pUIStateBarAndMiniMap) { CGameProcedure::s_pProcMain->m_pUIStateBarAndMiniMap->ClearMagic(); } diff --git a/src/game/UIDroppedItemDlg.cpp b/src/game/UIDroppedItemDlg.cpp index 04235bc2..2797b7fc 100644 --- a/src/game/UIDroppedItemDlg.cpp +++ b/src/game/UIDroppedItemDlg.cpp @@ -63,7 +63,7 @@ void CUIDroppedItemDlg::Init(CN3UIBase * pParent) { void CUIDroppedItemDlg::Render() { if (!m_bVisible) { - return; // ڽĵ render ʴ´. + return; // 보이지 않으면 자식들을 render하지 않는다. } POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); m_pUITooltipDlg->DisplayTooltipsDisable(); @@ -84,12 +84,12 @@ void CUIDroppedItemDlg::Render() { m_pUITooltipDlg->DisplayTooltipsEnable(ptCur.x, ptCur.y, spItem); } - // ǥõǾ ǥ.. + // 갯수 표시되야 할 아이템 갯수 표시.. CN3UIString * pStr = NULL; for (int i = 0; i < MAX_ITEM_BUNDLE_DROP_PIECE; i++) { if (m_pMyDroppedItem[i] && ((m_pMyDroppedItem[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (m_pMyDroppedItem[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL))) { - // string .. + // string 얻기.. pStr = GetChildStringByiOrder(i); if (pStr) { if ((GetState() == UI_STATE_ICON_MOVING) && @@ -106,7 +106,7 @@ void CUIDroppedItemDlg::Render() { } } } else { - // string .. + // string 얻기.. pStr = GetChildStringByiOrder(i); if (pStr) { pStr->SetVisible(false); @@ -204,16 +204,16 @@ DWORD CUIDroppedItemDlg::MouseProc(DWORD dwFlags, const POINT & ptCur, const POI void CUIDroppedItemDlg::AddToItemTable(int iItemID, int iItemCount, int iOrder) { __IconItemSkill * spItem; - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. - __TABLE_ITEM_EXT * pItemExt = NULL; // ̺ ü .. + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. + __TABLE_ITEM_EXT * pItemExt = NULL; // 아이템 테이블 구조체 포인터.. std::string szIconFN; - pItem = CGameBase::s_pTbl_Items_Basic->Find(iItemID / 1000 * 1000); // .. + pItem = CGameBase::s_pTbl_Items_Basic->Find(iItemID / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { pItemExt = CGameBase::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iItemID % 1000); } if (NULL == pItem || NULL == pItemExt) { - __ASSERT(0, " ̺ !!"); + __ASSERT(0, "아이템 포인터 테이블에 없음!!"); CLogWriter::Write("CUIDroppedItemDlg::AddToItemTable - Invalidate ItemID : %d", iItemID); return; } @@ -222,7 +222,7 @@ void CUIDroppedItemDlg::AddToItemTable(int iItemID, int iItemCount, int iOrder) e_PartPosition ePart; e_PlugPosition ePlug; e_ItemType eType = CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { return; } @@ -230,7 +230,7 @@ void CUIDroppedItemDlg::AddToItemTable(int iItemID, int iItemCount, int iOrder) spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = iItemCount; spItem->iDurability = pItem->siMaxDurability + pItemExt->siMaxDurability; @@ -240,17 +240,17 @@ void CUIDroppedItemDlg::AddToItemTable(int iItemID, int iItemCount, int iOrder) void CUIDroppedItemDlg::AddToItemTableToInventory(int iItemID, int iItemCount, int iOrder) { CN3UIArea * pArea; __IconItemSkill * spItem; - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. - __TABLE_ITEM_EXT * pItemExt = NULL; // ̺ ü .. + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. + __TABLE_ITEM_EXT * pItemExt = NULL; // 아이템 테이블 구조체 포인터.. std::string szIconFN; float fUVAspect = (float)45.0f / (float)64.0f; - pItem = CGameBase::s_pTbl_Items_Basic->Find(iItemID / 1000 * 1000); // .. + pItem = CGameBase::s_pTbl_Items_Basic->Find(iItemID / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { pItemExt = CGameBase::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iItemID % 1000); } if (NULL == pItem || NULL == pItemExt) { - __ASSERT(0, " ̺ !!"); + __ASSERT(0, "아이템 포인터 테이블에 없음!!"); CLogWriter::Write("CUIDroppedItemDlg::AddToItemTableToInventory - Invalidate ItemID : %d", iItemID); return; } @@ -259,7 +259,7 @@ void CUIDroppedItemDlg::AddToItemTableToInventory(int iItemID, int iItemCount, i e_PartPosition ePart; e_PlugPosition ePlug; e_ItemType eType = CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { return; } @@ -267,7 +267,7 @@ void CUIDroppedItemDlg::AddToItemTableToInventory(int iItemID, int iItemCount, i spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = iItemCount; spItem->iDurability = pItem->siMaxDurability + pItemExt->siMaxDurability; @@ -296,14 +296,14 @@ bool CUIDroppedItemDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { return false; } - // ˻ؼ õ 쿡 ˷ Ѵ.. + // 검사해서 선택된 아이콘을 가진 윈도우에게 결과를 알려줘야 한다.. switch (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd) { - // κ丮 κ ̶.. + // 인벤토리 윈도우로부터 온 것이라면.. case UIWND_INVENTORY: CGameProcedure::s_pProcMain->m_pUIInventory->CancelIconDrop(spItem); break; - // ŷ κ ̶... + // 상거래 윈도우로부터 온 것이라면... case UIWND_TRANSACTION: CGameProcedure::s_pProcMain->m_pUITransactionDlg->CancelIconDrop(spItem); break; @@ -372,7 +372,7 @@ bool CUIDroppedItemDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { e_PlugPosition ePlug; e_ItemType eType; - // ̴ϱ.. .. + // 서버에 보내지 않은 아이템이니까.. 서버에 보낸다.. BYTE byBuff[16]; int iOffset = 0; @@ -389,14 +389,14 @@ bool CUIDroppedItemDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { case UIMSG_ICON_UP: SetState(UI_STATE_COMMON_NONE); - // ˻.. - pItem = NULL; // ̺ ü .. + // 아이템이 돈인지 검사.. + pItem = NULL; // 아이템 테이블 구조체 포인터.. spItem = NULL; spItem = GetHighlightIconItem((CN3UIIcon *)pSender); if (!spItem) { break; } - pItem = CGameBase::s_pTbl_Items_Basic->Find(spItem->pItemBasic->dwID); // .. + pItem = CGameBase::s_pTbl_Items_Basic->Find(spItem->pItemBasic->dwID); // 열 데이터 얻기.. if (pItem == NULL) { __ASSERT(0, "NULL Item!!!"); CLogWriter::Write("CUIDroppedItemDlg::ReceiveMessage - UIMSG_ICON_UP - NULL Icon : %d", @@ -405,15 +405,15 @@ bool CUIDroppedItemDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } eType = CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 - // 迭̶ .. + // 보낸 아이콘 배열이랑 비교.. iOrder = GetItemiOrder(spItem); if (m_iBackupiOrder != iOrder) { break; } - if (m_bSendedIconArray[iOrder] == true) { // ѹ ´ Ŷ̸ break.. + if (m_bSendedIconArray[iOrder] == true) { // 한번 보냈던 패킷이면 break.. break; } else { m_bSendedIconArray[iOrder] = true; @@ -422,7 +422,7 @@ bool CUIDroppedItemDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { CAPISocket::MP_AddByte(byBuff, iOffset, N3_ITEM_DROPPED_GET); CAPISocket::MP_AddDword(byBuff, iOffset, m_iItemBundleID); - // ƴϸ κ丮 Ʈ ߰.... + // 돈이 아니면 인벤토리 리스트에 추가.... if (ITEM_TYPE_GOLD != eType) { CAPISocket::MP_AddDword(byBuff, iOffset, spItem->pItemBasic->dwID + spItem->pItemExt->dwID); // CAPISocket::MP_AddDword(byBuff, iOffset, (BYTE)iOrderInv); @@ -432,7 +432,7 @@ bool CUIDroppedItemDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } CGameProcedure::s_pSocket->Send(byBuff, iOffset); - // .. + // 보낸 아이콘 정보 셋팅.. CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = spItem; CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.UIWnd = UIWND_DROPITEM; CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.UIWndDistrict = UIWND_DISTRICT_DROPITEM; @@ -455,9 +455,9 @@ bool CUIDroppedItemDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_t iGold, int iPos, int iItemCount, int iStrLen, std::string strString) { - // Ʈ ã.. + // 아이템 리스트에서 아이템을 찾고.. bool bFound = false; - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. __TABLE_ITEM_EXT * pItemExt = NULL; __IconItemSkill * spItem = NULL; int i = 0; @@ -466,11 +466,11 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ __InfoPlayerMySelf * pInfoExt = NULL; std::string stdMsg; - if (bResult == 0x00) // .. + if (bResult == 0x00) // 실패.. { int iOrderInv = GetInventoryEmptyInviOrder(); if (iOrderInv == -1) { - // κ丮 .. break.. ^^ + // 인벤토리가 꽉 차있으면.. break.. ^^ char szBuff[128] = ""; std::string stdMsg; ::_LoadStringFromResource(IDS_INV_ITEM_FULL, stdMsg); @@ -487,19 +487,19 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ return; } - if (bResult == 0x02) // Ƽ ¿ Ƹ ´.. + if (bResult == 0x02) // 파티 상태에서 노아를 얻는다.. { - // .. + // 돈 갱신.. pStatic = NULL; pInfoExt = &(CGameBase::s_pPlayer->m_InfoExt); - // Ʈ.. + // 돈 업데이트.. ::_LoadStringFromResource(IDS_DROPPED_NOAH_GET, stdMsg); sprintf(szMsg, stdMsg.c_str(), iGold - pInfoExt->iGold); CGameProcedure::s_pProcMain->MsgOutput(szMsg, 0xff9b9bff); pInfoExt->iGold = iGold; - TRACE(" Ʈ %d \n", iGold); + TRACE("돈 업데이트 %d \n", iGold); pStatic = (CN3UIString *)CGameProcedure::s_pProcMain->m_pUIInventory->GetChildByID("text_gold"); __ASSERT(pStatic, "NULL UI Component!!"); if (pStatic) { @@ -510,7 +510,7 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ return; } - // ش.. + // 돈 아이콘이 있으면 없앤다.. bFound = false; for (i = 0; i < MAX_ITEM_BUNDLE_DROP_PIECE; i++) { if (m_pMyDroppedItem[i] && m_pMyDroppedItem[i]->pItemBasic->dwID == dwGold) { @@ -526,10 +526,10 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ if (!spItem) { return; } - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spItem->pUIIcon); - // ҽ .. + // 리소스 제거.. spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -547,16 +547,16 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ } } - if (bResult == 0x03) // Ƽ¿ .. + if (bResult == 0x03) // 파티상태에서 내가 아이템을 습득.. { pItem = NULL; pItemExt = NULL; - pItem = CGameBase::s_pTbl_Items_Basic->Find(iItemID / 1000 * 1000); // .. + pItem = CGameBase::s_pTbl_Items_Basic->Find(iItemID / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { pItemExt = CGameBase::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iItemID % 1000); } if (NULL == pItem || NULL == pItemExt) { - __ASSERT(0, " ̺ !!"); + __ASSERT(0, "아이템 포인터 테이블에 없음!!"); CLogWriter::Write("CUIDroppedItemDlg::GetItemByIDToInventory - NULL Icon : %d", iItemID); return; } @@ -570,7 +570,7 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ return; } - // ش.. + // 아이템 아이콘이 있으면 없앤다.. bFound = false; for (i = 0; i < MAX_ITEM_BUNDLE_DROP_PIECE; i++) { if ((m_pMyDroppedItem[i]) && @@ -591,10 +591,10 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ if (!spItem) { return; } - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spItem->pUIIcon); - // ҽ .. + // 리소스 제거.. spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -612,14 +612,14 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ return; } - if (bResult == 0x04) // Ƽ ¿ ٸ .. + if (bResult == 0x04) // 파티 상태에서 다른 멤버가 아이템을 습득.. { spItem = m_pMyDroppedItem[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; if (spItem) { - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spItem->pUIIcon); - // ҽ .. + // 리소스 제거.. spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -639,7 +639,7 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ return; } - if (bResult == 0x05) // Ƽ ¿ Ϲ .. + if (bResult == 0x05) // 파티 상태에서 일반적인 아이템 습득.. { if (iItemID == dwGold) { __ASSERT(0, "Invalidate Item ID From Server.. "); @@ -654,16 +654,16 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ } __IconItemSkill * spItemDest = CGameProcedure::s_pProcMain->m_pUIInventory->m_pMyInvWnd[iPos]; - if (spItemDest) // ִ.. + if (spItemDest) // 아이템이 있다.. { if (iItemID != (spItemDest->pItemBasic->dwID + spItemDest->pItemExt->dwID)) { - // Ŭ.. + // 기존 이이템을 클리어.. if (!spItemDest) { return; } RemoveChild(spItemDest->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItemDest->pUIIcon->Release(); delete spItemDest->pUIIcon; spItemDest->pUIIcon = NULL; @@ -672,22 +672,22 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ CGameProcedure::s_pProcMain->m_pUIInventory->m_pMyInvWnd[iPos] = NULL; - // .. .. + // 아이템을 새로 만듬.. 갯수 셋팅.. AddToItemTableToInventory(iItemID, iItemCount, iPos); } else { - // .. + // 갯수 셋팅.. CGameProcedure::s_pProcMain->m_pUIInventory->m_pMyInvWnd[iPos]->iCount = iItemCount; PlayItemSound(CGameProcedure::s_pProcMain->m_pUIInventory->m_pMyInvWnd[iPos]->pItemBasic); } } else { - // .. .. .. + // 아이템이 없는 경우 .. 새로 만든다.. 갯수 셋팅.. AddToItemTableToInventory(iItemID, iItemCount, iPos); } pItem = NULL; - pItem = CGameBase::s_pTbl_Items_Basic->Find(iItemID / 1000 * 1000); // .. + pItem = CGameBase::s_pTbl_Items_Basic->Find(iItemID / 1000 * 1000); // 열 데이터 얻기.. if (NULL == pItem) { - __ASSERT(0, " ̺ !!"); + __ASSERT(0, "아이템 포인터 테이블에 없음!!"); CLogWriter::Write("CUIDroppedItemDlg::GetItemByIDToInventory - NULL Icon : %d", iItemID); return; } @@ -705,14 +705,14 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ } if (bResult == 0x06) { - // ޽ ڽ ؽƮ ǥ.. + // 메시지 박스 텍스트 표시.. std::string szMsg; ::_LoadStringFromResource(IDS_ITEM_TOOMANY_OR_HEAVY, szMsg); CGameProcedure::s_pProcMain->MsgOutput(szMsg, 0xffff3b3b); } if (bResult == 0x07) { - // ޽ ڽ ؽƮ ǥ.. + // 메시지 박스 텍스트 표시.. std::string szMsg; ::_LoadStringFromResource(IDS_INV_ITEM_FULL, szMsg); CGameProcedure::s_pProcMain->MsgOutput(szMsg, 0xffff3b3b); @@ -728,16 +728,16 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ spItem = NULL; __IconItemSkill * spItemDest = CGameProcedure::s_pProcMain->m_pUIInventory->m_pMyInvWnd[iPos]; - if (spItemDest) // ִ.. + if (spItemDest) // 아이템이 있다.. { if (iItemID != (spItemDest->pItemBasic->dwID + spItemDest->pItemExt->dwID)) { - // Ŭ.. + // 기존 이이템을 클리어.. if (!spItemDest) { return; } RemoveChild(spItemDest->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItemDest->pUIIcon->Release(); delete spItemDest->pUIIcon; spItemDest->pUIIcon = NULL; @@ -746,24 +746,24 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ CGameProcedure::s_pProcMain->m_pUIInventory->m_pMyInvWnd[iPos] = NULL; - // .. .. + // 아이템을 새로 만듬.. 갯수 셋팅.. AddToItemTableToInventory(iItemID, iItemCount, iPos); } else { - // .. + // 갯수 셋팅.. CGameProcedure::s_pProcMain->m_pUIInventory->m_pMyInvWnd[iPos]->iCount = iItemCount; PlayItemSound(CGameProcedure::s_pProcMain->m_pUIInventory->m_pMyInvWnd[iPos]->pItemBasic); } } else { - // .. .. .. + // 아이템이 없는 경우 .. 새로 만든다.. 갯수 셋팅.. AddToItemTableToInventory(iItemID, iItemCount, iPos); } spItem = m_pMyDroppedItem[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; if (spItem) { - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spItem->pUIIcon); - // ҽ .. + // 리소스 제거.. spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -775,13 +775,13 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ pStatic = NULL; pInfoExt = &(CGameBase::s_pPlayer->m_InfoExt); - // Ʈ.. + // 돈 업데이트.. ::_LoadStringFromResource(IDS_DROPPED_NOAH_GET, stdMsg); sprintf(szMsg, stdMsg.c_str(), iGold - pInfoExt->iGold); CGameProcedure::s_pProcMain->MsgOutput(szMsg, 0xff9b9bff); pInfoExt->iGold = iGold; - TRACE(" Ʈ %d \n", iGold); + TRACE("돈 업데이트 %d \n", iGold); pStatic = (CN3UIString *)CGameProcedure::s_pProcMain->m_pUIInventory->GetChildByID("text_gold"); __ASSERT(pStatic, "NULL UI Component!!"); if (pStatic) { @@ -793,10 +793,10 @@ void CUIDroppedItemDlg::GetItemByIDToInventory(BYTE bResult, int iItemID, int64_ return; } - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spItem->pUIIcon); - // ҽ .. + // 리소스 제거.. spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; diff --git a/src/game/UIEndingDisplay.cpp b/src/game/UIEndingDisplay.cpp index e312567d..576be1e5 100644 --- a/src/game/UIEndingDisplay.cpp +++ b/src/game/UIEndingDisplay.cpp @@ -23,19 +23,19 @@ void CUIEndingDisplay::Release() { } void CUIEndingDisplay::Render() { - // ȭ  ߱.. + // 화면 가운데로 맞추기.. RECT rc = this->GetRegion(); int iX = (s_CameraData.vp.Width - (rc.right - rc.left)) / 2; int iY = (s_CameraData.vp.Height - (rc.bottom - rc.top)) / 2; this->SetPos(iX, iY); - CGameProcedure::s_pEng->Clear(0); // - CGameProcedure::s_pEng->BeginScene(); // ... + CGameProcedure::s_pEng->Clear(0); // 배경은 검은색 + CGameProcedure::s_pEng->BeginScene(); // 씬 렌더 ㅅ작... CUIManager::RenderStateSet(); CN3UIBase::Render(); CUIManager::RenderStateRestore(); - CGameProcedure::s_pEng->EndScene(); // ... + CGameProcedure::s_pEng->EndScene(); // 씬 렌더 시작... CGameProcedure::s_pEng->Present(CN3Base::s_hWndBase); } \ No newline at end of file diff --git a/src/game/UIHotKeyDlg.cpp b/src/game/UIHotKeyDlg.cpp index 5f0d98e3..c8438a75 100644 --- a/src/game/UIHotKeyDlg.cpp +++ b/src/game/UIHotKeyDlg.cpp @@ -88,13 +88,13 @@ DWORD CUIHotKeyDlg::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & dwRet |= CN3UIBase::MouseProc(dwFlags, ptCur, ptOld); return dwRet; } - // ʴ´.. + // 실제로 쓰진 않는다.. if (CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer) { dwRet |= CN3UIBase::MouseProc(dwFlags, ptCur, ptOld); return dwRet; } - // 巡 Ǵ .. + // 드래그 되는 아이콘 갱신.. if (GetState() == UI_STATE_ICON_MOVING) { if (CN3UIWndBase::m_sSkillSelectInfo.pSkillDoneInfo) { CN3UIWndBase::m_sSkillSelectInfo.pSkillDoneInfo->pUIIcon->SetRegion(GetSampleRect()); @@ -143,7 +143,7 @@ bool CUIHotKeyDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { break; case UIMSG_ICON_RUP: - // Hot Key 츦 ٴϸ鼭 ˻.. + // Hot Key 윈도우를 돌아 다니면서 검사.. if (IsIn(ptCur.x, ptCur.y)) { int iOrder = GetAreaiOrder(); if (m_pMyHotkey[m_iCurPage][iOrder]) { @@ -155,10 +155,10 @@ bool CUIHotKeyDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { break; case UIMSG_ICON_UP: - // Hot Key 츦 ٴϸ鼭 ˻.. + // Hot Key 윈도우를 돌아 다니면서 검사.. if (IsIn(ptCur.x, ptCur.y)) { int iOrder = GetAreaiOrder(); - if (CN3UIWndBase::m_sSkillSelectInfo.iOrder == iOrder) // .. + if (CN3UIWndBase::m_sSkillSelectInfo.iOrder == iOrder) // 실행.. { CN3UIArea * pArea; pArea = CN3UIWndBase::GetChildAreaByiOrder(UI_AREA_TYPE_SKILL_HOTKEY, iOrder); @@ -170,13 +170,13 @@ bool CUIHotKeyDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { DoOperate(m_pMyHotkey[m_iCurPage][iOrder]); } else { if (iOrder == -1) { - // ҽ Free.. + // 리소스 Free.. spSkill = CN3UIWndBase::m_sSkillSelectInfo.pSkillDoneInfo; - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spSkill->pUIIcon); - // ҽ .. + // 리소스 제거.. spSkill->pUIIcon->Release(); delete spSkill->pUIIcon; spSkill->pUIIcon = NULL; @@ -189,17 +189,17 @@ bool CUIHotKeyDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } CloseIconRegistry(); - } else // ű.. + } else // 옮기기.. { - // ִٸ.. + // 기존 아이콘이 있다면.. if (m_pMyHotkey[m_iCurPage][iOrder]) { - // Ѵ.. + // 기존 아이콘을 삭제한다.. spSkill = m_pMyHotkey[m_iCurPage][iOrder]; - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spSkill->pUIIcon); - // ҽ .. + // 리소스 제거.. spSkill->pUIIcon->Release(); delete spSkill->pUIIcon; spSkill->pUIIcon = NULL; @@ -227,15 +227,15 @@ bool CUIHotKeyDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { CloseIconRegistry(); } } - } else // .. + } else // 삭제.. { - // ҽ Free.. + // 리소스 Free.. spSkill = CN3UIWndBase::m_sSkillSelectInfo.pSkillDoneInfo; - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spSkill->pUIIcon); - // ҽ .. + // 리소스 제거.. spSkill->pUIIcon->Release(); delete spSkill->pUIIcon; spSkill->pUIIcon = NULL; @@ -266,7 +266,7 @@ void CUIHotKeyDlg::Render() { __IconItemSkill * pSkill = NULL; if (!m_bVisible) { - return; // ڽĵ render ʴ´. + return; // 보이지 않으면 자식들을 render하지 않는다. } DisableTooltipDisplay(); DisableCountStrDisplay(); @@ -292,7 +292,7 @@ void CUIHotKeyDlg::Render() { } } - // + // 현재 페이지에서 CN3UIArea * pArea; POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); @@ -359,7 +359,7 @@ void CUIHotKeyDlg::InitIconUpdate() { if (CGameProcedure::RegGetSetting(std::to_string(iSkillCount).c_str(), &HD, sizeof(CHotkeyData))) { __TABLE_UPC_SKILL * pUSkill = NULL; - // Skill Tree Window ̵ continue.. + // Skill Tree Window가 아이디를 갖고 있지 않으면 continue.. if ((HD.iID < UIITEM_TYPE_SONGPYUN_ID_MIN) && (!CGameProcedure::s_pProcMain->m_pUISkillTreeDlg->HasIDSkill(HD.iID))) { continue; @@ -373,10 +373,10 @@ void CUIHotKeyDlg::InitIconUpdate() { __IconItemSkill * spSkill = new __IconItemSkill(); spSkill->pSkill = pUSkill; - // ̸ .. ^^ + // 아이콘 이름 만들기.. ^^ spSkill->szIconFN = std::format("UI\\skillicon_{:02d}_{:d}.dxt", HD.iID % 100, HD.iID / 100); - // εϱ.. ^^ + // 아이콘 로드하기.. ^^ spSkill->pUIIcon = new CN3UIIcon; spSkill->pUIIcon->Init(this); spSkill->pUIIcon->SetTex(spSkill->szIconFN); @@ -391,7 +391,7 @@ void CUIHotKeyDlg::InitIconUpdate() { spSkill->pUIIcon->SetMoveRect(pArea->GetRegion()); } - // .. + // 아이콘 정보 저장.. m_pMyHotkey[HD.row][HD.column] = spSkill; } iSkillCount++; @@ -457,13 +457,13 @@ void CUIHotKeyDlg::AllFactorClear() { for (int i = 0; i < MAX_SKILL_HOTKEY_PAGE; i++) { for (int j = 0; j < MAX_SKILL_IN_HOTKEY; j++) { if (m_pMyHotkey[i][j] != NULL) { - // ҽ Free.. + // 리소스 Free.. spSkill = m_pMyHotkey[i][j]; - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spSkill->pUIIcon); - // ҽ .. + // 리소스 제거.. spSkill->pUIIcon->Release(); delete spSkill->pUIIcon; spSkill->pUIIcon = NULL; @@ -478,7 +478,7 @@ void CUIHotKeyDlg::AllFactorClear() { } int CUIHotKeyDlg::GetAreaiOrder() { - // Area ˻Ѵ.. + // 먼저 Area를 검색한다.. CN3UIArea * pArea; POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); @@ -493,7 +493,7 @@ int CUIHotKeyDlg::GetAreaiOrder() { } bool CUIHotKeyDlg::IsSelectedSkillInRealIconArea() { - // Area ˻Ѵ.. + // 먼저 Area를 검색한다.. CN3UIArea * pArea; bool bFound = false; POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); @@ -535,13 +535,13 @@ void CUIHotKeyDlg::SetReceiveSelectedSkill(int iIndex) { __IconItemSkill * spSkill = NULL; if (m_pMyHotkey[m_iCurPage][iIndex] != NULL) { - // ҽ Free.. + // 리소스 Free.. spSkill = m_pMyHotkey[m_iCurPage][iIndex]; - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spSkill->pUIIcon); - // ҽ .. + // 리소스 제거.. spSkill->pUIIcon->Release(); delete spSkill->pUIIcon; spSkill->pUIIcon = NULL; @@ -553,7 +553,7 @@ void CUIHotKeyDlg::SetReceiveSelectedSkill(int iIndex) { CN3UIArea * pArea; pArea = CN3UIWndBase::GetChildAreaByiOrder(UI_AREA_TYPE_SKILL_HOTKEY, iIndex); - // .. ڸ + // 그 다음에.. 그 자리에 m_pMyHotkey[m_iCurPage][iIndex] = CN3UIWndBase::m_sSkillSelectInfo.pSkillDoneInfo; m_pMyHotkey[m_iCurPage][iIndex]->szIconFN = CN3UIWndBase::m_sSkillSelectInfo.pSkillDoneInfo->szIconFN; m_pMyHotkey[m_iCurPage][iIndex]->pUIIcon->SetRegion(pArea->GetRegion()); @@ -643,8 +643,8 @@ void CUIHotKeyDlg::DoOperate(__IconItemSkill * pSkill) { } //char szBuf[512]; - // ޽ ڽ .. - //wsprintf(szBuf, "%s ų Ǿϴ.", pSkill->pSkill->szName.c_str() ); + // 메시지 박스 출력.. + //wsprintf(szBuf, "%s 스킬이 사용되었습니다.", pSkill->pSkill->szName.c_str() ); //CGameProcedure::s_pProcMain->MsgOutput(szBuf, 0xffffff00); PlayRepairSound(); @@ -659,13 +659,13 @@ void CUIHotKeyDlg::ClassChangeHotkeyFlush() { for (int i = 0; i < MAX_SKILL_HOTKEY_PAGE; i++) { for (int j = 0; j < MAX_SKILL_IN_HOTKEY; j++) { if (m_pMyHotkey[i][j] != NULL) { - // ҽ Free.. + // 리소스 Free.. spSkill = m_pMyHotkey[i][j]; - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spSkill->pUIIcon); - // ҽ .. + // 리소스 제거.. spSkill->pUIIcon->Release(); delete spSkill->pUIIcon; spSkill->pUIIcon = NULL; @@ -749,7 +749,7 @@ int CUIHotKeyDlg::GetCountCurPageIndex(__IconItemSkill * spSkill) { bool CUIHotKeyDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { bool bFound = false; - // ƴϸ.. + // 내가 가졌던 아이콘이 아니면.. if (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd != UIWND_INVENTORY) { return false; } else { @@ -770,15 +770,15 @@ bool CUIHotKeyDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { __IconItemSkill *spSkill, *spItem; - // ִٸ.. + // 기존 아이콘이 있다면.. if (m_pMyHotkey[m_iCurPage][iOrder]) { - // Ѵ.. + // 기존 아이콘을 삭제한다.. spSkill = m_pMyHotkey[m_iCurPage][iOrder]; - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spSkill->pUIIcon); - // ҽ .. + // 리소스 제거.. spSkill->pUIIcon->Release(); delete spSkill->pUIIcon; spSkill->pUIIcon = NULL; @@ -800,11 +800,11 @@ bool CUIHotKeyDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { spSkill = new __IconItemSkill(); spSkill->pSkill = pUSkill; - // ̸ .. ^^ + // 아이콘 이름 만들기.. ^^ spSkill->szIconFN = std::format("UI\\skillicon_{:02d}_{:d}.dxt", spItem->pItemBasic->dwEffectID1 % 100, spItem->pItemBasic->dwEffectID1 / 100); - // εϱ.. ^^ + // 아이콘 로드하기.. ^^ spSkill->pUIIcon = new CN3UIIcon; spSkill->pUIIcon->Init(this); spSkill->pUIIcon->SetTex(spSkill->szIconFN); @@ -853,7 +853,7 @@ void CUIHotKeyDlg::RenderSelectIcon(CN3UIIcon * pUIIcon) { return; } - RECT rc = pUIIcon->GetRegion(); // ǥ + RECT rc = pUIIcon->GetRegion(); // 선택 표시 __VertexTransformedColor vLines[5]; vLines[0].Set(rc.left, rc.top, UI_DEFAULT_Z, UI_DEFAULT_RHW, 0xff00ff00); @@ -902,8 +902,8 @@ void CUIHotKeyDlg::RenderSelectIcon(CN3UIIcon * pUIIcon) { //this_ui_add_start bool CUIHotKeyDlg::OnKeyPress(int iKey) { switch (iKey) { - case DIK_ESCAPE: { //hotkey Ŀ ٸ ui Ƿ DIK_ESCAPE Ŀ ٽ - //ִ ٸ ̸ ݾش. + case DIK_ESCAPE: { //hotkey가 포커스 잡혀있을때는 다른 ui를 닫을수 없으므로 DIK_ESCAPE가 들어오면 포커스를 다시잡고 + //열려있는 다른 유아이를 닫아준다. CGameProcedure::s_pUIMgr->ReFocusUI(); //this_ui CN3UIBase * pFocus = CGameProcedure::s_pUIMgr->GetFocusedUI(); if (pFocus && pFocus != this) { diff --git a/src/game/UIImageTooltipDlg.cpp b/src/game/UIImageTooltipDlg.cpp index 97e8dd57..a8bda376 100644 --- a/src/game/UIImageTooltipDlg.cpp +++ b/src/game/UIImageTooltipDlg.cpp @@ -74,7 +74,7 @@ bool CUIImageTooltipDlg::SetTooltipTextColor(e_Class eMyValue, e_Class eTooltipV void CUIImageTooltipDlg::SetPosSomething(int xpos, int ypos, int iNum) { int iWidth = 0; - // ũ .. + // 가로 크기 얻기.. for (int i = 0; i < iNum; i++) { if (m_pstdstr[i].empty()) { continue; @@ -88,7 +88,7 @@ void CUIImageTooltipDlg::SetPosSomething(int xpos, int ypos, int iNum) { // int iWidth = m_rcRegion.right-m_rcRegion.left; int iHeight = - (m_pStr[iNum - 1]->GetRegion().bottom - m_pStr[0]->GetRegion().top) + 14; // 2 string .. + (m_pStr[iNum - 1]->GetRegion().bottom - m_pStr[0]->GetRegion().top) + 14; // 2는 string간의 간격의 절반.. RECT rect, rect2; @@ -181,7 +181,7 @@ int CUIImageTooltipDlg::CalcTooltipStringNumAndWrite(__IconItemSkill * spItem, b ::_LoadStringFromResource(IDS_TOOLTIP_GOLD, szStr); if (spItem->pItemBasic->szName == szStr) { sprintf(szBuff, "%d %s", spItem->iCount, spItem->pItemBasic->szName.c_str()); - // ̸ .. + // 돈이면 흰색.. m_pStr[iIndex]->SetColor(m_CWhite); m_pstdstr[iIndex] = szBuff; iIndex++; @@ -237,7 +237,7 @@ int CUIImageTooltipDlg::CalcTooltipStringNumAndWrite(__IconItemSkill * spItem, b (spItem->pItemBasic->byContable != UIITEM_TYPE_COUNTABLE_SMALL)) { m_pStr[iIndex]->SetStyle(UI_STR_TYPE_HALIGN, UISTYLE_STRING_ALIGNCENTER); e_ItemClass eIC = (e_ItemClass)(spItem->pItemBasic->byClass); - CGameProcedure::GetTextByItemClass(eIC, szString); // ڿ .. + CGameProcedure::GetTextByItemClass(eIC, szString); // 아이템 종류에 따라 문자열 만들기.. m_pStr[iIndex]->SetColor(m_CWhite); m_pstdstr[iIndex] = szString; iIndex++; @@ -246,7 +246,7 @@ int CUIImageTooltipDlg::CalcTooltipStringNumAndWrite(__IconItemSkill * spItem, b e_Race eRace = (e_Race)spItem->pItemBasic->byNeedRace; if (eRace != RACE_ALL) { m_pStr[iIndex]->SetStyle(UI_STR_TYPE_HALIGN, UISTYLE_STRING_ALIGNCENTER); - CGameProcedure::GetTextByRace(eRace, szString); // ִ ڿ . + CGameProcedure::GetTextByRace(eRace, szString); // 아이템을 찰수 있는 종족에 따른 문자열 만들기. if (SetTooltipTextColor(CGameBase::s_pPlayer->m_InfoBase.eRace, eRace)) { m_pStr[iIndex]->SetColor(m_CWhite); } else { @@ -260,7 +260,7 @@ int CUIImageTooltipDlg::CalcTooltipStringNumAndWrite(__IconItemSkill * spItem, b if ((int)spItem->pItemBasic->byNeedClass != 0) { m_pStr[iIndex]->SetStyle(UI_STR_TYPE_HALIGN, UISTYLE_STRING_ALIGNCENTER); e_Class eClass = (e_Class)spItem->pItemBasic->byNeedClass; - CGameProcedure::GetTextByClass(eClass, szString); // ִ ڿ . + CGameProcedure::GetTextByClass(eClass, szString); // 아이템을 찰수 있는 종족에 따른 문자열 만들기. switch (eClass) { case CLASS_KINDOF_WARRIOR: @@ -471,7 +471,7 @@ int CUIImageTooltipDlg::CalcTooltipStringNumAndWrite(__IconItemSkill * spItem, b } ERROR_EXCEPTION - // ݽð .. + // 공격시간 감소 없어짐.. if (spItem->pItemBasic->siAttackRange != 0) { m_pStr[iIndex]->SetStyle(UI_STR_TYPE_HALIGN, UISTYLE_STRING_ALIGNLEFT); @@ -600,7 +600,7 @@ int CUIImageTooltipDlg::CalcTooltipStringNumAndWrite(__IconItemSkill * spItem, b } ERROR_EXCEPTION - if (spItem->pItemExt->byDamageFire != 0) // ȭӼ + if (spItem->pItemExt->byDamageFire != 0) // 화염속성 { m_pStr[iIndex]->SetStyle(UI_STR_TYPE_HALIGN, UISTYLE_STRING_ALIGNLEFT); ::_LoadStringFromResource(IDS_TOOLTIP_ATTRMAGIC1, szStr); @@ -977,7 +977,7 @@ int CUIImageTooltipDlg::CalcTooltipStringNumAndWrite(__IconItemSkill * spItem, b } } - return iIndex; // ӽ.. ݵ 1 ũ.. + return iIndex; // 임시.. 반드시 1보다 크다.. } void CUIImageTooltipDlg::DisplayTooltipsEnable(int xpos, int ypos, __IconItemSkill * spItem, bool bPrice, bool bBuy) { diff --git a/src/game/UIImageTooltipDlg.h b/src/game/UIImageTooltipDlg.h index e90286a3..67009d10 100644 --- a/src/game/UIImageTooltipDlg.h +++ b/src/game/UIImageTooltipDlg.h @@ -17,16 +17,16 @@ #define MAX_TOOLTIP_COUNT 30 class CUIImageTooltipDlg : public CN3UIBase { - const D3DCOLOR m_CYellow; // ... - const D3DCOLOR m_CBlue; // ... - const D3DCOLOR m_CGold; // ũ... - const D3DCOLOR m_CIvory; // ׷̵.. - const D3DCOLOR m_CGreen; // ɼ... ׷, ɷġ , Ӽ.. - const D3DCOLOR m_CWhite; // Ϲ... - const D3DCOLOR m_CRed; // ѿ ɸ.. + const D3DCOLOR m_CYellow; // 레어... + const D3DCOLOR m_CBlue; // 매직... + const D3DCOLOR m_CGold; // 유니크... + const D3DCOLOR m_CIvory; // 업그레이드.. + const D3DCOLOR m_CGreen; // 옵션... 저항력, 능력치 상승, 마법속성.. + const D3DCOLOR m_CWhite; // 일반... + const D3DCOLOR m_CRed; // 뭔가 제한에 걸릴때.. public: - CN3UIString * m_pStr[MAX_TOOLTIP_COUNT]; // Ʈ.. ^^ + CN3UIString * m_pStr[MAX_TOOLTIP_COUNT]; // 스트륑.. ^^ std::string m_pstdstr[MAX_TOOLTIP_COUNT]; CN3UIImage * m_pImg; diff --git a/src/game/UIInn.cpp b/src/game/UIInn.cpp index f3bb5d01..663d8a6d 100644 --- a/src/game/UIInn.cpp +++ b/src/game/UIInn.cpp @@ -25,14 +25,14 @@ CUIInn::~CUIInn() {} bool CUIInn::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (dwMsg == UIMSG_BUTTON_CLICK) { - if (pSender->m_szID == "btn_warehouse") //â̿.. + if (pSender->m_szID == "btn_warehouse") //창고이용.. { MsgSend_OpenWareHouse(); SetVisible(false); return true; } - if (pSender->m_szID == "btn_makeclan") //clan .. + if (pSender->m_szID == "btn_makeclan") //clan 생성.. { __InfoPlayerBase * pInfo = &(CGameProcedure::s_pPlayer->m_InfoBase); __InfoPlayerMySelf * pInfoExt = &(CGameProcedure::s_pPlayer->m_InfoExt); @@ -79,8 +79,8 @@ void CUIInn::Message(int iMessageID) { } void CUIInn::MsgSend_OpenWareHouse() { - BYTE byBuff[2]; // Ŷ .. - int iOffset = 0; // Ŷ .. + BYTE byBuff[2]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_WAREHOUSE); CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_WARE_OPEN); diff --git a/src/game/UIInventory.cpp b/src/game/UIInventory.cpp index 2103bbd9..7f4d9ca4 100644 --- a/src/game/UIInventory.cpp +++ b/src/game/UIInventory.cpp @@ -31,36 +31,36 @@ #include "Resource.h" static bool g_bItemClassGroup[26][26] = { - // [][÷̾] - // { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // ʱ׷ + // [아이템][플레이어] + // { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // 초기그룹 // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 - {1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // 0 Group - {1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1}, // 1 Group - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, // 2 Group - {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1}, // 3 Group - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, // 4 Group - {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, // 5 Group - {1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}, // 6 Group - {1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, // 7 Group - {1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, // 8 Group - {1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1}, // 9 Group - {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0}, // 10 Group - {1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1}, // 11 Group - {1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1}, // 12 Group - {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0}, // 13 Group - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1}, // 14 Group - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // 15 Group - {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0}, // 16 Group - {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}, // 17 Group - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, // 18 Group - {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0}, // 19 Group - {1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0}, // 20 Group - {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1}, // 21 Group - {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1}, // 22 Group - {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1}, // 23 Group - {0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0}, // 24 Group + {1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // 0번 Group + {1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1}, // 1번 Group + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, // 2번 Group + {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1}, // 3번 Group + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, // 4번 Group + {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, // 5번 Group + {1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0}, // 6번 Group + {1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, // 7번 Group + {1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, // 8번 Group + {1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1}, // 9번 Group + {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0}, // 10번 Group + {1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1}, // 11번 Group + {1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1}, // 12번 Group + {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0}, // 13번 Group + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1}, // 14번 Group + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // 15번 Group + {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0}, // 16번 Group + {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0}, // 17번 Group + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}, // 18번 Group + {1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0}, // 19번 Group + {1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0}, // 20번 Group + {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1}, // 21번 Group + {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1}, // 22번 Group + {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1}, // 23번 Group + {0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0}, // 24번 Group {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} -}; // 25 Group ( Class) +}; // 25번 Group (모든 Class) ////////////////////////////////////////////////////////////////////// // Construction/Destruction @@ -77,9 +77,9 @@ CUIInventory::CUIInventory() { m_pUITooltipDlg = NULL; CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; - m_bOpenningNow = false; // ִ.. - m_bClosingNow = false; // ִ.. - m_fMoveDelta = 0; // ε巴 ؼ ġ 꿡 εҼ .. + m_bOpenningNow = false; // 열리고 있다.. + m_bClosingNow = false; // 닫히고 있다.. + m_fMoveDelta = 0; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. m_bDestoyDlgAlive = false; m_pText_Weight = NULL; @@ -109,9 +109,9 @@ void CUIInventory::Release() { } } - m_bOpenningNow = false; // ִ.. - m_bClosingNow = false; // ִ.. - m_fMoveDelta = 0; // ε巴 ؼ ġ 꿡 εҼ .. + m_bOpenningNow = false; // 열리고 있다.. + m_bClosingNow = false; // 닫히고 있다.. + m_fMoveDelta = 0; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. m_pText_Weight = NULL; } @@ -166,7 +166,7 @@ void CUIInventory::Open(e_InvenState eIS) { pStatic->SetString(::_FormatCoins(CGameBase::s_pPlayer->m_InfoExt.iGold)); } - // !! + // 스르륵 열린다!! SetVisible(true); this->SetPos(CN3Base::s_CameraData.vp.Width, 10); m_fMoveDelta = 0; @@ -205,8 +205,8 @@ void CUIInventory::Close(bool bByKey) { SetState(UI_STATE_COMMON_NONE); CN3UIWndBase::AllHighLightIconFree(); - // ..!! - // SetVisible(false); // ش.. + // 스르륵 닫힌다..!! + // SetVisible(false); // 다 닫히고 나서 해준다.. RECT rc = this->GetRegion(); this->SetPos(CN3Base::s_CameraData.vp.Width - (rc.right - rc.left), 10); m_fMoveDelta = 0; @@ -214,7 +214,7 @@ void CUIInventory::Close(bool bByKey) { m_bClosingNow = true; if (m_pSnd_CloseUI) { - m_pSnd_CloseUI->Play(); // ݴ Ҹ.. + m_pSnd_CloseUI->Play(); // 닫는 소리.. } m_iRBtnDownOffs = -1; @@ -222,10 +222,10 @@ void CUIInventory::Close(bool bByKey) { void CUIInventory::Tick() { if (!m_bVisible) { - return; // ڽĵ tick ʴ´. + return; // 보이지 않으면 자식들을 tick하지 않는다. } - if (m_bOpenningNow) // ʿ ... Ѵٸ.. + if (m_bOpenningNow) // 오른쪽에서 왼쪽으로 스르륵...열려야 한다면.. { POINT ptCur = this->GetPos(); RECT rc = this->GetRegion(); @@ -240,7 +240,7 @@ void CUIInventory::Tick() { int iXLimit = CN3Base::s_CameraData.vp.Width - (int)fWidth; ptCur.x = CN3Base::s_CameraData.vp.Width - (int)m_fMoveDelta; - if (ptCur.x <= iXLimit) // ٿȴ!! + if (ptCur.x <= iXLimit) // 다열렸다!! { ptCur.x = iXLimit; m_bOpenningNow = false; @@ -249,7 +249,7 @@ void CUIInventory::Tick() { this->SetPos(ptCur.x, ptCur.y); CN3UIWndBase::AllHighLightIconFree(); - } else if (m_bClosingNow) // ʿ ... Ѵٸ.. + } else if (m_bClosingNow) // 오른쪽에서 왼쪽으로 스르륵...열려야 한다면.. { POINT ptCur = this->GetPos(); RECT rc = this->GetRegion(); @@ -264,12 +264,12 @@ void CUIInventory::Tick() { int iXLimit = CN3Base::s_CameraData.vp.Width; ptCur.x = CN3Base::s_CameraData.vp.Width - (int)(fWidth - m_fMoveDelta); - if (ptCur.x >= iXLimit) // ..!! + if (ptCur.x >= iXLimit) // 다 닫혔다..!! { ptCur.x = iXLimit; m_bClosingNow = false; - this->SetVisibleWithNoSound(false, false, true); // Ⱥ̰ Ѵ. + this->SetVisibleWithNoSound(false, false, true); // 다 닫혔으니 눈에서 안보이게 한다. } this->SetPos(ptCur.x, ptCur.y); @@ -286,7 +286,7 @@ void CUIInventory::Tick() { void CUIInventory::Render() { if (!m_bVisible) { - return; // ڽĵ render ʴ´. + return; // 보이지 않으면 자식들을 render하지 않는다. } POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); m_pUITooltipDlg->DisplayTooltipsDisable(); @@ -296,7 +296,7 @@ void CUIInventory::Render() { __IconItemSkill * spItem = NULL; RECT rcRegion; - SetRect(&rcRegion, rUser.left, rUser.top, rUser.right, rUser.bottom); // + SetRect(&rcRegion, rUser.left, rUser.top, rUser.right, rUser.bottom); // 영역 지정 char strDummy[32]; lstrcpy(strDummy, "elmo_ecli666"); @@ -328,11 +328,11 @@ void CUIInventory::Render() { CN3UIWndBase::m_sSelectedIconInfo.pItemSelect->pUIIcon->Render(); } - // ǥõǾ ǥ.. + // 갯수 표시되야 할 아이템 갯수 표시.. for (int i = 0; i < MAX_ITEM_INVENTORY; i++) { if (m_pMyInvWnd[i] && ((m_pMyInvWnd[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (m_pMyInvWnd[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL))) { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i); if (pStr) { if ((GetState() == UI_STATE_ICON_MOVING) && @@ -349,7 +349,7 @@ void CUIInventory::Render() { } } } else { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i); if (pStr) { pStr->SetVisible(false); @@ -357,7 +357,7 @@ void CUIInventory::Render() { } } - // ̸.. ; + // 수리모드이면.. 리턴; if (m_eInvenState == INV_STATE_REPAIR) { CGameProcedure::s_pProcMain->m_pUIRepairTooltip->Render(); return; @@ -526,7 +526,7 @@ DWORD CUIInventory::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & return dwRet; } - // ̸.. ; + // 수리모드이면.. 리턴; if (m_eInvenState == INV_STATE_REPAIR) { dwRet |= CN3UIBase::MouseProc(dwFlags, ptCur, ptOld); return dwRet; @@ -541,7 +541,7 @@ DWORD CUIInventory::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & } if (!pImg->IsIn(ptCur.x, ptCur.y)) { //this_ui_add_start - //ıϴ â â  κ丮â Ŭ ൿ ϸ ijͰ ̵ ؼ ϴ ... + //파괴하는 창이 열려있을때 그창을 벗어나서 인벤토리창에서 클릭과 같은 행동을 하면 캐릭터가 이동을 해서 방지하는 차원에서... if (IsIn(ptCur.x, ptCur.y)) { dwRet |= UI_MOUSEPROC_INREGION; } @@ -559,7 +559,7 @@ DWORD CUIInventory::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & return dwRet; } - // 巡 Ǵ .. + // 드래그 되는 아이콘 갱신.. if ((GetState() == UI_STATE_ICON_MOVING) && (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd == UIWND_INVENTORY) && (CN3UIWndBase::m_sSelectedIconInfo.pItemSelect)) { @@ -571,8 +571,8 @@ DWORD CUIInventory::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & } void CUIInventory::SendInvMsg(BYTE bDir, int iItemID, int SrcPos, int DestPos) { - BYTE byBuff[100]; // .. - int iOffset = 0; // ɼ.. + BYTE byBuff[100]; // 버퍼.. + int iOffset = 0; // 옵셋.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_ITEM_MOVE); // Item Move CAPISocket::MP_AddByte(byBuff, iOffset, bDir); @@ -582,7 +582,7 @@ void CUIInventory::SendInvMsg(BYTE bDir, int iItemID, int SrcPos, int DestPos) { TRACE("Send Inv Move %d, %d, %d, %d \n", bDir, iItemID, SrcPos, DestPos); - CGameProcedure::s_pProcMain->s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pProcMain->s_pSocket->Send(byBuff, iOffset); // 보냄.. } int CUIInventory::GetInvDestinationIndex(__IconItemSkill * spItem) { @@ -610,7 +610,7 @@ int CUIInventory::GetArmDestinationIndex(__IconItemSkill * spItem) { e_PartPosition ePart; e_PlugPosition ePlug; e_ItemType eType = - CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, NULL, ePart, ePlug); // ۿ ̸  + CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, NULL, ePart, ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { return false; } @@ -618,10 +618,10 @@ int CUIInventory::GetArmDestinationIndex(__IconItemSkill * spItem) { if (IsValidRaceAndClass(pItem, CN3UIWndBase::m_sSelectedIconInfo.pItemSelect->pItemExt)) { switch (pItem->byAttachPoint) { case ITEM_ATTACH_POS_DUAL: - if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT] && m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { // ʿ ִ .. - return ITEM_SLOT_POS_HAND_RIGHT; // Ѵ .. + if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT] && m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { // 양쪽에 있는 경우.. + return ITEM_SLOT_POS_HAND_RIGHT; // 둘다 있으면 오른쪽.. } - if (!m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]) { // ʿ .. + if (!m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]) { // 오른쪽에 없는 경우.. return ITEM_SLOT_POS_HAND_RIGHT; } else { if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]->pItemBasic->byAttachPoint == ITEM_ATTACH_POS_TWOHAND_RIGHT) { @@ -638,28 +638,28 @@ int CUIInventory::GetArmDestinationIndex(__IconItemSkill * spItem) { case ITEM_ATTACH_POS_HAND_LEFT: return ITEM_SLOT_POS_HAND_LEFT; - case ITEM_ATTACH_POS_TWOHAND_RIGHT: // հ տ .. - if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT] && m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { // ʿ ִ .. + case ITEM_ATTACH_POS_TWOHAND_RIGHT: // 양손검을 오른손에 찰때.. + if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT] && m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { // 양쪽에 있는 경우.. return -1; } else { return ITEM_SLOT_POS_HAND_RIGHT; } - case ITEM_ATTACH_POS_TWOHAND_LEFT: // հ տ .. - if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT] && m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { // ʿ ִ .. + case ITEM_ATTACH_POS_TWOHAND_LEFT: // 양손검을 오른손에 찰때.. + if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT] && m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { // 양쪽에 있는 경우.. return -1; } else { return ITEM_SLOT_POS_HAND_LEFT; } case ITEM_ATTACH_POS_EAR: - if (!m_pMySlot[ITEM_SLOT_POS_EAR_RIGHT]) { // ʿ .. + if (!m_pMySlot[ITEM_SLOT_POS_EAR_RIGHT]) { // 오른쪽에 없는 경우.. return ITEM_SLOT_POS_EAR_RIGHT; } - if (!m_pMySlot[ITEM_SLOT_POS_EAR_LEFT]) { // ʿ .. + if (!m_pMySlot[ITEM_SLOT_POS_EAR_LEFT]) { // 왼쪽에 없는 경우.. return ITEM_SLOT_POS_EAR_LEFT; } - return ITEM_SLOT_POS_EAR_RIGHT; // Ѵ .. + return ITEM_SLOT_POS_EAR_RIGHT; // 둘다 있으면 오른쪽.. case ITEM_ATTACH_POS_HEAD: return ITEM_SLOT_POS_HEAD; @@ -677,13 +677,13 @@ int CUIInventory::GetArmDestinationIndex(__IconItemSkill * spItem) { return ITEM_SLOT_POS_BELT; case ITEM_ATTACH_POS_FINGER: - if (!m_pMySlot[ITEM_SLOT_POS_RING_RIGHT]) { // ʿ .. + if (!m_pMySlot[ITEM_SLOT_POS_RING_RIGHT]) { // 오른쪽에 없는 경우.. return ITEM_SLOT_POS_RING_RIGHT; } - if (!m_pMySlot[ITEM_SLOT_POS_RING_LEFT]) { // ʿ .. + if (!m_pMySlot[ITEM_SLOT_POS_RING_LEFT]) { // 왼쪽에 없는 경우.. return ITEM_SLOT_POS_RING_LEFT; } - return ITEM_SLOT_POS_RING_RIGHT; // Ѵ .. + return ITEM_SLOT_POS_RING_RIGHT; // 둘다 있으면 오른쪽.. case ITEM_ATTACH_POS_LOWER: return ITEM_SLOT_POS_LOWER; @@ -702,7 +702,7 @@ int CUIInventory::GetArmDestinationIndex(__IconItemSkill * spItem) { } bool CUIInventory::CheckIconDropIfSuccessSendToServer(__IconItemSkill * spItem) { - //  ִ ˻ϰ.. + // 먼저 아이템이 들어갈 수 있는지 검사하고.. bool bFound = false; bool bArm = true; CN3UIArea * pArea; @@ -731,10 +731,10 @@ bool CUIInventory::CheckIconDropIfSuccessSendToServer(__IconItemSkill * spItem) } } - if (!bFound) // ã κ丮 ij ˻.. + if (!bFound) // 못 찾았으면 인벤토리 캐릭터 영역 검색.. { if (m_pArea_User->IsIn(ptCur.x, ptCur.y)) { - // κ ƴϸ.. false return.. + // 인벤 영역의 아이콘이 아니면.. false return.. if (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict == UIWND_DISTRICT_INVENTORY_INV) { iDestiOrder = GetArmDestinationIndex(CN3UIWndBase::m_sSelectedIconInfo.pItemSelect); if (iDestiOrder != -1) { @@ -761,11 +761,11 @@ bool CUIInventory::CheckIconDropIfSuccessSendToServer(__IconItemSkill * spItem) } if (!bFound) { - return false; // ãǷ.. .. + return false; // 못 찾았으므로.. 실패.. } - // Recovery Info Ȱϱ Ѵ.. - // WaitFromServer On ϰ.. Select Info Recovery Info .. + // 본격적으로 Recovery Info를 활용하기 시작한다.. + // 먼저 WaitFromServer를 On으로 하고.. Select Info를 Recovery Info로 복사.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = true; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = CN3UIWndBase::m_sSelectedIconInfo.pItemSelect; CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.UIWnd = CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd; @@ -774,15 +774,15 @@ bool CUIInventory::CheckIconDropIfSuccessSendToServer(__IconItemSkill * spItem) CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder = CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.iOrder; CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.UIWnd = UIWND_INVENTORY; CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = NULL; - // ˻ϴ ߿ Recovery Info߿ pItemTarget ʿϴٸ ۼϰ false Ҷ .. + // 검사하는 도중에 Recovery Info중에 pItemTarget를 필요하다면 작성하고 false를 리턴할때는 원래대로.. // Arm -> Arm if ((CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict == UIWND_DISTRICT_INVENTORY_SLOT) && bArm) { - // ִ 캸 .. + // 기존 아이콘이 있는지 살펴보고 기존 아이템이 없으면.. if (!m_pMySlot[iDestiOrder]) { if (IsValidPosFromArmToArm(iDestiOrder)) { - //  .. и 츦 ؼ ۼ.. - // ׸ ؾ ۾ ۼ.. + // 아이콘이 들어갈 수 있으면.. 서버가 실패를 줄 경우를 대비해서 백업 정보를 작성.. + // 그리고 서버가 성공을 줄 경우 해야할 작업 정보를 작성.. CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.UIWndDistrict = UIWND_DISTRICT_INVENTORY_SLOT; CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = iDestiOrder; @@ -799,21 +799,21 @@ bool CUIInventory::CheckIconDropIfSuccessSendToServer(__IconItemSkill * spItem) return false; } } - // .. + // 기존 아이콘이 있으면.. else { - //  .. + // 아이콘이 들어갈 수 있으면.. if (IsValidPosFromArmToArm(iDestiOrder)) { - // pItemTarget UIWndTargetStart ϰ.. + // 기존 아이콘 정보를 pItemTarget과 UIWndTargetStart를 셋팅하고.. CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = m_pMySlot[iDestiOrder]; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWnd = UIWND_INVENTORY; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWndDistrict = UIWND_DISTRICT_INVENTORY_SLOT; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.iOrder = iDestiOrder; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetEnd.UIWnd = UIWND_INVENTORY; - // ݴ뵵 ϸ.. + // 그 반대도 가능하면.. if (IsValidPosFromArmToArmInverse(CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder)) { - //  .. и 츦 ؼ ۼ.. - // ׸ ؾ ۾ ۼ.. + // 아이콘이 들어갈 수 있으면.. 서버가 실패를 줄 경우를 대비해서 백업 정보를 작성.. + // 그리고 서버가 성공을 줄 경우 해야할 작업 정보를 작성.. CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.UIWndDistrict = UIWND_DISTRICT_INVENTORY_SLOT; CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = iDestiOrder; @@ -838,11 +838,11 @@ bool CUIInventory::CheckIconDropIfSuccessSendToServer(__IconItemSkill * spItem) } // Arm -> Inv else if ((CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict == UIWND_DISTRICT_INVENTORY_SLOT) && !bArm) { - // ִ 캸 .. + // 기존 아이콘이 있는지 살펴보고 기존 아이템이 없으면.. if (!m_pMyInvWnd[iDestiOrder]) { - // 翬  ִ.. ^^ - //  .. и 츦 ؼ ۼ.. - // ׸ ؾ ۾ ۼ.. + // 아이콘은 당연히 들어갈 수 있당.. ^^ + // 아이콘이 들어갈 수 있으면.. 서버가 실패를 줄 경우를 대비해서 백업 정보를 작성.. + // 그리고 서버가 성공을 줄 경우 해야할 작업 정보를 작성.. CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.UIWndDistrict = UIWND_DISTRICT_INVENTORY_INV; CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = iDestiOrder; @@ -853,9 +853,9 @@ bool CUIInventory::CheckIconDropIfSuccessSendToServer(__IconItemSkill * spItem) CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder, iDestiOrder); return true; } - // .. + // 기존 아이콘이 있으면.. else { - // κ丮 󽽷 ã .. + // 인벤토리 빈슬롯을 찾아 들어간다.. bFound = false; for (i = 0; i < MAX_ITEM_INVENTORY; i++) { if (!m_pMyInvWnd[i]) { @@ -864,10 +864,10 @@ bool CUIInventory::CheckIconDropIfSuccessSendToServer(__IconItemSkill * spItem) } } - if (bFound) // ã.. + if (bFound) // 빈 슬롯을 찾았으면.. { - //  .. и 츦 ؼ ۼ.. - // ׸ ؾ ۾ ۼ.. + // 아이콘이 들어갈 수 있으면.. 서버가 실패를 줄 경우를 대비해서 백업 정보를 작성.. + // 그리고 서버가 성공을 줄 경우 해야할 작업 정보를 작성.. CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.UIWndDistrict = UIWND_DISTRICT_INVENTORY_INV; CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = i; @@ -887,12 +887,12 @@ bool CUIInventory::CheckIconDropIfSuccessSendToServer(__IconItemSkill * spItem) } // Inv -> Arm else if ((CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict == UIWND_DISTRICT_INVENTORY_INV) && bArm) { - // ˿ ϴ ִ 캼 ʿ䰡 .. ֳĸ, ˻ϴ Լ ϴϱ.. - // ִ 캸 .. + // 검에 장착하는 경우는 기존 아이콘이 있는지 살펴볼 필요가 없다.. 왜냐면, 검사하는 함수가 하니까.. + // 기존 아이콘이 있는지 살펴보고 기존 아이템이 없으면.. if (!m_pMySlot[iDestiOrder]) { if (IsValidPosFromInvToArm(iDestiOrder)) { - //  .. и 츦 ؼ ۼ.. - // ׸ ؾ ۾ ۼ.. + // 아이콘이 들어갈 수 있으면.. 서버가 실패를 줄 경우를 대비해서 백업 정보를 작성.. + // 그리고 서버가 성공을 줄 경우 해야할 작업 정보를 작성.. CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.UIWndDistrict = UIWND_DISTRICT_INVENTORY_SLOT; CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = iDestiOrder; @@ -909,15 +909,15 @@ bool CUIInventory::CheckIconDropIfSuccessSendToServer(__IconItemSkill * spItem) return false; } } - // .. + // 기존 아이콘이 있으면.. else { if (IsValidPosFromInvToArm(iDestiOrder)) { - //  .. и 츦 ؼ ۼ.. - // ׸ ؾ ۾ ۼ.. + // 아이콘이 들어갈 수 있으면.. 서버가 실패를 줄 경우를 대비해서 백업 정보를 작성.. + // 그리고 서버가 성공을 줄 경우 해야할 작업 정보를 작성.. CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.UIWndDistrict = UIWND_DISTRICT_INVENTORY_SLOT; CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = iDestiOrder; - // ˿ ϴ 찡 ƴϸ.. + // 검에 장착하는 경우가 아니면.. if ((iDestiOrder != ITEM_SLOT_POS_HAND_RIGHT) && (iDestiOrder != ITEM_SLOT_POS_HAND_LEFT)) { CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = m_pMySlot[iDestiOrder]; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWnd = UIWND_INVENTORY; @@ -944,10 +944,10 @@ bool CUIInventory::CheckIconDropIfSuccessSendToServer(__IconItemSkill * spItem) } // Inv -> Inv else if ((CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict == UIWND_DISTRICT_INVENTORY_INV) && !bArm) { - // ִ 캸 .. + // 기존 아이콘이 있는지 살펴보고 기존 아이템이 없으면.. if (!m_pMyInvWnd[iDestiOrder]) { - //  .. и 츦 ؼ ۼ.. - // ׸ ؾ ۾ ۼ.. + // 아이콘이 들어갈 수 있으면.. 서버가 실패를 줄 경우를 대비해서 백업 정보를 작성.. + // 그리고 서버가 성공을 줄 경우 해야할 작업 정보를 작성.. CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.UIWndDistrict = UIWND_DISTRICT_INVENTORY_INV; CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = iDestiOrder; @@ -958,7 +958,7 @@ bool CUIInventory::CheckIconDropIfSuccessSendToServer(__IconItemSkill * spItem) CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder, iDestiOrder); return true; } - // .. + // 기존 아이콘이 있으면.. else { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.UIWndDistrict = UIWND_DISTRICT_INVENTORY_INV; CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = iDestiOrder; @@ -992,11 +992,11 @@ inline bool CUIInventory::InvOpsSomething(__IconItemSkill * spItem) { } CN3UIArea * pArea = NULL; - // ˻Ѵ..̸ .. + // 검사한다..성공이면 서버에게 보냄.. if (CheckIconDropIfSuccessSendToServer(spItem)) { - // ̵.. Source.. ̴ Ÿ.. ϰ ߰ ʿ ̵ ϸ ȴ.. + // 아이콘 이동.. Source.. 같은 아이콘 내에서 움직이는 거면.. 굳이 제거하고 추가할 필요없이 이동만 하면 된다.. if (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource) { - // .. + // 제거.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: m_pMySlot[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = NULL; @@ -1008,7 +1008,7 @@ inline bool CUIInventory::InvOpsSomething(__IconItemSkill * spItem) { } } if (CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget) { - // .. + // 제거.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: m_pMySlot[CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.iOrder] = NULL; @@ -1020,11 +1020,11 @@ inline bool CUIInventory::InvOpsSomething(__IconItemSkill * spItem) { } } - // ̵.. Source.. ̴ Ÿ.. ϰ ߰ ʿ ̵ ϸ ȴ.. + // 아이콘 이동.. Source.. 같은 아이콘 내에서 움직이는 거면.. 굳이 제거하고 추가할 필요없이 이동만 하면 된다.. if (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource) { __IconItemSkill * spItem = CN3UIWndBase::m_sRecoveryJobInfo.pItemSource; - // ߰.. + // 추가.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: pArea = CN3UIWndBase::GetChildAreaByiOrder(UI_AREA_TYPE_SLOT, @@ -1051,7 +1051,7 @@ inline bool CUIInventory::InvOpsSomething(__IconItemSkill * spItem) { if (CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget) { __IconItemSkill * spItem = CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget; - // ߰.. + // 추가.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetEnd.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: pArea = CN3UIWndBase::GetChildAreaByiOrder(UI_AREA_TYPE_SLOT, @@ -1095,13 +1095,13 @@ bool CUIInventory::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { return false; } - // ƴϸ.. + // 내가 가졌던 아이콘이 아니면.. if (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd != m_eUIWnd) { return false; } - // ̰ κ丮 , Arm->Arm, Arm->Inv, Inv->Arm, Inv->Inv̴.. - // õ ܰ .. + // 내가 가졌던 아이콘이고 인벤토리 내에서 즉, Arm->Arm, Arm->Inv, Inv->Arm, Inv->Inv이다.. + // 선택된 아이콘과 같으면.. switch (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: pArea = @@ -1126,7 +1126,7 @@ bool CUIInventory::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } else if (m_pArea_Destroy->IsIn(ptCur.x, ptCur.y)) { m_bDestoyDlgAlive = true; - // .. + // 움직일 수 없다.. RECT rect = {0, 0, 0, 0}; switch (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict) { @@ -1166,14 +1166,14 @@ bool CUIInventory::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { void CUIInventory::ReceiveResultFromServer(BYTE bResult) { CN3UIArea * pArea = NULL; - if (bResult == 0x01) // .. + if (bResult == 0x01) // 성공.. { - // ٲ ͸ ̵.. + // 아이콘은 바뀌었으니 실제 데이터를 이동.. if (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource) { __IconItemSkill * spItem = CN3UIWndBase::m_sRecoveryJobInfo.pItemSource; e_ItemSlot eSlot = ITEM_SLOT_UNKNOWN; - // .. + // 제거.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: eSlot = (e_ItemSlot)CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder; @@ -1192,7 +1192,7 @@ void CUIInventory::ReceiveResultFromServer(BYTE bResult) { } e_ItemSlot eSlot = ITEM_SLOT_UNKNOWN; - // .. + // 제거.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: eSlot = (e_ItemSlot)CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.iOrder; @@ -1204,14 +1204,14 @@ void CUIInventory::ReceiveResultFromServer(BYTE bResult) { } } - // ٲ ͸ ̵.. + // 아이콘은 바뀌었으니 실제 데이터를 이동.. if (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource) { __IconItemSkill * spItem = CN3UIWndBase::m_sRecoveryJobInfo.pItemSource; if (!spItem) { return; } - // ߰.. + // 추가.. e_ItemSlot eSlot = ITEM_SLOT_UNKNOWN; switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: @@ -1231,7 +1231,7 @@ void CUIInventory::ReceiveResultFromServer(BYTE bResult) { } e_ItemSlot eSlot = ITEM_SLOT_UNKNOWN; - // ߰.. + // 추가.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetEnd.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: eSlot = (e_ItemSlot)CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetEnd.iOrder; @@ -1242,11 +1242,11 @@ void CUIInventory::ReceiveResultFromServer(BYTE bResult) { break; } } - } else // .. + } else // 실패.. { - // ·.. + // 아이콘을 원상태로.. if (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource) { - // .. + // 제거.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: m_pMySlot[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] = NULL; @@ -1258,9 +1258,9 @@ void CUIInventory::ReceiveResultFromServer(BYTE bResult) { } } - // ̵.. Target.. + // 아이콘 이동.. Target.. if (CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget) { - // .. + // 제거.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetEnd.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: m_pMySlot[CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetEnd.iOrder] = NULL; @@ -1275,7 +1275,7 @@ void CUIInventory::ReceiveResultFromServer(BYTE bResult) { if (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource) { __IconItemSkill * spItem = CN3UIWndBase::m_sRecoveryJobInfo.pItemSource; - // ߰.. + // 추가.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: pArea = CN3UIWndBase::GetChildAreaByiOrder(UI_AREA_TYPE_SLOT, @@ -1299,11 +1299,11 @@ void CUIInventory::ReceiveResultFromServer(BYTE bResult) { } } - // ̵.. Target.. + // 아이콘 이동.. Target.. if (CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget) { __IconItemSkill * spItem = CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget; - // ߰.. + // 추가.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: pArea = CN3UIWndBase::GetChildAreaByiOrder(UI_AREA_TYPE_SLOT, @@ -1434,7 +1434,7 @@ bool CUIInventory::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (dwMsg == UIMSG_BUTTON_CLICK) { if (pSender->m_szID == "btn_close") { - // κ丮 .. + // 인벤토리만 떠 있을때.. Close(); } } @@ -1485,8 +1485,8 @@ bool CUIInventory::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } break; case UIMSG_AREA_DOWN_FIRST: - // ΰ ŷ̰.. ̵ "area_gold"̸.. - // SubProcPerTrade Լ ȣ.. ( Լ editϴ ƴϸ.. ȣ) + // 개인간 거래중이고.. 내 아이디가 "area_gold"이면.. + // SubProcPerTrade에 함수를 호출.. ( 그 함수는 edit하는 중이 아니면.. 호출) if ((CGameProcedure::s_pProcMain->m_pSubProcPerTrade->m_ePerTradeState == PER_TRADE_STATE_NORMAL) && (pSender->m_szID.compare("area_gold") == 0)) { CGameProcedure::s_pProcMain->m_pSubProcPerTrade->RequestItemCountEdit(); @@ -1523,9 +1523,9 @@ bool CUIInventory::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { break; case UIMSG_ICON_UP: - // Ŵ ٴϸ鼭 ˻.. + // 아이콘 매니저 윈도우들을 돌아 다니면서 검사.. if (!CGameProcedure::s_pUIMgr->BroadcastIconDropMsg(CN3UIWndBase::m_sSelectedIconInfo.pItemSelect)) { - // ġ .. + // 아이콘 위치 원래대로.. IconRestore(); } else { if (CN3UIWndBase::m_sSelectedIconInfo.pItemSelect) { @@ -1545,7 +1545,7 @@ bool CUIInventory::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { case UIMSG_ICON_DBLCLK: SetState(UI_STATE_COMMON_NONE); - // ġ .. + // 아이콘 위치 원래대로.. IconRestore(); break; } @@ -1563,7 +1563,7 @@ bool CUIInventory::IsValidRaceAndClass(__TABLE_ITEM_BASIC * pItem, __TABLE_ITEM_ return false; } - // .. + // 종족.. switch (pItem->byNeedRace) { case 0: bValid = true; @@ -1584,7 +1584,7 @@ bool CUIInventory::IsValidRaceAndClass(__TABLE_ITEM_BASIC * pItem, __TABLE_ITEM_ std::string szMsg; if (bValid) { - // .. + // 직업.. if (pItem->byNeedClass != 0) { switch (pItem->byNeedClass) { case CLASS_KINDOF_WARRIOR: @@ -1845,7 +1845,7 @@ bool CUIInventory::IsValidPosFromInvToArm(int iOrder) { e_PartPosition ePart; e_PlugPosition ePlug; e_ItemType eType = - CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, NULL, ePart, ePlug); // ۿ ̸  + CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, NULL, ePart, ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { return false; } @@ -1893,18 +1893,18 @@ bool CUIInventory::IsValidPosFromInvToArm(int iOrder) { } break; - case ITEM_SLOT_POS_HAND_RIGHT: // .. + case ITEM_SLOT_POS_HAND_RIGHT: // 오른손.. switch (pItem->byAttachPoint) { case ITEM_ATTACH_POS_DUAL: case ITEM_ATTACH_POS_HAND_RIGHT: - // ϼտ Ⱑ ִ ˾ƺ.. + // 완손에 양손 무기가 있는지 알아본당.. if ((m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) && (m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]->pItemBasic->byAttachPoint == ITEM_ATTACH_POS_TWOHAND_LEFT)) { - // տ Ⱑ ִ false .. ^^ + // 오른손에 무기가 있는 경우 false 리턴.. ^^ if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]) { return false; } - // տ Ⱑ .. ޼ Ⱑ κ丮.. ^^ + // 오른손에 무기가 없는 경우.. 왼손 무기가 인벤토리로.. ^^ else { CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWnd = UIWND_INVENTORY; @@ -1916,9 +1916,9 @@ bool CUIInventory::IsValidPosFromInvToArm(int iOrder) { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder; return true; } - } else // ޼տ չⰡ .. + } else // 왼손에 양손무기가 없는 경우.. { - // տ Ⱑ ִ .. Item Exchange.. ^^ + // 오른손에 무기가 있는 경우.. Item Exchange.. ^^ if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]) { CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWnd = UIWND_INVENTORY; @@ -1930,21 +1930,21 @@ bool CUIInventory::IsValidPosFromInvToArm(int iOrder) { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder; return true; } - // տ Ⱑ .. true .. + // 오른손에 무기가 없는 경우.. true 리턴.. else { return true; } } break; - case ITEM_ATTACH_POS_TWOHAND_RIGHT: // հ տ .. - if (m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) // ޼տ Ⱑ ְ.. + case ITEM_ATTACH_POS_TWOHAND_RIGHT: // 양손검을 오른손에 찰때.. + if (m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) // 왼손에 무기가 있고.. { - // տ Ⱑ ִ false .. ^^ + // 오른손에 무기가 있는 경우 false 리턴.. ^^ if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]) { return false; } - // տ Ⱑ .. ޼ Ⱑ κ丮.. ^^ + // 오른손에 무기가 없는 경우 .. 왼손의 무기가 인벤토리로.. ^^ else { CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWnd = UIWND_INVENTORY; @@ -1956,9 +1956,9 @@ bool CUIInventory::IsValidPosFromInvToArm(int iOrder) { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder; return true; } - } else // ޼տ Ⱑ .. + } else // 왼손에 무기가 없고.. { - // տ Ⱑ ִ .. Item Exchange.. ^^ + // 오른손에 무기가 있는 경우.. Item Exchange.. ^^ if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]) { CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWnd = UIWND_INVENTORY; @@ -1970,7 +1970,7 @@ bool CUIInventory::IsValidPosFromInvToArm(int iOrder) { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder; return true; } - // տ Ⱑ .. true .. + // 오른손에 무기가 없는 경우.. true 리턴.. else { return true; } @@ -1983,14 +1983,14 @@ bool CUIInventory::IsValidPosFromInvToArm(int iOrder) { switch (pItem->byAttachPoint) { case ITEM_ATTACH_POS_DUAL: case ITEM_ATTACH_POS_HAND_LEFT: - // տ Ⱑ ִ ˾ƺ.. + // 오른손에 양손 무기가 있는지 알아본당.. if ((m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]) && (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]->pItemBasic->byAttachPoint == ITEM_ATTACH_POS_TWOHAND_RIGHT)) { - // ޼տ Ⱑ ִ false .. ^^ + // 왼손에 무기가 있는 경우 false 리턴.. ^^ if (m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { return false; } - // ޼տ Ⱑ .. Ⱑ κ丮.. ^^ + // 왼손에 무기가 없는 경우.. 오른손 무기가 인벤토리로.. ^^ else { CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWnd = UIWND_INVENTORY; @@ -2002,9 +2002,9 @@ bool CUIInventory::IsValidPosFromInvToArm(int iOrder) { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder; return true; } - } else // տ չⰡ .. + } else // 오른손에 양손무기가 없는 경우.. { - // ޼տ Ⱑ ִ .. Item Exchange.. ^^ + // 왼손에 무기가 있는 경우.. Item Exchange.. ^^ if (m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWnd = UIWND_INVENTORY; @@ -2016,21 +2016,21 @@ bool CUIInventory::IsValidPosFromInvToArm(int iOrder) { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder; return true; } - // ޼տ Ⱑ .. true .. + // 왼손에 무기가 없는 경우.. true 리턴.. else { return true; } } break; - case ITEM_ATTACH_POS_TWOHAND_LEFT: // հ ޼տ .. - if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]) // տ Ⱑ ְ.. + case ITEM_ATTACH_POS_TWOHAND_LEFT: // 양손검을 왼손에 찰때.. + if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]) // 오른손에 무기가 있고.. { - // ޼տ Ⱑ ִ false .. ^^ + // 왼손에 무기가 있는 경우 false 리턴.. ^^ if (m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { return false; } - // ޼տ Ⱑ .. Ⱑ κ丮.. ^^ + // 왼손에 무기가 없는 경우.. 오른손 무기가 인벤토리로.. ^^ else { CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWnd = UIWND_INVENTORY; @@ -2042,9 +2042,9 @@ bool CUIInventory::IsValidPosFromInvToArm(int iOrder) { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder; return true; } - } else // տ չⰡ .. + } else // 오른손에 양손무기가 없는 경우.. { - // ޼տ Ⱑ ִ .. Item Exchange.. ^^ + // 왼손에 무기가 있는 경우.. Item Exchange.. ^^ if (m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWnd = UIWND_INVENTORY; @@ -2056,7 +2056,7 @@ bool CUIInventory::IsValidPosFromInvToArm(int iOrder) { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder; return true; } - // ޼տ Ⱑ .. true .. + // 왼손에 무기가 없는 경우.. true 리턴.. else { return true; } @@ -2121,7 +2121,7 @@ bool CUIInventory::IsValidPosFromArmToArm(int iOrder) { e_PartPosition ePart; e_PlugPosition ePlug; e_ItemType eType = - CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, NULL, ePart, ePlug); // ۿ ̸  + CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, NULL, ePart, ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { return false; } @@ -2177,7 +2177,7 @@ bool CUIInventory::IsValidPosFromArmToArmInverse(int iOrder) { e_PartPosition ePart; e_PlugPosition ePlug; e_ItemType eType = - CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, NULL, ePart, ePlug); // ۿ ̸  + CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, NULL, ePart, ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { return false; } @@ -2228,7 +2228,7 @@ void CUIInventory::ItemAdd(__TABLE_ITEM_BASIC * pItem, __TABLE_ITEM_EXT * pItemE e_PartPosition ePart; e_PlugPosition ePlug; e_ItemType eType = - CGameProcedure::MakeResrcFileNameForUPC(pItem, &szFN, NULL, ePart, ePlug); // ۿ ̸  + CGameProcedure::MakeResrcFileNameForUPC(pItem, &szFN, NULL, ePart, ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_PLUG == eType) { if (ITEM_SLOT_HAND_LEFT == eSlot) { @@ -2239,7 +2239,7 @@ void CUIInventory::ItemAdd(__TABLE_ITEM_BASIC * pItem, __TABLE_ITEM_EXT * pItemE __ASSERT(0, "Invalid Item Plug Position"); } - CGameBase::s_pPlayer->PlugSet(ePlug, szFN, pItem, pItemExt); // ÷ .. + CGameBase::s_pPlayer->PlugSet(ePlug, szFN, pItem, pItemExt); // 플러그 셋팅.. CGameBase::s_pPlayer->DurabilitySet(eSlot, m_pMySlot[eSlot]->iDurability); } else if (ITEM_TYPE_PART == eType) { CGameBase::s_pPlayer->PartSet(ePart, szFN, pItem, pItemExt); @@ -2249,7 +2249,7 @@ void CUIInventory::ItemAdd(__TABLE_ITEM_BASIC * pItem, __TABLE_ITEM_EXT * pItemE void CUIInventory::ItemDelete(__TABLE_ITEM_BASIC * pItem, __TABLE_ITEM_EXT * pItemExt, e_ItemSlot eSlot) { __TABLE_PLAYER_LOOKS * pLooks = CGameBase::s_pTbl_UPC_Looks->Find( - CGameBase::s_pPlayer->m_InfoBase.eRace); // User Player Character Skin ü .. + CGameBase::s_pPlayer->m_InfoBase.eRace); // User Player Character Skin 구조체 포인터.. __ASSERT(pLooks, "NULL Basic Looks!"); if (NULL == pLooks) { return; @@ -2258,7 +2258,7 @@ void CUIInventory::ItemDelete(__TABLE_ITEM_BASIC * pItem, __TABLE_ITEM_EXT * pIt e_PartPosition ePart; e_PlugPosition ePlug; e_ItemType eType = - CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, NULL, ePart, ePlug); // ۿ ̸  + CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, NULL, ePart, ePlug); // 아이템에 따른 파일 이름을 만들어서 if (pLooks) { if (ITEM_TYPE_PLUG == eType) { @@ -2268,7 +2268,7 @@ void CUIInventory::ItemDelete(__TABLE_ITEM_BASIC * pItem, __TABLE_ITEM_EXT * pIt ePlug = PLUG_POS_RIGHTHAND; } - CGameBase::s_pPlayer->PlugSet(ePlug, "", NULL, NULL); // ÷ .. + CGameBase::s_pPlayer->PlugSet(ePlug, "", NULL, NULL); // 플러그 셋팅.. } else if (ITEM_TYPE_PART == eType) { if (PART_POS_HAIR_HELMET == ePart) { CGameBase::s_pPlayer->InitHair(); @@ -2294,7 +2294,7 @@ void CUIInventory::DurabilityChange(e_ItemSlot eSlot, int iDurability) { if (iDurability == 0) { if (m_pMySlot[eSlot]->pUIIcon && m_pMySlot[eSlot]->pItemBasic) { m_pMySlot[eSlot]->pUIIcon->SetStyle(m_pMySlot[eSlot]->pUIIcon->GetStyle() | UISTYLE_DURABILITY_EXHAUST); - // ޽ ڽ .. + // 메시지 박스 출력.. ::_LoadStringFromResource(IDS_DURABILITY_EXOAST, szDur); wsprintf(szBuf, szDur.c_str(), m_pMySlot[eSlot]->pItemBasic->szName.c_str()); CGameProcedure::s_pProcMain->MsgOutput(szBuf, 0xffff3b3b); @@ -2330,31 +2330,31 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI switch (iDistrict) { case 0x00: if (m_pMySlot[iIndex] && ((m_pMySlot[iIndex]->pItemBasic->dwID + m_pMySlot[iIndex]->pItemExt->dwID) != - iID)) // ִ°.. + iID)) // 엉뚱한 아이템이 있는경우.. { - // .. κ丮 츸.. + // 아이템 삭제.. 현재 인벤토리 윈도우만.. spItem = m_pMySlot[iIndex]; - // κ丮 .. + // 인벤토리에서도 지운다.. m_pMySlot[iIndex] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; delete spItem; spItem = NULL; - // ִ´.. - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. - __TABLE_ITEM_EXT * pItemExt = NULL; // ̺ ü .. + // 아이템을 만들어 넣는다.. + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. + __TABLE_ITEM_EXT * pItemExt = NULL; // 아이템 테이블 구조체 포인터.. - pItem = CGameProcedure::s_pTbl_Items_Basic->Find(iID / 1000 * 1000); // .. + pItem = CGameProcedure::s_pTbl_Items_Basic->Find(iID / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { - pItemExt = CGameProcedure::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iID % 1000); // .. + pItemExt = CGameProcedure::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iID % 1000); // 열 데이터 얻기.. } if (NULL == pItem || NULL == pItemExt) { __ASSERT(0, "NULL Item"); @@ -2366,7 +2366,7 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI e_PlugPosition ePlug; std::string szIconFN; e_ItemType eType = CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { CLogWriter::Write("MyInfo - slot - Unknown Item"); } @@ -2375,7 +2375,7 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = iCount; spItem->iDurability = pItem->siMaxDurability + pItemExt->siMaxDurability; m_pMySlot[iIndex] = spItem; @@ -2383,32 +2383,32 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI } else if (m_pMySlot[iIndex]) { m_pMySlot[iIndex]->iCount = iCount; if (iCount == 0) { - // .. κ丮 츸.. + // 아이템 삭제.. 현재 인벤토리 윈도우만.. __IconItemSkill * spItem; spItem = m_pMySlot[iIndex]; - // κ丮 .. + // 인벤토리에서도 지운다.. m_pMySlot[iIndex] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; delete spItem; spItem = NULL; } - } else // .. + } else // 아이템이 없는 경우.. { - // ִ´.. - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. - __TABLE_ITEM_EXT * pItemExt = NULL; // ̺ ü .. + // 아이템을 만들어 넣는다.. + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. + __TABLE_ITEM_EXT * pItemExt = NULL; // 아이템 테이블 구조체 포인터.. - pItem = CGameProcedure::s_pTbl_Items_Basic->Find(iID / 1000 * 1000); // .. + pItem = CGameProcedure::s_pTbl_Items_Basic->Find(iID / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { - pItemExt = CGameProcedure::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iID % 1000); // .. + pItemExt = CGameProcedure::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iID % 1000); // 열 데이터 얻기.. } if (NULL == pItem || NULL == pItemExt) { __ASSERT(0, "NULL Item"); @@ -2420,7 +2420,7 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI e_PlugPosition ePlug; std::string szIconFN; e_ItemType eType = CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { CLogWriter::Write("MyInfo - slot - Unknown Item"); } @@ -2429,7 +2429,7 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = iCount; spItem->iDurability = pItem->siMaxDurability + pItemExt->siMaxDurability; m_pMySlot[iIndex] = spItem; @@ -2439,31 +2439,31 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI case 0x01: if (m_pMyInvWnd[iIndex] && ((m_pMyInvWnd[iIndex]->pItemBasic->dwID + m_pMyInvWnd[iIndex]->pItemExt->dwID) != - iID)) // ִ°.. + iID)) // 엉뚱한 아이템이 있는경우.. { - // .. κ丮 츸.. + // 아이템 삭제.. 현재 인벤토리 윈도우만.. spItem = m_pMyInvWnd[iIndex]; - // κ丮 .. + // 인벤토리에서도 지운다.. m_pMyInvWnd[iIndex] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; delete spItem; spItem = NULL; - // ִ´.. - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. - __TABLE_ITEM_EXT * pItemExt = NULL; // ̺ ü .. + // 아이템을 만들어 넣는다.. + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. + __TABLE_ITEM_EXT * pItemExt = NULL; // 아이템 테이블 구조체 포인터.. - pItem = CGameProcedure::s_pTbl_Items_Basic->Find(iID / 1000 * 1000); // .. + pItem = CGameProcedure::s_pTbl_Items_Basic->Find(iID / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { - pItemExt = CGameProcedure::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iID % 1000); // .. + pItemExt = CGameProcedure::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iID % 1000); // 열 데이터 얻기.. } if (NULL == pItem || NULL == pItemExt) { __ASSERT(0, "NULL Item"); @@ -2475,7 +2475,7 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI e_PlugPosition ePlug; std::string szIconFN; e_ItemType eType = CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { CLogWriter::Write("MyInfo - slot - Unknown Item"); } @@ -2484,7 +2484,7 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = iCount; spItem->iDurability = pItem->siMaxDurability + pItemExt->siMaxDurability; m_pMyInvWnd[iIndex] = spItem; @@ -2492,32 +2492,32 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI } else if (m_pMyInvWnd[iIndex]) { m_pMyInvWnd[iIndex]->iCount = iCount; if (iCount == 0) { - // .. κ丮 츸.. + // 아이템 삭제.. 현재 인벤토리 윈도우만.. __IconItemSkill * spItem; spItem = m_pMyInvWnd[iIndex]; - // κ丮 .. + // 인벤토리에서도 지운다.. m_pMyInvWnd[iIndex] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; delete spItem; spItem = NULL; } - } else // .. + } else // 아이템이 없는 경우.. { - // ִ´.. - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. - __TABLE_ITEM_EXT * pItemExt = NULL; // ̺ ü .. + // 아이템을 만들어 넣는다.. + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. + __TABLE_ITEM_EXT * pItemExt = NULL; // 아이템 테이블 구조체 포인터.. - pItem = CGameProcedure::s_pTbl_Items_Basic->Find(iID / 1000 * 1000); // .. + pItem = CGameProcedure::s_pTbl_Items_Basic->Find(iID / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { - pItemExt = CGameProcedure::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iID % 1000); // .. + pItemExt = CGameProcedure::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iID % 1000); // 열 데이터 얻기.. } if (NULL == pItem || NULL == pItemExt) { __ASSERT(0, "NULL Item"); @@ -2529,7 +2529,7 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI e_PlugPosition ePlug; std::string szIconFN; e_ItemType eType = CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { CLogWriter::Write("MyInfo - slot - Unknown Item"); } @@ -2538,7 +2538,7 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = iCount; spItem->iDurability = pItem->siMaxDurability + pItemExt->siMaxDurability; m_pMyInvWnd[iIndex] = spItem; @@ -2565,25 +2565,25 @@ void CUIInventory::ItemCountChange(int iDistrict, int iIndex, int iCount, int iI void CUIInventory::ItemDestroyOK() { m_bDestoyDlgAlive = false; - BYTE byBuff[32]; // Ŷ .. - int iOffset = 0; // Ŷ .. + BYTE byBuff[32]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. - CAPISocket::MP_AddByte(byBuff, iOffset, N3_ITEM_DESTROY); // ŸƮ Ŷ Ŀ.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_ITEM_DESTROY); // 게임 스타트 패킷 커멘드.. switch (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: - CAPISocket::MP_AddByte(byBuff, iOffset, 0x01); // ̵ Ŷ ֱ.. + CAPISocket::MP_AddByte(byBuff, iOffset, 0x01); // 아이디 길이 패킷에 넣기.. break; case UIWND_DISTRICT_INVENTORY_INV: - CAPISocket::MP_AddByte(byBuff, iOffset, 0x02); // ̵ Ŷ ֱ.. + CAPISocket::MP_AddByte(byBuff, iOffset, 0x02); // 아이디 길이 패킷에 넣기.. break; } CAPISocket::MP_AddByte(byBuff, iOffset, - CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.iOrder); // ̵ Ŷ ֱ.. + CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.iOrder); // 아이디 길이 패킷에 넣기.. CAPISocket::MP_AddDword( byBuff, iOffset, CN3UIWndBase::m_sSelectedIconInfo.pItemSelect->pItemBasic->dwID + - CN3UIWndBase::m_sSelectedIconInfo.pItemSelect->pItemExt->dwID); // ̵ ڿ Ŷ ֱ.. + CN3UIWndBase::m_sSelectedIconInfo.pItemSelect->pItemExt->dwID); // 아이디 문자열 패킷에 넣기.. CGameProcedure::s_pSocket->Send(byBuff, iOffset); @@ -2628,11 +2628,11 @@ void CUIInventory::ReceiveResultItemRemoveFromServer(int iResult) { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; switch (iResult) { - case 0x01: // .. + case 0x01: // 성공.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: spItem = m_pMySlot[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; - // .. + // 내 영역에서도 지운다.. m_pMySlot[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = NULL; this->ItemDelete(spItem->pItemBasic, spItem->pItemExt, (e_ItemSlot)CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder); @@ -2640,18 +2640,18 @@ void CUIInventory::ReceiveResultItemRemoveFromServer(int iResult) { case UIWND_DISTRICT_INVENTORY_INV: spItem = m_pMyInvWnd[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; - // .. + // 내 영역에서도 지운다.. m_pMyInvWnd[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = NULL; break; } - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. if (!spItem) { return; } RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -2659,7 +2659,7 @@ void CUIInventory::ReceiveResultItemRemoveFromServer(int iResult) { spItem = NULL; break; - case 0x00: // .. + case 0x00: // 실패.. switch (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict) { case UIWND_DISTRICT_INVENTORY_SLOT: if (m_pMySlot[CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.iOrder] != NULL) { diff --git a/src/game/UIInventory.h b/src/game/UIInventory.h index 6c1c8f6a..8f7fa189 100644 --- a/src/game/UIInventory.h +++ b/src/game/UIInventory.h @@ -47,7 +47,7 @@ const int ITEM_ATTACH_POS_INVENTORY = 15; enum e_InvenState { INV_STATE_NORMAL = 1, INV_STATE_REPAIR, -}; // κ丮 .. ¿ ϱ .. ° ߰ƴ.. +}; // 인벤토리 상태.. 기존의 상태와 구별하기 위해.. 수리 상태가 추가됐다.. ////////////////////////////////////////////////////////////////////// @@ -58,9 +58,9 @@ class CUIInventory : public CN3UIWndBase { e_InvenState m_eInvenState; CItemRepairMgr m_cItemRepairMgr; - bool m_bOpenningNow; // ִ.. - bool m_bClosingNow; // ִ.. - float m_fMoveDelta; // ε巴 ؼ ġ 꿡 εҼ .. + bool m_bOpenningNow; // 열리고 있다.. + bool m_bClosingNow; // 닫히고 있다.. + float m_fMoveDelta; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. CN3UIArea * m_pArea_User; CN3UIArea * m_pArea_Destroy; @@ -82,7 +82,7 @@ class CUIInventory : public CN3UIWndBase { RECT GetSampleRect(); - // ˻ϴ ƾ.. + // 검사하는 루틴.. bool IsValidRaceAndClass(__TABLE_ITEM_BASIC * pItem, __TABLE_ITEM_EXT * pItemExt); bool IsValidPosFromInvToArm(int iOrder); bool IsValidPosFromArmToArm(int iOrder); @@ -142,7 +142,7 @@ class CUIInventory : public CN3UIWndBase { int GetCountInInvByID(int iID); - // Ҹ Һ or Not.. + // 소모성 아이템을 소비한 경우 or Not.. void ItemCountChange(int iDistrict, int iIndex, int iCount, int iID); // child dlg func.. diff --git a/src/game/UIItemExchange.cpp b/src/game/UIItemExchange.cpp index f74ba2fc..79c5f85b 100644 --- a/src/game/UIItemExchange.cpp +++ b/src/game/UIItemExchange.cpp @@ -74,7 +74,7 @@ bool CUIItemExchange::Load(HANDLE hFile) { void CUIItemExchange::Render() { if (!m_bVisible) { - return; // ڽĵ render ʴ´. + return; // 보이지 않으면 자식들을 render하지 않는다. } POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); m_pUITooltipDlg->DisplayTooltipsDisable(); @@ -202,7 +202,7 @@ bool CUIItemExchange::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { return false; } - // ƴϸ.. + // 내가 가졌던 아이콘이 아니면.. if (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd != m_eUIWnd) { FAIL_RETURN } @@ -210,7 +210,7 @@ bool CUIItemExchange::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { FAIL_RETURN } - // ̸.. npc ˻Ѵ.. + // 내가 가졌던 아이콘이면.. npc영역인지 검사한다.. bool bFound = false; int i; for (i = 0; i < MAX_ITEM_EX_RE_NPC; i++) { @@ -225,7 +225,7 @@ bool CUIItemExchange::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { FAIL_RETURN } - // ִ ˻Ѵ.. + // 아이템이 꽉 차있는지 검사한다.. bFound = false; for (i = 0; i < MAX_ITEM_EX_RE_NPC; i++) { if (!m_pMyNpcWnd[i]) { @@ -234,12 +234,12 @@ bool CUIItemExchange::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } } - // ʴٸ.. ù° ˻Ѵ.. + // 아이템이 꽉 차있지 않다면.. 가장 첫번째 빈 슬롯을 검사한다.. if (!bFound) { FAIL_RETURN } - // ޾Ƶδ.. + // 받아들인다.. m_pMyInvWnd[CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.iOrder] = NULL; spItem->pUIIcon->SetRegion(pArea->GetRegion()); @@ -247,10 +247,10 @@ bool CUIItemExchange::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { m_pMyNpcWnd[i] = spItem; - // .. + // 백업 정보.. m_pMyNpcWndOriginIndex[i] = CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.iOrder; - // ׷̵.. + // 수리비용 업그레이드.. m_iTotalPrice += CalcRepairGold(spItem); UpdateGoldValue(); @@ -264,13 +264,13 @@ void CUIItemExchange::UpdateGoldValue() { CN3UIString * pStrGold = (CN3UIString *)GetChildByID("string_gold"); __ASSERT(pStrGold, "NULL UI Component!!"); if (pStrGold) { - // Ʈ.. + // 돈 업데이트.. pStrGold->SetString(::_FormatCoins(m_iTotalPrice)); } } void CUIItemExchange::UpdateUserTotalGold(int64_t iGold) { - // Ʈ.. + // 돈 업데이트.. CGameBase::s_pPlayer->m_InfoExt.iGold = iGold; CN3UIString * pStatic = (CN3UIString *)CGameProcedure::s_pProcMain->m_pUIInventory->GetChildByID("text_gold"); __ASSERT(pStatic, "NULL UI Component!!"); @@ -361,9 +361,9 @@ bool CUIItemExchange::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { break; case UIMSG_ICON_UP: - // Ŵ ٴϸ鼭 ˻.. + // 아이콘 매니저 윈도우들을 돌아 다니면서 검사.. if (!CGameProcedure::s_pUIMgr->BroadcastIconDropMsg(CN3UIWndBase::m_sSelectedIconInfo.pItemSelect)) { - // ġ .. + // 아이콘 위치 원래대로.. IconRestore(); } break; @@ -382,7 +382,7 @@ DWORD CUIItemExchange::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT return dwRet; } - // 巡 Ǵ .. + // 드래그 되는 아이콘 갱신.. if ((GetState() == UI_STATE_ICON_MOVING) && (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd == UIWND_EXCHANGE_REPAIR)) { CN3UIWndBase::m_sSelectedIconInfo.pItemSelect->pUIIcon->SetRegion(GetSampleRect()); @@ -395,9 +395,9 @@ DWORD CUIItemExchange::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT void CUIItemExchange::Open() { SetVisible(true); - // ȣڵ尡 ʿϴ.. , κ丮, npc ŷ, ŷ .. + // 보호코드가 필요하다.. 예를 들면, 인벤토리, npc와의 상거래, 개인 거래 금지.. - // Ÿ ۾.. + // 기타 작업.. for (int i = 0; i < MAX_ITEM_EX_RE_NPC; i++) { m_pMyNpcWnd[i] = NULL; } @@ -409,12 +409,12 @@ void CUIItemExchange::Open() { m_iTotalPrice = 0; UpdateGoldValue(); - // κ丮 inv inv ű.. + // 인벤토리 inv 영역의 아이템을 이 윈도우의 inv영역으로 옮긴다.. ItemMoveFromInvToThis(); } void CUIItemExchange::UserPressOK() { - // .. + // 갯수 세기.. int iCount = 0; for (int i = 0; i < MAX_ITEM_EX_RE_NPC; i++) { if (m_pMyNpcWnd[i]) { @@ -426,45 +426,45 @@ void CUIItemExchange::UserPressOK() { UserPressCancel(); } - // .. - BYTE byBuff[16]; // Ŷ .. - int iOffset = 0; // Ŷ .. + // 서버에게 보내고.. + BYTE byBuff[16]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. - CAPISocket::MP_AddByte(byBuff, iOffset, N3_ITEM_REPAIR_REQUEST); // ŸƮ Ŷ Ŀ.. - CAPISocket::MP_AddShort(byBuff, iOffset, iCount); // ̵ Ŷ ֱ.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_ITEM_REPAIR_REQUEST); // 게임 스타트 패킷 커멘드.. + CAPISocket::MP_AddShort(byBuff, iOffset, iCount); // 아이디 길이 패킷에 넣기.. for (int i = 0; i < iCount; i++) { - CAPISocket::MP_AddByte(byBuff, iOffset, m_pMyNpcWndOriginIndex[i]); // ̵ Ŷ ֱ.. + CAPISocket::MP_AddByte(byBuff, iOffset, m_pMyNpcWndOriginIndex[i]); // 아이디 길이 패킷에 넣기.. CAPISocket::MP_AddDword(byBuff, iOffset, m_pMyNpcWnd[i]->pItemBasic->dwID + - m_pMyNpcWnd[i]->pItemExt->dwID); // ̵ ڿ Ŷ ֱ.. + m_pMyNpcWnd[i]->pItemExt->dwID); // 아이디 문자열 패킷에 넣기.. } CGameProcedure::s_pSocket->Send(byBuff, iOffset); - // ٸ.. + // 응답을 기다림.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = true; } void CUIItemExchange::ReceiveResultFromServer(int iResult, int64_t iUserGold) { - // ̸ npc Durability ִ밪.. + // 성공이면 npc영역의 Durability를 최대값으로.. if (iResult == 0x01) { for (int i = 0; i < MAX_ITEM_EX_RE_NPC; i++) { if (m_pMyNpcWnd[i]) { m_pMyNpcWnd[i]->iDurability = m_pMyNpcWnd[i]->pItemBasic->siMaxDurability + m_pMyNpcWnd[i]->pItemExt->siMaxDurability; - // ° UISTYLE_DURABILITY_EXHAUST ̸.. + // 아이콘 상태가 UISTYLE_DURABILITY_EXHAUST 이면.. m_pMyNpcWnd[i]->pUIIcon->SetStyle(m_pMyNpcWnd[i]->pUIIcon->GetStyle() & (~UISTYLE_DURABILITY_EXHAUST)); } } } - // Ʈ.. + // 돈 업데이트.. UpdateUserTotalGold(iUserGold); - // ٸ .. + // 응답 기다림 해제.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; - // npc inv ű.. + // 이 윈도우의 npc 영역의 아이템을 이 윈도우의 inv 영역으로 옮긴다.. CN3UIArea * pArea = NULL; for (int i = 0; i < MAX_ITEM_EX_RE_NPC; i++) { if (m_pMyNpcWnd[i]) { @@ -479,14 +479,14 @@ void CUIItemExchange::ReceiveResultFromServer(int iResult, int64_t iUserGold) { } } - // â ݴ´.. + // 창을 닫는다.. Close(); } void CUIItemExchange::UserPressCancel() { CN3UIArea * pArea = NULL; - // npc inv ű.. + // 이 윈도우의 npc 영역의 아이템을 이 윈도우의 inv 영역으로 옮긴다.. for (int i = 0; i < MAX_ITEM_EX_RE_NPC; i++) { if (m_pMyNpcWnd[i]) { pArea = CN3UIWndBase::GetChildAreaByiOrder(UI_AREA_TYPE_REPAIR_INV, m_pMyNpcWndOriginIndex[i]); @@ -500,14 +500,14 @@ void CUIItemExchange::UserPressCancel() { } } - // â ݴ´.. + // 창을 닫는다.. Close(); } void CUIItemExchange::Close() { SetVisible(false); - // inv κ丮 inv ű.. + // 이 윈도우의 inv 영역의 아이템을 이 인벤토리 윈도우의 inv영역으로 옮긴다.. ItemMoveFromThisToInv(); } diff --git a/src/game/UIKnightsOperation.cpp b/src/game/UIKnightsOperation.cpp index cf4689b3..4439de4d 100644 --- a/src/game/UIKnightsOperation.cpp +++ b/src/game/UIKnightsOperation.cpp @@ -104,19 +104,19 @@ bool CUIKnightsOperation::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { this->Close(); } else if (pSender == m_pBtn_Create) { this->MsgSend_KnightsCreate(); - } else if (pSender == m_pBtn_Join) // + } else if (pSender == m_pBtn_Join) // 가입 { this->MsgSend_KnightsJoin(); - } else if (pSender == m_pBtn_Destroy) // Ż + } else if (pSender == m_pBtn_Destroy) // 탈퇴 { std::string szMsg; ::_LoadStringFromResource(IDS_KNIGHTS_DESTROY_CONFIRM, szMsg); - CGameProcedure::MessageBoxPost(szMsg, "", MB_YESNO, BEHAVIOR_KNIGHTS_DESTROY); // ü .. - } else if (pSender == m_pBtn_Withdraw) // Ż + CGameProcedure::MessageBoxPost(szMsg, "", MB_YESNO, BEHAVIOR_KNIGHTS_DESTROY); // 기사단 해체 물어보기.. + } else if (pSender == m_pBtn_Withdraw) // 탈퇴 { std::string szMsg; ::_LoadStringFromResource(IDS_KNIGHTS_WITHDRAW_CONFIRM, szMsg); - CGameProcedure::MessageBoxPost(szMsg, "", MB_YESNO, BEHAVIOR_KNIGHTS_WITHDRAW); // Ż .. + CGameProcedure::MessageBoxPost(szMsg, "", MB_YESNO, BEHAVIOR_KNIGHTS_WITHDRAW); // 기사단 탈퇴 물어보기.. } } else if (dwMsg == UIMSG_LIST_SELCHANGE) { if (pSender == m_pList_Knights) { @@ -189,13 +189,13 @@ void CUIKnightsOperation::KnightsListClear() { } void CUIKnightsOperation::ChangeUIByDuty(e_KnightsDuty eDuty) { - if (eDuty == KNIGHTS_DUTY_CHIEF) // ̸ ü ϴ.. + if (eDuty == KNIGHTS_DUTY_CHIEF) // 기사단장이면 기사단 해체도 가능하다.. { if (m_pBtn_Destroy) { m_pBtn_Destroy->SetState(UI_STATE_BUTTON_NORMAL); } if (m_pBtn_Withdraw) { - m_pBtn_Withdraw->SetState(UI_STATE_BUTTON_DISABLE); // ŻѴ????!!!! + m_pBtn_Withdraw->SetState(UI_STATE_BUTTON_DISABLE); // 기사 단장이 탈퇴한다????!!!! } if (m_pBtn_Join) { m_pBtn_Join->SetState(UI_STATE_BUTTON_DISABLE); @@ -205,7 +205,7 @@ void CUIKnightsOperation::ChangeUIByDuty(e_KnightsDuty eDuty) { m_pBtn_Destroy->SetState(UI_STATE_BUTTON_DISABLE); } if (m_pBtn_Withdraw) { - m_pBtn_Withdraw->SetState(UI_STATE_BUTTON_NORMAL); // ŻѴ????!!!! + m_pBtn_Withdraw->SetState(UI_STATE_BUTTON_NORMAL); // 기사 단장이 탈퇴한다????!!!! } if (m_pBtn_Join) { m_pBtn_Join->SetState(UI_STATE_BUTTON_NORMAL); @@ -215,18 +215,18 @@ void CUIKnightsOperation::ChangeUIByDuty(e_KnightsDuty eDuty) { void CUIKnightsOperation::Open(e_KnightsDuty eDuty) { m_iPageCur = 0; - this->KnightsListClear(); // Ŭ - this->SetPosCenter(); //  ߰.. + this->KnightsListClear(); // 기사단 정보 클리어 + this->SetPosCenter(); // 가운데로 맞추고.. this->SetVisible(true); - this->ChangeUIByDuty(eDuty); // ѿ UI .. + this->ChangeUIByDuty(eDuty); // 권한에 따라 UI 변경.. } void CUIKnightsOperation::Close() { - this->KnightsListClear(); // Ŭ + this->KnightsListClear(); // 기사단 정보 클리어 this->SetVisible(false); if (m_pEdit_KnightsName) { - m_pEdit_KnightsName->KillFocus(); // ̷ ٸ Ȼ.. + m_pEdit_KnightsName->KillFocus(); // 이래야 다른곳에 문제가 안생긴다.. } } @@ -244,10 +244,10 @@ bool CUIKnightsOperation::MsgRecv_KnightsList(DataPack * pDataPack, int & iOffse CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szChiefName, iNameLength); iPoint = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); - this->KnightsListAdd(iID, szName, szChiefName, iMemberCount, iPoint); // UI ߰.. + this->KnightsListAdd(iID, szName, szChiefName, iMemberCount, iPoint); // UI 에 추가.. } - this->KnightsListUpdate(); // List ־ UI Update!! - this->EnableKnightsUIs(true); // Disable ư Enable Ų. + this->KnightsListUpdate(); // List 에 다 넣었으면 UI Update!! + this->EnableKnightsUIs(true); // Disable 된 버튼들 Enable 시킨다. return true; } @@ -258,7 +258,7 @@ void CUIKnightsOperation::MsgSend_KnightsCreate() { } std::string szKnightsName = m_pEdit_KnightsName->GetString(); - if (szKnightsName.empty()) // ̸ .. + if (szKnightsName.empty()) // 이름이 없으면 에러.. { std::string szMsg; ::_LoadStringFromResource(IDS_ERR_KNIGHTS_CREATE_FAILED_NAME_EMPTY, szMsg); @@ -271,7 +271,7 @@ void CUIKnightsOperation::MsgSend_KnightsCreate() { CAPISocket::MP_AddByte(byBuff, iOffset, N3_KNIGHTS); CAPISocket::MP_AddByte(byBuff, iOffset, - N3_SP_KNIGHTS_CREATE); // Send - s1(Name Length) str1 | Recv - b1(1: 0:) + N3_SP_KNIGHTS_CREATE); // 생성 Send - s1(Name Length) str1 | Recv - b1(1:성공 0:실패) CAPISocket::MP_AddShort(byBuff, iOffset, szKnightsName.size()); CAPISocket::MP_AddString(byBuff, iOffset, szKnightsName); @@ -284,7 +284,7 @@ void CUIKnightsOperation::MsgSend_KnightsDestroy() { CAPISocket::MP_AddByte(byBuff, iOffset, N3_KNIGHTS); CAPISocket::MP_AddByte(byBuff, iOffset, - N3_SP_KNIGHTS_DESTROY); // Send - s1(Name Length) str1 | Recv - b1(1: 0:) + N3_SP_KNIGHTS_DESTROY); // 생성 Send - s1(Name Length) str1 | Recv - b1(1:성공 0:실패) CGameProcedure::s_pSocket->Send(byBuff, iOffset); } @@ -334,7 +334,7 @@ void CUIKnightsOperation::MsgSend_KnightsList(int iPage) { CGameProcedure::s_pSocket->Send(byBuff, iOffset); - // ѱ涧 ư ´. + // 페이지를 넘길때는 버튼들을 막아 놓는다. this->EnableKnightsUIs(false); } diff --git a/src/game/UIKnightsOperation.h b/src/game/UIKnightsOperation.h index cf712dd8..508bfc09 100644 --- a/src/game/UIKnightsOperation.h +++ b/src/game/UIKnightsOperation.h @@ -43,7 +43,7 @@ class CUIKnightsOperation : public CN3UIBase { CN3UIEdit * m_pEdit_KnightsName; public: - void ChangeUIByDuty(enum e_KnightsDuty eDuty); // ѿ UI .. + void ChangeUIByDuty(enum e_KnightsDuty eDuty); // 권한에 따라 UI 변경.. void Open(enum e_KnightsDuty eDuty); void Close(); @@ -60,8 +60,8 @@ class CUIKnightsOperation : public CN3UIBase { void MsgSend_KnightsCreate(); void MsgSend_KnightsDestroy(); void MsgSend_KnightsJoin(); - void MsgSend_KnightsWithdraw(); // Ż. - void MsgSend_KnightsList(int iPage); // ܵ û.. 10 ´. + void MsgSend_KnightsWithdraw(); // 탈퇴. + void MsgSend_KnightsList(int iPage); // 페이지 단위로 기사단들 정보 요청.. 10 개씩 온다. void EnableKnightsUIs(bool bEnable); diff --git a/src/game/UILoading.cpp b/src/game/UILoading.cpp index 617c36a6..9c1ed5bf 100644 --- a/src/game/UILoading.cpp +++ b/src/game/UILoading.cpp @@ -49,8 +49,8 @@ bool CUILoading::Load(HANDLE hFile) { m_pProgress_Loading = (CN3UIProgress *)(CN3UIBase::GetChildByID("Progress_Loading")); __ASSERT(m_pProgress_Loading, "NULL UI Component!!"); - this->SetPosCenter(); //  ߱.. - m_pText_Version->SetPos(10, 10); // Version ǥ.. + this->SetPosCenter(); // 가운데로 맞추기.. + m_pText_Version->SetPos(10, 10); // Version 은 맨위에 표시.. if (m_pProgress_Loading) { m_pProgress_Loading->SetRange(0, 100); @@ -67,14 +67,14 @@ void CUILoading::Render(const std::string & szInfo, int iPercentage) { m_pProgress_Loading->SetCurValue(iPercentage); } - CGameProcedure::s_pEng->Clear(0); // - CGameProcedure::s_pEng->BeginScene(); // ... + CGameProcedure::s_pEng->Clear(0); // 배경은 검은색 + CGameProcedure::s_pEng->BeginScene(); // 씬 렌더 ㅅ작... CN3UIBase::Tick(); CUIManager::RenderStateSet(); CN3UIBase::Render(); CUIManager::RenderStateRestore(); - CGameProcedure::s_pEng->EndScene(); // ... + CGameProcedure::s_pEng->EndScene(); // 씬 렌더 시작... CGameProcedure::s_pEng->Present(CN3Base::s_hWndBase); } diff --git a/src/game/UILogin.cpp b/src/game/UILogin.cpp index 1ebc2e9b..7e60b1cc 100644 --- a/src/game/UILogin.cpp +++ b/src/game/UILogin.cpp @@ -37,7 +37,7 @@ CUILogIn::CUILogIn() { m_pList_Server = NULL; - m_bOpenningNow = false; // Ʒ ... Ѵٸ.. + m_bOpenningNow = false; // 위에서 아래로 스르륵...열려야 한다면.. m_fMoveDelta = 0; m_bLogIn = false; @@ -50,7 +50,7 @@ bool CUILogIn::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { return false; } - //s_CameraData.vp; //ҷ 캻 + //s_CameraData.vp; //불러 오는 과정을 살펴본다 //DWORD mm = s_CameraData.vp.Height; //DWORD ss = s_CameraData.vp.Width; @@ -58,10 +58,10 @@ bool CUILogIn::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (pSender == m_pBtn_LogIn && m_pEdit_id && m_pEdit_pw) { CGameProcedure::s_pProcLogIn->MsgSend_AccountLogIn(LIC_KNIGHTONLINE); } else if (pSender == m_pBtn_Connect) { - CGameProcedure::s_pProcLogIn->ConnectToGameServer(); // + CGameProcedure::s_pProcLogIn->ConnectToGameServer(); // 고른 게임 서버에 접속 } else if (pSender == m_pBtn_Cancel) { - PostQuitMessage(0); // ... - } else if (pSender == m_pBtn_Option) // ɼ.. + PostQuitMessage(0); // 종료... + } else if (pSender == m_pBtn_Option) // 옵션.. { std::string szMsg; ::_LoadStringFromResource(IDS_CONFIRM_EXECUTE_OPTION, szMsg); @@ -77,7 +77,7 @@ bool CUILogIn::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { return true; } } else if (UIMSG_LIST_DBLCLK == dwMsg) { - CGameProcedure::s_pProcLogIn->ConnectToGameServer(); // + CGameProcedure::s_pProcLogIn->ConnectToGameServer(); // 고른 게임 서버에 접속 } else if (dwMsg == UIMSG_EDIT_RETURN) { if (!m_bLogIn && m_pEdit_id && m_pEdit_pw) { CN3UIBase * pMsgBox = CGameProcedure::s_pMsgBoxMgr->GetFocusMsgBox(); @@ -273,7 +273,7 @@ void CUILogIn::Tick() { CN3UIBase::Tick(); if (m_pGroup_ServerList) { - if (m_bOpenningNow) // Ʒ ... Ѵٸ.. + if (m_bOpenningNow) // 위에서 아래로 스르륵...열려야 한다면.. { POINT ptCur = m_pGroup_ServerList->GetPos(); RECT rc = m_pGroup_ServerList->GetRegion(); @@ -288,7 +288,7 @@ void CUILogIn::Tick() { int iYLimit = 0; ptCur.y = (int)(m_fMoveDelta - fHeight); - if (ptCur.y >= iYLimit) // ٿȴ!! + if (ptCur.y >= iYLimit) // 다열렸다!! { ptCur.y = iYLimit; m_bOpenningNow = false; @@ -304,7 +304,7 @@ void CUILogIn::OpenServerList() { return; } - // !! + // 스르륵 열린다!! m_pGroup_ServerList->SetVisible(true); RECT rc = m_pGroup_ServerList->GetRegion(); m_pGroup_ServerList->SetPos(0, -(rc.bottom - rc.top)); @@ -315,10 +315,10 @@ void CUILogIn::OpenServerList() { void CUILogIn::SetVisibleLogInUIs(bool bEnable) { if (m_pGroup_LogIn) { - m_pGroup_LogIn->SetVisible(bEnable); // α .. + m_pGroup_LogIn->SetVisible(bEnable); // 로그인을 숨긴다.. } - // α п UI ... + // 로그인한 계정의 구분에 따라 UI 만지기... if (m_pText_Rights) { m_pText_Rights->SetVisible(false); } @@ -332,7 +332,7 @@ void CUILogIn::SetVisibleLogInUIs(bool bEnable) { if (false == bEnable) { if (LIC_MGAME == CGameProcedure::s_eLogInClassification) { if (m_pText_Rights && m_pImg_MGameLogo) { - // Ʒ ߴ .. + // 아래쪽 중단으로 맞춘다.. RECT rcView = {0, 0, s_CameraData.vp.Width, s_CameraData.vp.Height}; int iX = (rcView.right - (m_pText_Rights->GetWidth() + m_pImg_MGameLogo->GetWidth())) / 2; int iY = rcView.bottom - m_pText_Rights->GetHeight() - 20; @@ -345,7 +345,7 @@ void CUILogIn::SetVisibleLogInUIs(bool bEnable) { } } else if (LIC_DAUM == CGameProcedure::s_eLogInClassification) { if (m_pText_Rights && m_pImg_DaumLogo) { - // Ʒ ߴ .. + // 아래쪽 중단으로 맞춘다.. RECT rcView = {0, 0, s_CameraData.vp.Width, s_CameraData.vp.Height}; int iX = (rcView.right - (m_pText_Rights->GetWidth() + m_pImg_DaumLogo->GetWidth())) / 2; int iY = rcView.bottom - m_pText_Rights->GetHeight() - 20; diff --git a/src/game/UILogin.h b/src/game/UILogin.h index 4e506296..e90fe0cf 100644 --- a/src/game/UILogin.h +++ b/src/game/UILogin.h @@ -48,14 +48,14 @@ class CUILogIn : public CN3UIBase { std::vector<__GameServerInfo> m_ListServerInfos; - bool m_bOpenningNow; // Ʒ ... Ѵٸ.. + bool m_bOpenningNow; // 위에서 아래로 스르륵...열려야 한다면.. float m_fMoveDelta; - bool m_bLogIn; // α ߺ .. + bool m_bLogIn; // 로그인 중복 방지.. public: void SetRequestedLogIn(bool bLogIn) { m_bLogIn = bLogIn; } bool OnKeyPress(int iKey); - void SetVisibleLogInUIs(bool bEnable); // LogIn ʿ UI .. + void SetVisibleLogInUIs(bool bEnable); // 계정 LogIn 에 필요한 UI 들을 숨긴다.. void OpenServerList(); void Tick(); @@ -63,7 +63,7 @@ class CUILogIn : public CN3UIBase { void FocusCircular(); void FocusToID(); bool Load(HANDLE hFile); - bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); // ޽ ޴´.. , msg + bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); // 메시지를 받는다.. 보낸놈, msg int ServerInfoCount() { return m_ListServerInfos.size(); } bool ServerInfoAdd(const __GameServerInfo & GSI); diff --git a/src/game/UIManager.cpp b/src/game/UIManager.cpp index 889f752a..793d36a0 100644 --- a/src/game/UIManager.cpp +++ b/src/game/UIManager.cpp @@ -25,10 +25,10 @@ CUIManager::__RenderStateForUI CUIManager::s_sRSFU; // RenderStateForUI CUIManager::CUIManager() { m_dwMouseFlagsCur = 0; - m_bEnableOperation = true; // UI ΰ? + m_bEnableOperation = true; // UI 조작이 가능한 상태인가? m_pUIFocused = NULL; - m_bDoneSomething = false; // UI ߴ... + m_bDoneSomething = false; // UI 에서 조작을 했다... } CUIManager::~CUIManager() {} @@ -44,13 +44,13 @@ DWORD CUIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & pt } if (s_pTooltipCtrl) { - s_pTooltipCtrl->MouseProc(dwFlags, ptCur, ptOld); // 콺 ޼ . + s_pTooltipCtrl->MouseProc(dwFlags, ptCur, ptOld); // 툴팁에게 마우스 메세지 전달. } - // child ޼ + // child에게 메세지 전달 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor;) { CN3UIBase * pChild = (*itor); - // ŷ ̸ Ŵ 츸 ۵.. + // 상거래 중이면 아이콘 매니저 윈도우만 작동.. if (CGameProcedure::s_pProcMain && CGameProcedure::s_pProcMain->m_pUITransactionDlg && (CGameProcedure::s_pProcMain->m_pUITransactionDlg ->IsVisible())) // && (pChild->UIType() != UI_TYPE_ICON_MANAGER) ) @@ -62,7 +62,7 @@ DWORD CUIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & pt } } } - // Կ ̸ Ŵ 츸 ۵.. + // 보관함에 보관중이면 아이콘 매니저 윈도우만 작동.. if (CGameProcedure::s_pProcMain && CGameProcedure::s_pProcMain->m_pUIWareHouseDlg && (CGameProcedure::s_pProcMain->m_pUIWareHouseDlg ->IsVisible())) // && (pChild->UIType() != UI_TYPE_ICON_MANAGER) ) @@ -74,7 +74,7 @@ DWORD CUIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & pt } } } - // ΰ ŷ̸ Ŵ 츸 ۵.. ׼ ȭ Էϴ ̸.. Է 츸 ۵.. + // 개인간 거래중이면 아이콘 매니저 윈도우만 작동.. 돈 액수나 화살 갯수등을 입력하는 중이면.. 입력 윈도우만 작동.. if (CGameProcedure::s_pProcMain && CGameProcedure::s_pProcMain->m_pSubProcPerTrade && (CGameProcedure::s_pProcMain->m_pSubProcPerTrade->m_ePerTradeState != PER_TRADE_STATE_NONE)) { if (CGameProcedure::s_pProcMain->m_pSubProcPerTrade->m_ePerTradeState == PER_TRARE_STATE_EDITTING) { @@ -94,7 +94,7 @@ DWORD CUIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & pt if (pChild->m_pChildUI && pChild->m_pChildUI->IsVisible()) { DWORD dwRet = pChild->m_pChildUI->MouseProc(dwFlags, ptCur, ptOld); - if (UI_MOUSEPROC_DONESOMETHING & dwRet) { // ̰쿡 հ Ŀ ̴. + if (UI_MOUSEPROC_DONESOMETHING & dwRet) { // 이경우에는 먼가 포커스를 받은 경우이다. pChild->MouseProc(0, ptCur, ptOld); m_dwMouseFlagsCur |= (UI_MOUSEPROC_DONESOMETHING | UI_MOUSEPROC_CHILDDONESOMETHING); @@ -102,7 +102,7 @@ DWORD CUIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & pt return m_dwMouseFlagsCur; } else if ((UI_MOUSE_LBCLICK & dwFlags) && - (UI_MOUSEPROC_INREGION & dwRet)) { // Ŭ հ ߴٰ ϰ ع. + (UI_MOUSEPROC_INREGION & dwRet)) { // 영역 안을 클릭 했을때 먼가 일을 했다고 하고 리턴해버린다. pChild->MouseProc(0, ptCur, ptOld); m_dwMouseFlagsCur |= (UI_MOUSEPROC_DIALOGFOCUS); @@ -113,14 +113,14 @@ DWORD CUIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & pt } DWORD dwChildRet = pChild->MouseProc(dwFlags, ptCur, ptOld); - if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // ̰쿡 հ Ŀ ̴. + if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // 이경우에는 먼가 포커스를 받은 경우이다. m_dwMouseFlagsCur |= (UI_MOUSEPROC_DONESOMETHING | UI_MOUSEPROC_CHILDDONESOMETHING); SetFocusedUI(pChild); //this_ui return m_dwMouseFlagsCur; } else if ((UI_MOUSE_LBCLICK & dwFlags) && - (UI_MOUSEPROC_INREGION & dwChildRet)) { // Ŭ հ ߴٰ ϰ ع. + (UI_MOUSEPROC_INREGION & dwChildRet)) { // 영역 안을 클릭 했을때 먼가 일을 했다고 하고 리턴해버린다. m_dwMouseFlagsCur |= (UI_MOUSEPROC_DIALOGFOCUS); SetFocusedUI(pChild); //this_ui @@ -134,12 +134,12 @@ DWORD CUIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & pt m_dwMouseFlagsCur |= dwChildRet; } - // if(UI_MOUSE_LBCLICK & dwFlags) m_pUIFocused = NULL; // Ŀ UI .. ƹ͵ ϸ.. ̴.. + // if(UI_MOUSE_LBCLICK & dwFlags) m_pUIFocused = NULL; // 포커스 받은 UI 기록.. 아무것도 안하면.. 널이다.. return m_dwMouseFlagsCur; } -void CUIManager::ReorderChildList() // ̾˷α ġ +void CUIManager::ReorderChildList() // 다이알로그 순서 재배치 { int iChildCount = m_Children.size(); if (iChildCount <= 0) { @@ -151,7 +151,7 @@ DWORD CUIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & pt for (UIListItor itor = m_Children.begin(); m_Children.end() != itor;) { CN3UIBase * pChild = (*itor); if (pChild->GetStyle() & UISTYLE_ALWAYSTOP) { - itor = m_Children.erase(itor); // 켱 Ʈ + itor = m_Children.erase(itor); // 우선 리스트에서 지우고 ppBuffer[iAlwaysTopChildCount++] = pChild; } else { ++itor; @@ -159,7 +159,7 @@ DWORD CUIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & pt } for (int i = iAlwaysTopChildCount - 1; i >= 0; --i) { m_Children.push_front( - ppBuffer[i]); // Ǿտ ִ´. ׸ ߿ ׸ ϰ ޼ ް Ϸ + ppBuffer[i]); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하고 메세지를 맨 먼저 받게 하려고 } delete[] ppBuffer; } @@ -174,7 +174,7 @@ void CUIManager::Tick() { void CUIManager::Render() { this->RenderStateSet(); - CN3UIBase::Render(); // ڽĵ render + CN3UIBase::Render(); // 자식들 render if (s_pTooltipCtrl) { s_pTooltipCtrl->Render(); // tooltip render } @@ -189,7 +189,7 @@ void CUIManager::RenderStateSet() { #ifdef _DEBUG __ASSERT(FALSE == s_sRSFU.bSet, - " RenderStateSet()Լ ȣϰ RenderStateRestore()Լ ȣ Դϴ."); + "이전에 RenderStateSet()함수를 호출하고 RenderStateRestore()함수가 호출되지 않은 상태입니다."); s_sRSFU.bSet = TRUE; #endif @@ -217,7 +217,7 @@ void CUIManager::RenderStateSet() { s_lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); } if (FALSE != s_sRSFU.dwFog) { - s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); // 2d fog Դ´ .; + s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); // 2d도 fog를 먹는다 ㅡ.ㅡ; } if (D3DTEXF_POINT != s_sRSFU.dwMagFilter) { s_lpD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); @@ -232,7 +232,7 @@ void CUIManager::RenderStateSet() { void CUIManager::RenderStateRestore() { #ifdef _DEBUG - __ASSERT(TRUE == s_sRSFU.bSet, " RenderStateSet()Լ ȣ ʾҽϴ."); + __ASSERT(TRUE == s_sRSFU.bSet, "이전에 RenderStateSet()함수를 호출하지 않았습니다."); s_sRSFU.bSet = FALSE; #endif @@ -267,16 +267,16 @@ bool CUIManager::BroadcastIconDropMsg(__IconItemSkill * spItem) { bool bFound = false; POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); - // ٴϸ鼭 ˻.. + // 윈도우들을 돌아 다니면서 검사.. for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { if (bFound) { break; } CN3UIBase * pChild = (*itor); if (pChild->UIType() == UI_TYPE_ICON_MANAGER) { - // ش 찡 ̰(Ȱȭ Ǿ ְ), ȿ .. + // 해당 윈도우가 보이고(활성화 되어 있고), 그 윈도우 영역 안에 있으면.. if (((CN3UIWndBase *)pChild)->IsVisible() && ((CN3UIWndBase *)pChild)->IsIn(ptCur.x, ptCur.y)) { - // ش 쿡 ޽ Լ ȣ.. + // 해당 윈도우에 아이콘 드롭 메시지 함수를 호출.. if (((CN3UIWndBase *)pChild)->ReceiveIconDrop(spItem, ptCur)) { return true; } else { @@ -286,7 +286,7 @@ bool CUIManager::BroadcastIconDropMsg(__IconItemSkill * spItem) { } } - // .. ش 쿡 Cancel ޽ ش.. + // 어느 누구의 영역에도 속하지 않으면.. 해당 아이콘을 가진 윈도우에게 Cancel 메시지를 날려 준다.. if (!bFound) { switch (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd) { case UIWND_INVENTORY: @@ -346,9 +346,9 @@ void CUIManager::SetFocusedUI(CN3UIBase * pUI) { return; } - it = m_Children.erase(it); // 켱 Ʈ - m_Children.push_front(pUI); // Ǿտ ִ´. ׸ ߿ ׸ ϰ ޼ ް Ϸ - ReorderChildList(); // child list (׻ ߴ dialog ٽ Ѵ.) + it = m_Children.erase(it); // 우선 리스트에서 지우고 + m_Children.push_front(pUI); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하고 메세지를 맨 먼저 받게 하려고 + ReorderChildList(); // child list 재정렬(항상 위에 뜨는 dialog 때문에 다시 정렬한다.) m_pUIFocused = this->GetTopUI(true); } @@ -429,9 +429,9 @@ void CUIManager::SetVisibleFocusedUI(CN3UIBase * pUI) { } if (!(dwUIStyle & UISTYLE_FOCUS_UNABLE)) { - it = m_Children.erase(it); // 켱 Ʈ - m_Children.push_front(pUI); // Ǿտ ִ´. ׸ ߿ ׸ ϰ ޼ ް Ϸ - ReorderChildList(); // child list (׻ ߴ dialog ٽ Ѵ.) + it = m_Children.erase(it); // 우선 리스트에서 지우고 + m_Children.push_front(pUI); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하고 메세지를 맨 먼저 받게 하려고 + ReorderChildList(); // child list 재정렬(항상 위에 뜨는 dialog 때문에 다시 정렬한다.) } m_pUIFocused = this->GetEnableFocusTopUI(true); @@ -449,9 +449,9 @@ CN3UIBase * CUIManager::GetEnableFocusTopUI(bool bVisible) { UIListItor it = m_Children.begin(), itEnd = m_Children.end(); for (; it != itEnd; it++) { CN3UIBase * pUI = *(it); - if (pUI && pUI->IsVisible() && //̰ - !(pUI->GetStyle() & UISTYLE_FOCUS_UNABLE) && //Ŀ ϰ - !(pUI->GetStyle() & UISTYLE_HIDE_UNABLE)) { // ִ + if (pUI && pUI->IsVisible() && //보이고 + !(pUI->GetStyle() & UISTYLE_FOCUS_UNABLE) && //포커스가 가능하고 + !(pUI->GetStyle() & UISTYLE_HIDE_UNABLE)) { //닫힐수 있는 return pUI; } } diff --git a/src/game/UIManager.h b/src/game/UIManager.h index b0b40a8a..b84c6ac6 100644 --- a/src/game/UIManager.h +++ b/src/game/UIManager.h @@ -14,17 +14,17 @@ class CUIManager : public CN3UIBase { DWORD dwZEnable, dwAlphaBlend, dwSrcBlend, dwDestBlend, dwFog; DWORD dwMagFilter, dwMinFilter, dwMipFilter; #ifdef _DEBUG - BOOL bSet; // ̹ 3D device Ǿ Ǵ. + BOOL bSet; // 이미 값이 3D device의 값으로 세팅이 되었는지 판단. #endif }; static __RenderStateForUI s_sRSFU; // RenderStateForUI DWORD m_dwMouseFlagsCur; - bool m_bEnableOperation; // UI ΰ? + bool m_bEnableOperation; // UI 조작이 가능한 상태인가? CN3UIBase * m_pUIFocused; public: - bool m_bDoneSomething; // UI ߴ... + bool m_bDoneSomething; // UI 에서 조작을 했다... public: void UserMoveHideUIs(); @@ -32,16 +32,16 @@ class CUIManager : public CN3UIBase { static void RenderStateRestore(); static void RenderStateSet(); - void EnableOperationSet(bool bEnable) { m_bEnableOperation = bEnable; } // UI /Ұ.. - bool EnableOperation() { return m_bEnableOperation; } // UI ΰ? + void EnableOperationSet(bool bEnable) { m_bEnableOperation = bEnable; } // UI 조작 가능/불가능.. + bool EnableOperation() { return m_bEnableOperation; } // UI 조작이 가능한 상태인가? void Release(); void Tick(); DWORD MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptOld); DWORD GetCurMouseFlags() { return m_dwMouseFlagsCur; } - CN3UIBase * GetFocusedUI() { return m_pUIFocused; } // UI .. - void SetFocusedUI(CN3UIBase * pUI); // UI .. - CN3UIBase * GetTopUI(bool bVisible); // ֻ ִ UI . + CN3UIBase * GetFocusedUI() { return m_pUIFocused; } // 찍은 UI 가져오기.. + void SetFocusedUI(CN3UIBase * pUI); // 찍은 UI 가져오기.. + CN3UIBase * GetTopUI(bool bVisible); // 최상위에 있는 UI 가져오기. void SetVisibleFocusedUI(CN3UIBase * pUI); CN3UIBase * ReFocusUI(); void Render(); diff --git a/src/game/UIMessageBox.cpp b/src/game/UIMessageBox.cpp index 13b4b3a1..25b6cb6b 100644 --- a/src/game/UIMessageBox.cpp +++ b/src/game/UIMessageBox.cpp @@ -78,7 +78,7 @@ bool CUIMessageBox::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { return false; } - //s_CameraData.vp; //ҷ 캻 + //s_CameraData.vp; //불러 오는 과정을 살펴본다 //DWORD mm = s_CameraData.vp.Height; //DWORD ss = s_CameraData.vp.Width; @@ -97,33 +97,33 @@ bool CUIMessageBox::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { switch (m_eBehavior) { case BEHAVIOR_EXIT: { - if (CGameProcedure::s_pProcActive == pProcMain) // ν̸.. + if (CGameProcedure::s_pProcActive == pProcMain) // 지금 메인 프로시저이면.. { pProcMain->ReleaseSound(); ::PostQuitMessage(0); } else { ::PostQuitMessage(0); } - } break; // .. + } break; // 끝낸다.. case BEHAVIOR_RESTART_GAME: { - if (CGameProcedure::s_pProcActive == pProcMain) // ν̸.. + if (CGameProcedure::s_pProcActive == pProcMain) // 지금 메인 프로시저이면.. { std::string szIP = CGameProcedure::s_pSocket->GetCurrentIP(); DWORD dwPort = CGameProcedure::s_pSocket->GetCurrentPort(); - CGameProcedure::s_bNeedReportConnectionClosed = false; // ؾ ϴ.. + CGameProcedure::s_bNeedReportConnectionClosed = false; // 서버접속이 끊어진걸 보고해야 하는지.. CGameProcedure::s_pSocket->Disconnect(); - Sleep(2000); // 2 .. ó ð ش. + Sleep(2000); // 2초 딜레이.. 서버가 처리할 시간을 준다. CGameProcedure::s_pSocket->Connect(CGameProcedure::s_hWndBase, szIP.c_str(), dwPort); - CGameProcedure::s_bNeedReportConnectionClosed = true; // ؾ ϴ.. + CGameProcedure::s_bNeedReportConnectionClosed = true; // 서버접속이 끊어진걸 보고해야 하는지.. CGameProcedure::s_bNeedReportVersionCheck = true; CGameProcedure::ProcActiveSet( - (CGameProcedure *)CGameProcedure::s_pProcCharacterSelect); // ٽ ij .. + (CGameProcedure *)CGameProcedure::s_pProcCharacterSelect); // 다시 캐릭터 고르자.. } } break; case BEHAVIOR_REGENERATION: pProcMain->MsgSend_Regen(); - break; // Ȱ ޽ .. + break; // 부활 메시지 날리기.. case BEHAVIOR_PARTY_PERMIT: pProcMain->MsgSend_PartyOrForcePermit(0, true); break; @@ -146,17 +146,17 @@ bool CUIMessageBox::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { break; case BEHAVIOR_KNIGHTS_DESTROY: pProcMain->m_pUIKnightsOp->MsgSend_KnightsDestroy(); - break; // ǰ.. + break; // 기사단 뽀개기.. case BEHAVIOR_KNIGHTS_WITHDRAW: pProcMain->m_pUIKnightsOp->MsgSend_KnightsWithdraw(); - break; // Żϱ.. + break; // 기사단 탈퇴하기.. case BEHAVIOR_PERSONAL_TRADE_PERMIT: pProcMain->m_pSubProcPerTrade->ProcessProceed(PER_TRADE_RESULT_MY_AGREE); - break; // .. + break; // 내가 허락.. case BEHAVIOR_MGAME_LOGIN: pProcLogIn->MsgSend_AccountLogIn(LIC_MGAME); break; - case BEHAVIOR_DELETE_CHR: // ij .. + case BEHAVIOR_DELETE_CHR: // 캐릭터 지우기.. { std::string szKey; if (m_pEdit_Common) { @@ -171,15 +171,15 @@ bool CUIMessageBox::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (pProcMain->m_pUIPartyBBS) { pProcMain->m_pUIPartyBBS->MsgSend_Register(); } - break; // Ƽ Խǿ + break; // 파티 게시판에 등록 case BEHAVIOR_PARTY_BBS_REGISTER_CANCEL: if (pProcMain->m_pUIPartyBBS) { pProcMain->m_pUIPartyBBS->MsgSend_RegisterCancel(); } - break; // Ƽ Խǿ + break; // 파티 게시판에 등록 해제 case BEHAVIOR_EXECUTE_OPTION: { - ::ShellExecute(NULL, "open", "Option.exe", NULL, NULL, SW_SHOWNORMAL); // Ȩ ̵.. - PostQuitMessage(0); // ... + ::ShellExecute(NULL, "open", "Option.exe", NULL, NULL, SW_SHOWNORMAL); // 홈페이지로 이동.. + PostQuitMessage(0); // 종료... } break; default: break; @@ -203,10 +203,10 @@ bool CUIMessageBox::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { break; case BEHAVIOR_PERSONAL_TRADE_PERMIT: pProcMain->m_pSubProcPerTrade->LeavePerTradeState(PER_TRADE_RESULT_MY_DISAGREE); - break; // .. + break; // 내가 거절.. case BEHAVIOR_PERSONAL_TRADE_FMT_WAIT: pProcMain->m_pSubProcPerTrade->LeavePerTradeState(PER_TRADE_RESULT_MY_CANCEL); - break; // .. + break; // 내가 취소.. case BEHAVIOR_CLAN_JOIN: pProcMain->MsgSend_KnightsJoinReq(false); break; diff --git a/src/game/UIMessageBox.h b/src/game/UIMessageBox.h index abf1a543..c4a12172 100644 --- a/src/game/UIMessageBox.h +++ b/src/game/UIMessageBox.h @@ -20,8 +20,8 @@ class CUIMessageBox : public CN3UIBase { CN3UIEdit * m_pEdit_Common; public: - e_Behavior m_eBehavior; // OK ư ... - int m_iStyle; // ޽ ڽ Ÿ + e_Behavior m_eBehavior; // OK 버튼을 누르면 할짓... + int m_iStyle; // 메시지 박스 스타일 public: bool OnKeyPress(int iKey); diff --git a/src/game/UIMessageBoxManager.cpp b/src/game/UIMessageBoxManager.cpp index 77e82ecc..65a59be2 100644 --- a/src/game/UIMessageBoxManager.cpp +++ b/src/game/UIMessageBoxManager.cpp @@ -67,7 +67,7 @@ std::string CUIMessageBoxManager::MessageBoxPost(const std::string & szMsg, cons pMB->SetPos(pt.x, pt.y); pMB->SetVisible(true); - m_pMsgBoxLatestRef = pMB; // ȭ.. Z ؼ ͸ ش.. + m_pMsgBoxLatestRef = pMB; // 마지막에 띄운 대화상자.. Z 정렬을 위해서 이 포인터를 세팅해준다.. it = m_UBMs.begin(); it_e = m_UBMs.end(); @@ -112,13 +112,13 @@ void CUIMessageBoxManager::Render() { continue; } CUIManager::RenderStateSet(); - pMB->Render(); // ޽ ڽ .. + pMB->Render(); // 메시지 박스 렌더링.. CUIManager::RenderStateRestore(); } if (m_pMsgBoxLatestRef && m_pMsgBoxLatestRef->IsVisible()) { CUIManager::RenderStateSet(); - m_pMsgBoxLatestRef->Render(); // ޽ ڽ .. + m_pMsgBoxLatestRef->Render(); // 메시지 박스 렌더링.. CUIManager::RenderStateRestore(); } } diff --git a/src/game/UIMessageWnd.cpp b/src/game/UIMessageWnd.cpp index 431cb017..6f7a92cf 100644 --- a/src/game/UIMessageWnd.cpp +++ b/src/game/UIMessageWnd.cpp @@ -26,7 +26,7 @@ CUIMessageWnd::~CUIMessageWnd() { if (m_ppUILines) { delete[] m_ppUILines; m_ppUILines = NULL; - } // m_ppUILines[n] ʹ ޸ ҴǾ ־ θ ɶ ڵ ϹǷ Ѵ. + } // m_ppUILines[n]의 포인터는 메모리 할당되어 있어도 부모가 해제될때 자동으로 해제하므로 안지워야 한다. ChatListItor itor; for (itor = m_ChatBuffer.begin(); m_ChatBuffer.end() != itor; ++itor) { @@ -55,7 +55,7 @@ void CUIMessageWnd::Release() { if (m_ppUILines) { delete[] m_ppUILines; m_ppUILines = NULL; - } // m_ppUILines[n] ʹ ޸ ҴǾ ־ θ ɶ ڵ ϹǷ Ѵ. + } // m_ppUILines[n]의 포인터는 메모리 할당되어 있어도 부모가 해제될때 자동으로 해제하므로 안지워야 한다. ZeroMemory(&m_rcChatOutRegion, sizeof(m_rcChatOutRegion)); ChatListItor itor; @@ -80,19 +80,19 @@ BOOL CUIMessageWnd::MoveOffset(int iOffsetX, int iOffsetY) { if (0 == iOffsetX && 0 == iOffsetY) { return FALSE; } - // ui + // ui 영역 m_rcRegion.left += iOffsetX; m_rcRegion.top += iOffsetY; m_rcRegion.right += iOffsetX; m_rcRegion.bottom += iOffsetY; - // movable + // movable 영역 m_rcMovable.left += iOffsetX; m_rcMovable.top += iOffsetY; m_rcMovable.right += iOffsetX; m_rcMovable.bottom += iOffsetY; - // children ǥ + // children 좌표 갱신 CN3UIBase * pCUI = NULL; // Child UI... for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { pCUI = (*itor); @@ -100,7 +100,7 @@ BOOL CUIMessageWnd::MoveOffset(int iOffsetX, int iOffsetY) { pCUI->MoveOffset(iOffsetX, iOffsetY); } - //⿡ äâ ű ͵ ־... + //여기에 채팅창 옮기는 것도 넣어라... RECT rt = CGameProcedure::s_pProcMain->m_pUIChatDlg->GetRegion(); POINT pt = this->GetPos(); if ((pt.x != rt.right) || (pt.y != rt.top)) { @@ -122,7 +122,7 @@ bool CUIMessageWnd::Load(HANDLE hFile) { m_rcChatOutRegion = m_pChatOut->GetRegion(); CreateLines(); - __ASSERT(0 < m_iChatLineCount, "äâ ʹ ۾ƿ"); + __ASSERT(0 < m_iChatLineCount, "채팅창이 너무 작아요"); return true; } @@ -136,7 +136,7 @@ bool CUIMessageWnd::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } if (dwMsg == UIMSG_SCROLLBAR_POS) { - // ũѹٿ ´ ä Line + // 스크롤바에 맞는 채팅 Line 설정 int iCurLinePos = m_pScrollbar->GetCurrentPos(); SetTopLine(iCurLinePos); } @@ -155,7 +155,7 @@ void CUIMessageWnd::CreateLines() { m_ppUILines = NULL; } SIZE size; - if (m_pChatOut && m_pChatOut->GetTextExtent("", lstrlen(""), &size) && size.cy > 0) { + if (m_pChatOut && m_pChatOut->GetTextExtent("가", lstrlen("가"), &size) && size.cy > 0) { m_iChatLineCount = (m_rcChatOutRegion.bottom - m_rcChatOutRegion.top) / size.cy; } else { return; @@ -188,13 +188,13 @@ void CUIMessageWnd::AddMsg(const std::string & szString, D3DCOLOR color) { return; } - // ChatBuffer ֱ + // ChatBuffer에 넣기 __ChatInfo * pChatInfo = new __ChatInfo; pChatInfo->szChat = szString; pChatInfo->color = color; m_ChatBuffer.push_back(pChatInfo); - if (m_ChatBuffer.size() > 255) // 255 տ + if (m_ChatBuffer.size() > 255) // 255개가 넘으면 앞에서부터 지우기 { __ChatInfo * pTemp = m_ChatBuffer.front(); if (pTemp) { @@ -204,18 +204,18 @@ void CUIMessageWnd::AddMsg(const std::string & szString, D3DCOLOR color) { m_ChatBuffer.pop_front(); } - // line buffer ֱ + // line buffer 에 넣기 AddLineBuffer(szString, color); - // Line buffer - int iCurLinePos = m_pScrollbar->GetCurrentPos(); // scroll bar Ű ִ line + // Line buffer 갯수 조절 + int iCurLinePos = m_pScrollbar->GetCurrentPos(); // 현재 scroll bar가 가리키고 있는 line BOOL bAutoScroll = (m_pScrollbar->GetMaxPos() == iCurLinePos) ? TRUE : FALSE; while ( m_LineBuffer.size() > MAX_CHAT_LINES && - 0 < iCurLinePos) // MAX_CHAT_LINES ִ line ( ũѹٰ 0 line Ƿ 500 ѱ ִ) + 0 < iCurLinePos) // MAX_CHAT_LINES은 최대 line의 수 (단 스크롤바가 0인 곳에 있으면 line을 지우지 않으므로 500개를 넘길 수 있다) { - // + // 한줄 지우기 __ChatInfo * pTemp = m_LineBuffer.front(); if (pTemp) { delete pTemp; @@ -229,9 +229,9 @@ void CUIMessageWnd::AddMsg(const std::string & szString, D3DCOLOR color) { if (iMaxScrollPos < 0) { iMaxScrollPos = 0; } - m_pScrollbar->SetRange(0, iMaxScrollPos); // scroll bar range + m_pScrollbar->SetRange(0, iMaxScrollPos); // scroll bar range 설정 - // ڵ ũ̸ + // 자동으로 스크롤이면 if (bAutoScroll) { iCurLinePos = iMaxScrollPos; } @@ -239,10 +239,10 @@ void CUIMessageWnd::AddMsg(const std::string & szString, D3DCOLOR color) { iCurLinePos = 0; } - // ũѹ ġ 缳 + // 스크롤바 현재 위치 재설정 m_pScrollbar->SetCurrentPos(iCurLinePos); - // ũѹٿ ´ ä Line + // 스크롤바에 맞는 채팅 Line 설정 SetTopLine(iCurLinePos); } @@ -254,7 +254,7 @@ void CUIMessageWnd::AddLineBuffer(const std::string & szString, D3DCOLOR color) __ASSERT(m_pChatOut, ""); const int iStrLen = szString.size(); - // line buffer ֱ + // line buffer 넣기 SIZE size; if (FALSE == m_pChatOut->GetTextExtent(szString, iStrLen, &size)) { __ASSERT(0, "no device context"); @@ -263,7 +263,7 @@ void CUIMessageWnd::AddLineBuffer(const std::string & szString, D3DCOLOR color) const int iRegionWidth = m_rcChatOutRegion.right - m_rcChatOutRegion.left; - // ڸ ڵ,  ڴ ڸ ؿ ٿ.. + // 글자 자르는 코드, 영역 밖으로 벗어나는 글자는 자르고 밑에 줄에.. int iCX = 0; int iCount = 0; int iLineStart = 0; @@ -279,7 +279,7 @@ void CUIMessageWnd::AddLineBuffer(const std::string & szString, D3DCOLOR color) int iLineLength = iCount - iLineStart + 1; std::string szLine; pLineInfo->szChat = szString.substr(iLineStart, iLineLength); - } // ӵ \n pszLine = NULL ִ. + } // 연속된 \n일 경우 pszLine = NULL이 될 수 있다. ++iCount; iLineStart = iCount; @@ -287,16 +287,16 @@ void CUIMessageWnd::AddLineBuffer(const std::string & szString, D3DCOLOR color) } else { int iCC = 0; if (0x80 & szString[iCount]) { - iCC = 2; // 2BYTE + iCC = 2; // 2BYTE 문자 } else { - iCC = 1; // 1BYTE + iCC = 1; // 1BYTE 문자 } BOOL bFlag = m_pChatOut->GetTextExtent(&(szString[iCount]), iCC, &size); __ASSERT(bFlag, "cannot get size of dfont"); - if ((iCX + size.cx) > iRegionWidth) // ̰ Ѿ + if ((iCX + size.cx) > iRegionWidth) // 가로 길이가 넘었으면 { - // ߰ϱ + // 한 라인 더 추가하기 int iLineLength = iCount - iLineStart; if (iLineLength > 0) { @@ -306,19 +306,19 @@ void CUIMessageWnd::AddLineBuffer(const std::string & szString, D3DCOLOR color) pLineInfo->color = color; pLineInfo->szChat = szString.substr(iLineStart, iLineLength); } else { - __ASSERT(iRegionWidth > 15, "ʹ Ƽ ѱڵ "); + __ASSERT(iRegionWidth > 15, "너무 좁아서 한글자도 찍을 수가 없다"); break; } iLineStart = iCount; iCX = 0; } - // ϱ + // 글자 더하기 iCount += iCC; iCX += size.cx; } } - // ó + // 맨 마지막 출 처리 int iLineLength = iStrLen - iLineStart; if (iLineLength > 0) { __ChatInfo * pLineInfo = new __ChatInfo; @@ -341,7 +341,7 @@ void CUIMessageWnd::SetTopLine(int iTopLine) { iTopLine = iLineBufferSize; } - // ټ ʷ ӽùۿ ϰ string + // 앞줄서부터 차례로 임시버퍼에 저장하고 string 길이 측정 __ChatInfo ** ppLineInfos = new __ChatInfo *[m_iChatLineCount]; ZeroMemory(ppLineInfos, sizeof(__ChatInfo *) * m_iChatLineCount); @@ -355,8 +355,8 @@ void CUIMessageWnd::SetTopLine(int iTopLine) { } __ASSERT(m_ppUILines, "null pointer"); - // տ ° ʷ ۿ ֱ - int iRealLine = i; // µǴ + // 앞에서부터 맞게 차례로 각각 버퍼에 넣기 + int iRealLine = i; // 실제 출력되는 줄 수 int iRealLineCount = 0; for (i = 0; i < iRealLine; ++i) { ++iRealLineCount; @@ -370,14 +370,14 @@ void CUIMessageWnd::SetTopLine(int iTopLine) { if (NULL == m_ppUILines[i]) { continue; } - m_ppUILines[i]->SetString(""); // ĭ + m_ppUILines[i]->SetString(""); // 나머지는 빈칸 만들기 } delete[] ppLineInfos; } -void CUIMessageWnd::RecalcLineBuffer() // äâ  ȣָ line buffer ٽ ؼ ־ش. +void CUIMessageWnd::RecalcLineBuffer() // 채팅창 사이즈가 변했을때 호출해주면 line buffer를 다시 계산해서 넣어준다. { - // line buffer ʱȭϱ + // line buffer 초기화하기 ChatListItor itor; for (itor = m_LineBuffer.begin(); m_LineBuffer.end() != itor; ++itor) { __ChatInfo * pLineBuff = (*itor); @@ -387,7 +387,7 @@ void CUIMessageWnd::SetTopLine(int iTopLine) { } m_LineBuffer.clear(); - // Line buffer ٽ ֱ + // Line buffer 다시 넣기 for (itor = m_ChatBuffer.begin(); m_ChatBuffer.end() != itor; ++itor) { __ChatInfo * pChatBuff = (*itor); if (pChatBuff) { @@ -395,10 +395,10 @@ void CUIMessageWnd::SetTopLine(int iTopLine) { } } - // Line buffer - while (m_LineBuffer.size() > MAX_CHAT_LINES) // MAX_CHAT_LINES ִ line + // Line buffer 갯수 조절 + while (m_LineBuffer.size() > MAX_CHAT_LINES) // MAX_CHAT_LINES은 최대 line의 수 { - // + // 한줄 지우기 __ChatInfo * pLineBuff = m_LineBuffer.front(); if (pLineBuff) { delete pLineBuff; @@ -411,27 +411,27 @@ void CUIMessageWnd::SetTopLine(int iTopLine) { if (iMaxScrollPos < 0) { iMaxScrollPos = 0; } - m_pScrollbar->SetRange(0, iMaxScrollPos); // scroll bar range + m_pScrollbar->SetRange(0, iMaxScrollPos); // scroll bar range 설정 - // ũѹ ġ 缳 + // 스크롤바 현재 위치 재설정 m_pScrollbar->SetCurrentPos(iMaxScrollPos); - // ũѹٿ ´ ä Line + // 스크롤바에 맞는 채팅 Line 설정 SetTopLine(iMaxScrollPos); } void CUIMessageWnd::SetRegion(const RECT & Rect) { CN3UIBase::SetRegion(Rect); - // ڽĵ ġѴ. - // m_rcChatOutRegion = ; // ä ٽ ش. - //CreateLines(); // ä  ϰ ٽ . - //RecalcLineBuffer(); // ۸ ٽ ְ ۾ ǥѴ. + // 자식들을 적당히 배치한다. + // m_rcChatOutRegion = ; // 채팅 출력 영역을 다시 지정해준다. + //CreateLines(); // 채팅 라인을 몇줄 들어갈지 계산하고 다시 만든다. + //RecalcLineBuffer(); // 라인 버퍼를 다 지우고 다시 만들어주고 글씨를 표시한다. } bool CUIMessageWnd::OnKeyPress(int iKey) { switch (iKey) { - case DIK_ESCAPE: { //hotkey Ŀ ٸ ui Ƿ DIK_ESCAPE Ŀ ٽ - //ִ ٸ ̸ ݾش. + case DIK_ESCAPE: { //hotkey가 포커스 잡혀있을때는 다른 ui를 닫을수 없으므로 DIK_ESCAPE가 들어오면 포커스를 다시잡고 + //열려있는 다른 유아이를 닫아준다. CGameProcedure::s_pUIMgr->ReFocusUI(); //this_ui CN3UIBase * pFocus = CGameProcedure::s_pUIMgr->GetFocusedUI(); if (pFocus && pFocus != this) { diff --git a/src/game/UIMessageWnd.h b/src/game/UIMessageWnd.h index f903ab76..80c4fc97 100644 --- a/src/game/UIMessageWnd.h +++ b/src/game/UIMessageWnd.h @@ -11,36 +11,36 @@ class CUIMessageWnd : public CN3UIBase { protected: CN3UIString * - m_pChatOut; // ä µǴ UIString ( m_Child ), ۾ü ʱ Ѵ. - CN3UIScrollBar * m_pScrollbar; // scrollbar ( m_Child ) + m_pChatOut; // 채팅이 출력되는 UIString 참조포인터(실제 m_Child로 관리), 글씨체와 초기 영역만 참조한다. + CN3UIScrollBar * m_pScrollbar; // scrollbar 참조포인터(실제 m_Child로 관리) - ChatList m_ChatBuffer; // ä packet buffer - ChatList m_LineBuffer; // Line buffer + ChatList m_ChatBuffer; // 채팅 packet기준으로 된 buffer + ChatList m_LineBuffer; // Line 기준으로 된 buffer - int m_iChatLineCount; // äâ µǴ line (äâ  ٽ .) - RECT m_rcChatOutRegion; // ä µǴ - CN3UIString ** m_ppUILines; // ä µǴ UIString 迭(äâ  ϹǷ 迭 Ѵ. + int m_iChatLineCount; // 채팅창에 출력되는 line의 수(채팅창 사이즈가 변했을때 다시 계산해주자.) + RECT m_rcChatOutRegion; // 채팅이 출력되는 영역 + CN3UIString ** m_ppUILines; // 채팅이 출력되는 UIString 배열포인터(채팅창 사이즈가 변하므로 배열도 변한다. protected: - void SetTopLine(int iTopLine); // ش. + void SetTopLine(int iTopLine); // 맨 윗줄을 지정해준다. void AddLineBuffer(const std::string & szString, - D3DCOLOR color); // line ۸ ش.(ʹ ˾Ƽ 2ٷ ش.) - void RecalcLineBuffer(); // äâ  ȣָ line buffer ٽ ؼ ־ش. + D3DCOLOR color); // line 버퍼를 만들어준다.(너무 길면 알아서 2줄로 만들어준다.) + void RecalcLineBuffer(); // 채팅창 사이즈가 변했을때 호출해주면 line buffer를 다시 계산해서 넣어준다. void CreateLines(); // Operations public: bool OnKeyPress(int iKey); - BOOL MoveOffset(int iOffsetX, int iOffsetY); // offsetYŭ ̵ش.(region, children, move rect ̵) + BOOL MoveOffset(int iOffsetX, int iOffsetY); // offsetY만큼 이동해준다.(region, children, move rect 이동) bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); void Release(); bool Load(HANDLE hFile); void SetRegion( const RECT & - Rect); // ( Ҷ ȣȴ. ܼ ̵ ȣ ʴ´.(̵ܼ MoveOffset ȣ)) + Rect); // 영역 지정(사이즈가 변할때 호출된다. 단순 이동은 호출되지 않는다.(단순이동은 MoveOffset이 호출)) void AddMsg(const std::string & szString, - D3DCOLOR color = 0xffffffff); // ä ޼ ϰ ˸ · ȭ鿡 ش. + D3DCOLOR color = 0xffffffff); // 채팅 메세지를 저장하고 알맞은 형태로 화면에 출력해준다. CUIMessageWnd(); virtual ~CUIMessageWnd(); diff --git a/src/game/UINPCChangeEvent.cpp b/src/game/UINPCChangeEvent.cpp index cdcf7888..0ca4c7cd 100644 --- a/src/game/UINPCChangeEvent.cpp +++ b/src/game/UINPCChangeEvent.cpp @@ -63,13 +63,13 @@ bool CUINPCChangeEvent::Load(HANDLE hFile) { __ASSERT(m_pBtn_Close, "NULL UI Component!!"); // UIPointInitDlg.. ^^ - e_Nation eNation = CGameProcedure::s_pPlayer->m_InfoBase.eNation; // .... + e_Nation eNation = CGameProcedure::s_pPlayer->m_InfoBase.eNation; // 국가.... __TABLE_UI_RESRC * pTbl = CGameProcedure::s_pTbl_UI->Find(eNation); m_pDlg = new CUIPointInitDlg(); m_pDlg->LoadFromFile(pTbl->szChangeInitBill); - // ġ .. + // 위치 계산 .. int iXPos, iYPos; iXPos = (iW / 2) - (m_pDlg->GetRegion().right - m_pDlg->GetRegion().left) / 2; iYPos = (iH / 2) - (m_pDlg->GetRegion().bottom - m_pDlg->GetRegion().top) / 2; diff --git a/src/game/UINPCEvent.cpp b/src/game/UINPCEvent.cpp index 36563720..c92ebe42 100644 --- a/src/game/UINPCEvent.cpp +++ b/src/game/UINPCEvent.cpp @@ -49,7 +49,7 @@ bool CUINPCEvent::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (dwMsg == UIMSG_BUTTON_CLICK) { if (pSender->m_szID == "Btn_Sale") { if (CGameProcedure::s_pProcMain->m_pSubProcPerTrade->m_ePerTradeState != - PER_TRADE_STATE_NONE) { /* ΰ ŷ ̸.. */ + PER_TRADE_STATE_NONE) { /* 개인간 상거래 중이면.. */ return true; } @@ -68,7 +68,7 @@ bool CUINPCEvent::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (pSender->m_szID == "Btn_Repair") { if (CGameProcedure::s_pProcMain->m_pSubProcPerTrade->m_ePerTradeState != - PER_TRADE_STATE_NONE) { /* ΰ ŷ ̸.. */ + PER_TRADE_STATE_NONE) { /* 개인간 상거래 중이면.. */ return true; } diff --git a/src/game/UIPartyBBS.cpp b/src/game/UIPartyBBS.cpp index 5a454e06..f36a48b5 100644 --- a/src/game/UIPartyBBS.cpp +++ b/src/game/UIPartyBBS.cpp @@ -79,7 +79,7 @@ bool CUIPartyBBS::Load(HANDLE hFile) { m_pText[i] = (CN3UIString *)(pParty->GetChildByID(std::format("text_{:02d}", i))); } - m_iCurPage = 0; // .. + m_iCurPage = 0; // 현재 페이지.. return true; } @@ -126,15 +126,15 @@ bool CUIPartyBBS::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } else if (pSender == m_pBtn_Register) { std::string szMsg; ::_LoadStringFromResource(IDS_PARTY_BBS_REGISTER, szMsg); - CGameProcedure::MessageBoxPost(szMsg, "", MB_YESNO, BEHAVIOR_PARTY_BBS_REGISTER); // ü .. + CGameProcedure::MessageBoxPost(szMsg, "", MB_YESNO, BEHAVIOR_PARTY_BBS_REGISTER); // 기사단 해체 물어보기.. } else if (pSender == m_pBtn_RegisterCancel) { std::string szMsg; ::_LoadStringFromResource(IDS_PARTY_BBS_REGISTER_CANCEL, szMsg); CGameProcedure::MessageBoxPost(szMsg, "", MB_YESNO, - BEHAVIOR_PARTY_BBS_REGISTER_CANCEL); // ü .. + BEHAVIOR_PARTY_BBS_REGISTER_CANCEL); // 기사단 해체 물어보기.. } else if (pSender == m_pBtn_Whisper) { RequestWhisper(); - } else if (pSender == m_pBtn_Party) // Ƽ û + } else if (pSender == m_pBtn_Party) // 파티 신청 { RequestParty(); } @@ -149,7 +149,7 @@ bool CUIPartyBBS::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { void CUIPartyBBS::MsgSend_RefreshData(int iCurPage) { if (m_bProcessing) { - return; // Ŷ + return; //전에 보낸 패킷 응답이 없으면 } float fTime = CN3Base::TimeGet(); @@ -176,7 +176,7 @@ void CUIPartyBBS::MsgRecv_RefreshData(DataPack * pDataPack, int & iOffset) { BYTE byType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); BYTE byResult = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); if (byResult != 0x01) { - return; //ߴٸ + return; //실패했다면 } switch (byType) { @@ -226,7 +226,7 @@ void CUIPartyBBS::MsgRecv_RefreshData(DataPack * pDataPack, int & iOffset) { void CUIPartyBBS::MsgSend_Register() { if (m_bProcessing) { - return; // Ŷ + return; //전에 보낸 패킷 응답이 없으면 } BYTE byBuff[4]; @@ -241,7 +241,7 @@ void CUIPartyBBS::MsgSend_Register() { void CUIPartyBBS::MsgSend_RegisterCancel() { if (m_bProcessing) { - return; // Ŷ + return; //전에 보낸 패킷 응답이 없으면 } BYTE byBuff[4]; @@ -256,7 +256,7 @@ void CUIPartyBBS::MsgSend_RegisterCancel() { void CUIPartyBBS::RefreshPage() { if (m_pText_Page) { - m_pText_Page->SetStringAsInt(m_iCurPage + 1); // ǥ.. + m_pText_Page->SetStringAsInt(m_iCurPage + 1); // 페이지 표시.. } ResetContent(); @@ -302,10 +302,10 @@ void CUIPartyBBS::PartyStringSet(BYTE byType) { ::_LoadStringFromResource(IDS_WANT_PARTY_MEMBER, szMsg); sprintf(szBuff, szMsg.c_str(), iLMin, iLMax); CGameProcedure::s_pPlayer->InfoStringSet(szBuff, 0xff00ff00); - CGameProcedure::s_pProcMain->MsgSend_StateChange(N3_SP_STATE_CHANGE_RECRUIT_PARTY, 0x02); // Ƽ û.. + CGameProcedure::s_pProcMain->MsgSend_StateChange(N3_SP_STATE_CHANGE_RECRUIT_PARTY, 0x02); // 파티 요청.. 취소 } else { CGameProcedure::s_pPlayer->InfoStringSet("", 0); - CGameProcedure::s_pProcMain->MsgSend_StateChange(N3_SP_STATE_CHANGE_RECRUIT_PARTY, 0x01); // Ƽ û.. + CGameProcedure::s_pProcMain->MsgSend_StateChange(N3_SP_STATE_CHANGE_RECRUIT_PARTY, 0x01); // 파티 요청.. } } @@ -442,7 +442,7 @@ void CUIPartyBBS::RequestWhisper() { __InfoPartyBBS IPB = (*it); if (0 != lstrcmpi(IPB.szID.c_str(), - CGameProcedure::s_pPlayer->m_InfoBase.szID.c_str())) { // ڽſԴ ӼӸ ϰ Ѵ... + CGameProcedure::s_pPlayer->m_InfoBase.szID.c_str())) { //나 자신에게는 귓속말을 못하게 한다... CGameProcedure::s_pProcMain->MsgSend_ChatSelectTarget(IPB.szID); } break; @@ -465,12 +465,12 @@ void CUIPartyBBS::RequestParty() { __InfoPartyBBS IPB = (*it); if (0 != lstrcmpi(IPB.szID.c_str(), CGameProcedure::s_pPlayer->m_InfoBase.szID - .c_str())) { // ڽſԴ Ƽ û ϰ Ѵ... + .c_str())) { //나 자신에게는 파티 신청을 못하게 한다... std::string szMsg; if (CGameProcedure::s_pProcMain->MsgSend_PartyOrForceCreate(0, IPB.szID)) { - ::_LoadStringFromResource(IDS_PARTY_INVITE, szMsg); // Ƽ + ::_LoadStringFromResource(IDS_PARTY_INVITE, szMsg); // 파티 } else { - ::_LoadStringFromResource(IDS_PARTY_INVITE_FAILED, szMsg); // Ƽ ʴ + ::_LoadStringFromResource(IDS_PARTY_INVITE_FAILED, szMsg); // 파티 초대 실패 } CGameProcedure::s_pProcMain->MsgOutput(IPB.szID + szMsg, 0xffffff00); break; diff --git a/src/game/UIPartyBBS.h b/src/game/UIPartyBBS.h index 444b4d3c..f1327ca1 100644 --- a/src/game/UIPartyBBS.h +++ b/src/game/UIPartyBBS.h @@ -12,7 +12,7 @@ typedef typename std::list<__InfoPartyBBS>::iterator it_PartyBBS; -class CUIPartyBBS : public CN3UIBase // Ƽ UI, δ Ŭ .. +class CUIPartyBBS : public CN3UIBase // 파티에 관한 UI, 부대와 같은 클래스로 쓴다.. { protected: class CN3UIButton * m_pBtn_PageUp; @@ -29,8 +29,8 @@ typedef typename std::list<__InfoPartyBBS>::iterator it_PartyBBS; class CN3UIString * m_pText[69]; std::list<__InfoPartyBBS> m_Datas; // BBS Data - int m_iCurPage; // .. - int m_iMaxPage; // .. + int m_iCurPage; // 현재 페이지.. + int m_iMaxPage; // 총 페이지.. int m_iCurIndex; bool m_bProcessing; float m_fTime; diff --git a/src/game/UIPartyBBSSelector.cpp b/src/game/UIPartyBBSSelector.cpp index 4f67acbf..25ace2c4 100644 --- a/src/game/UIPartyBBSSelector.cpp +++ b/src/game/UIPartyBBSSelector.cpp @@ -65,7 +65,7 @@ void CUIPartyBBSSelector::MsgSend_PartyBBSKind(BYTE byKind) { BYTE byBuff[4]; int iOffset = 0; - CAPISocket::MP_AddByte(byBuff, iOffset, 1); // Ŷ ؾ ҵ - CAPISocket::MP_AddByte(byBuff, iOffset, byKind); // Ƽ Ƽ ... - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // Ŷ .. + CAPISocket::MP_AddByte(byBuff, iOffset, 1); // 패킷도 정해야 할듯 + CAPISocket::MP_AddByte(byBuff, iOffset, byKind); // 파티구함인지 파티원 구함인지... + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 패킷을 보냄.. } diff --git a/src/game/UIPartyOrForce.cpp b/src/game/UIPartyOrForce.cpp index ef401b8e..387e53d4 100644 --- a/src/game/UIPartyOrForce.cpp +++ b/src/game/UIPartyOrForce.cpp @@ -19,14 +19,14 @@ CUIPartyOrForce::CUIPartyOrForce() { for (int i = 0; i < MAX_PARTY_OR_FORCE; i++) { - m_pProgress_HPs[i] = NULL; // δ ŭ... HP Gauge - m_pProgress_HPReduce[i] = NULL; // δ ŭ... HP Reduce - m_pProgress_ETC[i] = NULL; // δ ŭ... ̻ - m_pStatic_IDs[i] = NULL; // δ ŭ... ̸.. + m_pProgress_HPs[i] = NULL; // 부대원갯수 만큼... HP Gauge + m_pProgress_HPReduce[i] = NULL; // 부대원갯수 만큼... HP Reduce + m_pProgress_ETC[i] = NULL; // 부대원갯수 만큼... 상태이상 + m_pStatic_IDs[i] = NULL; // 부대원갯수 만큼... 이름들.. m_pAreas[i] = NULL; } - m_iIndexSelected = -1; // õ ε.. + m_iIndexSelected = -1; // 현재 선택된 멤버인덱스.. } CUIPartyOrForce::~CUIPartyOrForce() {} @@ -35,12 +35,12 @@ void CUIPartyOrForce::Release() { CN3UIBase::Release(); m_Members.clear(); - m_iIndexSelected = -1; // õ ε.. + m_iIndexSelected = -1; // 현재 선택된 멤버인덱스.. for (int i = 0; i < MAX_PARTY_OR_FORCE; i++) { - m_pProgress_HPs[i] = NULL; // δ ŭ... HP Gauge - m_pProgress_HPReduce[i] = NULL; // δ ŭ... HP Reduce - m_pProgress_ETC[i] = NULL; // δ ŭ... ̻ - m_pStatic_IDs[i] = NULL; // δ ŭ... ̸.. + m_pProgress_HPs[i] = NULL; // 부대원갯수 만큼... HP Gauge + m_pProgress_HPReduce[i] = NULL; // 부대원갯수 만큼... HP Reduce + m_pProgress_ETC[i] = NULL; // 부대원갯수 만큼... 상태이상 + m_pStatic_IDs[i] = NULL; // 부대원갯수 만큼... 이름들.. m_pAreas[i] = NULL; } } @@ -51,7 +51,7 @@ bool CUIPartyOrForce::Load(HANDLE hFile) { } char szID[128] = ""; - for (int i = 0; i < MAX_PARTY_OR_FORCE; i++) // ã.. + for (int i = 0; i < MAX_PARTY_OR_FORCE; i++) // 빈곳을 찾자.. { sprintf(szID, "progress_hp_%d", i); // m_pProgress_HPs[i] = (CN3UIProgress *)(this->GetChildByID(szID)); @@ -104,7 +104,7 @@ bool CUIPartyOrForce::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { // if(m_pStatic_IDs[i] && pSender == m_pStatic_IDs[i]) if (pSender == m_pAreas[i]) { pIP = &(*it); - m_iIndexSelected = i; // õ ε.. + m_iIndexSelected = i; // 현재 선택된 멤버인덱스.. break; } } @@ -151,7 +151,7 @@ void CUIPartyOrForce::Render() { rc.right = (rc1.right > rc2.right) ? rc1.right : rc2.right; rc.bottom = (rc1.bottom > rc2.bottom) ? rc1.bottom : rc2.bottom; - CN3Base::RenderLines(rc, 0xff00ff00); // ǥ.. + CN3Base::RenderLines(rc, 0xff00ff00); // 선택 표시.. } bool CUIPartyOrForce::TargetByIndex(int iIndex) { @@ -165,7 +165,7 @@ bool CUIPartyOrForce::TargetByIndex(int iIndex) { } __InfoPartyOrForce * pIP = &(*it); - m_iIndexSelected = iIndex; // õ ε.. + m_iIndexSelected = iIndex; // 현재 선택된 멤버인덱스.. if (pIP) { CGameProcedure::s_pProcMain->TargetSelect(pIP->iID, true); @@ -271,7 +271,7 @@ bool CUIPartyOrForce::MemberRemove(int iID) { void CUIPartyOrForce::MemberDestroy() { m_Members.clear(); - for (int i = 0; i < MAX_PARTY_OR_FORCE; i++) // ã.. + for (int i = 0; i < MAX_PARTY_OR_FORCE; i++) // 빈곳을 찾자.. { if (m_pProgress_HPs[i]) { m_pProgress_HPs[i]->SetVisible(false); @@ -291,13 +291,13 @@ void CUIPartyOrForce::MemberDestroy() { this->MemberInfoReInit(); } -void CUIPartyOrForce::MemberInfoReInit() // Ƽ ɶ.. Ʈ.. +void CUIPartyOrForce::MemberInfoReInit() // 파티원 구성이 변경될때.. 순서 및 각종 정보 업데이트.. { it_PartyOrForce it = m_Members.begin(), itEnd = m_Members.end(); __InfoPartyOrForce * pIP = NULL; int i; for (i = 0; it != itEnd && i < MAX_PARTY_OR_FORCE; it++, i++) { - pIP = &(*it); // ϱ ̷ ߴ.. + pIP = &(*it); // 디버깅 하기 쉬우라고 이렇게 했다.. if (pIP->iHPMax <= 0) { __ASSERT(0, "Invalid Party memeber HP"); continue; @@ -337,9 +337,9 @@ void CUIPartyOrForce::MemberDestroy() { } if (m_Members.empty()) { - this->SetVisible(false); // . + this->SetVisible(false); // 멤버가 없으면 숨긴다. } else { - this->SetVisible(true); // δ. + this->SetVisible(true); // 멤버가 있으면 보인다. } } @@ -363,7 +363,7 @@ void CUIPartyOrForce::MemberHPChange(int iID, int iHP, int iHPMax) { it_PartyOrForce it = m_Members.begin(), itEnd = m_Members.end(); __InfoPartyOrForce * pIP = NULL; for (int i = 0; it != itEnd && i < MAX_PARTY_OR_FORCE; it++, i++) { - pIP = &(*it); // ϱ ̷ ߴ.. + pIP = &(*it); // 디버깅 하기 쉬우라고 이렇게 했다.. if (pIP->iID == iID) { pIP->iHP = iHP; pIP->iHPMax = iHPMax; @@ -386,7 +386,7 @@ void CUIPartyOrForce::MemberStatusChange(int iID, e_PartyStatus ePS, bool bSuffe it_PartyOrForce it = m_Members.begin(), itEnd = m_Members.end(); __InfoPartyOrForce * pIP = NULL; for (int i = 0; it != itEnd && i < MAX_PARTY_OR_FORCE; it++, i++) { - pIP = &(*it); // ϱ ̷ ߴ.. + pIP = &(*it); // 디버깅 하기 쉬우라고 이렇게 했다.. if (pIP->iID == iID) { if (PARTY_STATUS_DOWN_HP == ePS) { pIP->bSufferDown_HP = bSuffer; @@ -402,7 +402,7 @@ void CUIPartyOrForce::MemberLevelChange(int iID, int iLevel) { it_PartyOrForce it = m_Members.begin(), itEnd = m_Members.end(); __InfoPartyOrForce * pIP = NULL; for (int i = 0; it != itEnd && i < MAX_PARTY_OR_FORCE; it++, i++) { - pIP = &(*it); // ϱ ̷ ߴ.. + pIP = &(*it); // 디버깅 하기 쉬우라고 이렇게 했다.. if (pIP->iID == iID) { pIP->iLevel = iLevel; break; @@ -414,7 +414,7 @@ void CUIPartyOrForce::MemberClassChange(int iID, e_Class eClass) { it_PartyOrForce it = m_Members.begin(), itEnd = m_Members.end(); __InfoPartyOrForce * pIP = NULL; for (int i = 0; it != itEnd && i < MAX_PARTY_OR_FORCE; it++, i++) { - pIP = &(*it); // ϱ ̷ ߴ.. + pIP = &(*it); // 디버깅 하기 쉬우라고 이렇게 했다.. if (pIP->iID == iID) { pIP->eClass = eClass; break; @@ -438,7 +438,7 @@ void CUIPartyOrForce::Tick() { it_PartyOrForce it = m_Members.begin(), itEnd = m_Members.end(); __InfoPartyOrForce * pIP = NULL; for (int i = 0; it != itEnd && i < MAX_PARTY_OR_FORCE; it++, i++) { - pIP = &(*it); // ϱ ̷ ߴ.. + pIP = &(*it); // 디버깅 하기 쉬우라고 이렇게 했다.. if (m_pProgress_HPs[i]) { if (pIP->bSufferDown_HP || pIP->bSufferDown_Etc) { m_pProgress_HPs[i]->SetVisible(false); @@ -484,8 +484,8 @@ void CUIPartyOrForce::Tick() { bool CUIPartyOrForce::OnKeyPress(int iKey) { switch (iKey) { - case DIK_ESCAPE: { //hotkey Ŀ ٸ ui Ƿ DIK_ESCAPE Ŀ ٽ - //ִ ٸ ̸ ݾش. + case DIK_ESCAPE: { //hotkey가 포커스 잡혀있을때는 다른 ui를 닫을수 없으므로 DIK_ESCAPE가 들어오면 포커스를 다시잡고 + //열려있는 다른 유아이를 닫아준다. CGameProcedure::s_pUIMgr->ReFocusUI(); //this_ui CN3UIBase * pFocus = CGameProcedure::s_pUIMgr->GetFocusedUI(); if (pFocus && pFocus != this) { diff --git a/src/game/UIPartyOrForce.h b/src/game/UIPartyOrForce.h index 3ea554cb..73e3f666 100644 --- a/src/game/UIPartyOrForce.h +++ b/src/game/UIPartyOrForce.h @@ -10,20 +10,20 @@ typedef typename std::list<__InfoPartyOrForce>::iterator it_PartyOrForce; -class CUIPartyOrForce : public CN3UIBase // Ƽ UI, δ Ŭ .. +class CUIPartyOrForce : public CN3UIBase // 파티에 관한 UI, 부대와 같은 클래스로 쓴다.. { protected: - class CN3UIProgress * m_pProgress_HPs[MAX_PARTY_OR_FORCE]; // δ ŭ... HP Gauge - class CN3UIProgress * m_pProgress_HPReduce[MAX_PARTY_OR_FORCE]; // δ ŭ... HP Reduce - class CN3UIProgress * m_pProgress_ETC[MAX_PARTY_OR_FORCE]; // δ ŭ... ̻ - class CN3UIStatic * m_pStatic_IDs[MAX_PARTY_OR_FORCE]; // δ ŭ... ̸.. - class CN3UIArea * m_pAreas[MAX_PARTY_OR_FORCE]; // δ ŭ... ̸.. + class CN3UIProgress * m_pProgress_HPs[MAX_PARTY_OR_FORCE]; // 부대원갯수 만큼... HP Gauge + class CN3UIProgress * m_pProgress_HPReduce[MAX_PARTY_OR_FORCE]; // 부대원갯수 만큼... HP Reduce + class CN3UIProgress * m_pProgress_ETC[MAX_PARTY_OR_FORCE]; // 부대원갯수 만큼... 상태이상 + class CN3UIStatic * m_pStatic_IDs[MAX_PARTY_OR_FORCE]; // 부대원갯수 만큼... 이름들.. + class CN3UIArea * m_pAreas[MAX_PARTY_OR_FORCE]; // 부대원갯수 만큼... 이름들.. - std::list<__InfoPartyOrForce> m_Members; // Ƽ - int m_iIndexSelected; // õ ε.. + std::list<__InfoPartyOrForce> m_Members; // 파티 멤버 + int m_iIndexSelected; // 현재 선택된 멤버인덱스.. public: - int m_iPartyOrForce; // Ƽ? δ?? 1 ̸ Ƽ 2 ̸ δ.. + int m_iPartyOrForce; // 파티냐? 부대냐?? 1 이면 파티 2 이면 부대.. public: bool OnKeyPress(int iKey); @@ -33,12 +33,12 @@ typedef typename std::list<__InfoPartyOrForce>::iterator it_PartyOrForce; void MemberHPChange(int iID, int iHP, int iHPMax); void MemberStatusChange(int iID, e_PartyStatus ePS, bool bSuffer); - void MemberInfoReInit(); // Ƽ ɶ.. Ʈ.. - bool TargetByIndex(int iIndex); // Ÿ .. + void MemberInfoReInit(); // 파티원 구성이 변경될때.. 순서 및 각종 정보 업데이트.. + bool TargetByIndex(int iIndex); // 순서대로 타겟 잡기.. const __InfoPartyOrForce * MemberInfoGetByID(int iID, int & iIndexResult); const __InfoPartyOrForce * MemberInfoGetByIndex(int iIndex); - const __InfoPartyOrForce * MemberInfoGetSelected(); // õ ε.. + const __InfoPartyOrForce * MemberInfoGetSelected(); // 현재 선택된 멤버인덱스.. const __InfoPartyOrForce * MemberAdd(int iID, const std::string szID, int iLevel, e_Class eClass, int iHP, int iHPMax); class CPlayerOther * MemberGetByNearst(const __Vector3 & vPosPlayer); diff --git a/src/game/UIPerTradeDlg.cpp b/src/game/UIPerTradeDlg.cpp index 9da8c872..856a3e0f 100644 --- a/src/game/UIPerTradeDlg.cpp +++ b/src/game/UIPerTradeDlg.cpp @@ -83,7 +83,7 @@ void CUIPerTradeDlg::Release() { void CUIPerTradeDlg::Render() { if (!m_bVisible) { - return; // ڽĵ render ʴ´. + return; // 보이지 않으면 자식들을 render하지 않는다. } POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); m_pUITooltipDlg->DisplayTooltipsDisable(); @@ -106,11 +106,11 @@ void CUIPerTradeDlg::Render() { } } - // ǥõǾ ǥ.. + // 갯수 표시되야 할 아이템 갯수 표시.. for (int i = 0; i < MAX_ITEM_PER_TRADE; i++) { if (m_pPerTradeMy[i] && ((m_pPerTradeMy[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (m_pPerTradeMy[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL))) { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i); if (pStr) { pStr->SetVisible(true); @@ -118,7 +118,7 @@ void CUIPerTradeDlg::Render() { pStr->Render(); } } else { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i); if (pStr) { pStr->SetVisible(false); @@ -126,11 +126,11 @@ void CUIPerTradeDlg::Render() { } } - // ǥõǾ ǥ.. + // 갯수 표시되야 할 아이템 갯수 표시.. for (int i = 0; i < MAX_ITEM_PER_TRADE; i++) { if (m_pPerTradeOther[i] && ((m_pPerTradeOther[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (m_pPerTradeOther[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL))) { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i + 100); if (pStr) { pStr->SetVisible(true); @@ -138,7 +138,7 @@ void CUIPerTradeDlg::Render() { pStr->Render(); } } else { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i + 100); if (pStr) { pStr->SetVisible(false); @@ -146,11 +146,11 @@ void CUIPerTradeDlg::Render() { } } - // ǥõǾ ǥ.. + // 갯수 표시되야 할 아이템 갯수 표시.. for (int i = 0; i < MAX_ITEM_INVENTORY; i++) { if (m_pPerTradeInv[i] && ((m_pPerTradeInv[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (m_pPerTradeInv[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL))) { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i + 200); if (pStr) { if ((GetState() == UI_STATE_ICON_MOVING) && @@ -167,7 +167,7 @@ void CUIPerTradeDlg::Render() { } } } else { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i + 200); if (pStr) { pStr->SetVisible(false); @@ -197,7 +197,7 @@ void CUIPerTradeDlg::InitIconWnd(e_UIWND eWnd) { CN3UIWndBase::InitIconWnd(eWnd); - // ư ·.. + // 내 결정 버튼 보통 상태로.. std::string szFN = "btn_trade_my"; CN3UIButton * pButton; pButton = (CN3UIButton *)GetChildButtonByName(szFN); @@ -237,11 +237,11 @@ __IconItemSkill * CUIPerTradeDlg::GetHighlightIconItem(CN3UIIcon * pUIIcon) { } void CUIPerTradeDlg::LeavePerTradeState() { - // Ŭ.. + // 변수 클리어.. for (int i = 0; i < MAX_ITEM_PER_TRADE; i++) { m_iBackupiOrder[i] = -1; } - // ư ·.. + // 내 결정 버튼 보통 상태로.. std::string szFN = "btn_trade_my"; CN3UIButton * pButton; pButton = (CN3UIButton *)GetChildButtonByName(szFN); @@ -259,12 +259,12 @@ void CUIPerTradeDlg::LeavePerTradeState() { } void CUIPerTradeDlg::EnterPerTradeState() { - // ʱȭ.. + // 변수 초기화.. for (int i = 0; i < MAX_ITEM_PER_TRADE; i++) { m_iBackupiOrder[i] = -1; } - // ư ·.. + // 내 결정 버튼 보통 상태로.. std::string szFN = "btn_trade_my"; CN3UIButton * pButton; pButton = (CN3UIButton *)GetChildButtonByName(szFN); @@ -388,7 +388,7 @@ void CUIPerTradeDlg::ItemCountOK() { } CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = true; - m_iBackupiCount = iGold; // ű ȭ .. + m_iBackupiCount = iGold; // 전에 옮긴 화살등의 갯수.. int iOffset = spItem->iCount - iGold; // Sound.. @@ -397,30 +397,30 @@ void CUIPerTradeDlg::ItemCountOK() { } if (iOffset > 0) { - // Ʈ.. + // 숫자 업데이트.. spItem->iCount = iOffset; - // ش ġ Ѵٸ.. + // 해당 위치에 아이콘이 존재 한다면.. if (m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]) { m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]->iCount += iGold; } } else { - // ش ġ Ѵٸ.. + // 해당 위치에 아이콘이 존재 한다면.. if (m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]) { m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]->iCount += iGold; } - // κ丮 Ѵ.. + // 인벤토리의 아이콘을 삭제한다.. __IconItemSkill * spItem; spItem = m_pPerTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; - // κ丮 .. + // 인벤토리에서도 지운다.. m_pPerTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -428,7 +428,7 @@ void CUIPerTradeDlg::ItemCountOK() { spItem = NULL; } - // Server .. + // Server에게 보낸다.. SendToServerItemAddMsg(CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder, m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]->pItemBasic->dwID + m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]->pItemExt->dwID, @@ -448,17 +448,17 @@ void CUIPerTradeDlg::ItemCountCancel() { if ((m_pPerTradeMy[i]) && ((m_pPerTradeMy[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (m_pPerTradeMy[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL))) { if (m_pPerTradeMy[i]->iCount == 0) { - // κ丮 Ѵ.. + // 인벤토리의 아이콘을 삭제한다.. __IconItemSkill * spItem; spItem = m_pPerTradeMy[i]; - // κ丮 .. + // 인벤토리에서도 지운다.. m_pPerTradeMy[i] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -468,7 +468,7 @@ void CUIPerTradeDlg::ItemCountCancel() { } } - // .. + // 취소.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = NULL; @@ -477,18 +477,18 @@ void CUIPerTradeDlg::ItemCountCancel() { } void CUIPerTradeDlg::SendToServerItemAddMsg(uint8_t pos, int itemID, int iCount) { - // Ѵ.. - BYTE byBuff[16]; // Ŷ .. - int iOffset = 0; // Ŷ .. + // 서버에게 전송한다.. + BYTE byBuff[16]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. - // Ŷ  .. + // 서버에게 패킷 만들어서 날림.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_PER_TRADE); CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_PER_TRADE_ADD); CAPISocket::MP_AddByte(byBuff, iOffset, pos); CAPISocket::MP_AddDword(byBuff, iOffset, itemID); CAPISocket::MP_AddDword(byBuff, iOffset, iCount); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보냄.. } bool CUIPerTradeDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { @@ -505,7 +505,7 @@ bool CUIPerTradeDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { return false; } - // ƴϸ.. + // 내가 가졌던 아이콘이 아니면.. if (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd != m_eUIWnd) { FAIL_RETURN } @@ -513,7 +513,7 @@ bool CUIPerTradeDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { FAIL_RETURN } - // ̸.. npc ˻Ѵ.. + // 내가 가졌던 아이콘이면.. npc영역인지 검사한다.. int i, iDestiOrder = -1; bool bFound = false; @@ -544,8 +544,8 @@ bool CUIPerTradeDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { bFound = false; if ((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) { - // Ȱ̳ .. - // Կ ش ִ ˾ƺ.. + // 활이나 물약등 아이템인 경우.. + // 면저 슬롯에 해당 아이콘이 있는지 알아본다.. for (i = 0; i < MAX_ITEM_PER_TRADE; i++) { if (bFound) { break; @@ -560,9 +560,9 @@ bool CUIPerTradeDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } } - // ã.. + // 못찾았으면.. if (!bFound) { - // 󽽷 ã .. + // 빈슬롯을 찾아 들어간다.. for (i = 0; i < MAX_ITEM_PER_TRADE; i++) { if (!m_pPerTradeMy[i]) { bFound = true; @@ -571,7 +571,7 @@ bool CUIPerTradeDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } } - if (!bFound) // ã .. + if (!bFound) // 빈 슬롯을 찾지 못했으면.. { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; @@ -582,20 +582,20 @@ bool CUIPerTradeDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = iDestiOrder; - // ִ 캸.. + // 아이콘이 있는지 없는지 살펴보고.. if (!m_pPerTradeMy[iDestiOrder]) { __IconItemSkill * spItemNew = NULL; spItem = CN3UIWndBase::m_sSelectedIconInfo.pItemSelect; - // 0.. + // 아이콘이 없으면 아이콘을 만드록 갯수는 0으로.. spItemNew = new __IconItemSkill; spItemNew->pItemBasic = spItem->pItemBasic; spItemNew->pItemExt = spItem->pItemExt; - spItemNew->szIconFN = spItem->szIconFN; // ̸ .. + spItemNew->szIconFN = spItem->szIconFN; // 아이콘 파일 이름 복사.. spItemNew->iCount = 0; spItemNew->iDurability = spItem->iDurability; - // ҽ .. + // 아이콘 리소스 만들기.. spItemNew->pUIIcon = new CN3UIIcon; float fUVAspect = (float)45.0f / (float)64.0f; spItemNew->pUIIcon->Init(this); @@ -609,7 +609,7 @@ bool CUIPerTradeDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { GetChildAreaByiOrder(UI_AREA_TYPE_PER_TRADE_MY, CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder); if (pArea) { spItemNew->pUIIcon->SetRegion(pArea->GetRegion()); - // .. + // 움직일 수 없다.. RECT rect = {0, 0, 0, 0}; spItemNew->pUIIcon->SetMoveRect(rect); } @@ -619,12 +619,12 @@ bool CUIPerTradeDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { m_iBackupiOrder[i] = CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.iOrder; - // Ȱ̳ .. + // 활이나 물약등 아이템인 경우.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_pCountableItemEdit->Open(UIWND_PER_TRADE, UIWND_DISTRICT_PER_TRADE_MY, false); FAIL_RETURN } else { - //  ִ Ȯ, ڸ .. + // 아이템이 들어갈 수 있는지 확인, 아이템이 들어 가는 자리 계산.. for (i = 0; i < MAX_ITEM_PER_TRADE; i++) { if (m_pPerTradeMy[i] == NULL) { bFound = true; @@ -634,13 +634,13 @@ bool CUIPerTradeDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { if (!bFound) { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; - FAIL_RETURN // ãǷ.. .. + FAIL_RETURN // 못 찾았으므로.. 실패.. } CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = i; m_iBackupiOrder[i] = CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.iOrder; - // Server .. 1..^^ + // Server에게 보낸다.. 현재 아이템 갯수는 1..^^ SendToServerItemAddMsg(m_iBackupiOrder[i], CN3UIWndBase::m_sSelectedIconInfo.pItemSelect->pItemBasic->dwID + CN3UIWndBase::m_sSelectedIconInfo.pItemSelect->pItemExt->dwID, @@ -648,9 +648,9 @@ bool CUIPerTradeDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = NULL; } - // ŷ ϰ.. + // 내 거래 영역에 세팅하고.. m_pPerTradeMy[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] = spItem; - // 쿡 Ŭ.. + // 영역 윈도우에서 클리어.. m_pPerTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = NULL; pArea = GetChildAreaByiOrder(UI_AREA_TYPE_PER_TRADE_MY, CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder); @@ -705,7 +705,7 @@ DWORD CUIPerTradeDlg::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT return dwRet; } - // 巡 Ǵ .. + // 드래그 되는 아이콘 갱신.. if ((GetState() == UI_STATE_ICON_MOVING) && (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd == UIWND_PER_TRADE)) { CN3UIWndBase::m_sSelectedIconInfo.pItemSelect->pUIIcon->SetRegion(GetSampleRect()); @@ -761,18 +761,18 @@ bool CUIPerTradeDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if ((dwMsg == UIMSG_BUTTON_CLICK) && (pSender->m_szID == "btn_close") && (m_pSubProcPerTrade != NULL) && ((m_pSubProcPerTrade->m_ePerTradeState == PER_TRADE_STATE_NORMAL) || (m_pSubProcPerTrade->m_ePerTradeState == PER_TRADE_STATE_MY_TRADE_DECISION_DONE))) { - // ¿ ŷ ư ¿ ִ.. + // 정상 상태와 내가 거래 결정 버튼을 누른 상태에서만 취소할 수 있다.. m_pSubProcPerTrade->LeavePerTradeState(PER_TRADE_RESULT_MY_CANCEL); } if ((dwMsg == UIMSG_BUTTON_CLICK) && (pSender->m_szID == "btn_trade_my") && (m_pSubProcPerTrade != NULL) && - (m_pSubProcPerTrade->m_ePerTradeState == PER_TRADE_STATE_NORMAL)) { // ¿ ִ.. + (m_pSubProcPerTrade->m_ePerTradeState == PER_TRADE_STATE_NORMAL)) { // 정상 상태에서만 결정할 수 있다.. m_pSubProcPerTrade->PerTradeMyDecision(); } if (dwMsg == UIMSG_BUTTON_CLICK) { if (pSender->m_szID == "btn_gold") { - // κ丮 .. + // 인벤토리만 떠 있을때.. CGameProcedure::s_pProcMain->m_pSubProcPerTrade->RequestItemCountEdit(); } } @@ -817,9 +817,9 @@ bool CUIPerTradeDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { break; case UIMSG_ICON_UP: - // Ŵ ٴϸ鼭 ˻.. + // 아이콘 매니저 윈도우들을 돌아 다니면서 검사.. if (!CGameProcedure::s_pUIMgr->BroadcastIconDropMsg(CN3UIWndBase::m_sSelectedIconInfo.pItemSelect)) { - // ġ .. + // 아이콘 위치 원래대로.. IconRestore(); } // Sound.. diff --git a/src/game/UIPerTradeDlg.h b/src/game/UIPerTradeDlg.h index c28b8c74..9e45497a 100644 --- a/src/game/UIPerTradeDlg.h +++ b/src/game/UIPerTradeDlg.h @@ -21,7 +21,7 @@ class CUIPerTradeDlg : public CN3UIWndBase { public: CSubProcPerTrade * m_pSubProcPerTrade; - // ؾ ü + // 직접 접근해야 할 객체 참조 포인터 __IconItemSkill * m_pPerTradeMy[MAX_ITEM_PER_TRADE]; __IconItemSkill * m_pPerTradeOther[MAX_ITEM_PER_TRADE]; __IconItemSkill * m_pPerTradeInv[MAX_ITEM_INVENTORY]; @@ -29,7 +29,7 @@ class CUIPerTradeDlg : public CN3UIWndBase { int m_iBackupiOrder[MAX_ITEM_PER_TRADE]; CUIImageTooltipDlg * m_pUITooltipDlg; - int m_iBackupiCount; // ű ȭ .. + int m_iBackupiCount; // 전에 옮긴 화살등의 갯수.. CN3UIString * m_pStrMyGold; diff --git a/src/game/UIQuestMenu.cpp b/src/game/UIQuestMenu.cpp index 3f71cf1a..e60eaca1 100644 --- a/src/game/UIQuestMenu.cpp +++ b/src/game/UIQuestMenu.cpp @@ -83,7 +83,7 @@ bool CUIQuestMenu::Load(HANDLE hFile) { void CUIQuestMenu::Render() { if (!m_bVisible) { - return; // ڽĵ render ʴ´. + return; // 보이지 않으면 자식들을 render하지 않는다. } for (UIListReverseItor itor = m_ReSizeChildren.rbegin(); m_ReSizeChildren.rend() != itor; ++itor) { @@ -105,7 +105,7 @@ DWORD CUIQuestMenu::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & return dwRet; } - // UI ̴ ڵ + // UI 움직이는 코드 if (UI_STATE_COMMON_MOVE == m_eState) { if (dwFlags & UI_MOUSE_LBCLICKED) { SetState(UI_STATE_COMMON_NONE); @@ -116,25 +116,25 @@ DWORD CUIQuestMenu::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & return dwRet; } - if (false == IsIn(ptCur.x, ptCur.y)) // ̸ + if (false == IsIn(ptCur.x, ptCur.y)) // 영역 밖이면 { if (false == IsIn(ptOld.x, ptOld.y)) { - return dwRet; // ǥ ̸ + return dwRet; // 이전 좌표도 영역 밖이면 } - dwRet |= UI_MOUSEPROC_PREVINREGION; // ǥ ̾. + dwRet |= UI_MOUSEPROC_PREVINREGION; // 이전 좌표는 영역 안이었다. } else { - // tool tip + // tool tip 관련 if (s_pTooltipCtrl) { s_pTooltipCtrl->SetText(m_szToolTip); } } - dwRet |= UI_MOUSEPROC_INREGION; // ̹ ǥ ̴. + dwRet |= UI_MOUSEPROC_INREGION; // 이번 좌표는 영역 안이다. if (m_pChildUI && m_pChildUI->IsVisible()) { return dwRet; } - // child ޼ + // child에게 메세지 전달 for (UIListItor itor = m_ReSizeChildren.begin(); m_ReSizeChildren.end() != itor; ++itor) { CN3UIBase * pChild = (*itor); DWORD dwChildRet = 0; @@ -150,17 +150,17 @@ DWORD CUIQuestMenu::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & } } - if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // ̰쿡 հ Ŀ ̴. - // (Ʒ ڵ dialog ϴ ؾ Ѵ. Ƴ) - // m_Children.erase(itor); // 켱 Ʈ - // m_Children.push_front(pChild); // Ǿտ ִ´. ׸ ߿ ׸ Ϸ + if (UI_MOUSEPROC_DONESOMETHING & dwChildRet) { // 이경우에는 먼가 포커스를 받은 경우이다. + // (아래 코드는 dialog를 관리하는 곳에서 해야 한다. 따라서 막아놓음) + // m_Children.erase(itor); // 우선 리스트에서 지우고 + // m_Children.push_front(pChild); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하려고 dwRet |= (UI_MOUSEPROC_CHILDDONESOMETHING | UI_MOUSEPROC_DONESOMETHING); return dwRet; } } - // UI ̴ ڵ + // UI 움직이는 코드 if (UI_STATE_COMMON_MOVE != m_eState && PtInRect(&m_rcMovable, ptCur) && (dwFlags & UI_MOUSE_LBCLICK)) { SetState(UI_STATE_COMMON_MOVE); dwRet |= UI_MOUSEPROC_DONESOMETHING; @@ -204,13 +204,13 @@ BOOL CUIQuestMenu::MoveOffset(int iOffsetX, int iOffsetY) { m_rcCImage.right += iOffsetX; m_rcCImage.bottom += iOffsetY; - // ui + // ui 영역 m_rcRegion.left += iOffsetX; m_rcRegion.top += iOffsetY; m_rcRegion.right += iOffsetX; m_rcRegion.bottom += iOffsetY; - // movable + // movable 영역 if (m_rcMovable.right - m_rcMovable.left != 0 && m_rcMovable.bottom - m_rcMovable.top != 0) { m_rcMovable.left += iOffsetX; m_rcMovable.top += iOffsetY; @@ -218,7 +218,7 @@ BOOL CUIQuestMenu::MoveOffset(int iOffsetX, int iOffsetY) { m_rcMovable.bottom += iOffsetY; } - // children ǥ + // children 좌표 갱신 CN3UIBase * pCUI = NULL; // Child UI... for (UIListItor itor = m_ReSizeChildren.begin(); m_ReSizeChildren.end() != itor; ++itor) { pCUI = (*itor); @@ -309,7 +309,7 @@ void CUIQuestMenu::Open(DataPack * pDataPack, int & iOffset) { m_pTextMenu[0]->SetString(szMenu[0]); } - //string + //string 생성 for (int i = 1; i < m_iMenuCnt; i++) { m_pTextMenu[i] = new CN3UIString; __ASSERT(m_pTextMenu[i], "NULL UI Component!!!"); @@ -360,7 +360,7 @@ void CUIQuestMenu::Open(DataPack * pDataPack, int & iOffset) { rcTemp.bottom = rcTemp.top + iIH; m_pImageBCenter->SetRegion(rcTemp); - //̰ ⺻ ٽ ... + //이건 기본 유아이의 영역을 다시 설정해줌... const int iWidth = CN3Base::s_CameraData.vp.Width; const int iHeight = CN3Base::s_CameraData.vp.Height; int iX = 0, iY = 0; diff --git a/src/game/UIRepairTooltipDlg.cpp b/src/game/UIRepairTooltipDlg.cpp index 3f728274..79b1a174 100644 --- a/src/game/UIRepairTooltipDlg.cpp +++ b/src/game/UIRepairTooltipDlg.cpp @@ -34,16 +34,16 @@ void CUIRepairTooltipDlg::Release() { } void CUIRepairTooltipDlg::InitPos() { - m_pStr[0] = (CN3UIString *)GetChildByID("string_repairgold"); //̸ + m_pStr[0] = (CN3UIString *)GetChildByID("string_repairgold"); //이름 __ASSERT(m_pStr[0], "NULL UI Component!!"); m_pStr[0]->SetString("0"); - m_pStr[1] = (CN3UIString *)GetChildByID("string_dur_max"); //̸ + m_pStr[1] = (CN3UIString *)GetChildByID("string_dur_max"); //이름 __ASSERT(m_pStr[1], "NULL UI Component!!"); m_pStr[1]->SetString("0"); - m_pStr[2] = (CN3UIString *)GetChildByID("string_dur_current"); //̸ + m_pStr[2] = (CN3UIString *)GetChildByID("string_dur_current"); //이름 __ASSERT(m_pStr[2], "NULL UI Component!!"); m_pStr[2]->SetString("0"); - m_pStr[3] = (CN3UIString *)GetChildByID("string_title"); //̸ + m_pStr[3] = (CN3UIString *)GetChildByID("string_title"); //이름 __ASSERT(m_pStr[3], "NULL UI Component!!"); m_pStr[3]->SetString("0"); BackupStrColor(); diff --git a/src/game/UIRepairTooltipDlg.h b/src/game/UIRepairTooltipDlg.h index cfc9c6f6..a9d7279f 100644 --- a/src/game/UIRepairTooltipDlg.h +++ b/src/game/UIRepairTooltipDlg.h @@ -15,8 +15,8 @@ ////////////////////////////////////////////////////////////////////// class CUIRepairTooltipDlg : public CN3UIBase { - CN3UIString * m_pStr[MAX_REPAIR_TOOLTIP_COUNT]; // Ʈ.. ^^ - D3DCOLOR m_pStrColor[MAX_REPAIR_TOOLTIP_COUNT]; // Ʈ .. ^^ + CN3UIString * m_pStr[MAX_REPAIR_TOOLTIP_COUNT]; // 스트륑.. ^^ + D3DCOLOR m_pStrColor[MAX_REPAIR_TOOLTIP_COUNT]; // 스트륑 색깔.. ^^ int m_iPosXBack, m_iPosYBack; __IconItemSkill * m_spItemBack; diff --git a/src/game/UISkillTreeDlg.cpp b/src/game/UISkillTreeDlg.cpp index 63c5fab7..05d078d7 100644 --- a/src/game/UISkillTreeDlg.cpp +++ b/src/game/UISkillTreeDlg.cpp @@ -29,9 +29,9 @@ ////////////////////////////////////////////////////////////////////// CUISkillTreeDlg::CUISkillTreeDlg() { - m_bOpenningNow = false; // ִ.. - m_bClosingNow = false; // ִ.. - m_fMoveDelta = 0.0f; // ε巴 ؼ ġ 꿡 εҼ .. + m_bOpenningNow = false; // 열리고 있다.. + m_bClosingNow = false; // 닫히고 있다.. + m_fMoveDelta = 0.0f; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. m_iRBtnDownOffs = -1; m_iCurKindOf = 0; @@ -75,9 +75,9 @@ CUISkillTreeDlg::~CUISkillTreeDlg() { void CUISkillTreeDlg::Release() { CN3UIBase::Release(); - m_bOpenningNow = false; // ִ.. - m_bClosingNow = false; // ִ.. - m_fMoveDelta = 0.0f; // ε巴 ؼ ġ 꿡 εҼ .. + m_bOpenningNow = false; // 열리고 있다.. + m_bClosingNow = false; // 닫히고 있다.. + m_fMoveDelta = 0.0f; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. for (int i = 0; i < MAX_SKILL_KIND_OF; i++) { for (int j = 0; j < MAX_SKILL_PAGE_NUM; j++) { @@ -131,7 +131,7 @@ void CUISkillTreeDlg::UpdateDisableCheck() { } void CUISkillTreeDlg::Tick() { - if (m_bOpenningNow) // ʿ ... Ѵٸ.. + if (m_bOpenningNow) // 오른쪽에서 왼쪽으로 스르륵...열려야 한다면.. { POINT ptCur = this->GetPos(); RECT rc = this->GetRegion(); @@ -146,14 +146,14 @@ void CUISkillTreeDlg::Tick() { int iXLimit = CN3Base::s_CameraData.vp.Width - (int)fWidth; ptCur.x = CN3Base::s_CameraData.vp.Width - (int)m_fMoveDelta; - if (ptCur.x <= iXLimit) // ٿȴ!! + if (ptCur.x <= iXLimit) // 다열렸다!! { ptCur.x = iXLimit; m_bOpenningNow = false; } this->SetPos(ptCur.x, ptCur.y); - } else if (m_bClosingNow) // ʿ ... Ѵٸ.. + } else if (m_bClosingNow) // 오른쪽에서 왼쪽으로 스르륵...열려야 한다면.. { POINT ptCur = this->GetPos(); RECT rc = this->GetRegion(); @@ -168,12 +168,12 @@ void CUISkillTreeDlg::Tick() { int iXLimit = CN3Base::s_CameraData.vp.Width; ptCur.x = CN3Base::s_CameraData.vp.Width - (int)(fWidth - m_fMoveDelta); - if (ptCur.x >= iXLimit) // ..!! + if (ptCur.x >= iXLimit) // 다 닫혔다..!! { ptCur.x = iXLimit; m_bClosingNow = false; - this->SetVisibleWithNoSound(false, false, true); // Ⱥ̰ Ѵ. + this->SetVisibleWithNoSound(false, false, true); // 다 닫혔으니 눈에서 안보이게 한다. } this->SetPos(ptCur.x, ptCur.y); @@ -188,13 +188,13 @@ DWORD CUISkillTreeDlg::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT dwRet |= CN3UIBase::MouseProc(dwFlags, ptCur, ptOld); return dwRet; } - // ʴ´.. + // 실제로 쓰진 않는다.. if (CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer) { dwRet |= CN3UIBase::MouseProc(dwFlags, ptCur, ptOld); return dwRet; } - // 巡 Ǵ .. + // 드래그 되는 아이콘 갱신.. if (GetState() == UI_STATE_ICON_MOVING) { if (CN3UIWndBase::m_sSkillSelectInfo.pSkillDoneInfo) { CN3UIWndBase::m_sSkillSelectInfo.pSkillDoneInfo->pUIIcon->SetRegion(GetSampleRect()); @@ -314,7 +314,7 @@ bool CUISkillTreeDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { case UIMSG_ICON_RUP: { int iRBtn = GetIndexInArea(ptCur); if (iRBtn != -1 && m_iRBtnDownOffs != -1 && m_iRBtnDownOffs == iRBtn) { - //  ڸ ִ ˻.. + // 들어갈 자리가 있는지 검사.. CUIHotKeyDlg * pDlg = CGameProcedure::s_pProcMain->m_pUIHotKeyDlg; int iIndex; if (pDlg->GetEmptySlotIndex(iIndex)) { @@ -325,7 +325,7 @@ bool CUISkillTreeDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { spSkillCopy->pSkill = spSkill->pSkill; spSkillCopy->szIconFN = spSkill->szIconFN; - // εϱ.. ^^ + // 아이콘 로드하기.. ^^ spSkillCopy->pUIIcon = new CN3UIIcon; spSkillCopy->pUIIcon->Init(this); spSkillCopy->pUIIcon->SetTex(spSkill->szIconFN); @@ -354,12 +354,12 @@ bool CUISkillTreeDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { // Get Item.. spSkill = GetHighlightIconItem((CN3UIIcon *)pSender); - // 纻 .. + // 복사본을 만든다.. spSkillCopy = new __IconItemSkill(); spSkillCopy->pSkill = spSkill->pSkill; spSkillCopy->szIconFN = spSkill->szIconFN; - // εϱ.. ^^ + // 아이콘 로드하기.. ^^ spSkillCopy->pUIIcon = new CN3UIIcon; spSkillCopy->pUIIcon->Init(this); spSkillCopy->pUIIcon->SetTex(spSkill->szIconFN); @@ -390,18 +390,18 @@ bool CUISkillTreeDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { break; case UIMSG_ICON_UP: - // Hot Key 츦 ٴϸ鼭 ˻.. + // Hot Key 윈도우를 돌아 다니면서 검사.. { CUIHotKeyDlg * pDlg = CGameProcedure::s_pProcMain->m_pUIHotKeyDlg; if (!IsIn(ptCur.x, ptCur.y) && pDlg->IsIn(ptCur.x, ptCur.y)) { if (!pDlg->IsSelectedSkillInRealIconArea()) { - // ҽ Free.. + // 리소스 Free.. spSkill = CN3UIWndBase::m_sSkillSelectInfo.pSkillDoneInfo; if (spSkill) { - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spSkill->pUIIcon); - // ҽ .. + // 리소스 제거.. spSkill->pUIIcon->Release(); delete spSkill->pUIIcon; spSkill->pUIIcon = NULL; @@ -410,13 +410,13 @@ bool CUISkillTreeDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } } } else { - // ҽ Free.. + // 리소스 Free.. spSkill = CN3UIWndBase::m_sSkillSelectInfo.pSkillDoneInfo; if (spSkill) { - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spSkill->pUIIcon); - // ҽ .. + // 리소스 제거.. spSkill->pUIIcon->Release(); delete spSkill->pUIIcon; spSkill->pUIIcon = NULL; @@ -460,7 +460,7 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { iCurKindOfBackup = m_iCurKindOf; iCurSkillPageBackup = m_iCurSkillPage; - int iSkillExtra; // ųâ .. + int iSkillExtra; // 스킬창의 값.. int iSkillPoint; std::string str; CN3UIString *pStrName = NULL, *pStrName2 = NULL; @@ -484,14 +484,14 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { return; } - // ¸.. ų ø .. + // 전직하지 않은 상태면.. 전문스킬은 올릴수 없다.. switch (iValue) { case 5: case 6: case 7: case 8: { switch (CGameBase::s_pPlayer->m_InfoBase.eNation) { - case NATION_KARUS: // ī罺.. + case NATION_KARUS: // 카루스.. switch (CGameBase::s_pPlayer->m_InfoBase.eClass) { case CLASS_KA_WARRIOR: case CLASS_KA_ROGUE: @@ -505,7 +505,7 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { } break; - case NATION_ELMORAD: // .. + case NATION_ELMORAD: // 엘모라도.. switch (CGameBase::s_pPlayer->m_InfoBase.eClass) { case CLASS_EL_WARRIOR: case CLASS_EL_ROGUE: @@ -524,7 +524,7 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { if (iValue == 8) { switch (CGameBase::s_pPlayer->m_InfoBase.eNation) { - case NATION_KARUS: // ī罺.. + case NATION_KARUS: // 카루스.. switch (CGameBase::s_pPlayer->m_InfoBase.eClass) { case CLASS_KA_SORCERER: case CLASS_KA_HUNTER: @@ -537,7 +537,7 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { } break; - case NATION_ELMORAD: // .. + case NATION_ELMORAD: // 엘모라도.. switch (CGameBase::s_pPlayer->m_InfoBase.eClass) { case CLASS_EL_MAGE: case CLASS_EL_RANGER: @@ -554,7 +554,7 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { if (iValue == 7) { switch (CGameBase::s_pPlayer->m_InfoBase.eNation) { - case NATION_KARUS: // ī罺.. + case NATION_KARUS: // 카루스.. switch (CGameBase::s_pPlayer->m_InfoBase.eClass) { case CLASS_KA_BERSERKER: { std::string szMsg; @@ -565,7 +565,7 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { } break; - case NATION_ELMORAD: // .. + case NATION_ELMORAD: // 엘모라도.. switch (CGameBase::s_pPlayer->m_InfoBase.eClass) { case CLASS_EL_BLADE: { std::string szMsg; @@ -580,7 +580,7 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { if (iValue == 6) { switch (CGameBase::s_pPlayer->m_InfoBase.eNation) { - case NATION_KARUS: // ī罺.. + case NATION_KARUS: // 카루스.. switch (CGameBase::s_pPlayer->m_InfoBase.eClass) { case CLASS_KA_HUNTER: { std::string szMsg; @@ -591,7 +591,7 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { } break; - case NATION_ELMORAD: // .. + case NATION_ELMORAD: // 엘모라도.. switch (CGameBase::s_pPlayer->m_InfoBase.eClass) { case CLASS_EL_RANGER: { std::string szMsg; @@ -649,7 +649,7 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { str = pStrName2->GetString(); iSkillPoint = atoi(str.c_str()); - // ڱ ڽ ϼ .. + // 자기 자신 레벨보다 높일수 없다.. if (iSkillPoint >= CGameBase::s_pPlayer->m_InfoBase.iLevel) { std::string szMsg; ::_LoadStringFromResource(IDS_SKILL_UP_INVALID, szMsg); @@ -657,14 +657,14 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { return; } - // .. Ʈ.. + // 써버에게 보내고.. 숫자 업데이트.. BYTE byBuff[4]; int iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, N3_SKILL_CHANGE); CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)iValue); CGameProcedure::s_pSocket->Send(byBuff, iOffset); - // ų Ʈ Ʈ.. + // 스킬 포인트 업데이트.. iSkillExtra--; pStrName->SetStringAsInt(iSkillExtra); m_iSkillInfo[0] = iSkillExtra; @@ -700,7 +700,7 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { break; } - switch (iValue) // ų Ʈ.. + switch (iValue) // 스킬 아이콘 업데이트.. { case 5: case 6: @@ -715,7 +715,7 @@ void CUISkillTreeDlg::PointPushUpButton(int iValue) { void CUISkillTreeDlg::Render() { if (!m_bVisible) { - return; // ڽĵ render ʴ´. + return; // 보이지 않으면 자식들을 render하지 않는다. } __IconItemSkill * spSkill = NULL; @@ -1063,17 +1063,17 @@ void CUISkillTreeDlg::InitIconWnd(e_UIWND eWnd) { void CUISkillTreeDlg::InitIconUpdate() { __TABLE_UPC_SKILL * pUSkill = NULL; - // Ŭ.. + // 기존 아이콘 모두 클리어.. for (int i = 0; i < MAX_SKILL_KIND_OF; i++) { for (int j = 0; j < MAX_SKILL_PAGE_NUM; j++) { for (int k = 0; k < MAX_SKILL_IN_PAGE; k++) { if (m_pMySkillTree[i][j][k] != NULL) { __IconItemSkill * spSkill = m_pMySkillTree[i][j][k]; - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spSkill->pUIIcon); - // ҽ .. + // 리소스 제거.. spSkill->pUIIcon->Release(); delete spSkill->pUIIcon; spSkill->pUIIcon = NULL; @@ -1085,7 +1085,7 @@ void CUISkillTreeDlg::InitIconUpdate() { } } - // ̵ = ڵ*1000 + 001.. ( ڵ+1)*100 + 001.. + // 아이디 = 직업 코드*1000 + 001부터.. (직업 코드+1)*100 + 001까지.. int iSkillIDFirst, iSkillIndexFirst, iSkillIndexLast, iModulo; iSkillIDFirst = CGameBase::s_pPlayer->m_InfoBase.eClass * 1000 + 1; iSkillIndexFirst = CGameBase::s_pTbl_Skill->IDToIndex(iSkillIDFirst); @@ -1093,7 +1093,7 @@ void CUISkillTreeDlg::InitIconUpdate() { if (iSkillIndexFirst == -1) { PageButtonInitialize(); - return; // ù° ų .. ȵȴ.. + return; // 첫번째 스킬이 없으면.. 안된다.. } if (CGameBase::s_pPlayer->m_InfoBase.eClass != CLASS_EL_DRUID) { @@ -1116,34 +1116,34 @@ void CUISkillTreeDlg::InitIconUpdate() { continue; } - // Ǵ ȮѴ.. + // 조건이 충족 되는지 확인한다.. iModulo = pUSkill->iNeedSkill % 10; switch (iModulo) { - case 0: // Base Skill.. ǴѴ.. - if (pUSkill->iNeedLevel <= CGameBase::s_pPlayer->m_InfoBase.iLevel) { // ų .. + case 0: // Base Skill.. 레벨 점보만으로 판단한다.. + if (pUSkill->iNeedLevel <= CGameBase::s_pPlayer->m_InfoBase.iLevel) { // 내 레벨보다 같거나 작으면.. AddSkillToPage(pUSkill); } break; - case 5: // Skill.. ٸ.. + case 5: // 전문 Skill.. 직업마다 다르다.. if (pUSkill->iNeedLevel <= m_iSkillInfo[5]) { AddSkillToPage(pUSkill, 1); } break; - case 6: // Skill.. ٸ.. + case 6: // 전문 Skill.. 직업마다 다르다.. if (pUSkill->iNeedLevel <= m_iSkillInfo[6]) { AddSkillToPage(pUSkill, 2); } break; - case 7: // Skill.. ٸ.. + case 7: // 전문 Skill.. 직업마다 다르다.. if (pUSkill->iNeedLevel <= m_iSkillInfo[7]) { AddSkillToPage(pUSkill, 3); } break; - case 8: // Skill.. ٸ.. + case 8: // 전문 Skill.. 직업마다 다르다.. if (pUSkill->iNeedLevel <= m_iSkillInfo[8]) { AddSkillToPage(pUSkill, 4); } @@ -1158,7 +1158,7 @@ void CUISkillTreeDlg::PageButtonInitialize() { SetPageInIconRegion(0, 0); SetPageInCharRegion(); - // .. m_iSkillInfo[MAX_SKILL_FROM_SERVER]; // ޴ .. + // 서버에게 받은 값으로 세팅.. m_iSkillInfo[MAX_SKILL_FROM_SERVER]; // 서버로 받는 슬롯 정보.. CN3UIString * pStrName = (CN3UIString *)GetChildByID("string_skillpoint"); __ASSERT(pStrName, "NULL UI Component!!"); pStrName->SetStringAsInt(m_iSkillInfo[0]); @@ -1417,7 +1417,7 @@ void CUISkillTreeDlg::AddSkillToPage(__TABLE_UPC_SKILL * pUSkill, int iOffset) { int i, j; bool bFound = false; - // m_pMySkillTree[iOffset] ̵ ִ 캻.. + // m_pMySkillTree[iOffset]에 같은 아이디가 있는지 살펴본다.. for (i = 0; i < MAX_SKILL_PAGE_NUM; i++) { for (j = 0; j < MAX_SKILL_IN_PAGE; j++) { if (m_pMySkillTree[iOffset][i][j] != NULL) { @@ -1428,7 +1428,7 @@ void CUISkillTreeDlg::AddSkillToPage(__TABLE_UPC_SKILL * pUSkill, int iOffset) { } } - // m_pMySkillTree[iOffset]  ִ 캻.. + // m_pMySkillTree[iOffset]에 들어갈 수 있는지 살펴본다.. for (i = 0; i < MAX_SKILL_PAGE_NUM; i++) { for (j = 0; j < MAX_SKILL_IN_PAGE; j++) { if (m_pMySkillTree[iOffset][i][j] == NULL) { @@ -1446,10 +1446,10 @@ void CUISkillTreeDlg::AddSkillToPage(__TABLE_UPC_SKILL * pUSkill, int iOffset) { __IconItemSkill * spSkill = new __IconItemSkill(); spSkill->pSkill = pUSkill; - // ̸ .. ^^ + // 아이콘 이름 만들기.. ^^ spSkill->szIconFN = std::format("UI\\skillicon_{:02d}_{:d}.dxt", pUSkill->dwID % 100, pUSkill->dwID / 100); - // εϱ.. ^^ + // 아이콘 로드하기.. ^^ spSkill->pUIIcon = new CN3UIIcon; spSkill->pUIIcon->Init(this); spSkill->pUIIcon->SetTex(spSkill->szIconFN); @@ -1464,12 +1464,12 @@ void CUISkillTreeDlg::AddSkillToPage(__TABLE_UPC_SKILL * pUSkill, int iOffset) { spSkill->pUIIcon->SetMoveRect(pArea->GetRegion()); } - // .. + // 아이콘 정보 저장.. m_pMySkillTree[iOffset][i][j] = spSkill; } void CUISkillTreeDlg::Open() { - // !! + // 스르륵 열린다!! SetVisible(true); this->SetPos(CN3Base::s_CameraData.vp.Width, 10); m_fMoveDelta = 0; @@ -1480,14 +1480,14 @@ void CUISkillTreeDlg::Open() { } void CUISkillTreeDlg::Close() { - // ҽ Free.. + // 리소스 Free.. __IconItemSkill * spSkill = NULL; spSkill = CN3UIWndBase::m_sSkillSelectInfo.pSkillDoneInfo; if (spSkill) { - // Ŵ .. + // 매니저에서 제거.. RemoveChild(spSkill->pUIIcon); - // ҽ .. + // 리소스 제거.. spSkill->pUIIcon->Release(); delete spSkill->pUIIcon; spSkill->pUIIcon = NULL; @@ -1498,8 +1498,8 @@ void CUISkillTreeDlg::Close() { SetState(UI_STATE_COMMON_NONE); CN3UIWndBase::AllHighLightIconFree(); - // ..!! - // SetVisible(false); // ش.. + // 스르륵 닫힌다..!! + // SetVisible(false); // 다 닫히고 나서 해준다.. RECT rc = this->GetRegion(); this->SetPos(CN3Base::s_CameraData.vp.Width - (rc.right - rc.left), 10); m_fMoveDelta = 0; @@ -1507,7 +1507,7 @@ void CUISkillTreeDlg::Close() { m_bClosingNow = true; if (m_pSnd_CloseUI) { - m_pSnd_CloseUI->Play(); // ݴ Ҹ.. + m_pSnd_CloseUI->Play(); // 닫는 소리.. } m_iRBtnDownOffs = -1; @@ -1551,7 +1551,7 @@ RECT CUISkillTreeDlg::GetSampleRect() { return rect; } -void CUISkillTreeDlg::SetPageInIconRegion(int iKindOf, int iPageNum) // .. +void CUISkillTreeDlg::SetPageInIconRegion(int iKindOf, int iPageNum) // 아이콘 역역에서 현재 페이지 설정.. { if ((iKindOf >= MAX_SKILL_KIND_OF) || (iPageNum >= MAX_SKILL_PAGE_NUM)) { return; @@ -1588,7 +1588,7 @@ RECT CUISkillTreeDlg::GetSampleRect() { } } - // ڿ Ʈ.. ų ų ̸ String̰.. ƴϸ Ⱥ̰.. + // 아이콘 설명 문자열 업데이트.. 현재 스킬 종류와 현재 스킬 페이지중 아이콘이 보이면 String보이게.. 아니면 안보이게.. CN3UIString * pStrName = NULL; for (int k = 0; k < MAX_SKILL_IN_PAGE; k++) { if (m_pMySkillTree[m_iCurKindOf][m_iCurSkillPage][k] != NULL) { @@ -1636,18 +1636,18 @@ void CUISkillTreeDlg::AllClearImageByName(const std::string & szFN, bool bTrueOr } } -void CUISkillTreeDlg::SetPageInCharRegion() // .. +void CUISkillTreeDlg::SetPageInCharRegion() // 문자 역역에서 현재 페이지 설정.. { AllClearImageByName("public", false); switch (CGameBase::s_pPlayer->m_InfoBase.eNation) { - case NATION_KARUS: // ī罺.. + case NATION_KARUS: // 카루스.. AllClearImageByName("hunter", false); AllClearImageByName("berserker", false); AllClearImageByName("sorcerer", false); AllClearImageByName("shaman", false); - // .. + // 직업.. switch (CGameBase::s_pPlayer->m_InfoBase.eClass) { case CLASS_KA_WARRIOR: case CLASS_KA_ROGUE: @@ -1674,13 +1674,13 @@ void CUISkillTreeDlg::AllClearImageByName(const std::string & szFN, bool bTrueOr } break; - case NATION_ELMORAD: // .. + case NATION_ELMORAD: // 엘모라도.. AllClearImageByName("ranger", false); AllClearImageByName("blade", false); AllClearImageByName("mage", false); AllClearImageByName("cleric", false); - // .. + // 직업.. switch (CGameBase::s_pPlayer->m_InfoBase.eClass) { case CLASS_EL_WARRIOR: case CLASS_EL_ROGUE: diff --git a/src/game/UISkillTreeDlg.h b/src/game/UISkillTreeDlg.h index cc36f944..ef43ca3c 100644 --- a/src/game/UISkillTreeDlg.h +++ b/src/game/UISkillTreeDlg.h @@ -17,17 +17,17 @@ const int SKILL_DEF_SPECIAL1 = 2; const int SKILL_DEF_SPECIAL2 = 3; const int SKILL_DEF_SPECIAL3 = 4; -// MAX_SKILL_KIND_OF : Base Skill 1, ų 4.. -// MAX_SKILL_IN_PAGE : .. -// MAX_SKILL_PAGE_NUM : ų Ѱ ִ .. +// MAX_SKILL_KIND_OF : Base Skill 1개, 전문 스킬 4개.. +// MAX_SKILL_IN_PAGE : 한 페이지 내의 아이콘 갯수.. +// MAX_SKILL_PAGE_NUM : 스킬 한개가 가지는 최대 페이지수.. ////////////////////////////////////////////////////////////////////// class CUISkillTreeDlg : public CN3UIWndBase { protected: - bool m_bOpenningNow; // ִ.. - bool m_bClosingNow; // ִ.. - float m_fMoveDelta; // ε巴 ؼ ġ 꿡 εҼ .. + bool m_bOpenningNow; // 열리고 있다.. + bool m_bClosingNow; // 닫히고 있다.. + float m_fMoveDelta; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. int m_iRBtnDownOffs; @@ -40,9 +40,9 @@ class CUISkillTreeDlg : public CN3UIWndBase { int m_iCurKindOf; int m_iCurSkillPage; - int m_iSkillInfo[MAX_SKILL_FROM_SERVER]; // ޴ .. - __IconItemSkill * m_pMySkillTree[MAX_SKILL_KIND_OF][MAX_SKILL_PAGE_NUM][MAX_SKILL_IN_PAGE]; // ų .. - int m_iCurInPageOffset[MAX_SKILL_KIND_OF]; // ų ɼ.. + int m_iSkillInfo[MAX_SKILL_FROM_SERVER]; // 서버로 받는 슬롯 정보.. + __IconItemSkill * m_pMySkillTree[MAX_SKILL_KIND_OF][MAX_SKILL_PAGE_NUM][MAX_SKILL_IN_PAGE]; // 총 스킬 정보.. + int m_iCurInPageOffset[MAX_SKILL_KIND_OF]; // 스킬당 현재 페이지 옵셋.. protected: void AllClearImageByName(const std::string & szFN, bool bTrueOrNot); @@ -72,8 +72,8 @@ class CUISkillTreeDlg : public CN3UIWndBase { void AddSkillToPage(__TABLE_UPC_SKILL * pUSkill, int iOffset = 0); - void SetPageInIconRegion(int iKindOf, int iPageNum); // .. - void SetPageInCharRegion(); // .. + void SetPageInIconRegion(int iKindOf, int iPageNum); // 아이콘 역역에서 현재 페이지 설정.. + void SetPageInCharRegion(); // 문자 역역에서 현재 페이지 설정.. CN3UIImage * GetChildImageByName(const std::string & szFN); CN3UIBase * GetChildBaseByName(const std::string & szFN); diff --git a/src/game/UIStateBar.cpp b/src/game/UIStateBar.cpp index e2516610..d979d3ff 100644 --- a/src/game/UIStateBar.cpp +++ b/src/game/UIStateBar.cpp @@ -36,7 +36,7 @@ CUIStateBar::CUIStateBar() { m_pProgress_ExpC = NULL; m_pProgress_ExpP = NULL; - // ̴ϸ... + // 미니맵... m_pGroup_MiniMap = NULL; m_pImage_Map = NULL; m_pBtn_ZoomIn = NULL; @@ -100,7 +100,7 @@ void CUIStateBar::Release() { m_pProgress_ExpC = NULL; m_pProgress_ExpP = NULL; - // ̴ϸ... + // 미니맵... m_pGroup_MiniMap = NULL; m_pImage_Map = NULL; m_pBtn_ZoomIn = NULL; @@ -231,16 +231,16 @@ void CUIStateBar::UpdateExp(int iExp, int iExpNext, bool bUpdateImmediately) { int iPercentage2 = 100 * iExp2 / iExpNext2; if (bUpdateImmediately) { - m_pProgress_ExpC->SetCurValue(iPercentage2); //SetCurValue --> set + m_pProgress_ExpC->SetCurValue(iPercentage2); //SetCurValue --> set경우 } else { m_pProgress_ExpC->SetCurValue(iPercentage2, 0.7f, 50.0f); } } else { - m_pProgress_ExpC->SetCurValue(0); //SetCurValue --> set + m_pProgress_ExpC->SetCurValue(0); //SetCurValue --> set경우 } if (bUpdateImmediately) { - m_pProgress_ExpP->SetCurValue(iPercentage); //SetCurValue --> set + m_pProgress_ExpP->SetCurValue(iPercentage); //SetCurValue --> set경우 } else { m_pProgress_ExpP->SetCurValue(iPercentage, 0.3f, 100.0f); } @@ -262,7 +262,7 @@ void CUIStateBar::UpdateMSP(int iMSP, int iMSPMax, bool bUpdateImmediately) { int iPercentage = 100 * iMSP / iMSPMax; if (bUpdateImmediately) { - m_pProgress_MSP->SetCurValue(iPercentage); //SetCurValue --> set + m_pProgress_MSP->SetCurValue(iPercentage); //SetCurValue --> set경우 } else { m_pProgress_MSP->SetCurValue(iPercentage, 0.3f, 100.0f); } @@ -281,7 +281,7 @@ void CUIStateBar::UpdateHP(int iHP, int iHPMax, bool bUpdateImmediately) { int iPercentage = 100 * iHP / iHPMax; if (bUpdateImmediately) { - m_pProgress_HP->SetCurValue(iPercentage); //SetCurValue --> set + m_pProgress_HP->SetCurValue(iPercentage); //SetCurValue --> set경우 } else { m_pProgress_HP->SetCurValue(iPercentage, 0.3f, 100.0f); } @@ -298,7 +298,7 @@ void CUIStateBar::UpdatePosition(const __Vector3 & vPos, float fYaw) { m_pText_Position->SetString(std::format("{}, {}", (int)vPos.x, (int)vPos.z)); - // ̴ϸ. + // 미니맵. m_vPosPlayer = vPos; m_fYawPlayer = fYaw; } @@ -311,7 +311,7 @@ void CUIStateBar::Render() { CN3UIBase::Render(); if (NULL == m_pGroup_MiniMap || false == m_pGroup_MiniMap->IsVisible()) { - return; // ̴ϸ ư.. + return; // 미니맵이 안켜져 있음 돌아간다.. } if (NULL == m_pImage_Map) { return; @@ -361,7 +361,7 @@ void CUIStateBar::Render() { CN3Base::s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); CN3Base::s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE); - CN3Base::s_lpD3DDev->SetFVF(FVF_TRANSFORMEDCOLOR); // ÷̾ ġ ǥ.. + CN3Base::s_lpD3DDev->SetFVF(FVF_TRANSFORMEDCOLOR); // 플레이어의 위치및 방향 표시.. __Vector3 vPos; it_PositionInfo it = m_Positions.begin(), itEnd = m_Positions.end(); @@ -403,7 +403,7 @@ void CUIStateBar::Render() { CN3Base::s_lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, m_vArrows, sizeof(__VertexTransformedColor)); - it = m_PositionsTop.begin(), itEnd = m_PositionsTop.end(); // ߿ ׸ ... + it = m_PositionsTop.begin(), itEnd = m_PositionsTop.end(); // 나중에 그릴 점덜... for (; it != itEnd; it++) { info = *it; @@ -468,8 +468,8 @@ void CUIStateBar::Tick() { CN3UIBase::Tick(); - TickMiniMap(); // ̹... - TickMagicIcon(); // ó.. + TickMiniMap(); // 맵 이미지... + TickMagicIcon(); // 아이콘 처리.. m_fFPSValue += s_fSecPerFrm; if (m_fFPSValue > 1.0f) { @@ -510,7 +510,7 @@ void CUIStateBar::TickMiniMap() { } float fOffset = (0.5f / m_fZoom); - float fX = (m_vPosPlayer.x / m_fMapSizeX); // 1/16 .. + float fX = (m_vPosPlayer.x / m_fMapSizeX); // 1/16 축적.. float fY = (m_vPosPlayer.z / m_fMapSizeZ); // m_pImage_Map->SetUVRect(fX - fOffset, fY - fOffset, fX + fOffset, fY + fOffset); m_pImage_Map->SetUVRect((fX - fOffset), 1.0f - (fY + fOffset), (fX + fOffset), 1.0f - (fY - fOffset)); @@ -522,7 +522,7 @@ void CUIStateBar::TickMiniMap() { mtxRot.RotationZ(m_fYawPlayer); mtxRot.PosSet(rc.left + (rc.right - rc.left) / 2.0f, rc.top + (rc.bottom - rc.top) / 2.0f, 0); - // ȭǥ ... + // 화살표 세팅... m_vArrows[0].Set(0, -fH, UI_DEFAULT_Z, UI_DEFAULT_RHW, 0xff00ff00); m_vArrows[1].Set(0, fH / 2.0f, UI_DEFAULT_Z, UI_DEFAULT_RHW, 0xff00ff00); m_vArrows[2].Set(-fH, fH, UI_DEFAULT_Z, UI_DEFAULT_RHW, 0xff00ff00); @@ -533,7 +533,7 @@ void CUIStateBar::TickMiniMap() { m_vArrows[5] = m_vArrows[1]; for (int i = 0; i < 6; i++) { - m_vArrows[i] *= mtxRot; // ġ ȸ ȯ.. + m_vArrows[i] *= mtxRot; // 위치 및 회전 변환.. } } @@ -613,7 +613,7 @@ bool CUIStateBar::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { pMagicImg->fDuration = 0.0f; } - //ֶ.. + //없애라.. BYTE byBuff[32]; int iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, (BYTE)N3_MAGIC); @@ -630,7 +630,7 @@ bool CUIStateBar::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { CAPISocket::MP_AddShort(byBuff, iOffset, 0); CAPISocket::MP_AddShort(byBuff, iOffset, 0); - CGameProcedure::s_pSocket->Send(byBuff, iOffset); // .. + CGameProcedure::s_pSocket->Send(byBuff, iOffset); // 보낸다.. } } } @@ -788,8 +788,8 @@ DWORD CUIStateBar::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & p bool CUIStateBar::OnKeyPress(int iKey) { switch (iKey) { - case DIK_ESCAPE: { //hotkey Ŀ ٸ ui Ƿ DIK_ESCAPE Ŀ ٽ - //ִ ٸ ̸ ݾش. + case DIK_ESCAPE: { //hotkey가 포커스 잡혀있을때는 다른 ui를 닫을수 없으므로 DIK_ESCAPE가 들어오면 포커스를 다시잡고 + //열려있는 다른 유아이를 닫아준다. CGameProcedure::s_pUIMgr->ReFocusUI(); //this_ui CN3UIBase * pFocus = CGameProcedure::s_pUIMgr->GetFocusedUI(); if (pFocus && pFocus != this) { diff --git a/src/game/UIStateBar.h b/src/game/UIStateBar.h index fb8c8683..16ec1a0e 100644 --- a/src/game/UIStateBar.h +++ b/src/game/UIStateBar.h @@ -9,7 +9,7 @@ struct __PositionInfo { __Vector3 vPos; int iID; - D3DCOLOR crType; // ... + D3DCOLOR crType; // 종류에 따른 색깔... }; struct __DurationMagicImg { @@ -29,9 +29,9 @@ class CUIStateBar : public CN3UIBase { CN3UIProgress * m_pProgress_ExpC; CN3UIProgress * m_pProgress_ExpP; - // ̴ϸ... + // 미니맵... CN3UIBase * m_pGroup_MiniMap; - CN3UIImage * m_pImage_Map; // ̹ ̴ϸ ؽó Ų.. + CN3UIImage * m_pImage_Map; // 이 이미지에 미니맵 텍스처를 적용시킨다.. CN3UIButton * m_pBtn_ZoomIn; CN3UIButton * m_pBtn_ZoomOut; @@ -47,7 +47,7 @@ class CUIStateBar : public CN3UIBase { bool m_bQuestButtonClicked; bool m_bShowSystemTime; - float m_fZoom; // .. + float m_fZoom; // 지도의 배율.. float m_fMapSizeX; float m_fMapSizeZ; float m_fYawPlayer; @@ -55,11 +55,11 @@ class CUIStateBar : public CN3UIBase { float m_fFPSValue; - __VertexTransformedColor m_vArrows[6]; // ÷̾ ġ ȭǥ.. + __VertexTransformedColor m_vArrows[6]; // 플레이어 위치 화살표.. std::list<__PositionInfo> m_Positions; - std::list<__PositionInfo> m_PositionsTop; // ׸ ġ.. + std::list<__PositionInfo> m_PositionsTop; // 맨 위에 그릴 위치덜.. - //÷ִ ų ǥϱ.. + //컬려있는 마법스킬 표시하기.. std::list<__DurationMagicImg *> m_pMagic; // Attributes @@ -85,12 +85,12 @@ class CUIStateBar : public CN3UIBase { void PositionInfoAdd(int iID, const __Vector3 & vPos, D3DCOLOR crID, bool bDrawTop); void PositionInfoClear(); bool LoadMap(const std::string & szMiniMapFN, float fMapSizeX, - float fMapSizeZ); // ̴ϸ Ʈ ̸, ʺ ..(Meter); + float fMapSizeZ); // 미니맵 비트맵 파일 이름, 매의 너비 길이..(Meter); - bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); // ޽ ޴´.. , msg + bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); // 메시지를 받는다.. 보낸놈, msg virtual void Tick(); - virtual void Render(); // ̴ϸ .. + virtual void Render(); // 미니맵 렌더링.. virtual bool Load(HANDLE hFile); virtual void Release(); diff --git a/src/game/UITargetBar.cpp b/src/game/UITargetBar.cpp index 70e97bb2..014a32b4 100644 --- a/src/game/UITargetBar.cpp +++ b/src/game/UITargetBar.cpp @@ -43,7 +43,7 @@ void CUITargetBar::UpdateHP(int iHP, int iHPMax, bool bUpdateImmediately) { if (bUpdateImmediately) { m_pProgressHP->SetCurValue(iPercentage); } else { - m_pProgressHP->SetCurValue(iPercentage, 0.5f, 50.0f); // 1ʵڿ ʴ 50 ӵ ϰ Ѵ. + m_pProgressHP->SetCurValue(iPercentage, 0.5f, 50.0f); // 1초뒤에 초당 50 의 속도로 변하게 한다. } return; } @@ -67,7 +67,7 @@ bool CUITargetBar::Load(HANDLE hFile) { if (m_pProgressHP) { m_pProgressHP->SetRange(0, 100); } - if (m_pStringID) // Ʈ ٲ۴. + if (m_pStringID) // 폰트를 바꾼다. { std::string szFontID; ::_LoadStringFromResource(IDS_FONT_ID, szFontID); diff --git a/src/game/UITargetBar.h b/src/game/UITargetBar.h index 85a08e79..f27d7274 100644 --- a/src/game/UITargetBar.h +++ b/src/game/UITargetBar.h @@ -11,7 +11,7 @@ class CUITargetBar : public CN3UIBase { class CN3UIProgress * m_pProgressHP; class CN3UIString * m_pStringID; - float m_fTimeSendPacketLast; // ̰ 1ʿ ѹ Ÿ û.. + float m_fTimeSendPacketLast; // 이걸 기준으로 1초에 한번씩 타겟의 정보 요청.. public: void UpdateHP(int iHP, int iMaxHP, bool bUpdateImmediately); diff --git a/src/game/UITradeBBSSelector.cpp b/src/game/UITradeBBSSelector.cpp index 4dfb0075..f62b7122 100644 --- a/src/game/UITradeBBSSelector.cpp +++ b/src/game/UITradeBBSSelector.cpp @@ -62,8 +62,8 @@ bool CUITradeBBSSelector::Load(HANDLE hFile) { } void CUITradeBBSSelector::MsgSend_OpenTradeSellBBS() { - BYTE byBuff[5]; // Ŷ .. - int iOffset = 0; // Ŷ .. + BYTE byBuff[5]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_TRADE_BBS); CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_TYPE_BBS_OPEN); @@ -72,8 +72,8 @@ void CUITradeBBSSelector::MsgSend_OpenTradeSellBBS() { } void CUITradeBBSSelector::MsgSend_OpenTradeBuyBBS() { - BYTE byBuff[5]; // Ŷ .. - int iOffset = 0; // Ŷ .. + BYTE byBuff[5]; // 패킷 버퍼.. + int iOffset = 0; // 패킷 오프셋.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_TRADE_BBS); CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_TYPE_BBS_OPEN); diff --git a/src/game/UITradeEditDlg.cpp b/src/game/UITradeEditDlg.cpp index f98b8e8d..bfdde89d 100644 --- a/src/game/UITradeEditDlg.cpp +++ b/src/game/UITradeEditDlg.cpp @@ -37,7 +37,7 @@ void CUITradeEditDlg::Release() { CN3UIBase::Release(); } -int CUITradeEditDlg::GetQuantity() // "edit_trade" Edit Control ´.. +int CUITradeEditDlg::GetQuantity() // "edit_trade" Edit Control 에서 정수값을 얻오온다.. { CN3UIEdit * pEdit = (CN3UIEdit *)this->GetChildByID("edit_trade"); __ASSERT(pEdit, "NULL UI Component!!"); @@ -45,7 +45,7 @@ void CUITradeEditDlg::Release() { return atoi(pEdit->GetString().c_str()); } -void CUITradeEditDlg::SetQuantity(int iQuantity) // "edit_trade" Edit Control ڿ Ѵ.. +void CUITradeEditDlg::SetQuantity(int iQuantity) // "edit_trade" Edit Control 에서 정수값을 문자열로 세팅한다.. { CN3UIEdit * pEdit = (CN3UIEdit *)this->GetChildByID("edit_trade"); __ASSERT(pEdit, "NULL UI Component!!"); diff --git a/src/game/UITradeEditDlg.h b/src/game/UITradeEditDlg.h index b9f65956..b21cefd9 100644 --- a/src/game/UITradeEditDlg.h +++ b/src/game/UITradeEditDlg.h @@ -26,7 +26,7 @@ class CUITradeEditDlg : public CN3UIBase { virtual ~CUITradeEditDlg(); int GetQuantity(); - void SetQuantity(int iQuantity); // "edit_trade" Edit Control ڿ Ѵ.. + void SetQuantity(int iQuantity); // "edit_trade" Edit Control 에서 정수값을 문자열로 세팅한다.. virtual void Release(); virtual bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); diff --git a/src/game/UITradeList.cpp b/src/game/UITradeList.cpp index 5615cb5b..3c3aab3d 100644 --- a/src/game/UITradeList.cpp +++ b/src/game/UITradeList.cpp @@ -56,7 +56,7 @@ bool CUITradeList::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } else if (dwMsg == UIMSG_SCROLLBAR_POS) { - // ũѹٿ ´ ä Line + // 스크롤바에 맞는 채팅 Line 설정 int iCurLinePos = m_pScrollbar->GetCurrentPos(); SetTopLine(iCurLinePos); } @@ -75,13 +75,13 @@ void CUITradeList::Open(int iIDTarget) { __TABLE_PLAYER_LOOKS * pPlayer = NULL; __TABLE_ITEM_BASIC * pItem = NULL; - // ̵ = ڵ*1000 + 001.. ( ڵ+1)*100 + 001.. + // 아이디 = 직업 코드*1000 + 001부터.. (직업 코드+1)*100 + 001까지.. int iIDFirst, iIDIndexFirst, iIDIndexLast, iDivide, iTotalCount; iIDFirst = iIDTarget * 1000 + 1; iIDIndexFirst = CGameBase::s_pTbl_Exchange_Quest->IDToIndex(iIDFirst); if (iIDIndexFirst == -1) { - return; // ƹ Ʈ ʴ.. + return; // 아무런 리스트도 가지고 있지 않다.. } iTotalCount = CGameBase::s_pTbl_Exchange_Quest->GetSize(); @@ -105,7 +105,7 @@ void CUITradeList::Open(int iIDTarget) { iIDIndexLast = iTotalCount; } - // ޽ ڽ ؽƮ ǥ.. + // 메시지 박스 텍스트 표시.. char pszID[32]; for (int i = iIDIndexFirst; i < iIDIndexFirst + 40; i++) { pQuest = CGameBase::s_pTbl_Exchange_Quest->GetIndexedData(i); @@ -113,7 +113,7 @@ void CUITradeList::Open(int iIDTarget) { iDivide = pQuest->dwID / 1000; pPlayer = CGameBase::s_pTbl_NPC_Looks->Find(iDivide); m_sStr[i - iIDIndexFirst] = pPlayer->szName; - m_sStr[i - iIDIndexFirst] += " "; + m_sStr[i - iIDIndexFirst] += "에게 "; pItem = CGameBase::s_pTbl_Items_Basic->Find(pQuest->iCondition0); if (pItem) { @@ -121,7 +121,7 @@ void CUITradeList::Open(int iIDTarget) { } else { m_sStr[i - iIDIndexFirst] += "NULL Item"; } - m_sStr[i - iIDIndexFirst] += " "; + m_sStr[i - iIDIndexFirst] += "과 "; pItem = CGameBase::s_pTbl_Items_Basic->Find(pQuest->iCondition1); if (pItem) { @@ -129,7 +129,7 @@ void CUITradeList::Open(int iIDTarget) { } else { m_sStr[i - iIDIndexFirst] += "NULL Item"; } - m_sStr[i - iIDIndexFirst] += " "; + m_sStr[i - iIDIndexFirst] += "를 "; sprintf(pszID, "%d", i); m_sStr[i - iIDIndexFirst] += pszID; m_sStr[i - iIDIndexFirst] += "\n"; @@ -145,9 +145,9 @@ void CUITradeList::Close() { SetVisible(false); } -void CUITradeList::SetTopLine(int iTopLine) // ش. +void CUITradeList::SetTopLine(int iTopLine) // 맨 윗줄을 지정해준다. { - // 0 ~ 10 ̰.. .. + // 0 ~ 10 사이값.. 먼저 총 갯수를 센다.. int i, iTotalCount, iFirstIndex, iLastIndex; for (i = 0; i < 40; i++) { if (m_sStr[i].empty()) { diff --git a/src/game/UITradeList.h b/src/game/UITradeList.h index a787cc9d..8ec1a877 100644 --- a/src/game/UITradeList.h +++ b/src/game/UITradeList.h @@ -14,7 +14,7 @@ class CUITradeList : public CN3UIBase { CN3UIString * m_pStr_List[9]; std::string m_sStr[40]; - CN3UIScrollBar * m_pScrollbar; // scrollbar ( m_Child ) + CN3UIScrollBar * m_pScrollbar; // scrollbar 참조포인터(실제 m_Child로 관리) public: CUITradeList(); @@ -28,5 +28,5 @@ class CUITradeList : public CN3UIBase { void Open(int iIDTarget = -1); void Close(); - void SetTopLine(int iTopLine); // ش. + void SetTopLine(int iTopLine); // 맨 윗줄을 지정해준다. }; diff --git a/src/game/UITradeSellBBS.cpp b/src/game/UITradeSellBBS.cpp index 023d6f7b..b299846f 100644 --- a/src/game/UITradeSellBBS.cpp +++ b/src/game/UITradeSellBBS.cpp @@ -96,7 +96,7 @@ bool CUITradeSellBBS::Load(HANDLE hFile) { m_pText[i] = (CN3UIString *)(this->GetChildByID(std::format("text_{:02d}", i))); } - m_iCurPage = 0; // .. + m_iCurPage = 0; // 현재 페이지.. __TABLE_UI_RESRC * pTblUI = NULL; pTblUI = CGameBase::s_pTbl_UI->Find(NATION_ELMORAD); @@ -125,7 +125,7 @@ bool CUITradeSellBBS::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (pSender == m_pBtn_Refresh) { float fTime = CN3Base::TimeGet(); if (fTime - m_fTime < 3.0f) { - return true; //ʹ û ϰ 3ʿ ѹ . + return true; //너무 자주 새데이터 요청을 못하게 함 3초에 한번정도로 제약을 둠. } m_fTime = fTime; @@ -191,13 +191,13 @@ void CUITradeSellBBS::MsgRecv_TradeBBS(DataPack * pDataPack, int & iOffset) { std::string szMsg; switch (bySubResult) { - case 1: //1: Ϲ + case 1: //1: 일반적인 실패 ::_LoadStringFromResource(IDS_TRADE_BBS_FAIL1, szMsg); break; - case 2: //2:  + case 2: //2: 돈이 없어서 실패 ::_LoadStringFromResource(IDS_TRADE_BBS_FAIL2, szMsg); break; - case 3: //3: ׸  + case 3: //3: 항목이 없어서 실패 ::_LoadStringFromResource(IDS_TRADE_BBS_FAIL4, szMsg); break; } @@ -216,20 +216,20 @@ void CUITradeSellBBS::MsgRecv_TradeBBS(DataPack * pDataPack, int & iOffset) { std::string szMsg; switch (bySubResult) { - case 1: //1: Ϲ + case 1: //1: 일반적인 실패 ::_LoadStringFromResource(IDS_TRADE_BBS_FAIL5, szMsg); break; - case 2: //2:  + case 2: //2: 돈이 없어서 실패 ::_LoadStringFromResource(IDS_TRADE_BBS_FAIL2, szMsg); break; - case 3: //3: ׸  + case 3: //3: 항목이 없어서 실패 ::_LoadStringFromResource(IDS_TRADE_BBS_FAIL4, szMsg); break; } CGameProcedure::s_pProcMain->MsgOutput(szMsg, 0xffff0000); } - return; //ߴٸ + return; //실패했다면 } if (bySubType == N3_SP_TYPE_BBS_OPEN) { @@ -293,8 +293,8 @@ void CUITradeSellBBS::MsgRecv_RefreshData(DataPack * pDataPack, int & iOffset) { if (iLen > 0) { CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, Info.szExplanation, iLen); } - Info.iPrice = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); //ۿ - Info.sIndex = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); //ϵ ε + Info.iPrice = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); //아이템에 제시한 가격 + Info.sIndex = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); //등록된 인덱스 if (Info.sID != -1) { m_Datas.push_back(Info); @@ -316,7 +316,7 @@ void CUITradeSellBBS::MsgRecv_RefreshData(DataPack * pDataPack, int & iOffset) { void CUITradeSellBBS::RefreshPage() { if (m_pString_Page) { - m_pString_Page->SetStringAsInt(m_iCurPage + 1); // ǥ.. + m_pString_Page->SetStringAsInt(m_iCurPage + 1); // 페이지 표시.. } ResetContent(); @@ -336,7 +336,7 @@ void CUITradeSellBBS::RefreshPage() { void CUITradeSellBBS::MsgSend_RefreshData(int iCurPage) { if (m_bProcessing) { - return; // Ŷ + return; //전에 보낸 패킷 응답이 없으면 } BYTE byBuff[10]; @@ -353,7 +353,7 @@ void CUITradeSellBBS::MsgSend_RefreshData(int iCurPage) { void CUITradeSellBBS::MsgSend_Register() { if (m_bProcessing) { - return; // Ŷ + return; //전에 보낸 패킷 응답이 없으면 } if (!CGameProcedure::s_pProcMain->m_pUITradeBBSEdit) { return; @@ -390,7 +390,7 @@ void CUITradeSellBBS::MsgSend_Register() { void CUITradeSellBBS::MsgSend_RegisterCancel(short sIndex) { if (m_bProcessing) { - return; // Ŷ + return; //전에 보낸 패킷 응답이 없으면 } BYTE byBuff[10]; @@ -440,7 +440,7 @@ void CUITradeSellBBS::CallBackProc(int iID, DWORD dwFlag) { void CUITradeSellBBS::OnButtonRegister() { if (m_bProcessing) { - return; // Ŷ + return; //전에 보낸 패킷 응답이 없으면 } if (m_byBBSKind == N3_SP_TRADE_BBS_BUY) { @@ -470,7 +470,7 @@ void CUITradeSellBBS::OnButtonRegister() { void CUITradeSellBBS::OnButtonRegisterCancel() { if (m_bProcessing) { - return; // Ŷ + return; //전에 보낸 패킷 응답이 없으면 } if (m_iCurIndex <= -1) { return; @@ -486,12 +486,12 @@ void CUITradeSellBBS::OnButtonRegisterCancel() { __InfoTradeSellBBS ITSB = (*it); if (0 == lstrcmpi(ITSB.szID.c_str(), - CGameProcedure::s_pPlayer->m_InfoBase.szID.c_str())) { //ڱ͸ ϰ.. + CGameProcedure::s_pPlayer->m_InfoBase.szID.c_str())) { //자기것만 등록해제하게.. MsgSend_RegisterCancel(ITSB.sIndex); break; } else if (AUTHORITY_MANAGER == CGameProcedure::s_pProcMain->s_pPlayer->m_InfoBase - .iAuthority) { //ڿԴ ش...(質 弳 Խù ؼ...) + .iAuthority) { //운영자에게는 해제 권한을 준다...(도배나 욕설등의 게시물 삭제를 위해서...) MsgSend_RegisterCancel(ITSB.sIndex); break; } @@ -514,7 +514,7 @@ void CUITradeSellBBS::OnButtonWhisper() { __InfoTradeSellBBS ITSB = (*it); if (0 != lstrcmpi(ITSB.szID.c_str(), - CGameProcedure::s_pPlayer->m_InfoBase.szID.c_str())) { // ڽſԴ ӼӸ ϰ Ѵ... + CGameProcedure::s_pPlayer->m_InfoBase.szID.c_str())) { //나 자신에게는 귓속말을 못하게 한다... CGameProcedure::s_pProcMain->MsgSend_ChatSelectTarget(ITSB.szID); } break; @@ -533,7 +533,7 @@ void CUITradeSellBBS::SetVisible(bool bVisible) { void CUITradeSellBBS::OnButtonTrade() { if (m_bProcessing) { - return; // Ŷ + return; //전에 보낸 패킷 응답이 없으면 } if (m_iCurIndex <= -1) { @@ -623,10 +623,10 @@ void CUITradeSellBBS::OnListExplanation() { void CUITradeSellBBS::MsgSend_PerTrade() { if (m_bProcessing) { - return; // Ŷ + return; //전에 보낸 패킷 응답이 없으면 } if (0 == lstrcmpi(m_ITSB.szID.c_str(), CGameProcedure::s_pPlayer->m_InfoBase.szID.c_str())) { - return; //ڱ ڽſԴ ŷ ϰ + return; //자기 자신에게는 거래를 하지 못하게 } BYTE byBuff[10]; diff --git a/src/game/UITradeSellBBS.h b/src/game/UITradeSellBBS.h index 86d14f10..3bca7346 100644 --- a/src/game/UITradeSellBBS.h +++ b/src/game/UITradeSellBBS.h @@ -12,14 +12,14 @@ #include "UITradeExplanation.h" #include -struct __InfoTradeSellBBS // Ƽ Խ ü.. +struct __InfoTradeSellBBS // 파티 지원 게시판 구조체.. { - std::string szID; // Ƽ ̸ ڿ - std::string szTitle; // - std::string szExplanation; // - int iPrice; // - short sIndex; // ε - short sID; // ij ̵ + std::string szID; // 파티 이름 문자열 + std::string szTitle; // 제목 + std::string szExplanation; // 설명 + int iPrice; // 가격 + short sIndex; // 등록 인덱스 + short sID; // 캐릭터 아이디 void Init() { szID = ""; @@ -61,8 +61,8 @@ class CUITradeSellBBS : public CN3UIBase { std::list<__InfoTradeSellBBS> m_Datas; __InfoTradeSellBBS m_ITSB; - int m_iCurPage; // .. - int m_iMaxPage; // .. + int m_iCurPage; // 현재 페이지.. + int m_iMaxPage; // 총 페이지.. bool m_bProcessing; BYTE m_byBBSKind; int m_iCurIndex; diff --git a/src/game/UITransactionDlg.cpp b/src/game/UITransactionDlg.cpp index 6b1e8c1b..99307451 100644 --- a/src/game/UITransactionDlg.cpp +++ b/src/game/UITransactionDlg.cpp @@ -78,7 +78,7 @@ void CUITransactionDlg::Release() { void CUITransactionDlg::Render() { if (!m_bVisible) { - return; // ڽĵ render ʴ´. + return; // 보이지 않으면 자식들을 render하지 않는다. } POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); @@ -102,11 +102,11 @@ void CUITransactionDlg::Render() { } } - // ǥõǾ ǥ.. + // 갯수 표시되야 할 아이템 갯수 표시.. for (int i = 0; i < MAX_ITEM_INVENTORY; i++) { if (m_pMyTradeInv[i] && ((m_pMyTradeInv[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (m_pMyTradeInv[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL))) { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i); if (pStr) { if ((GetState() == UI_STATE_ICON_MOVING) && @@ -123,7 +123,7 @@ void CUITransactionDlg::Render() { } } } else { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i); if (pStr) { pStr->SetVisible(false); @@ -243,7 +243,7 @@ void CUITransactionDlg::EnterTransactionState() { std::string szIconFN; __IconItemSkill * spItem = NULL; - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. __TABLE_ITEM_EXT * pItemExt = NULL; int iOrg = m_iTradeID / 1000; @@ -261,9 +261,9 @@ void CUITransactionDlg::EnterTransactionState() { } pItem = CGameBase::s_pTbl_Items_Basic->GetIndexedData(i); - if (NULL == pItem) // .. + if (NULL == pItem) // 아이템이 없으면.. { - __ASSERT(0, " ̺ !!"); + __ASSERT(0, "아이템 포인터 테이블에 없음!!"); CLogWriter::Write("CUITransactionDlg::EnterTransactionState - Invalid Item ID : %d, %d", iOrg, iExt); continue; } @@ -277,9 +277,9 @@ void CUITransactionDlg::EnterTransactionState() { } pItemExt = CGameBase::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iExt); - if (NULL == pItemExt) // .. + if (NULL == pItemExt) // 아이템이 없으면.. { - __ASSERT(0, " ̺ !!"); + __ASSERT(0, "아이템 포인터 테이블에 없음!!"); CLogWriter::Write("CUITransactionDlg::EnterTransactionState - Invalid Item ID : %d, %d", iOrg, iExt); continue; } @@ -291,13 +291,13 @@ void CUITransactionDlg::EnterTransactionState() { e_PartPosition ePart; e_PlugPosition ePlug; e_ItemType eType = CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 __ASSERT(ITEM_TYPE_UNKNOWN != eType, "Unknown Item"); spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = 1; spItem->iDurability = pItem->siMaxDurability + pItemExt->siMaxDurability; @@ -394,7 +394,7 @@ void CUITransactionDlg::LeaveTransactionState() { SetState(UI_STATE_COMMON_NONE); CN3UIWndBase::AllHighLightIconFree(); - // inv κ丮 inv ű.. + // 이 윈도우의 inv 영역의 아이템을 이 인벤토리 윈도우의 inv영역으로 옮긴다.. ItemMoveFromThisToInv(); if (CGameProcedure::s_pProcMain->m_pUISkillTreeDlg) { @@ -438,7 +438,7 @@ void CUITransactionDlg::ItemCountOK() { int iWeight; switch (CN3UIWndBase::m_pCountableItemEdit->GetCallerWndDistrict()) { - case UIWND_DISTRICT_TRADE_NPC: // .. + case UIWND_DISTRICT_TRADE_NPC: // 사는 경우.. spItem = m_pMyTrade[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; switch (spItem->pItemBasic->byContable) { @@ -446,7 +446,7 @@ void CUITransactionDlg::ItemCountOK() { case UIITEM_TYPE_SOMOONE: iWeight = spItem->pItemBasic->siWeight; - // üũ.. + // 무게 체크.. if ((pInfoExt->iWeight + iWeight) > pInfoExt->iWeightMax) { std::string szMsg; ::_LoadStringFromResource(IDS_ITEM_WEIGHT_OVERFLOW, szMsg); @@ -459,7 +459,7 @@ void CUITransactionDlg::ItemCountOK() { if (iGold <= 0) { return; } - // short ̻ .. + // short 범위이상은 살수 없다.. if (iGold > UIITEM_COUNT_MANY) { std::string szMsg; ::_LoadStringFromResource(IDS_MANY_COUNTABLE_ITEM_BUY_FAIL, szMsg); @@ -474,7 +474,7 @@ void CUITransactionDlg::ItemCountOK() { return; } - // ż X .. ׳ .. + // 매수가 X 갯수가 내가 가진 돈보다 많으면.. 그냥 리턴.. if ((iGold * spItem->pItemBasic->iPrice) > pInfoExt->iGold) { std::string szMsg; ::_LoadStringFromResource(IDS_COUNTABLE_ITEM_BUY_NOT_ENOUGH_MONEY, szMsg); @@ -484,7 +484,7 @@ void CUITransactionDlg::ItemCountOK() { iWeight = iGold * spItem->pItemBasic->siWeight; - // üũ.. + // 무게 체크.. if ((pInfoExt->iWeight + iWeight) > pInfoExt->iWeightMax) { std::string szMsg; ::_LoadStringFromResource(IDS_ITEM_WEIGHT_OVERFLOW, szMsg); @@ -497,7 +497,7 @@ void CUITransactionDlg::ItemCountOK() { if (iGold <= 0) { return; } - // short ̻ .. + // short 범위이상은 살수 없다.. if (iGold > UIITEM_COUNT_FEW) { std::string szMsg; ::_LoadStringFromResource(IDS_SMALL_COUNTABLE_ITEM_BUY_FAIL, szMsg); @@ -512,7 +512,7 @@ void CUITransactionDlg::ItemCountOK() { return; } - // ż X .. ׳ .. + // 매수가 X 갯수가 내가 가진 돈보다 많으면.. 그냥 리턴.. if ((iGold * spItem->pItemBasic->iPrice) > pInfoExt->iGold) { std::string szMsg; ::_LoadStringFromResource(IDS_COUNTABLE_ITEM_BUY_NOT_ENOUGH_MONEY, szMsg); @@ -522,7 +522,7 @@ void CUITransactionDlg::ItemCountOK() { iWeight = iGold * spItem->pItemBasic->siWeight; - // üũ.. + // 무게 체크.. if ((pInfoExt->iWeight + iWeight) > pInfoExt->iWeightMax) { std::string szMsg; ::_LoadStringFromResource(IDS_ITEM_WEIGHT_OVERFLOW, szMsg); @@ -534,13 +534,13 @@ void CUITransactionDlg::ItemCountOK() { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = true; - if (m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]) // ش ġ .. + if (m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]) // 해당 위치에 아이콘이 있으면.. { - // Ʈ.. + // 숫자 업데이트.. m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]->iCount += iGold; - // ǥô Ҷ.. Inventory Render.. - // .. + // 표시는 아이콘 렌더링할때.. Inventory의 Render에서.. + // 서버에게 보냄.. SendToServerBuyMsg(CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->dwID + CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemExt->dwID, CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder, iGold); @@ -550,11 +550,11 @@ void CUITransactionDlg::ItemCountOK() { spItemNew = new __IconItemSkill; spItemNew->pItemBasic = spItem->pItemBasic; spItemNew->pItemExt = spItem->pItemExt; - spItemNew->szIconFN = spItem->szIconFN; // ̸ .. + spItemNew->szIconFN = spItem->szIconFN; // 아이콘 파일 이름 복사.. spItemNew->iCount = iGold; spItemNew->iDurability = spItem->pItemBasic->siMaxDurability + spItem->pItemExt->siMaxDurability; - // ҽ .. + // 아이콘 리소스 만들기.. spItemNew->pUIIcon = new CN3UIIcon; float fUVAspect = (float)45.0f / (float)64.0f; spItemNew->pUIIcon->Init(this); @@ -572,7 +572,7 @@ void CUITransactionDlg::ItemCountOK() { m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] = spItemNew; - // .. + // 서버에게 보냄.. SendToServerBuyMsg(CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->dwID + CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemExt->dwID, CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder, iGold); @@ -583,7 +583,7 @@ void CUITransactionDlg::ItemCountOK() { } break; - case UIWND_DISTRICT_TRADE_MY: // Ĵ .. + case UIWND_DISTRICT_TRADE_MY: // 파는 경우.. spItem = m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; if (iGold <= 0) { @@ -596,13 +596,13 @@ void CUITransactionDlg::ItemCountOK() { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = true; if ((spItem->iCount - iGold) > 0) { - // Ʈ.. + // 숫자 업데이트.. spItem->iCount -= iGold; } else { spItem->pUIIcon->SetVisible(false); } - // .. + // 서버에게 보냄.. SendToServerSellMsg(CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->dwID + CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemExt->dwID, CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder, iGold); @@ -618,7 +618,7 @@ void CUITransactionDlg::ItemCountCancel() { PlayItemSound(CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic); } - // .. + // 취소.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = NULL; @@ -707,7 +707,7 @@ void CUITransactionDlg::ReceiveResultTradeMoveFail() { } void CUITransactionDlg::ReceiveItemDropByTradeSuccess() { - // ؾ .. ǻ츱 ġ ű.. + // 원래 아이템을 삭제해야 하지만.. 되살릴 방법이 없기 때문에 원래 위치로 옮기고.. __IconItemSkill * spItem; spItem = CN3UIWndBase::m_sRecoveryJobInfo.pItemSource; @@ -720,12 +720,12 @@ void CUITransactionDlg::ReceiveItemDropByTradeSuccess() { spItem->pUIIcon->SetMoveRect(pArea->GetRegion()); } - // Invisible ϰ ٶ Ѵ.. + // Invisible로 하고 삭제는 서버가 성공을 줄때 한다.. spItem->pUIIcon->SetVisible(false); if ((spItem->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (spItem->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) { - // Ȱ̳ .. + // 활이나 물약등 아이템인 경우.. spItem->pUIIcon->SetVisible(true); } } @@ -745,7 +745,7 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { return false; } - // ƴϸ.. + // 내가 가졌던 아이콘이 아니면.. if (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd != m_eUIWnd) { FAIL_RETURN } @@ -754,7 +754,7 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { FAIL_RETURN } - // ̸.. npc ˻Ѵ.. + // 내가 가졌던 아이콘이면.. npc영역인지 검사한다.. int i, iDestiOrder = -1; bool bFound = false; for (i = 0; i < MAX_ITEM_TRADE; i++) { @@ -781,14 +781,14 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { FAIL_RETURN } - // fail!!!!! + // 같은 윈도우 내에서의 움직임은 fail!!!!! if ((eUIWnd == CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict) && (eUIWnd != UIWND_DISTRICT_TRADE_MY)) { FAIL_RETURN } - // Recovery Info Ȱϱ Ѵ.. - // WaitFromServer On ϰ.. Select Info Recovery Info .. ̶ Dest ӿ.. + // 본격적으로 Recovery Info를 활용하기 시작한다.. + // 먼저 WaitFromServer를 On으로 하고.. Select Info를 Recovery Info로 복사.. 이때 Dest는 팰요없다.. if (spItem != CN3UIWndBase::m_sSelectedIconInfo.pItemSelect) { CN3UIWndBase::m_sSelectedIconInfo.pItemSelect = spItem; } @@ -814,12 +814,12 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { switch (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict) { case UIWND_DISTRICT_TRADE_NPC: - if (eUIWnd == UIWND_DISTRICT_TRADE_MY) // .. + if (eUIWnd == UIWND_DISTRICT_TRADE_MY) // 사는 경우.. { if ((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) { - // Ȱ̳ .. - // κ丮 ش ִ ˾ƺ.. + // 활이나 물약등 아이템인 경우.. + // 면저 인벤토리에 해당 아이콘이 있는지 알아본다.. bFound = false; for (i = 0; i < MAX_ITEM_INVENTORY; i++) { @@ -838,11 +838,11 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } } - // ã.. + // 못찾았으면.. if (!bFound) { - if (m_pMyTradeInv[iDestiOrder]) // ش ġ .. + if (m_pMyTradeInv[iDestiOrder]) // 해당 위치에 아이콘이 있으면.. { - // κ丮 󽽷 ã .. + // 인벤토리 빈슬롯을 찾아 들어간다.. for (i = 0; i < MAX_ITEM_INVENTORY; i++) { if (!m_pMyTradeInv[i]) { bFound = true; @@ -851,7 +851,7 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } } - if (!bFound) // ã .. + if (!bFound) // 빈 슬롯을 찾지 못했으면.. { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; @@ -870,7 +870,7 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } else { __InfoPlayerMySelf * pInfoExt = &(CGameBase::s_pPlayer->m_InfoExt); - // ż X .. ׳ .. + // 매수가 X 갯수가 내가 가진 돈보다 많으면.. 그냥 리턴.. if ((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->iPrice) > pInfoExt->iGold) { std::string szMsg; ::_LoadStringFromResource(IDS_COUNTABLE_ITEM_BUY_NOT_ENOUGH_MONEY, szMsg); @@ -881,7 +881,7 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { FAIL_RETURN } - // üũ.. + // 무게 체크.. if ((pInfoExt->iWeight + CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->siWeight) > pInfoExt->iWeightMax) { std::string szMsg; @@ -893,10 +893,10 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { FAIL_RETURN } - // Ϲ .. - if (m_pMyTradeInv[iDestiOrder]) // ش ġ .. + // 일반 아이템인 경우.. + if (m_pMyTradeInv[iDestiOrder]) // 해당 위치에 아이콘이 있으면.. { - // κ丮 󽽷 ã .. + // 인벤토리 빈슬롯을 찾아 들어간다.. bFound = false; for (i = 0; i < MAX_ITEM_INVENTORY; i++) { if (!m_pMyTradeInv[i]) { @@ -906,7 +906,7 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } } - if (!bFound) // ã .. + if (!bFound) // 빈 슬롯을 찾지 못했으면.. { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; @@ -928,7 +928,7 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { e_PlugPosition ePlug; CGameProcedure::MakeResrcFileNameForUPC( m_pMyTrade[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]->pItemBasic, NULL, - &szIconFN, ePart, ePlug); // ۿ ̸  + &szIconFN, ePart, ePlug); // 아이템에 따른 파일 이름을 만들어서 __IconItemSkill * spItemNew; spItemNew = new __IconItemSkill; @@ -936,7 +936,7 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { m_pMyTrade[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]->pItemBasic; spItemNew->pItemExt = m_pMyTrade[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]->pItemExt; - spItemNew->szIconFN = szIconFN; // ̸ .. + spItemNew->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItemNew->iCount = 1; spItemNew->iDurability = m_pMyTrade[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] @@ -944,7 +944,7 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { m_pMyTrade[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] ->pItemExt->siMaxDurability; - // ҽ .. + // 아이콘 리소스 만들기.. spItemNew->pUIIcon = new CN3UIIcon; float fUVAspect = (float)45.0f / (float)64.0f; spItemNew->pUIIcon->Init(this); @@ -971,22 +971,22 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { break; case UIWND_DISTRICT_TRADE_MY: - if (eUIWnd == UIWND_DISTRICT_TRADE_NPC) // Ĵ .. + if (eUIWnd == UIWND_DISTRICT_TRADE_NPC) // 파는 경우.. { if ((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) { - // Ȱ̳ .. + // 활이나 물약등 아이템인 경우.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_pCountableItemEdit->Open( UIWND_TRANSACTION, CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict, false); } else { - // Server .. + // Server에게 보낸다.. SendToServerSellMsg(CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->dwID + CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemExt->dwID, CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder, CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->iCount); - // ؾ .. ǻ츱 ġ ű.. + // 원래 아이템을 삭제해야 하지만.. 되살릴 방법이 없기 때문에 원래 위치로 옮기고.. pArea = NULL; pArea = GetChildAreaByiOrder(UI_AREA_TYPE_TRADE_MY, CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder); @@ -995,12 +995,12 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { spItem->pUIIcon->SetMoveRect(pArea->GetRegion()); } - // Invisible ϰ ٶ Ѵ.. + // Invisible로 하고 삭제는 서버가 성공을 줄때 한다.. spItem->pUIIcon->SetVisible(false); } FAIL_RETURN } else { - // ̵.. + // 이동.. __IconItemSkill *spItemSource, *spItemTarget = NULL; spItemSource = CN3UIWndBase::m_sRecoveryJobInfo.pItemSource; @@ -1012,7 +1012,7 @@ bool CUITransactionDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = iDestiOrder; - if (m_pMyTradeInv[iDestiOrder]) // ش ġ .. + if (m_pMyTradeInv[iDestiOrder]) // 해당 위치에 아이콘이 있으면.. { CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = m_pMyTradeInv[iDestiOrder]; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWnd = UIWND_TRANSACTION; @@ -1060,30 +1060,30 @@ void CUITransactionDlg::ReceiveResultTradeFromServer(uint8_t bResult, uint8_t bT __IconItemSkill * spItem = NULL; __InfoPlayerMySelf * pInfoExt = &(CGameBase::s_pPlayer->m_InfoExt); - // ҽ UIWND_DISTRICT_TRADE_NPC ̸ °.. + // 소스 영역이 UIWND_DISTRICT_TRADE_NPC 이면 아이템 사는거.. switch (CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.UIWndDistrict) { case UIWND_DISTRICT_TRADE_NPC: - if (bResult != 0x01) // ж.. + if (bResult != 0x01) // 실패라면.. { if ((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) { int64_t iGold = CN3UIWndBase::m_pCountableItemEdit->GetQuantity(); if ((m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]->iCount - iGold) > 0) { - // Ʈ.. + // 숫자 업데이트.. m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]->iCount -= iGold; } else { - // .. κ丮 츸.. + // 아이템 삭제.. 현재 인벤토리 윈도우만.. __IconItemSkill * spItem; spItem = m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]; - // κ丮 .. + // 인벤토리에서도 지운다.. m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -1091,17 +1091,17 @@ void CUITransactionDlg::ReceiveResultTradeFromServer(uint8_t bResult, uint8_t bT spItem = NULL; } } else { - // .. κ丮 츸.. + // 아이템 삭제.. 현재 인벤토리 윈도우만.. __IconItemSkill * spItem; spItem = m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]; - // κ丮 .. + // 인벤토리에서도 지운다.. m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -1110,13 +1110,13 @@ void CUITransactionDlg::ReceiveResultTradeFromServer(uint8_t bResult, uint8_t bT } if (bType == 0x04) { - // ޽ ڽ ؽƮ ǥ.. + // 메시지 박스 텍스트 표시.. std::string szMsg; ::_LoadStringFromResource(IDS_ITEM_TOOMANY_OR_HEAVY, szMsg); CGameProcedure::s_pProcMain->MsgOutput(szMsg, 0xffff3b3b); } } else { - // ̸.. Ʈ.. κ丮.. + // 성공이면.. 돈 업데이트.. 먼저 인벤토리.. pInfoExt->iGold = iMoney; pStatic = (CN3UIString *)CGameProcedure::s_pProcMain->m_pUIInventory->GetChildByID("text_gold"); __ASSERT(pStatic, "NULL UI Component!!"); @@ -1124,7 +1124,7 @@ void CUITransactionDlg::ReceiveResultTradeFromServer(uint8_t bResult, uint8_t bT pStatic->SetString(::_FormatCoins(pInfoExt->iGold)); } if (m_pStrMyGold) { - m_pStrMyGold->SetString(::_FormatCoins(pInfoExt->iGold)); // ŷâ.. + m_pStrMyGold->SetString(::_FormatCoins(pInfoExt->iGold)); // 상거래창.. } } @@ -1133,31 +1133,31 @@ void CUITransactionDlg::ReceiveResultTradeFromServer(uint8_t bResult, uint8_t bT break; case UIWND_DISTRICT_TRADE_MY: - if (bResult != 0x01) // ж.. + if (bResult != 0x01) // 실패라면.. { if ((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) { int64_t iGold = CN3UIWndBase::m_pCountableItemEdit->GetQuantity(); if (m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] - ->pUIIcon->IsVisible()) // δٸ.. + ->pUIIcon->IsVisible()) // 기존 아이콘이 보인다면.. { - // ڸ ٲش.. + // 숫자만 바꿔준다.. m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]->iCount += iGold; } else { - // δٸ.. + // 기존 아이콘이 안 보인다면.. m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]->iCount = iGold; - // ̰.. + // 아이콘이 보이게.. m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]->pUIIcon->SetVisible(true); } } else { - // Invisible ߴ Icon Visible.. + // Invisible로 쎗팅했던 Icon Visible로.. spItem = m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; spItem->pUIIcon->SetVisible(true); } } else { - // Ȱ̳ Ⱥδٸ.. .. + // 활이나 물약등 아이템인 경우 기존 아이콘이 안보인다면.. 아이템 삭제.. if ((((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) && @@ -1165,17 +1165,17 @@ void CUITransactionDlg::ReceiveResultTradeFromServer(uint8_t bResult, uint8_t bT ((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable != UIITEM_TYPE_COUNTABLE) && (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable != UIITEM_TYPE_COUNTABLE_SMALL))) { - // .. 츸.. + // 아이템 삭제.. 현재 내 영역 윈도우만.. __IconItemSkill * spItem; spItem = m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; - // .. + // 내 영역에서도 지운다.. m_pMyTradeInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -1183,7 +1183,7 @@ void CUITransactionDlg::ReceiveResultTradeFromServer(uint8_t bResult, uint8_t bT spItem = NULL; } - // ̸.. Ʈ.. + // 성공이면.. 돈 업데이트.. pInfoExt->iGold = iMoney; pStatic = (CN3UIString *)CGameProcedure::s_pProcMain->m_pUIInventory->GetChildByID("text_gold"); __ASSERT(pStatic, "NULL UI Component!!"); @@ -1191,7 +1191,7 @@ void CUITransactionDlg::ReceiveResultTradeFromServer(uint8_t bResult, uint8_t bT pStatic->SetString(::_FormatCoins(pInfoExt->iGold)); } if (m_pStrMyGold) { - m_pStrMyGold->SetString(::_FormatCoins(pInfoExt->iGold)); // ŷâ.. + m_pStrMyGold->SetString(::_FormatCoins(pInfoExt->iGold)); // 상거래창.. } } @@ -1253,7 +1253,7 @@ DWORD CUITransactionDlg::MouseProc(DWORD dwFlags, const POINT & ptCur, const POI return dwRet; } - // 巡 Ǵ .. + // 드래그 되는 아이콘 갱신.. if ((GetState() == UI_STATE_ICON_MOVING) && (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd == UIWND_TRANSACTION)) { CN3UIWndBase::m_sSelectedIconInfo.pItemSelect->pUIIcon->SetRegion(GetSampleRect()); @@ -1429,9 +1429,9 @@ bool CUITransactionDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { break; case UIMSG_ICON_UP: - // Ŵ ٴϸ鼭 ˻.. + // 아이콘 매니저 윈도우들을 돌아 다니면서 검사.. if (!CGameProcedure::s_pUIMgr->BroadcastIconDropMsg(CN3UIWndBase::m_sSelectedIconInfo.pItemSelect)) { - // ġ .. + // 아이콘 위치 원래대로.. IconRestore(); } // Sound.. @@ -1508,7 +1508,7 @@ void CUITransactionDlg::SetVisibleWithNoSound(bool bVisible, bool bWork, bool bR SetState(UI_STATE_COMMON_NONE); CN3UIWndBase::AllHighLightIconFree(); - // inv κ丮 inv ű.. + // 이 윈도우의 inv 영역의 아이템을 이 인벤토리 윈도우의 inv영역으로 옮긴다.. ItemMoveFromThisToInv(); if (CGameProcedure::s_pProcMain->m_pUISkillTreeDlg) { diff --git a/src/game/UITransactionDlg.h b/src/game/UITransactionDlg.h index 6291863a..f7dc5565 100644 --- a/src/game/UITransactionDlg.h +++ b/src/game/UITransactionDlg.h @@ -26,7 +26,7 @@ class CUITransactionDlg : public CN3UIWndBase { friend class CUIInventory; public: - // ؾ ü + // 직접 접근해야 할 객체 참조 포인터 __IconItemSkill * m_pMyTrade[MAX_ITEM_TRADE_PAGE][MAX_ITEM_TRADE]; __IconItemSkill * m_pMyTradeInv[MAX_ITEM_INVENTORY]; CN3UIString * m_pStrMyGold; @@ -86,7 +86,7 @@ class CUITransactionDlg : public CN3UIWndBase { void SendToServerBuyMsg(int itemID, uint8_t pos, int iCount); void SendToServerMoveMsg(int itemID, uint8_t startpos, uint8_t destpos); - // .. + // 물건 구입이 서버에게 보내기전 성공.. void ReceiveItemDropByTradeSuccess(); CN3UIBase * GetChildButtonByName(const std::string & szFN); @@ -102,7 +102,7 @@ class CUITransactionDlg : public CN3UIWndBase { void ReceiveResultTradeMoveSuccess(); void ReceiveResultTradeMoveFail(); - // ŸƲ ǥ.. + // 타이틀 표시.. void ShowTitle(e_NpcTrade eNT); void GoldUpdate(); diff --git a/src/game/UIVarious.cpp b/src/game/UIVarious.cpp index 0b337e42..a85207f6 100644 --- a/src/game/UIVarious.cpp +++ b/src/game/UIVarious.cpp @@ -36,8 +36,8 @@ CUIState::CUIState() { m_pText_HP = NULL; m_pText_MP = NULL; m_pText_Exp = NULL; - m_pText_AP = NULL; // = NULL - m_pText_GP = NULL; // = NULL + m_pText_AP = NULL; // 공격 = NULL력 + m_pText_GP = NULL; // 방어 = NULL력 m_pText_Weight = NULL; m_pText_BonusPoint = NULL; @@ -84,8 +84,8 @@ void CUIState::Release() { m_pText_HP = NULL; m_pText_MP = NULL; m_pText_Exp = NULL; - m_pText_AP = NULL; // = NULL - m_pText_GP = NULL; // = NULL + m_pText_AP = NULL; // 공격 = NULL력 + m_pText_GP = NULL; // 방어 = NULL력 m_pText_Weight = NULL; m_pText_BonusPoint = NULL; @@ -200,7 +200,7 @@ bool CUIState::Load(HANDLE hFile) { return true; } -void CUIState::UpdateBonusPointAndButtons(int iBonusPointRemain) // ʽ Ʈ Ѱ?? +void CUIState::UpdateBonusPointAndButtons(int iBonusPointRemain) // 보너스 포인트 적용이 가능한가?? { bool bEnable = false; if (iBonusPointRemain > 0) { @@ -214,7 +214,7 @@ bool CUIState::Load(HANDLE hFile) { } if (m_pBtn_Strength) { - m_pBtn_Strength->SetVisible(bEnable); // ġ ü.. + m_pBtn_Strength->SetVisible(bEnable); // 경험치 체인지.. } if (m_pBtn_Stamina) { m_pBtn_Stamina->SetVisible(bEnable); @@ -244,12 +244,12 @@ void CUIState::UpdateLevel(int iVal) { m_pText_Level->SetStringAsInt(iVal); } -void CUIState::UpdateRealmPoint(int iVal) // ⿩ 10  ǥ +void CUIState::UpdateRealmPoint(int iVal) // 국가 기여도는 10을 나누어서 표시 { if (NULL == m_pText_RealmPoint) { return; } - m_pText_RealmPoint->SetStringAsInt(iVal / 10); // ⿩ 10  ǥ + m_pText_RealmPoint->SetStringAsInt(iVal / 10); // 국가 기여도는 10을 나누어서 표시 } void CUIState::UpdateHP(int iVal, int iValMax) { @@ -367,7 +367,7 @@ void CUIState::UpdateRegistPoison(int iVal, int iDelta) { bool CUIState::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (dwMsg == UIMSG_BUTTON_CLICK) { - if (pSender == m_pBtn_Strength) { // ġ ü.. + if (pSender == m_pBtn_Strength) { // 경험치 체인지.. this->MsgSendAblityPointChange(0x01, +1); } else if (pSender == m_pBtn_Stamina) { this->MsgSendAblityPointChange(0x02, +1); @@ -388,7 +388,7 @@ void CUIState::MsgSendAblityPointChange(BYTE byType, short siValueDelta) { int iOffset = 0; CAPISocket::MP_AddByte(byBuff, iOffset, N3_POINT_CHANGE); CAPISocket::MP_AddByte(byBuff, iOffset, byType); - CAPISocket::MP_AddShort(byBuff, iOffset, siValueDelta); // 0x00 - þԲ.. 0x01 - Ʈ.. + CAPISocket::MP_AddShort(byBuff, iOffset, siValueDelta); // 0x00 - 점차 늘어나게끔.. 0x01 - 즉시 업데이트.. CGameProcedure::s_pSocket->Send(byBuff, iOffset); } @@ -613,47 +613,47 @@ bool CUIKnights::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { KNIGHTS_DUTY_VICECHIEF == pInfoExt->eKnightsDuty || KNIGHTS_DUTY_OFFICER == pInfoExt->eKnightsDuty ) { - this->MsgSend_MemberInfoAll(m_iPageCur); // ִ ¸.. ü Ʈ .. + this->MsgSend_MemberInfoAll(m_iPageCur); // 직위가 있는 상태면.. 전체 리스트 보기.. } else if(KNIGHTS_DUTY_UNKNOWN) { } else { - this->MsgSend_MemberInfoOnline(m_iPageCur); // Ϲݱ.. ѵ鸸 ... + this->MsgSend_MemberInfoOnline(m_iPageCur); // 직위가 없는 일반기사면.. 접속한 넘들만 보기... } } } else if(pSender == m_pBtn_Close) SetVisible(false); - else if(pSender == m_pBtn_MemberJoinAdmit) // . + else if(pSender == m_pBtn_MemberJoinAdmit) // 멤버 가입 허락. this->MsgSend_MemberJoinAdmit(); - else if(pSender == m_pBtn_MemberJoinReject) // . + else if(pSender == m_pBtn_MemberJoinReject) // 멤버 가입 거절. this->MsgSend_MemberJoinReject(); - else if(pSender == m_pBtn_MemberPunish) // ¡ + else if(pSender == m_pBtn_MemberPunish) // 멤버 징계 this->MsgSend_MemberPunish(); - else if(pSender == m_pBtn_MemberRemove) // + else if(pSender == m_pBtn_MemberRemove) // 멤버 삭제 this->MsgSend_MemberRemove(); - else if(pSender == m_pBtn_MemberAppoint) // Ӹ + else if(pSender == m_pBtn_MemberAppoint) // 멤버 직위에 임명 { - this->VisibleAppointButtons(true); // Ӹ ư ׷ ̰ ϱ.. + this->VisibleAppointButtons(true); // 임명 버튼들 그룹 보이게 하기.. } else if(pSender == m_pBtn_AppointChief) { this->MsgSend_DutyAppoint(KNIGHTS_DUTY_CHIEF); - this->VisibleAppointButtons(false); // Ӹ ư ׷ Ⱥ̰ ϱ.. + this->VisibleAppointButtons(false); // 임명 버튼들 그룹 안보이게 하기.. } else if(pSender == m_pBtn_AppointViceChief) { this->MsgSend_DutyAppoint(KNIGHTS_DUTY_VICECHIEF); - this->VisibleAppointButtons(false); // Ӹ ư ׷ Ⱥ̰ ϱ.. + this->VisibleAppointButtons(false); // 임명 버튼들 그룹 안보이게 하기.. } else if(pSender == m_pBtn_AppointOfficer) { this->MsgSend_DutyAppoint(KNIGHTS_DUTY_OFFICER); - this->VisibleAppointButtons(false); // Ӹ ư ׷ Ⱥ̰ ϱ.. + this->VisibleAppointButtons(false); // 임명 버튼들 그룹 안보이게 하기.. } - else if(pSender == m_pBtn_Online) // ڸ ̰ Ѵ.. + else if(pSender == m_pBtn_Online) // 접속자만 보이게 한다.. { m_iPageCur = 0; this->MsgSend_MemberInfoOnline(0); @@ -714,8 +714,8 @@ void CUIKnights::UpdateKnightsGrade(int iVal) { /* if(NULL == m_pText_Grade) return; - std::string szVal(" : "); - if(iVal <= 0) szVal += ""; + std::string szVal("등급 : "); + if(iVal <= 0) szVal += "없음"; else szVal += (char)('0'+iVal); m_pText_Grade->SetString(szVal); @@ -726,8 +726,8 @@ void CUIKnights::UpdateKnightsRank(int iVal) { /* if(NULL == m_pText_Rank) return; - std::string szVal(" : "); - if(iVal <= 0) szVal += ""; + std::string szVal("순위 : "); + if(iVal <= 0) szVal += "없음"; else szVal += (char)('0'+iVal); m_pText_Rank->SetString(szVal); @@ -862,7 +862,7 @@ void CUIKnights::MsgSend_MemberInfoOnline(int iPage) CGameProcedure::s_pSocket->Send(byBuff, iOffset); - // ѱ涧 ư ´. + // 페이지를 넘길때는 버튼들을 막아 놓는다. // this->EnableKnightsUIs(false); } //*/ @@ -893,17 +893,17 @@ bool CUIKnights::MsgRecv_MemberInfo(DataPack * pDataPack, int & iOffset) { eClass = (e_Class)CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); iConnected = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); - this->MemberListAdd(szName, eDuty, eClass, iLevel, iConnected); // UI ߰.. + this->MemberListAdd(szName, eDuty, eClass, iLevel, iConnected); // UI 에 추가.. } m_iPageCur = 1; m_pText_Page->SetStringAsInt(m_iPageCur); - this->MemberListUpdate(); // List ־ UI Update!! + this->MemberListUpdate(); // List 에 다 넣었으면 UI Update!! return true; } -void CUIKnights::ChangeUIByDuty(e_KnightsDuty eDuty) // ѿ UI .. +void CUIKnights::ChangeUIByDuty(e_KnightsDuty eDuty) // 권한에 따라 UI 변경.. { if (KNIGHTS_DUTY_CHIEF == eDuty) { m_pBtn_Admit->SetVisible(true); @@ -933,14 +933,14 @@ bool CUIKnights::MsgRecv_MemberInfo(DataPack * pDataPack, int & iOffset) { { } - this->VisibleAppointButtons(false); // Ӹ ư .. + this->VisibleAppointButtons(false); // 임명 버튼 숨기고.. if(m_pGroup_BossCmd) m_pGroup_BossCmd->SetVisible(bVisibles[0]); if(m_pBtn_Online) m_pBtn_Online->SetVisible(bVisibles[1]); */ } /* -void CUIKnights::VisibleAppointButtons(bool bVisible) // Ӹ Interface +void CUIKnights::VisibleAppointButtons(bool bVisible) // 기사단장 전용 임명 Interface { if(NULL == m_pGroup_Appoint) return; m_pGroup_Appoint->SetVisible(bVisible); @@ -957,8 +957,8 @@ void CUIKnights::MsgSend_MemberJoinAdmit() CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_KNIGHTS_MEMBER_JOIN_ADMIT); std::string szName = "???"; - CAPISocket::MP_AddShort(byBuff, iOffset, szName.size()); // ̵ .. - CAPISocket::MP_AddString(byBuff, iOffset, szName); // ̵.. + CAPISocket::MP_AddShort(byBuff, iOffset, szName.size()); // 아이디 길이.. + CAPISocket::MP_AddString(byBuff, iOffset, szName); // 실제 아이디.. CGameProcedure::s_pSocket->Send(byBuff, iOffset); } @@ -974,8 +974,8 @@ void CUIKnights::MsgSend_MemberJoinReject() CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_KNIGHTS_MEMBER_JOIN_REJECT); std::string szName = "???"; - CAPISocket::MP_AddShort(byBuff, iOffset, szName.size()); // ̵ .. - CAPISocket::MP_AddString(byBuff, iOffset, szName); // ̵.. + CAPISocket::MP_AddShort(byBuff, iOffset, szName.size()); // 아이디 길이.. + CAPISocket::MP_AddString(byBuff, iOffset, szName); // 실제 아이디.. CGameProcedure::s_pSocket->Send(byBuff, iOffset); } @@ -991,8 +991,8 @@ void CUIKnights::MsgSend_MemberPunish() CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_KNIGHTS_MEMBER_PUNISH); std::string szName = "???"; - CAPISocket::MP_AddShort(byBuff, iOffset, szName.size()); // ̵ .. - CAPISocket::MP_AddString(byBuff, iOffset, szName); // ̵.. + CAPISocket::MP_AddShort(byBuff, iOffset, szName.size()); // 아이디 길이.. + CAPISocket::MP_AddString(byBuff, iOffset, szName); // 실제 아이디.. CGameProcedure::s_pSocket->Send(byBuff, iOffset); } @@ -1008,8 +1008,8 @@ void CUIKnights::MsgSend_MemberRemove() CAPISocket::MP_AddByte(byBuff, iOffset, N3_SP_KNIGHTS_MEMBER_REMOVE); std::string szName = "???"; - CAPISocket::MP_AddShort(byBuff, iOffset, szName.size()); // ̵ .. - CAPISocket::MP_AddString(byBuff, iOffset, szName); // ̵.. + CAPISocket::MP_AddShort(byBuff, iOffset, szName.size()); // 아이디 길이.. + CAPISocket::MP_AddString(byBuff, iOffset, szName); // 실제 아이디.. CGameProcedure::s_pSocket->Send(byBuff, iOffset); } @@ -1033,8 +1033,8 @@ void CUIKnights::MsgSend_DutyAppoint(e_KnightsDuty eDuty) CAPISocket::MP_AddByte(byBuff, iOffset, eSP); std::string szName = "???"; - CAPISocket::MP_AddShort(byBuff, iOffset, szName.size()); // ̵ .. - CAPISocket::MP_AddString(byBuff, iOffset, szName); // ̵.. + CAPISocket::MP_AddShort(byBuff, iOffset, szName.size()); // 아이디 길이.. + CAPISocket::MP_AddString(byBuff, iOffset, szName); // 실제 아이디.. CGameProcedure::s_pSocket->Send(byBuff, iOffset); } @@ -1057,7 +1057,7 @@ CUIFriends::CUIFriends() { } CUIFriends::~CUIFriends() { - this->SaveListToTextFile(""); // .. + this->SaveListToTextFile(""); // 몽땅 저장.. } bool CUIFriends::Load(HANDLE hFile) { @@ -1087,11 +1087,11 @@ bool CUIFriends::Load(HANDLE hFile) { __ASSERT(m_pBtn_Delete, "NULL UI Component!!"); std::string szFN = - CGameProcedure::s_szAccount + "_" + CGameProcedure::s_szServer + ".txt"; // ̸ _.txt Ѵ. + CGameProcedure::s_szAccount + "_" + CGameProcedure::s_szServer + ".txt"; // 파일이름은 계정_서버.txt 로 한다. FILE * pFile = fopen(szFN.c_str(), "r"); if (pFile) { char szLine[256] = ""; - char * pszResult = fgets(szLine, 256, pFile); // а.. + char * pszResult = fgets(szLine, 256, pFile); // 줄을 읽고.. while (pszResult) { int iLen = lstrlen(szLine); if (iLen > 3 && iLen <= 22) { @@ -1109,7 +1109,7 @@ bool CUIFriends::Load(HANDLE hFile) { this->MemberAdd(szTmp, -1, false, false); } } - pszResult = fgets(szLine, 256, pFile); // ù° а.. + pszResult = fgets(szLine, 256, pFile); // 첫째 줄을 읽고.. } fclose(pFile); @@ -1119,10 +1119,10 @@ bool CUIFriends::Load(HANDLE hFile) { return true; } -void CUIFriends::SaveListToTextFile(const std::string & szID) // ڿ ߰ϰ.. .. +void CUIFriends::SaveListToTextFile(const std::string & szID) // 문자열이 있으면 추가하고.. 없으면 몽땅 저장.. { std::string szFN = - CGameProcedure::s_szAccount + "_" + CGameProcedure::s_szServer + ".txt"; // ̸ _.txt Ѵ. + CGameProcedure::s_szAccount + "_" + CGameProcedure::s_szServer + ".txt"; // 파일이름은 계정_서버.txt 로 한다. char szFlags[4] = "w"; if (!szID.empty()) { lstrcpy(szFlags, "a"); @@ -1181,25 +1181,25 @@ bool CUIFriends::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { } } - if (iPagePrev != m_iPageCur) // ɶ + if (iPagePrev != m_iPageCur) // 페이지가 변경될때 { this->UpdateList(); this->MsgSend_MemberInfo(false); } - } else if (pSender == m_pBtn_Refresh) // ȭ ... + } else if (pSender == m_pBtn_Refresh) // 새 화면으로 갱신... { this->MsgSend_MemberInfo(true); - } else if (pSender == m_pBtn_Add) // ߰. + } else if (pSender == m_pBtn_Add) // 추가. { CPlayerOther * pUPC = CGameProcedure::s_pOPMgr->UPCGetByID(CGameProcedure::s_pPlayer->m_iIDTarget, false); if (pUPC) { - if (this->MemberAdd(pUPC->IDString(), pUPC->IDNumber(), true, false)) // ߰ ̸.. + if (this->MemberAdd(pUPC->IDString(), pUPC->IDNumber(), true, false)) // 추가 성공이면.. { - this->SaveListToTextFile(pUPC->IDString()); // Ͽ ߰ .. + this->SaveListToTextFile(pUPC->IDString()); // 파일에 추가 저장.. this->MsgSend_MemberInfo(pUPC->IDString()); } } - } else if (pSender == m_pBtn_Delete) // + } else if (pSender == m_pBtn_Delete) // 멤버 삭제 { if (m_pList_Friends) { int iSel = m_pList_Friends->GetCurSel(); @@ -1207,10 +1207,10 @@ bool CUIFriends::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { m_pList_Friends->GetString(iSel, szID); if (this->MemberDelete(szID)) { - this->UpdateList(); // Ʈ Ʈ.. + this->UpdateList(); // 리스트 업데이트.. } } - } else if (pSender == m_pBtn_Whisper) // ӼӸ + } else if (pSender == m_pBtn_Whisper) // 귓속말 { if (m_pList_Friends) { int iSel = m_pList_Friends->GetCurSel(); @@ -1218,7 +1218,7 @@ bool CUIFriends::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { m_pList_Friends->GetString(iSel, szID); pProcMain->MsgSend_ChatSelectTarget(szID); } - } else if (pSender == m_pBtn_Party) // Ƽ û + } else if (pSender == m_pBtn_Party) // 파티 신청 { int iSel = m_pList_Friends->GetCurSel(); std::string szID; @@ -1227,9 +1227,9 @@ bool CUIFriends::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (it != m_MapFriends.end()) { std::string szMsg; if (pProcMain->MsgSend_PartyOrForceCreate(0, szID)) { - ::_LoadStringFromResource(IDS_PARTY_INVITE, szMsg); // Ƽ + ::_LoadStringFromResource(IDS_PARTY_INVITE, szMsg); // 파티 } else { - ::_LoadStringFromResource(IDS_PARTY_INVITE_FAILED, szMsg); // Ƽ ʴ + ::_LoadStringFromResource(IDS_PARTY_INVITE_FAILED, szMsg); // 파티 초대 실패 } pProcMain->MsgOutput(it->second.szName + szMsg, 0xffffff00); } @@ -1296,7 +1296,7 @@ void CUIFriends::UpdateList() { } if (m_pText_Page) { - m_pText_Page->SetStringAsInt(m_iPageCur + 1); // ǥ.. + m_pText_Page->SetStringAsInt(m_iPageCur + 1); // 페이지 표시.. } it_FI it = m_MapFriends.begin(), itEnd = m_MapFriends.end(); @@ -1322,7 +1322,7 @@ void CUIFriends::UpdateList() { m_pList_Friends->SetFontColor(iIndex, crStatus); } - m_pList_Friends->SetCurSel(iSelPrev); // .. + m_pList_Friends->SetCurSel(iSelPrev); // 전의 선택으로 돌리기.. } void CUIFriends::MsgSend_MemberInfo(bool bDisableInterval) { @@ -1352,7 +1352,7 @@ void CUIFriends::MsgSend_MemberInfo(bool bDisableInterval) { CAPISocket::MP_AddByte( &(buffers[0]), iOffset, - N3_FRIEND_INFO); // ģ .. Send s1(̸), str1(̸) | Receive s1(̸), str1(̸), s1(ID), b2(, Ƽ) + N3_FRIEND_INFO); // 친구 정보.. Send s1(이름길이), str1(유저이름) | Receive s1(이름길이), str1(유저이름), s1(ID), b2(접속, 파티) CAPISocket::MP_AddShort(&(buffers[0]), iOffset, iFC); for (int i = 0; i < iFC; i++) { std::string szID; @@ -1375,7 +1375,7 @@ void CUIFriends::MsgSend_MemberInfo(const std::string & szID) { CAPISocket::MP_AddByte( byBuff, iOffset, - N3_FRIEND_INFO); // ģ .. Send s1(̸), str1(̸) | Receive s1(̸), str1(̸), s1(ID), b2(, Ƽ) + N3_FRIEND_INFO); // 친구 정보.. Send s1(이름길이), str1(유저이름) | Receive s1(이름길이), str1(유저이름), s1(ID), b2(접속, 파티) CAPISocket::MP_AddShort(byBuff, iOffset, iFC); CAPISocket::MP_AddShort(byBuff, iOffset, szID.size()); @@ -1394,7 +1394,7 @@ void CUIFriends::MsgRecv_MemberInfo(DataPack * pDataPack, int & iOffset) { for (int i = 0; i < iFC; i++) { iLen = CAPISocket::Parse_GetShort( pDataPack->m_pData, - iOffset); // ģ .. Send s1(̸), str1(̸) | Receive s1(̸), str1(̸), s1(ID), b2(, Ƽ) + iOffset); // 친구 정보.. Send s1(이름길이), str1(유저이름) | Receive s1(이름길이), str1(유저이름), s1(ID), b2(접속, 파티) CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szID, iLen); iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); bStatus = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); @@ -1428,9 +1428,9 @@ CUIVarious::CUIVarious() { m_pPageQuest = NULL; m_pPageFriends = NULL; - m_bOpenningNow = false; // ִ.. - m_bClosingNow = false; // ִ.. - m_fMoveDelta = 0; // ε巴 ؼ ġ 꿡 εҼ .. + m_bOpenningNow = false; // 열리고 있다.. + m_bClosingNow = false; // 닫히고 있다.. + m_fMoveDelta = 0; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. } CUIVarious::~CUIVarious() {} @@ -1449,9 +1449,9 @@ void CUIVarious::Release() { m_pPageQuest = NULL; m_pPageFriends = NULL; - m_bOpenningNow = false; // ִ.. - m_bClosingNow = false; // ִ.. - m_fMoveDelta = 0; // ε巴 ؼ ġ 꿡 εҼ .. + m_bOpenningNow = false; // 열리고 있다.. + m_bClosingNow = false; // 닫히고 있다.. + m_fMoveDelta = 0; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. } bool CUIVarious::Load(HANDLE hFile) { @@ -1470,7 +1470,7 @@ bool CUIVarious::Load(HANDLE hFile) { m_pBtn_Close = (CN3UIButton *)(this->GetChildByID("Btn_Close")); __ASSERT(m_pBtn_Close, "NULL UI Component!!"); - // UI ȵǾ .. + // 아직 UI 가 안되어 있으니 막자.. if (m_pBtn_Quest) { m_pBtn_Quest->SetState(UI_STATE_BUTTON_DISABLE); } @@ -1516,13 +1516,13 @@ bool CUIVarious::Load(HANDLE hFile) { bool CUIVarious::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (dwMsg == UIMSG_BUTTON_CLICK) { if (pSender == m_pBtn_Close) { - this->Close(); // ݴ´.. + this->Close(); // 닫는다.. } else if (pSender == m_pBtn_State) { this->UpdatePageButtons(m_pBtn_State); } - // else if(pSender == m_pBtn_Quest) this->UpdatePageButtons(m_pBtn_Quest); // Ʈ... + // else if(pSender == m_pBtn_Quest) this->UpdatePageButtons(m_pBtn_Quest); // 퀘스트... else if (pSender == m_pBtn_Knights) { - this->UpdatePageButtons(m_pBtn_Knights); // ... .. + this->UpdatePageButtons(m_pBtn_Knights); // 기사단... 잠시 막자.. } else if (pSender == m_pBtn_Friends) { this->UpdatePageButtons(m_pBtn_Friends); } @@ -1560,12 +1560,12 @@ void CUIVarious::UpdatePageButtons(CN3UIButton * pButtonToActive) { } if (pButtonToActive == m_pBtn_Friends && m_pPageFriends) { - m_pPageFriends->MsgSend_MemberInfo(false); // ̷ ģƮ ƮѴ.. + m_pPageFriends->MsgSend_MemberInfo(false); // 이러면 친구리스트를 업데이트한다.. } } void CUIVarious::Open() { - // !! + // 스르륵 열린다!! this->SetVisible(true); RECT rc = this->GetRegion(); this->SetPos(-(rc.right - rc.left), 80); @@ -1573,26 +1573,26 @@ void CUIVarious::Open() { m_bOpenningNow = true; m_bClosingNow = false; - // Ʈ ûؼ ޴´. + // 기사단 리스트가 없으면 요청해서 받는다. // __InfoPlayerMySelf* pInfoExt = &(CGameBase::s_pPlayer->m_InfoExt); // if(m_pPageKnights->NeedMemberListRequest() && pInfoExt->iKnightsID > 0) // { // m_pPageKnights->MsgSend_MemberInfoOnline(0); // } - // // ̰ų α̸...UI ޶ Ѵ.. - // m_pPageKnights->ChangeUIByDuty(pInfoExt->eKnightsDuty); // ѿ UI .. + // // 기사단장이거나 간부급이면...UI 가 달라야 한다.. + // m_pPageKnights->ChangeUIByDuty(pInfoExt->eKnightsDuty); // 권한에 따라 UI 변경.. } void CUIVarious::Close() { - // ..!! - // SetVisible(false); // ش.. + // 스르륵 닫힌다..!! + // SetVisible(false); // 다 닫히고 나서 해준다.. this->SetPos(0, 80); m_fMoveDelta = 0; m_bOpenningNow = false; m_bClosingNow = true; if (m_pSnd_CloseUI) { - m_pSnd_CloseUI->Play(); // ݴ Ҹ.. + m_pSnd_CloseUI->Play(); // 닫는 소리.. } } @@ -1604,7 +1604,7 @@ void CUIVarious::Tick() { m_pPageKnights->m_fTimeLimit_Remove += CN3Base::s_fSecPerFrm; } - if (m_bOpenningNow) // ʿ ... Ѵٸ.. + if (m_bOpenningNow) // 오른쪽에서 왼쪽으로 스르륵...열려야 한다면.. { POINT ptCur = this->GetPos(); RECT rc = this->GetRegion(); @@ -1619,14 +1619,14 @@ void CUIVarious::Tick() { int iXLimit = 0; ptCur.x = (int)(m_fMoveDelta - fWidth); - if (ptCur.x >= iXLimit) // ٿȴ!! + if (ptCur.x >= iXLimit) // 다열렸다!! { ptCur.x = iXLimit; m_bOpenningNow = false; } this->SetPos(ptCur.x, ptCur.y); - } else if (m_bClosingNow) // ʿ ... Ѵٸ.. + } else if (m_bClosingNow) // 오른쪽에서 왼쪽으로 스르륵...열려야 한다면.. { POINT ptCur = this->GetPos(); RECT rc = this->GetRegion(); @@ -1641,12 +1641,12 @@ void CUIVarious::Tick() { int iXLimit = -fWidth; ptCur.x = -m_fMoveDelta; - if (ptCur.x <= iXLimit) // ..!! + if (ptCur.x <= iXLimit) // 다 닫혔다..!! { ptCur.x = iXLimit; m_bClosingNow = false; - this->SetVisibleWithNoSound(false, false, true); // Ⱥ̰ Ѵ. + this->SetVisibleWithNoSound(false, false, true); // 다 닫혔으니 눈에서 안보이게 한다. CGameProcedure::s_pUIMgr->ReFocusUI(); //this_ui } @@ -1663,19 +1663,19 @@ void CUIVarious::UpdateAllStates(const __InfoPlayerBase * pInfoBase, const __Inf std::string szVal; - if (m_pPageState->m_pText_Class) // + if (m_pPageState->m_pText_Class) // 직업 { CGameProcedure::GetTextByClass(pInfoBase->eClass, szVal); m_pPageState->m_pText_Class->SetString(szVal); } - // + // 종족 if (m_pPageState->m_pText_Race) { CGameProcedure::GetTextByRace(pInfoBase->eRace, szVal); m_pPageState->m_pText_Race->SetString(szVal); } - // + // 국가 if (m_pPageState->m_pText_Nation) { CGameProcedure::GetTextByNation(pInfoBase->eNation, szVal); m_pPageState->m_pText_Nation->SetString(szVal); @@ -1691,7 +1691,7 @@ void CUIVarious::UpdateAllStates(const __InfoPlayerBase * pInfoBase, const __Inf m_pPageState->UpdateAttackPoint(pInfoExt->iAttack, pInfoExt->iAttack_Delta); m_pPageState->UpdateGuardPoint(pInfoExt->iGuard, pInfoExt->iGuard_Delta); - m_pPageState->UpdateBonusPointAndButtons(pInfoExt->iBonusPointRemain); // ʽ Ʈ Ѱ?? + m_pPageState->UpdateBonusPointAndButtons(pInfoExt->iBonusPointRemain); // 보너스 포인트 적용이 가능한가?? m_pPageState->UpdateStrength(pInfoExt->iStrength, pInfoExt->iStrength_Delta); m_pPageState->UpdateStamina(pInfoExt->iStamina, pInfoExt->iStamina_Delta); @@ -1706,10 +1706,10 @@ void CUIVarious::UpdateAllStates(const __InfoPlayerBase * pInfoBase, const __Inf m_pPageState->UpdateRegistLight(pInfoExt->iRegistLight, pInfoExt->iRegistLight_Delta); m_pPageState->UpdateRegistPoison(pInfoExt->iRegistPoison, pInfoExt->iRegistPoison_Delta); - // Ʈ... - m_pPageState->UpdateRealmPoint(pInfoExt->iRealmPoint); // ⿩ 10  ǥ + // 기사단 관련 정보 업데이트... + m_pPageState->UpdateRealmPoint(pInfoExt->iRealmPoint); // 국가 기여도는 10을 나누어서 표시 - // ij ɷġ Ʈ ̹ Ʈ.. + // 캐릭터 능력치 포인트 이미지 업데이트.. if (m_pPageState->m_pImg_Str) { m_pPageState->m_pImg_Str->SetVisible(false); } diff --git a/src/game/UIVarious.h b/src/game/UIVarious.h index 4c7a428e..ca77b720 100644 --- a/src/game/UIVarious.h +++ b/src/game/UIVarious.h @@ -22,8 +22,8 @@ class CUIState : public CN3UIBase { CN3UIString * m_pText_HP; CN3UIString * m_pText_MP; CN3UIString * m_pText_Exp; - CN3UIString * m_pText_AP; // ݷ - CN3UIString * m_pText_GP; // + CN3UIString * m_pText_AP; // 공격력 + CN3UIString * m_pText_GP; // 방어력 CN3UIString * m_pText_Weight; CN3UIString * m_pText_BonusPoint; @@ -54,11 +54,11 @@ class CUIState : public CN3UIBase { CN3UIBase * m_pImg_Str; public: - void UpdateBonusPointAndButtons(int iBonusPointRemain); // ʽ Ʈ Ѱ?? + void UpdateBonusPointAndButtons(int iBonusPointRemain); // 보너스 포인트 적용이 가능한가?? void UpdateID(const std::string & szID); void UpdateLevel(int iVal); - void UpdateRealmPoint(int iVal); // ⿩ 10  ǥ + void UpdateRealmPoint(int iVal); // 국가 기여도는 10을 나누어서 표시 void UpdateHP(int iVal, int iValMax); void UpdateMSP(int iVal, int iValMax); @@ -80,7 +80,7 @@ class CUIState : public CN3UIBase { void UpdateRegistCurse(int iVal, int iDelta); void UpdateRegistPoison(int iVal, int iDelta); - void MsgSendAblityPointChange(BYTE byType, short siValueDelta); // ɷġ ȭ Ŷ .. + void MsgSendAblityPointChange(BYTE byType, short siValueDelta); // 능력치 변화 패킷으로 보내기.. virtual bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); virtual bool Load(HANDLE hFile); @@ -90,12 +90,12 @@ class CUIState : public CN3UIBase { virtual ~CUIState(); }; -struct __KnightsMemberInfo // ܿ .. +struct __KnightsMemberInfo // 기사 단원 정보.. { std::string szName; - int iLevel; // ÷̾ .. - e_Class eClass; // . - e_KnightsDuty eDuty; // . + int iLevel; // 플레이어 레벨.. + e_Class eClass; // 직업. + e_KnightsDuty eDuty; // 기사단 직위. int iConnected; }; @@ -152,7 +152,7 @@ class CUIKnights : public CN3UIBase { CUIKnights(); virtual ~CUIKnights(); - // .... + //쓰지 않음.... bool NeedMemberListRequest() { if (m_MemberList.empty()) { return true; @@ -162,7 +162,7 @@ class CUIKnights : public CN3UIBase { } void ChangeUIByDuty(e_KnightsDuty eDuty); - //void VisibleAppointButtons(bool bVisible); // Ӹ Interface + //void VisibleAppointButtons(bool bVisible); // 기사단장 전용 임명 Interface //void MsgSend_MemberInfoOnline(int iPage); bool MsgRecv_MemberInfo(class DataPack * pDataPack, int & iOffset); @@ -174,12 +174,12 @@ class CUIKnights : public CN3UIBase { //void MsgSend_DutyAppoint(e_KnightsDuty eDuty); }; -struct __FriendsInfo // ܿ .. +struct __FriendsInfo // 기사 단원 정보.. { std::string szName; int iID; // ID - bool bOnLine; // ߳? - bool bIsParty; // Ƽ ÷ΰ? + bool bOnLine; // 접속했나? + bool bIsParty; // 파티 플레이중인가? void Init() { szName = ""; @@ -212,9 +212,9 @@ class CUIFriends : public CN3UIBase { CN3UIButton * m_pBtn_Delete; public: - void SaveListToTextFile(const std::string & szID); // ڿ ߰ϰ.. .. - void MsgSend_MemberInfo(bool bDisableInterval); // û - void MsgSend_MemberInfo(const std::string & szID); // ̳Ѹ û.. + void SaveListToTextFile(const std::string & szID); // 문자열이 있으면 추가하고.. 없으면 몽땅 저장.. + void MsgSend_MemberInfo(bool bDisableInterval); // 현재 페이지 정보 요청 + void MsgSend_MemberInfo(const std::string & szID); // 이넘만 요청.. void MsgRecv_MemberInfo(DataPack * pDataPack, int & iOffset); void UpdateList(); bool MemberDelete(const std::string & szID); @@ -233,7 +233,7 @@ class CUIQuest : public CN3UIBase { virtual ~CUIQuest(); }; -class CUIVarious : public CN3UIBase // ٿ뵵 UI +class CUIVarious : public CN3UIBase // 다용도 UI { public: CUIState * m_pPageState; @@ -248,9 +248,9 @@ class CUIQuest : public CN3UIBase { CN3UIButton * m_pBtn_Friends; CN3UIButton * m_pBtn_Close; - bool m_bOpenningNow; // ִ.. - bool m_bClosingNow; // ִ.. - float m_fMoveDelta; // ε巴 ؼ ġ 꿡 εҼ .. + bool m_bOpenningNow; // 열리고 있다.. + bool m_bClosingNow; // 닫히고 있다.. + float m_fMoveDelta; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. public: void SetVisibleWithNoSound(bool bVisible, bool bWork = false, bool bReFocus = false); @@ -258,7 +258,7 @@ class CUIQuest : public CN3UIBase { bool OnKeyPress(int iKey); void UpdatePageButtons(CN3UIButton * pButtonToActive); void UpdateAllStates(const __InfoPlayerBase * pInfoBase, const __InfoPlayerMySelf * pInfoExt); - void UpdateKnightsInfo(); // Ʈ + void UpdateKnightsInfo(); // 기사단 관련 정보 업데이트 void Open(); void Close(); diff --git a/src/game/UIWareHouseDlg.cpp b/src/game/UIWareHouseDlg.cpp index 885ff4e4..cef05e5b 100644 --- a/src/game/UIWareHouseDlg.cpp +++ b/src/game/UIWareHouseDlg.cpp @@ -85,7 +85,7 @@ void CUIWareHouseDlg::Release() { void CUIWareHouseDlg::Render() { if (!m_bVisible) { - return; // ڽĵ render ʴ´. + return; // 보이지 않으면 자식들을 render하지 않는다. } POINT ptCur = CGameProcedure::s_pLocalInput->MouseGetPos(); @@ -109,12 +109,12 @@ void CUIWareHouseDlg::Render() { } } - // ǥõǾ ǥ.. + // 갯수 표시되야 할 아이템 갯수 표시.. for (int i = 0; i < MAX_ITEM_TRADE; i++) { if (m_pMyWare[m_iCurPage][i] && ((m_pMyWare[m_iCurPage][i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (m_pMyWare[m_iCurPage][i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL))) { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i + 100); if (pStr) { if ((GetState() == UI_STATE_ICON_MOVING) && @@ -131,7 +131,7 @@ void CUIWareHouseDlg::Render() { } } } else { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i + 100); if (pStr) { pStr->SetVisible(false); @@ -142,7 +142,7 @@ void CUIWareHouseDlg::Render() { for (int i = 0; i < MAX_ITEM_INVENTORY; i++) { if (m_pMyWareInv[i] && ((m_pMyWareInv[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (m_pMyWareInv[i]->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL))) { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i); if (pStr) { if ((GetState() == UI_STATE_ICON_MOVING) && @@ -159,7 +159,7 @@ void CUIWareHouseDlg::Render() { } } } else { - // string .. + // string 얻기.. CN3UIString * pStr = GetChildStringByiOrder(i); if (pStr) { pStr->SetVisible(false); @@ -286,7 +286,7 @@ DWORD CUIWareHouseDlg::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT return dwRet; } - // 巡 Ǵ .. + // 드래그 되는 아이콘 갱신.. if ((GetState() == UI_STATE_ICON_MOVING) && (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd == UIWND_WARE_HOUSE)) { CN3UIWndBase::m_sSelectedIconInfo.pItemSelect->pUIIcon->SetRegion(GetSampleRect()); @@ -310,13 +310,13 @@ bool CUIWareHouseDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { if (dwMsg == UIMSG_BUTTON_CLICK) { if (pSender == m_pBtnGold) { - // κ丮 .. + // 인벤토리만 떠 있을때.. CN3UIWndBase::m_pCountableItemEdit->Open(UIWND_WARE_HOUSE, UIWND_DISTRICT_TRADE_MY, true, true); return true; } if (pSender == m_pBtnGoldWareHouse) { - // κ丮 .. + // 인벤토리만 떠 있을때.. CN3UIWndBase::m_pCountableItemEdit->Open(UIWND_WARE_HOUSE, UIWND_DISTRICT_TRADE_NPC, true, true); return true; } @@ -420,9 +420,9 @@ bool CUIWareHouseDlg::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { break; case UIMSG_ICON_UP: - // Ŵ ٴϸ鼭 ˻.. + // 아이콘 매니저 윈도우들을 돌아 다니면서 검사.. if (!CGameProcedure::s_pUIMgr->BroadcastIconDropMsg(CN3UIWndBase::m_sSelectedIconInfo.pItemSelect)) { - // ġ .. + // 아이콘 위치 원래대로.. IconRestore(); } // Sound.. @@ -453,7 +453,7 @@ void CUIWareHouseDlg::LeaveWareHouseState() { SetState(UI_STATE_COMMON_NONE); CN3UIWndBase::AllHighLightIconFree(); - // inv κ丮 inv ű.. + // 이 윈도우의 inv 영역의 아이템을 이 인벤토리 윈도우의 inv영역으로 옮긴다.. ItemMoveFromThisToInv(); if (CGameProcedure::s_pProcMain->m_pUISkillTreeDlg) { @@ -594,7 +594,7 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { return false; } - // ƴϸ.. + // 내가 가졌던 아이콘이 아니면.. if (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWnd != m_eUIWnd) { FAIL_RETURN } @@ -603,7 +603,7 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { FAIL_RETURN } - // ̸.. npc ˻Ѵ.. + // 내가 가졌던 아이콘이면.. npc영역인지 검사한다.. int i, iDestiOrder = -1; bool bFound = false; for (i = 0; i < MAX_ITEM_TRADE; i++) { @@ -632,8 +632,8 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { FAIL_RETURN } - // Recovery Info Ȱϱ Ѵ.. - // WaitFromServer On ϰ.. Select Info Recovery Info .. ̶ Dest ӿ.. + // 본격적으로 Recovery Info를 활용하기 시작한다.. + // 먼저 WaitFromServer를 On으로 하고.. Select Info를 Recovery Info로 복사.. 이때 Dest는 팰요없다.. if (spItem != CN3UIWndBase::m_sSelectedIconInfo.pItemSelect) { CN3UIWndBase::m_sSelectedIconInfo.pItemSelect = spItem; } @@ -651,12 +651,12 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { switch (CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict) { case UIWND_DISTRICT_TRADE_NPC: - if (eUIWnd == UIWND_DISTRICT_TRADE_MY) // .. + if (eUIWnd == UIWND_DISTRICT_TRADE_MY) // 빼는 경우.. { if ((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) { - // Ȱ̳ .. - // κ丮 ش ִ ˾ƺ.. + // 활이나 물약등 아이템인 경우.. + // 면저 인벤토리에 해당 아이콘이 있는지 알아본다.. bFound = false; for (i = 0; i < MAX_ITEM_INVENTORY; i++) { @@ -672,11 +672,11 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } } - // ã.. + // 못찾았으면.. if (!bFound) { - if (m_pMyWareInv[iDestiOrder]) // ش ġ .. + if (m_pMyWareInv[iDestiOrder]) // 해당 위치에 아이콘이 있으면.. { - // κ丮 󽽷 ã .. + // 인벤토리 빈슬롯을 찾아 들어간다.. for (i = 0; i < MAX_ITEM_INVENTORY; i++) { if (!m_pMyWareInv[i]) { bFound = true; @@ -685,7 +685,7 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } } - if (!bFound) // ã .. + if (!bFound) // 빈 슬롯을 찾지 못했으면.. { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; @@ -702,10 +702,10 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { UIWND_WARE_HOUSE, CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict, false); FAIL_RETURN } else { - // Ϲ .. - if (m_pMyWareInv[iDestiOrder]) // ش ġ .. + // 일반 아이템인 경우.. + if (m_pMyWareInv[iDestiOrder]) // 해당 위치에 아이콘이 있으면.. { - // κ丮 󽽷 ã .. + // 인벤토리 빈슬롯을 찾아 들어간다.. bFound = false; for (i = 0; i < MAX_ITEM_INVENTORY; i++) { if (!m_pMyWareInv[i]) { @@ -715,7 +715,7 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } } - if (!bFound) // ã .. + if (!bFound) // 빈 슬롯을 찾지 못했으면.. { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; @@ -728,7 +728,7 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = iDestiOrder; } - // üũ.. + // 무게 체크.. __InfoPlayerMySelf * pInfoExt = &(CGameBase::s_pPlayer->m_InfoExt); if ((pInfoExt->iWeight + CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->siWeight) > pInfoExt->iWeightMax) { @@ -757,7 +757,7 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { FAIL_RETURN } } else { - // ̵.. + // 이동.. __IconItemSkill *spItemSource, *spItemTarget = NULL; spItemSource = CN3UIWndBase::m_sRecoveryJobInfo.pItemSource; @@ -770,8 +770,8 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = iDestiOrder; - // â ̵.. ( Ϲ Ѵ..) - if (m_pMyWare[m_iCurPage][iDestiOrder]) // ش ġ .. + // 창고 내에서 이동.. (모두 일반 아이템으로 취급한다..) + if (m_pMyWare[m_iCurPage][iDestiOrder]) // 해당 위치에 아이콘이 있으면.. { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; @@ -784,7 +784,7 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { m_pMyWare[m_iCurPage][iDestiOrder] = spItemSource; m_pMyWare[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = spItemTarget; - // ̵ ޽ .. + // 이동 메시지를 보낸다.. SendToServerWareToWareMsg(CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->dwID + CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemExt->dwID, m_iCurPage, CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder, @@ -795,15 +795,15 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { break; case UIWND_DISTRICT_TRADE_MY: - if (eUIWnd == UIWND_DISTRICT_TRADE_NPC) // ִ .. + if (eUIWnd == UIWND_DISTRICT_TRADE_NPC) // 넣는 경우.. { if ((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) { - // Ȱ̳ .. - // Ware ִ ˾ƺ.. + // 활이나 물약등 아이템인 경우.. + // 면저 Ware에 아이콘이 있는지 알아본다.. bFound = false; - // 10 .. + // 10개의 폐이지를 다 뒤진다.. for (int iPage = 0; iPage < MAX_ITEM_WARE_PAGE; iPage++) { if (bFound) { break; @@ -824,11 +824,11 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } } - // ã.. + // 못찾았으면.. if (!bFound) { - if (m_pMyWare[m_iCurPage][iDestiOrder]) // ش ġ .. + if (m_pMyWare[m_iCurPage][iDestiOrder]) // 해당 위치에 아이콘이 있으면.. { - // 󽽷 ã .. + // 빈슬롯을 찾아 들어간다.. for (int iPage = 0; iPage < MAX_ITEM_WARE_PAGE; iPage++) { if (bFound) { break; @@ -847,7 +847,7 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } } - if (!bFound) // ã .. + if (!bFound) // 빈 슬롯을 찾지 못했으면.. { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; @@ -866,13 +866,13 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { UIWND_WARE_HOUSE, CN3UIWndBase::m_sSelectedIconInfo.UIWndSelect.UIWndDistrict, false); FAIL_RETURN } else { - // Ϲ .. - if (m_pMyWare[m_iCurPage][iDestiOrder]) // ش ġ .. + // 일반 아이템인 경우.. + if (m_pMyWare[m_iCurPage][iDestiOrder]) // 해당 위치에 아이콘이 있으면.. { - // κ丮 󽽷 ã .. + // 인벤토리 빈슬롯을 찾아 들어간다.. bFound = false; - // 10 .. + // 10개의 폐이지를 다 뒤진다.. for (int iPage = 0; iPage < MAX_ITEM_WARE_PAGE; iPage++) { if (bFound) { break; @@ -892,7 +892,7 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { } } - if (!bFound) // ã .. + if (!bFound) // 빈 슬롯을 찾지 못했으면.. { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; @@ -930,7 +930,7 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { FAIL_RETURN } } else { - // ̵.. + // 이동.. __IconItemSkill *spItemSource, *spItemTarget = NULL; spItemSource = CN3UIWndBase::m_sRecoveryJobInfo.pItemSource; @@ -943,8 +943,8 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder = iDestiOrder; - // Inv ̵.. ( Ϲ Ѵ..) - if (m_pMyWareInv[iDestiOrder]) // ش ġ .. + // Inv 내에서 이동.. (모두 일반 아이템으로 취급한다..) + if (m_pMyWareInv[iDestiOrder]) // 해당 위치에 아이콘이 있으면.. { CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = m_pMyWareInv[iDestiOrder]; CN3UIWndBase::m_sRecoveryJobInfo.UIWndTargetStart.UIWnd = UIWND_WARE_HOUSE; @@ -971,7 +971,7 @@ bool CUIWareHouseDlg::ReceiveIconDrop(__IconItemSkill * spItem, POINT ptCur) { m_pMyWareInv[iDestiOrder] = spItemSource; m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = spItemTarget; - // ̵ ޽ .. + // 이동 메시지를 보낸다.. SendToServerInvToInvMsg(CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->dwID + CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemExt->dwID, m_iCurPage, CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder, iDestiOrder); @@ -1052,14 +1052,14 @@ void CUIWareHouseDlg::SendToServerInvToInvMsg(int iItemID, uint8_t page, uint8_t CGameProcedure::s_pSocket->Send(byBuff, iOffset); } -void CUIWareHouseDlg::ReceiveResultToWareMsg(BYTE bResult) // ִ .. +void CUIWareHouseDlg::ReceiveResultToWareMsg(BYTE bResult) // 넣는 경우.. { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; int64_t iGold = CN3UIWndBase::m_pCountableItemEdit->GetQuantity(); __IconItemSkill * spItem; CN3UIArea * pArea = NULL; - if (bResult != 0x01) // .. + if (bResult != 0x01) // 실패.. { if (m_bSendedItemGold) { ReceiveResultGoldToWareFail(); @@ -1067,7 +1067,7 @@ void CUIWareHouseDlg::SendToServerInvToInvMsg(int iItemID, uint8_t page, uint8_t } if ((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == - UIITEM_TYPE_COUNTABLE_SMALL)) // Ȱ̳ .. + UIITEM_TYPE_COUNTABLE_SMALL)) // 활이나 물약등 아이템인 경우.. { // Ware Side.. ////////////////////////////////////////////////////// @@ -1077,23 +1077,23 @@ void CUIWareHouseDlg::SendToServerInvToInvMsg(int iItemID, uint8_t page, uint8_t [CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] ->iCount - iGold) > 0) { - // Ʈ.. + // 숫자 업데이트.. m_pMyWare[CN3UIWndBase::m_sRecoveryJobInfo.m_iPage] [CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] ->iCount -= iGold; } else { - // .. κ丮 츸.. + // 아이템 삭제.. 현재 인벤토리 윈도우만.. spItem = m_pMyWare[CN3UIWndBase::m_sRecoveryJobInfo.m_iPage] [CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]; - // κ丮 .. + // 인벤토리에서도 지운다.. m_pMyWare[CN3UIWndBase::m_sRecoveryJobInfo.m_iPage] [CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -1109,7 +1109,7 @@ void CUIWareHouseDlg::SendToServerInvToInvMsg(int iItemID, uint8_t page, uint8_t } else { m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]->iCount += iGold; } - } else // Ϲ .. + } else // 일반 아이템인 경우.. { m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = m_pMyWare[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]; @@ -1127,26 +1127,26 @@ void CUIWareHouseDlg::SendToServerInvToInvMsg(int iItemID, uint8_t page, uint8_t } } - // .. + // 성공.. else { if (m_bSendedItemGold) { - m_bSendedItemGold = false; // .. + m_bSendedItemGold = false; // 원래 대로.. return; } if (((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) && !m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] - ->pUIIcon->IsVisible()) // Ȱ̳ .. + ->pUIIcon->IsVisible()) // 활이나 물약등 아이템인 경우.. { spItem = m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; - // κ丮 .. + // 인벤토리에서도 지운다.. m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -1156,14 +1156,14 @@ void CUIWareHouseDlg::SendToServerInvToInvMsg(int iItemID, uint8_t page, uint8_t } } -void CUIWareHouseDlg::ReceiveResultFromWareMsg(BYTE bResult) // .. +void CUIWareHouseDlg::ReceiveResultFromWareMsg(BYTE bResult) // 빼는 경우.. { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; int64_t iGold = CN3UIWndBase::m_pCountableItemEdit->GetQuantity(); __IconItemSkill * spItem; CN3UIArea * pArea = NULL; - if (bResult != 0x01) // .. + if (bResult != 0x01) // 실패.. { if (m_bSendedItemGold) { ReceiveResultGoldFromWareFail(); @@ -1174,19 +1174,19 @@ void CUIWareHouseDlg::SendToServerInvToInvMsg(int iItemID, uint8_t page, uint8_t // Inv Side.. ////////////////////////////////////////////////////// if ((m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]->iCount - iGold) > 0) { - // Ʈ.. + // 숫자 업데이트.. m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]->iCount -= iGold; } else { - // .. κ丮 츸.. + // 아이템 삭제.. 현재 인벤토리 윈도우만.. spItem = m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]; - // κ丮 .. + // 인벤토리에서도 지운다.. m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -1204,7 +1204,7 @@ void CUIWareHouseDlg::SendToServerInvToInvMsg(int iItemID, uint8_t page, uint8_t } else { m_pMyWare[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]->iCount += iGold; } - } else // Ϲ .. + } else // 일반 아이템.. { m_pMyWare[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]; @@ -1221,32 +1221,32 @@ void CUIWareHouseDlg::SendToServerInvToInvMsg(int iItemID, uint8_t page, uint8_t m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] = NULL; } - // ޽ ڽ ؽƮ ǥ.. + // 메시지 박스 텍스트 표시.. std::string szMsg; ::_LoadStringFromResource(IDS_ITEM_TOOMANY_OR_HEAVY, szMsg); CGameProcedure::s_pProcMain->MsgOutput(szMsg, 0xffff3b3b); } - // .. + // 성공.. else { if (m_bSendedItemGold) { - m_bSendedItemGold = false; // .. + m_bSendedItemGold = false; // 원래 대로.. return; } if (((CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE) || (CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->byContable == UIITEM_TYPE_COUNTABLE_SMALL)) && !m_pMyWare[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] - ->pUIIcon->IsVisible()) // Ȱ̳ .. + ->pUIIcon->IsVisible()) // 활이나 물약등 아이템인 경우.. { spItem = m_pMyWare[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; - // κ丮 .. + // 인벤토리에서도 지운다.. m_pMyWare[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder] = NULL; - // iOrder Ŵ Ʈ Ѵ.. + // iOrder로 내 매니저의 아이템을 리스트에서 삭제한다.. RemoveChild(spItem->pUIIcon); - // ҽ ... + // 아이콘 리소스 삭제... spItem->pUIIcon->Release(); delete spItem->pUIIcon; spItem->pUIIcon = NULL; @@ -1260,7 +1260,7 @@ void CUIWareHouseDlg::ReceiveResultWareToWareMsg(BYTE bResult) { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIArea * pArea = NULL; - if (bResult != 0x01) // .. + if (bResult != 0x01) // 실패.. { __IconItemSkill *spItemSource = NULL, *spItemTarget = NULL; spItemSource = CN3UIWndBase::m_sRecoveryJobInfo.pItemSource; @@ -1301,7 +1301,7 @@ void CUIWareHouseDlg::ReceiveResultInvToInvMsg(BYTE bResult) { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIArea * pArea = NULL; - if (bResult != 0x01) // .. + if (bResult != 0x01) // 실패.. { __IconItemSkill *spItemSource = NULL, *spItemTarget = NULL; spItemSource = CN3UIWndBase::m_sRecoveryJobInfo.pItemSource; @@ -1346,7 +1346,7 @@ void CUIWareHouseDlg::ItemCountOK() { __InfoPlayerMySelf * pInfoExt = &(CGameBase::s_pPlayer->m_InfoExt); switch (CN3UIWndBase::m_pCountableItemEdit->GetCallerWndDistrict()) { - case UIWND_DISTRICT_TRADE_NPC: // .. + case UIWND_DISTRICT_TRADE_NPC: // 빼는 경우.. spItem = m_pMyWare[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; if (iGold > spItem->iCount) { return; @@ -1357,7 +1357,7 @@ void CUIWareHouseDlg::ItemCountOK() { case UIITEM_TYPE_SOMOONE: iWeight = spItem->pItemBasic->siWeight; - // üũ.. + // 무게 체크.. if ((pInfoExt->iWeight + iWeight) > pInfoExt->iWeightMax) { std::string szMsg; ::_LoadStringFromResource(IDS_ITEM_WEIGHT_OVERFLOW, szMsg); @@ -1370,7 +1370,7 @@ void CUIWareHouseDlg::ItemCountOK() { if (iGold <= 0) { return; } - // short ̻ .. + // short 범위이상은 살수 없다.. if (iGold > UIITEM_COUNT_MANY) { std::string szMsg; ::_LoadStringFromResource(IDS_MANY_COUNTABLE_ITEM_GET_MANY, szMsg); @@ -1388,7 +1388,7 @@ void CUIWareHouseDlg::ItemCountOK() { } } - // üũ.. + // 무게 체크.. iWeight = iGold * spItem->pItemBasic->siWeight; if ((pInfoExt->iWeight + iWeight) > pInfoExt->iWeightMax) { std::string szMsg; @@ -1402,7 +1402,7 @@ void CUIWareHouseDlg::ItemCountOK() { if (iGold <= 0) { return; } - // short ̻ .. + // short 범위이상은 살수 없다.. if (iGold > UIITEM_COUNT_FEW) { std::string szMsg; ::_LoadStringFromResource(IDS_SMALL_COUNTABLE_ITEM_GET_MANY, szMsg); @@ -1420,7 +1420,7 @@ void CUIWareHouseDlg::ItemCountOK() { } } - // üũ.. + // 무게 체크.. iWeight = iGold * spItem->pItemBasic->siWeight; if ((pInfoExt->iWeight + iWeight) > pInfoExt->iWeightMax) { std::string szMsg; @@ -1434,11 +1434,11 @@ void CUIWareHouseDlg::ItemCountOK() { spItem = m_pMyWare[m_iCurPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = true; - if (m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]) // ش ġ .. + if (m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]) // 해당 위치에 아이콘이 있으면.. { - // Ʈ.. + // 숫자 업데이트.. m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]->iCount += iGold; - } else // ... + } else // 없으면 아이콘을 만든다... { __IconItemSkill * spItemNew; spItemNew = new __IconItemSkill; @@ -1465,14 +1465,14 @@ void CUIWareHouseDlg::ItemCountOK() { } if ((spItem->iCount - iGold) > 0) { - // Ʈ.. + // 숫자 업데이트.. spItem->iCount -= iGold; } else { spItem->pUIIcon->SetVisible(false); } - // ǥô Ҷ.. Inventory Render.. - // .. + // 표시는 아이콘 렌더링할때.. Inventory의 Render에서.. + // 서버에게 보냄.. SendToServerFromWareMsg(CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->dwID + CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemExt->dwID, m_iCurPage, CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder, @@ -1484,7 +1484,7 @@ void CUIWareHouseDlg::ItemCountOK() { } break; - case UIWND_DISTRICT_TRADE_MY: // ִ .. + case UIWND_DISTRICT_TRADE_MY: // 넣는 경우.. spItem = m_pMyWareInv[CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceStart.iOrder]; if (iGold > spItem->iCount) { return; @@ -1495,7 +1495,7 @@ void CUIWareHouseDlg::ItemCountOK() { if (iGold <= 0) { return; } - // short ̻ .. + // short 범위이상은 살수 없다.. if (iGold > UIITEM_COUNT_MANY) { std::string szMsg; ::_LoadStringFromResource(IDS_MANY_COUNTABLE_ITEM_GET_MANY, szMsg); @@ -1520,7 +1520,7 @@ void CUIWareHouseDlg::ItemCountOK() { if (iGold <= 0) { return; } - // short ̻ .. + // short 범위이상은 살수 없다.. if (iGold > UIITEM_COUNT_FEW) { std::string szMsg; ::_LoadStringFromResource(IDS_SMALL_COUNTABLE_ITEM_GET_MANY, szMsg); @@ -1546,12 +1546,12 @@ void CUIWareHouseDlg::ItemCountOK() { CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = true; if (m_pMyWare[CN3UIWndBase::m_sRecoveryJobInfo.m_iPage] - [CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]) // ش ġ .. + [CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder]) // 해당 위치에 아이콘이 있으면.. { - // Ʈ.. + // 숫자 업데이트.. m_pMyWare[CN3UIWndBase::m_sRecoveryJobInfo.m_iPage][CN3UIWndBase::m_sRecoveryJobInfo.UIWndSourceEnd.iOrder] ->iCount += iGold; - } else // .. + } else // 없으면 아이콘을 만든다.. { __IconItemSkill * spItemNew; spItemNew = new __IconItemSkill; @@ -1583,14 +1583,14 @@ void CUIWareHouseDlg::ItemCountOK() { } if ((spItem->iCount - iGold) > 0) { - // Ʈ.. + // 숫자 업데이트.. spItem->iCount -= iGold; } else { spItem->pUIIcon->SetVisible(false); } - // ǥô Ҷ.. Inventory Render.. - // .. + // 표시는 아이콘 렌더링할때.. Inventory의 Render에서.. + // 서버에게 보냄.. SendToServerToWareMsg(CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic->dwID + CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemExt->dwID, CN3UIWndBase::m_sRecoveryJobInfo.m_iPage, @@ -1609,7 +1609,7 @@ void CUIWareHouseDlg::ItemCountCancel() { PlayItemSound(CN3UIWndBase::m_sRecoveryJobInfo.pItemSource->pItemBasic); } - // .. + // 취소.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = NULL; @@ -1678,23 +1678,23 @@ void CUIWareHouseDlg::AddItemInWare(int iItem, int iDurability, int iCount, int } std::string szIconFN; __IconItemSkill * spItem = NULL; - __TABLE_ITEM_BASIC * pItem = NULL; // ̺ ü .. + __TABLE_ITEM_BASIC * pItem = NULL; // 아이템 테이블 구조체 포인터.. __TABLE_ITEM_EXT * pItemExt = NULL; - pItem = CGameBase::s_pTbl_Items_Basic->Find(iItem / 1000 * 1000); // .. + pItem = CGameBase::s_pTbl_Items_Basic->Find(iItem / 1000 * 1000); // 열 데이터 얻기.. if (pItem && pItem->byExtIndex >= 0 && pItem->byExtIndex < MAX_ITEM_EXTENSION) { - pItemExt = CGameBase::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iItem % 1000); // .. + pItemExt = CGameBase::s_pTbl_Items_Exts[pItem->byExtIndex]->Find(iItem % 1000); // 열 데이터 얻기.. } if (NULL == pItem || NULL == pItemExt) { __ASSERT(0, "NULL Item!!!"); CLogWriter::Write("WareHouse - Ware - Unknown Item %d, IDNumber", iItem); - return; // .. + return; // 아이템이 없으면.. } e_PartPosition ePart; e_PlugPosition ePlug; e_ItemType eType = CGameProcedure::MakeResrcFileNameForUPC(pItem, NULL, &szIconFN, ePart, - ePlug); // ۿ ̸  + ePlug); // 아이템에 따른 파일 이름을 만들어서 if (ITEM_TYPE_UNKNOWN == eType) { CLogWriter::Write("MyInfo - slot - Unknown Item"); } @@ -1703,7 +1703,7 @@ void CUIWareHouseDlg::AddItemInWare(int iItem, int iDurability, int iCount, int spItem = new __IconItemSkill; spItem->pItemBasic = pItem; spItem->pItemExt = pItemExt; - spItem->szIconFN = szIconFN; // ̸ .. + spItem->szIconFN = szIconFN; // 아이콘 파일 이름 복사.. spItem->iCount = iCount; spItem->iDurability = iDurability; @@ -1711,20 +1711,20 @@ void CUIWareHouseDlg::AddItemInWare(int iItem, int iDurability, int iCount, int TRACE("Init Inv Msg Inve %d, iOrder %d \n", iItem, iIndex); } -void CUIWareHouseDlg::GoldCountToWareOK() // ִ .. +void CUIWareHouseDlg::GoldCountToWareOK() //돈을 넣는 경우.. { - int64_t iGold, iMyMoney, iWareMoney; // κ丮 .. + int64_t iGold, iMyMoney, iWareMoney; // 인벤토리의 값.. - // Կ ϴ .. + // 돈을 보관함에 보관하는 경우.. iGold = CN3UIWndBase::m_pCountableItemEdit->GetQuantity(); // Gold Offset Backup.. m_iGoldOffsetBackup = iGold; - // ´.. + // 현재 내가 가진 돈을 얻어 온다.. iMyMoney = CGameBase::s_pPlayer->m_InfoExt.iGold; - // ´.. + // 보관함의 돈을 얻어온다.. CN3UIString * pStr = (CN3UIString *)GetChildByID("string_wareitem_name"); __ASSERT(pStr, "NULL UI Component!!"); iWareMoney = pStr->GetStringAsInt({','}); @@ -1732,54 +1732,54 @@ void CUIWareHouseDlg::AddItemInWare(int iItem, int iDurability, int iCount, int return; } - m_bSendedItemGold = true; // ̴.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + m_bSendedItemGold = true; // 보낸 아이템이 돈이다.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Ų.. + // 돈을 감소 시킨다.. iMyMoney -= iGold; CGameBase::s_pPlayer->m_InfoExt.iGold = iMyMoney; iWareMoney += iGold; - // ǥ.. Ware.. + // 돈 표시.. Ware.. pStr->SetString(::_FormatCoins(iWareMoney)); - // ǥ.. κ丮.. + // 돈 표시.. 인벤토리.. pStr = (CN3UIString *)CGameProcedure::s_pProcMain->m_pUIInventory->GetChildByID("text_gold"); __ASSERT(pStr, "NULL UI Component!!"); if (pStr) { pStr->SetString(::_FormatCoins(iMyMoney)); } - // ǥ.. Inv.. + // 돈 표시.. Inv.. pStr = (CN3UIString *)GetChildByID("string_item_name"); __ASSERT(pStr, "NULL UI Component!!"); if (pStr) { pStr->SetString(::_FormatCoins(iMyMoney)); } - // Ŷ  .. + // 서버에게 패킷 만들어서 날림.. SendToServerToWareMsg(dwGold, 0xff, 0xff, 0xff, iGold); - // ¸ ȭŰ.. â ݰ.. + // 상태를 변화시키고.. 창을 닫고.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = true; CN3UIWndBase::m_pCountableItemEdit->Close(); PlayGoldSound(); } -void CUIWareHouseDlg::GoldCountFromWareOK() // .. +void CUIWareHouseDlg::GoldCountFromWareOK() // 돈을 빼는 경우.. { - int64_t iGold, iMyMoney, iWareMoney; // κ丮 .. + int64_t iGold, iMyMoney, iWareMoney; // 인벤토리의 값.. - // Կ .. + // 돈을 보관함에서 빼는 경우.. iGold = CN3UIWndBase::m_pCountableItemEdit->GetQuantity(); // Gold Offset Backup.. m_iGoldOffsetBackup = iGold; - // ´.. + // 현재 내가 가진 돈을 얻어 온다.. iMyMoney = CGameBase::s_pPlayer->m_InfoExt.iGold; - // ´.. + // 보관함의 돈을 얻어온다.. CN3UIString * pStr = (CN3UIString *)GetChildByID("string_wareitem_name"); __ASSERT(pStr, "NULL UI Component!!"); iWareMoney = pStr->GetStringAsInt({','}); @@ -1787,35 +1787,35 @@ void CUIWareHouseDlg::AddItemInWare(int iItem, int iDurability, int iCount, int return; } - m_bSendedItemGold = true; // ̴.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + m_bSendedItemGold = true; // 보낸 아이템이 돈이다.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Ų.. + // 돈을 감소 시킨다.. iMyMoney += iGold; CGameBase::s_pPlayer->m_InfoExt.iGold = iMyMoney; iWareMoney -= iGold; - // ǥ.. Ware.. + // 돈 표시.. Ware.. pStr->SetString(::_FormatCoins(iWareMoney)); - // ǥ.. κ丮.. + // 돈 표시.. 인벤토리.. pStr = (CN3UIString *)CGameProcedure::s_pProcMain->m_pUIInventory->GetChildByID("text_gold"); __ASSERT(pStr, "NULL UI Component!!"); if (pStr) { pStr->SetString(::_FormatCoins(iMyMoney)); } - // ǥ.. Inv.. + // 돈 표시.. Inv.. pStr = (CN3UIString *)GetChildByID("string_item_name"); __ASSERT(pStr, "NULL UI Component!!"); if (pStr) { pStr->SetString(::_FormatCoins(iMyMoney)); } - // Ŷ  .. + // 서버에게 패킷 만들어서 날림.. SendToServerFromWareMsg(dwGold, 0xff, 0xff, 0xff, iGold); - // ¸ ȭŰ.. â ݰ.. + // 상태를 변화시키고.. 창을 닫고.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = true; CN3UIWndBase::m_pCountableItemEdit->Close(); @@ -1823,11 +1823,11 @@ void CUIWareHouseDlg::AddItemInWare(int iItem, int iDurability, int iCount, int } void CUIWareHouseDlg::GoldCountToWareCancel() { - // Կ ϴ .. + // 돈을 보관함에 보관하는 경우 취소.. // Sound.. PlayGoldSound(); - // .. + // 취소.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = NULL; @@ -1836,11 +1836,11 @@ void CUIWareHouseDlg::GoldCountToWareCancel() { } void CUIWareHouseDlg::GoldCountFromWareCancel() { - // Կ .. + // 돈을 보관함에서 빼오는 경우 취소.. // Sound.. PlayGoldSound(); - // .. + // 취소.. CN3UIWndBase::m_sRecoveryJobInfo.m_bWaitFromServer = false; CN3UIWndBase::m_sRecoveryJobInfo.pItemSource = NULL; CN3UIWndBase::m_sRecoveryJobInfo.pItemTarget = NULL; @@ -1849,42 +1849,42 @@ void CUIWareHouseDlg::GoldCountFromWareCancel() { } void CUIWareHouseDlg::ReceiveResultGoldToWareFail() { - int64_t iGold, iMyMoney, iWareMoney; // κ丮 .. + int64_t iGold, iMyMoney, iWareMoney; // 인벤토리의 값.. - m_bSendedItemGold = false; // .. + m_bSendedItemGold = false; // 원래 대로.. - // Կ .. + // 돈을 보관함에서 빼는 경우.. iGold = CN3UIWndBase::m_pCountableItemEdit->GetQuantity(); // Gold Offset Backup.. m_iGoldOffsetBackup = iGold; - // ´.. + // 현재 내가 가진 돈을 얻어 온다.. iMyMoney = CGameBase::s_pPlayer->m_InfoExt.iGold; - // ´.. + // 보관함의 돈을 얻어온다.. CN3UIString * pStr = NULL; pStr = (CN3UIString *)GetChildByID("string_wareitem_name"); __ASSERT(pStr, "NULL UI Component!!"); iWareMoney = pStr->GetStringAsInt({','}); - // Ų.. + // 돈을 감소 시킨다.. iMyMoney += iGold; CGameBase::s_pPlayer->m_InfoExt.iGold = iMyMoney; iWareMoney -= iGold; - // ǥ.. Ware.. + // 돈 표시.. Ware.. pStr->SetString(::_FormatCoins(iWareMoney)); - // ǥ.. κ丮.. + // 돈 표시.. 인벤토리.. pStr = (CN3UIString *)CGameProcedure::s_pProcMain->m_pUIInventory->GetChildByID("text_gold"); __ASSERT(pStr, "NULL UI Component!!"); if (pStr) { pStr->SetString(::_FormatCoins(iMyMoney)); } - // ǥ.. Inv.. + // 돈 표시.. Inv.. pStr = (CN3UIString *)GetChildByID("string_item_name"); __ASSERT(pStr, "NULL UI Component!!"); if (pStr) { @@ -1893,42 +1893,42 @@ void CUIWareHouseDlg::ReceiveResultGoldToWareFail() { } void CUIWareHouseDlg::ReceiveResultGoldFromWareFail() { - int64_t iGold, iMyMoney, iWareMoney; // κ丮 .. + int64_t iGold, iMyMoney, iWareMoney; // 인벤토리의 값.. - m_bSendedItemGold = false; // .. + m_bSendedItemGold = false; // 원래 대로.. - // Կ ϴ .. + // 돈을 보관함에 보관하는 경우.. iGold = CN3UIWndBase::m_pCountableItemEdit->GetQuantity(); // Gold Offset Backup.. m_iGoldOffsetBackup = iGold; - // ´.. + // 현재 내가 가진 돈을 얻어 온다.. iMyMoney = CGameBase::s_pPlayer->m_InfoExt.iGold; - // ´.. + // 보관함의 돈을 얻어온다.. CN3UIString * pStr = NULL; pStr = (CN3UIString *)GetChildByID("string_wareitem_name"); __ASSERT(pStr, "NULL UI Component!!"); iWareMoney = pStr->GetStringAsInt({','}); - // Ų.. + // 돈을 감소 시킨다.. iMyMoney -= iGold; CGameBase::s_pPlayer->m_InfoExt.iGold = iMyMoney; iWareMoney += iGold; - // ǥ.. Ware.. + // 돈 표시.. Ware.. pStr->SetString(::_FormatCoins(iWareMoney)); - // ǥ.. κ丮.. + // 돈 표시.. 인벤토리.. pStr = (CN3UIString *)CGameProcedure::s_pProcMain->m_pUIInventory->GetChildByID("text_gold"); __ASSERT(pStr, "NULL UI Component!!"); if (pStr) { pStr->SetString(::_FormatCoins(iMyMoney)); } - // ǥ.. Inv.. + // 돈 표시.. Inv.. pStr = (CN3UIString *)GetChildByID("string_item_name"); __ASSERT(pStr, "NULL UI Component!!"); if (pStr) { @@ -1995,7 +1995,7 @@ void CUIWareHouseDlg::SetVisibleWithNoSound(bool bVisible, bool bWork, bool bReF SetState(UI_STATE_COMMON_NONE); CN3UIWndBase::AllHighLightIconFree(); - // inv κ丮 inv ű.. + // 이 윈도우의 inv 영역의 아이템을 이 인벤토리 윈도우의 inv영역으로 옮긴다.. ItemMoveFromThisToInv(); if (CGameProcedure::s_pProcMain->m_pUISkillTreeDlg) { diff --git a/src/game/UIWareHouseDlg.h b/src/game/UIWareHouseDlg.h index 5e69cc7d..f6e8a181 100644 --- a/src/game/UIWareHouseDlg.h +++ b/src/game/UIWareHouseDlg.h @@ -18,7 +18,7 @@ class CUIWareHouseDlg : public CN3UIWndBase { friend class CUIInventory; public: - // ؾ ü + // 직접 접근해야 할 객체 참조 포인터 __IconItemSkill * m_pMyWare[MAX_ITEM_WARE_PAGE][MAX_ITEM_TRADE]; __IconItemSkill * m_pMyWareInv[MAX_ITEM_INVENTORY]; CN3UIString * m_pStrMyGold; diff --git a/src/game/UIWarp.cpp b/src/game/UIWarp.cpp index ad0346cc..55b059c9 100644 --- a/src/game/UIWarp.cpp +++ b/src/game/UIWarp.cpp @@ -23,7 +23,7 @@ CUIWarp::CUIWarp() { m_pBtn_Cancel = NULL; m_pList_Infos = NULL; - m_pText_Agreement = NULL; // .. + m_pText_Agreement = NULL; // 동의 사항.. } CUIWarp::~CUIWarp() {} @@ -54,7 +54,7 @@ bool CUIWarp::ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg) { this->SetVisible(false); } else if (dwMsg & UIMSG_LIST_SELCHANGE) { if (pSender == m_pList_Infos) { - this->UpdateAgreement(); // ǹ Ʈ.. + this->UpdateAgreement(); // 동의문 업데이트.. } } diff --git a/src/game/UIWarp.h b/src/game/UIWarp.h index 621d9685..b48c4811 100644 --- a/src/game/UIWarp.h +++ b/src/game/UIWarp.h @@ -9,11 +9,11 @@ #include "N3Base/N3UIBase.h" struct __WarpInfo { - int iID; // ȣ .. + int iID; // 이 번호를 서버에게 날린다.. std::string szName; - std::string szAgreement; // ˸ Ǹ ϴ .. + std::string szAgreement; // 유저한테 알리고 동의를 구하는 글.. int iZone; - int iMaxUser; // ִ ο.. + int iMaxUser; // 최대 제한 인원수.. int iGold; __Vector3 vPos; }; @@ -29,7 +29,7 @@ class CUIWarp : public CN3UIBase { class CN3UIButton * m_pBtn_Cancel; class CN3UIList * m_pList_Infos; - class CN3UIString * m_pText_Agreement; // .. + class CN3UIString * m_pText_Agreement; // 동의 사항.. std::list<__WarpInfo> m_ListInfos; diff --git a/src/game/WarMessage.cpp b/src/game/WarMessage.cpp index e80da181..2ad7541e 100644 --- a/src/game/WarMessage.cpp +++ b/src/game/WarMessage.cpp @@ -48,7 +48,7 @@ void CWarMessage::Release() { void CWarMessage::SetMessage(const std::string & szText, DWORD dwFlags, DWORD dwColor) { if (m_pMessageFont) { - m_pMessageFont->SetText(szText, dwFlags); // Ʈ ؽƮ . + m_pMessageFont->SetText(szText, dwFlags); // 폰트에 텍스트 지정. m_pMessageFont->SetFontColor(dwColor); m_fTime = WAR_MESSAGE_SHOW_TIME; } diff --git a/src/game/res/Resource.rc b/src/game/res/Resource.rc index 1d94d9cab6c7801692b6806587329cb6674bd6e1..4aae3d5d205c49cfdb4ed47e0a98fbb2ecd55437 100644 GIT binary patch literal 111684 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 Xh7q$0?QwFvNa$}8+6vF}VDJ9`^vT+w literal 64427 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 K)@sJQ<^KSdVxi~& diff --git a/src/server/AIServer/AIServer.vcxproj.filters b/src/server/AIServer/AIServer.vcxproj.filters index ea217279..e47edc70 100644 --- a/src/server/AIServer/AIServer.vcxproj.filters +++ b/src/server/AIServer/AIServer.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/server/AIServer/AIServer.vcxproj.user b/src/server/AIServer/AIServer.vcxproj.user index 5e8a5e38..675e3874 100644 --- a/src/server/AIServer/AIServer.vcxproj.user +++ b/src/server/AIServer/AIServer.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\server diff --git a/src/server/AIServer/AIServerDlg.cpp b/src/server/AIServer/AIServerDlg.cpp index 72ee174d..dc23d7ba 100644 --- a/src/server/AIServer/AIServerDlg.cpp +++ b/src/server/AIServer/AIServerDlg.cpp @@ -24,7 +24,7 @@ #include "Region.h" #include "ini.h" -//#include "extern.h" // ü +//#include "extern.h" // 전역 객체 #ifdef _DEBUG #define new DEBUG_NEW @@ -39,7 +39,7 @@ CRITICAL_SECTION g_User_critical; CRITICAL_SECTION g_region_critical; CRITICAL_SECTION g_LogFileWrite; -#define CHECK_ALIVE 100 // Ӽ 迩 Ǵ, Ÿ̸ +#define CHECK_ALIVE 100 // 게임서버와 통신이 끊김여부 판단, 타이머 변수 #define REHP_TIME 200 #define MONSTER_SPEED 1500 @@ -47,12 +47,12 @@ CRITICAL_SECTION g_LogFileWrite; // CAboutDlg dialog used for App About /* - ** Repent AI Server ۾ ** - 1. 3 Լ ߰ + ** Repent AI Server 작업시 참고 사항 ** + 1. 3개의 함수 추가 int GetSpeed(BYTE bySpeed); int GetAttackSpeed(BYTE bySpeed); int GetCatsSpeed(BYTE bySpeed); - 2. Repent ° Ʒ Լ + 2. Repent에 맞개 아래의 함수 수정 CreateNpcThread(); GetMonsterTableData(); GetNpcTableData(); @@ -160,7 +160,7 @@ END_MESSAGE_MAP() // CServerDlg message handlers /////////////////////////////////////////////////////////////////////////////// -// ʱȭ +// 각종 초기화 // BOOL CServerDlg::OnInitDialog() { CDialog::OnInitDialog(); @@ -180,9 +180,9 @@ BOOL CServerDlg::OnInitDialog() { myrand(1, 10000); // don't delete } // Compress Init - memset(m_CompBuf, NULL, 10240); // ͸ - m_iCompIndex = 0; // - m_CompCount = 0; // + memset(m_CompBuf, NULL, 10240); // 압축할 데이터를 모으는 버퍼 + m_iCompIndex = 0; // 압축할 데이터의 길이 + m_CompCount = 0; // 압축할 데이터의 개수 InitializeCriticalSection(&g_User_critical); InitializeCriticalSection(&g_LogFileWrite); m_sSocketCount = 0; @@ -229,13 +229,13 @@ BOOL CServerDlg::OnInitDialog() { GetServerInfoIni(); if (m_byZone == UNIFY_ZONE) { - m_strStatus.Format("UNIFY_ZONE "); + m_strStatus.Format("UNIFY_ZONE 서버의 현재 상태"); } else if (m_byZone == KARUS_ZONE) { - m_strStatus.Format("KARUS "); + m_strStatus.Format("KARUS 서버의 현재 상태"); } else if (m_byZone == ELMORAD_ZONE) { - m_strStatus.Format("ELMORAD "); + m_strStatus.Format("ELMORAD 서버의 현재 상태"); } else if (m_byZone == BATTLE_ZONE) { - m_strStatus.Format("BATTLE "); + m_strStatus.Format("BATTLE 서버의 현재 상태"); } //---------------------------------------------------------------------- @@ -310,12 +310,12 @@ BOOL CServerDlg::OnInitDialog() { //---------------------------------------------------------------------- // Load NPC Data & Activate NPC //---------------------------------------------------------------------- - if (!GetMonsterTableData()) { // Monster Ưġ ̺ Load + if (!GetMonsterTableData()) { // Monster 특성치 테이블 Load EndDialog(IDCANCEL); return FALSE; } - if (!GetNpcTableData()) { // NPC Ưġ ̺ Load + if (!GetNpcTableData()) { // NPC 특성치 테이블 Load EndDialog(IDCANCEL); return FALSE; } @@ -426,7 +426,7 @@ void CServerDlg::DefaultInit() { SetIcon(m_hIcon, FALSE); // Set small icon } -// Magic Table д´. +// Magic Table 을 읽는다. BOOL CServerDlg::GetMagicTableData() { CMagicTableSet MagicTableSet; @@ -624,7 +624,7 @@ BOOL CServerDlg::GetMakeLareItemTableData() { } ///////////////////////////////////////////////////////////////////////// -// NPC Item Table д´. +// NPC Item Table 을 읽는다. // BOOL CServerDlg::GetNpcItemTable() { CNpcItemSet NpcItemSet; @@ -699,7 +699,7 @@ BOOL CServerDlg::GetNpcItemTable() { return TRUE; } -// Monster Table Data д´. +// Monster Table Data 를 읽는다. BOOL CServerDlg::GetMonsterTableData() { CMonTableSet NpcTableSet; @@ -727,54 +727,54 @@ BOOL CServerDlg::GetMonsterTableData() { Npc->m_sSid = NpcTableSet.m_sSid; // MONSTER(NPC) Serial ID _tcscpy(Npc->m_strName, NpcTableSet.m_strName); // MONSTER(NPC) Name Npc->m_sPid = NpcTableSet.m_sPid; // MONSTER(NPC) Picture ID - Npc->m_sSize = NpcTableSet.m_sSize; // MONSTER(NPC) ij ũ - Npc->m_iWeapon_1 = NpcTableSet.m_iWeapon1; // 빫 - Npc->m_iWeapon_2 = NpcTableSet.m_iWeapon2; // 빫 - Npc->m_byGroup = NpcTableSet.m_byGroup; // Ҽ - Npc->m_byActType = NpcTableSet.m_byActType; // ൿ - Npc->m_byRank = NpcTableSet.m_byRank; // - Npc->m_byTitle = NpcTableSet.m_byTitle; // + Npc->m_sSize = NpcTableSet.m_sSize; // MONSTER(NPC) 캐릭 크기 비율 + Npc->m_iWeapon_1 = NpcTableSet.m_iWeapon1; // 착용무기 + Npc->m_iWeapon_2 = NpcTableSet.m_iWeapon2; // 착용무기 + Npc->m_byGroup = NpcTableSet.m_byGroup; // 소속집단 + Npc->m_byActType = NpcTableSet.m_byActType; // 행동패턴 + Npc->m_byRank = NpcTableSet.m_byRank; // 작위 + Npc->m_byTitle = NpcTableSet.m_byTitle; // 지위 Npc->m_iSellingGroup = NpcTableSet.m_iSellingGroup; // item group Npc->m_sLevel = NpcTableSet.m_sLevel; // level - Npc->m_iExp = NpcTableSet.m_iExp; // ġ + Npc->m_iExp = NpcTableSet.m_iExp; // 경험치 Npc->m_iLoyalty = NpcTableSet.m_iLoyalty; // loyalty - Npc->m_iMaxHP = NpcTableSet.m_iHpPoint; // ִ HP - Npc->m_sMaxMP = NpcTableSet.m_sMpPoint; // ִ MP - Npc->m_sAttack = NpcTableSet.m_sAtk; // ݰ - Npc->m_sDefense = NpcTableSet.m_sAc; //  - Npc->m_sHitRate = NpcTableSet.m_sHitRate; // Ÿݼ - Npc->m_sEvadeRate = NpcTableSet.m_sEvadeRate; // ȸǼ - Npc->m_sDamage = NpcTableSet.m_sDamage; // ⺻ - Npc->m_sAttackDelay = NpcTableSet.m_sAttackDelay; // ݵ - Npc->m_bySpeed_1 = NpcTableSet.m_bySpeed1; // ̵ӵ (ȱ) - Npc->m_bySpeed_2 = NpcTableSet.m_bySpeed2; // ̵ӵ (ٱ) - Npc->m_sSpeed = MONSTER_SPEED; // ̵ӵ - Npc->m_sStandTime = NpcTableSet.m_sStandtime; // ִ ð - Npc->m_iMagic1 = NpcTableSet.m_iMagic1; // 븶 1 - Npc->m_iMagic2 = NpcTableSet.m_iMagic2; // 븶 2 - Npc->m_iMagic3 = NpcTableSet.m_iMagic3; // 븶 3 - Npc->m_sFireR = NpcTableSet.m_sFireR; // ȭ ׷ - Npc->m_sColdR = NpcTableSet.m_sColdR; // ñ ׷ - Npc->m_sLightningR = NpcTableSet.m_sLightningR; // ׷ - Npc->m_sMagicR = NpcTableSet.m_sMagicR; // ׷ - Npc->m_sDiseaseR = NpcTableSet.m_sDiseaseR; // ׷ - Npc->m_sPoisonR = NpcTableSet.m_sPoisonR; // ׷ - Npc->m_sLightR = NpcTableSet.m_sLightR; // ׷ + Npc->m_iMaxHP = NpcTableSet.m_iHpPoint; // 최대 HP + Npc->m_sMaxMP = NpcTableSet.m_sMpPoint; // 최대 MP + Npc->m_sAttack = NpcTableSet.m_sAtk; // 공격값 + Npc->m_sDefense = NpcTableSet.m_sAc; // 방어값 + Npc->m_sHitRate = NpcTableSet.m_sHitRate; // 타격성공률 + Npc->m_sEvadeRate = NpcTableSet.m_sEvadeRate; // 회피성공률 + Npc->m_sDamage = NpcTableSet.m_sDamage; // 기본 데미지 + Npc->m_sAttackDelay = NpcTableSet.m_sAttackDelay; // 공격딜레이 + Npc->m_bySpeed_1 = NpcTableSet.m_bySpeed1; // 이동속도 (걷기) + Npc->m_bySpeed_2 = NpcTableSet.m_bySpeed2; // 이동속도 (뛰기) + Npc->m_sSpeed = MONSTER_SPEED; // 이동속도 + Npc->m_sStandTime = NpcTableSet.m_sStandtime; // 서있는 시간 + Npc->m_iMagic1 = NpcTableSet.m_iMagic1; // 사용마법 1 + Npc->m_iMagic2 = NpcTableSet.m_iMagic2; // 사용마법 2 + Npc->m_iMagic3 = NpcTableSet.m_iMagic3; // 사용마법 3 + Npc->m_sFireR = NpcTableSet.m_sFireR; // 화염 저항력 + Npc->m_sColdR = NpcTableSet.m_sColdR; // 냉기 저항력 + Npc->m_sLightningR = NpcTableSet.m_sLightningR; // 전기 저항력 + Npc->m_sMagicR = NpcTableSet.m_sMagicR; // 마법 저항력 + Npc->m_sDiseaseR = NpcTableSet.m_sDiseaseR; // 저주 저항력 + Npc->m_sPoisonR = NpcTableSet.m_sPoisonR; // 독 저항력 + Npc->m_sLightR = NpcTableSet.m_sLightR; // 빛 저항력 Npc->m_sBulk = NpcTableSet.m_sBulk; - Npc->m_bySearchRange = NpcTableSet.m_bySearchRange; // Ž - Npc->m_byAttackRange = NpcTableSet.m_byAttackRange; // Ÿ - Npc->m_byTracingRange = NpcTableSet.m_byTracingRange; // ߰ݰŸ - //Npc->m_sAI = NpcTableSet.m_sAI; // ΰ ε + Npc->m_bySearchRange = NpcTableSet.m_bySearchRange; // 적 탐지 범위 + Npc->m_byAttackRange = NpcTableSet.m_byAttackRange; // 사정거리 + Npc->m_byTracingRange = NpcTableSet.m_byTracingRange; // 추격거리 + //Npc->m_sAI = NpcTableSet.m_sAI; // 인공지능 인덱스 Npc->m_tNpcType = NpcTableSet.m_byType; // NPC Type // 0 : Monster // 1 : Normal NPC - Npc->m_byFamilyType = NpcTableSet.m_byFamily; // ̿ 踦 Ѵ. - //Npc->m_tItemPer; // Ȯ - //Npc->m_tDnPer; // Ȯ + Npc->m_byFamilyType = NpcTableSet.m_byFamily; // 몹들사이에서 가족관계를 결정한다. + //Npc->m_tItemPer; // 아이템이 떨어질 확률 + //Npc->m_tDnPer; // 돈이 떨어질확률 - Npc->m_iMoney = NpcTableSet.m_iMoney; // - Npc->m_iItem = NpcTableSet.m_sItem; // + Npc->m_iMoney = NpcTableSet.m_iMoney; // 떨어지는 돈 + Npc->m_iItem = NpcTableSet.m_sItem; // 떨어지는 아이템 Npc->m_byDirectAttack = NpcTableSet.m_byDirectAttack; Npc->m_byMagicAttack = NpcTableSet.m_byMagicAttack; @@ -804,7 +804,7 @@ BOOL CServerDlg::GetMonsterTableData() { return TRUE; } -// NPC Table Data д´. ( & NPC) +// NPC Table Data 를 읽는다. (경비병 & NPC) BOOL CServerDlg::GetNpcTableData() { CNpcTableSet NpcTableSet; @@ -832,54 +832,54 @@ BOOL CServerDlg::GetNpcTableData() { Npc->m_sSid = NpcTableSet.m_sSid; // MONSTER(NPC) Serial ID _tcscpy(Npc->m_strName, NpcTableSet.m_strName); // MONSTER(NPC) Name Npc->m_sPid = NpcTableSet.m_sPid; // MONSTER(NPC) Picture ID - Npc->m_sSize = NpcTableSet.m_sSize; // MONSTER(NPC) ij ũ - Npc->m_iWeapon_1 = NpcTableSet.m_iWeapon1; // 빫 - Npc->m_iWeapon_2 = NpcTableSet.m_iWeapon2; // 빫 - Npc->m_byGroup = NpcTableSet.m_byGroup; // Ҽ - Npc->m_byActType = NpcTableSet.m_byActType; // ൿ - Npc->m_byRank = NpcTableSet.m_byRank; // - Npc->m_byTitle = NpcTableSet.m_byTitle; // + Npc->m_sSize = NpcTableSet.m_sSize; // MONSTER(NPC) 캐릭 크기 비율 + Npc->m_iWeapon_1 = NpcTableSet.m_iWeapon1; // 착용무기 + Npc->m_iWeapon_2 = NpcTableSet.m_iWeapon2; // 착용무기 + Npc->m_byGroup = NpcTableSet.m_byGroup; // 소속집단 + Npc->m_byActType = NpcTableSet.m_byActType; // 행동패턴 + Npc->m_byRank = NpcTableSet.m_byRank; // 작위 + Npc->m_byTitle = NpcTableSet.m_byTitle; // 지위 Npc->m_iSellingGroup = NpcTableSet.m_iSellingGroup; // item group Npc->m_sLevel = NpcTableSet.m_sLevel; // level - Npc->m_iExp = NpcTableSet.m_iExp; // ġ + Npc->m_iExp = NpcTableSet.m_iExp; // 경험치 Npc->m_iLoyalty = NpcTableSet.m_iLoyalty; // loyalty - Npc->m_iMaxHP = NpcTableSet.m_iHpPoint; // ִ HP - Npc->m_sMaxMP = NpcTableSet.m_sMpPoint; // ִ MP - Npc->m_sAttack = NpcTableSet.m_sAtk; // ݰ - Npc->m_sDefense = NpcTableSet.m_sAc; //  - Npc->m_sHitRate = NpcTableSet.m_sHitRate; // Ÿݼ - Npc->m_sEvadeRate = NpcTableSet.m_sEvadeRate; // ȸǼ - Npc->m_sDamage = NpcTableSet.m_sDamage; // ⺻ - Npc->m_sAttackDelay = NpcTableSet.m_sAttackDelay; // ݵ - Npc->m_bySpeed_1 = NpcTableSet.m_bySpeed1; // ̵ӵ (ȱ) - Npc->m_bySpeed_2 = NpcTableSet.m_bySpeed2; // ̵ӵ (ٱ) - Npc->m_sSpeed = MONSTER_SPEED; // ̵ӵ - Npc->m_sStandTime = NpcTableSet.m_sStandtime; // ִ ð - Npc->m_iMagic1 = NpcTableSet.m_iMagic1; // 븶 1 - Npc->m_iMagic2 = NpcTableSet.m_iMagic2; // 븶 2 - Npc->m_iMagic3 = NpcTableSet.m_iMagic3; // 븶 3 - Npc->m_sFireR = NpcTableSet.m_sFireR; // ȭ ׷ - Npc->m_sColdR = NpcTableSet.m_sColdR; // ñ ׷ - Npc->m_sLightningR = NpcTableSet.m_sLightningR; // ׷ - Npc->m_sMagicR = NpcTableSet.m_sMagicR; // ׷ - Npc->m_sDiseaseR = NpcTableSet.m_sDiseaseR; // ׷ - Npc->m_sPoisonR = NpcTableSet.m_sPoisonR; // ׷ - Npc->m_sLightR = NpcTableSet.m_sLightR; // ׷ + Npc->m_iMaxHP = NpcTableSet.m_iHpPoint; // 최대 HP + Npc->m_sMaxMP = NpcTableSet.m_sMpPoint; // 최대 MP + Npc->m_sAttack = NpcTableSet.m_sAtk; // 공격값 + Npc->m_sDefense = NpcTableSet.m_sAc; // 방어값 + Npc->m_sHitRate = NpcTableSet.m_sHitRate; // 타격성공률 + Npc->m_sEvadeRate = NpcTableSet.m_sEvadeRate; // 회피성공률 + Npc->m_sDamage = NpcTableSet.m_sDamage; // 기본 데미지 + Npc->m_sAttackDelay = NpcTableSet.m_sAttackDelay; // 공격딜레이 + Npc->m_bySpeed_1 = NpcTableSet.m_bySpeed1; // 이동속도 (걷기) + Npc->m_bySpeed_2 = NpcTableSet.m_bySpeed2; // 이동속도 (뛰기) + Npc->m_sSpeed = MONSTER_SPEED; // 이동속도 + Npc->m_sStandTime = NpcTableSet.m_sStandtime; // 서있는 시간 + Npc->m_iMagic1 = NpcTableSet.m_iMagic1; // 사용마법 1 + Npc->m_iMagic2 = NpcTableSet.m_iMagic2; // 사용마법 2 + Npc->m_iMagic3 = NpcTableSet.m_iMagic3; // 사용마법 3 + Npc->m_sFireR = NpcTableSet.m_sFireR; // 화염 저항력 + Npc->m_sColdR = NpcTableSet.m_sColdR; // 냉기 저항력 + Npc->m_sLightningR = NpcTableSet.m_sLightningR; // 전기 저항력 + Npc->m_sMagicR = NpcTableSet.m_sMagicR; // 마법 저항력 + Npc->m_sDiseaseR = NpcTableSet.m_sDiseaseR; // 저주 저항력 + Npc->m_sPoisonR = NpcTableSet.m_sPoisonR; // 독 저항력 + Npc->m_sLightR = NpcTableSet.m_sLightR; // 빛 저항력 Npc->m_sBulk = NpcTableSet.m_sBulk; - Npc->m_bySearchRange = NpcTableSet.m_bySearchRange; // Ž - Npc->m_byAttackRange = NpcTableSet.m_byAttackRange; // Ÿ - Npc->m_byTracingRange = NpcTableSet.m_byTracingRange; // ߰ݰŸ - //Npc->m_sAI = NpcTableSet.m_sAI; // ΰ ε + Npc->m_bySearchRange = NpcTableSet.m_bySearchRange; // 적 탐지 범위 + Npc->m_byAttackRange = NpcTableSet.m_byAttackRange; // 사정거리 + Npc->m_byTracingRange = NpcTableSet.m_byTracingRange; // 추격거리 + //Npc->m_sAI = NpcTableSet.m_sAI; // 인공지능 인덱스 Npc->m_tNpcType = NpcTableSet.m_byType; // NPC Type // 0 : Monster // 1 : Normal NPC - Npc->m_byFamilyType = NpcTableSet.m_byFamily; // ̿ 踦 Ѵ. - //Npc->m_tItemPer; // Ȯ - //Npc->m_tDnPer; // Ȯ + Npc->m_byFamilyType = NpcTableSet.m_byFamily; // 몹들사이에서 가족관계를 결정한다. + //Npc->m_tItemPer; // 아이템이 떨어질 확률 + //Npc->m_tDnPer; // 돈이 떨어질확률 - Npc->m_iMoney = NpcTableSet.m_iMoney; // - Npc->m_iItem = NpcTableSet.m_sItem; // + Npc->m_iMoney = NpcTableSet.m_iMoney; // 떨어지는 돈 + Npc->m_iItem = NpcTableSet.m_sItem; // 떨어지는 아이템 Npc->m_byDirectAttack = NpcTableSet.m_byDirectAttack; Npc->m_byMagicAttack = NpcTableSet.m_byMagicAttack; @@ -909,7 +909,7 @@ BOOL CServerDlg::GetNpcTableData() { return TRUE; } -// Npc Thread . +// Npc Thread 를 만든다. BOOL CServerDlg::CreateNpcThread() { BOOL bMoveNext = TRUE; int nSerial = m_sMapEventNpc; @@ -918,7 +918,7 @@ BOOL CServerDlg::CreateNpcThread() { int nRandom = 0, nServerNum = 0; double dbSpeed = 0; - m_TotalNPC = 0; // DB ִ + m_TotalNPC = 0; // DB에 있는 수 m_CurrentNPC = 0; m_CurrentNPCError = 0; @@ -926,7 +926,7 @@ BOOL CServerDlg::CreateNpcThread() { CRoomEvent * pRoom = NULL; // sungyong test - //CRNpcPosSet NpcPosSet; // Ѹ ׽Ʈ + //CRNpcPosSet NpcPosSet; // 한마리 테스트용 CNpcPosSet NpcPosSet; char szPath[500]; @@ -956,7 +956,7 @@ BOOL CServerDlg::CreateNpcThread() { while (!NpcPosSet.IsEOF()) { nMonsterNumber = NpcPosSet.m_NumNPC; - //if( NpcPosSet.m_ZoneID == 101 ) { // ׽Ʈ ؼ,, + //if( NpcPosSet.m_ZoneID == 101 ) { // 테스트를 위해서,, // nMonsterNumber = 1; //if(nMonsterNumber > 4) { // nMonsterNumber = nMonsterNumber / 4; @@ -968,7 +968,7 @@ BOOL CServerDlg::CreateNpcThread() { if (m_byZone == nServerNum || m_byZone == UNIFY_ZONE) { for (int j = 0; j < nMonsterNumber; j++) { CNpc * pNpc = new CNpc; - pNpc->m_sNid = nSerial++; // ȣ + pNpc->m_sNid = nSerial++; // 서버 내에서의 고유 번호 pNpc->m_sSid = (short)NpcPosSet.m_NpcID; // MONSTER(NPC) Serial ID pNpc->m_byMoveType = NpcPosSet.m_ActType; @@ -1010,61 +1010,61 @@ BOOL CServerDlg::CreateNpcThread() { _tcscpy(pNpc->m_strName, pNpcTable->m_strName); // MONSTER(NPC) Name pNpc->m_sPid = pNpcTable->m_sPid; // MONSTER(NPC) Picture ID - pNpc->m_sSize = pNpcTable->m_sSize; // ij (100 ۼƮ ) - pNpc->m_iWeapon_1 = pNpcTable->m_iWeapon_1; // 빫 - pNpc->m_iWeapon_2 = pNpcTable->m_iWeapon_2; // 빫 - pNpc->m_byGroup = pNpcTable->m_byGroup; // Ҽ - pNpc->m_byActType = pNpcTable->m_byActType; // ൿ - pNpc->m_byRank = pNpcTable->m_byRank; // - pNpc->m_byTitle = pNpcTable->m_byTitle; // + pNpc->m_sSize = pNpcTable->m_sSize; // 캐릭터의 비율(100 퍼센트 기준) + pNpc->m_iWeapon_1 = pNpcTable->m_iWeapon_1; // 착용무기 + pNpc->m_iWeapon_2 = pNpcTable->m_iWeapon_2; // 착용무기 + pNpc->m_byGroup = pNpcTable->m_byGroup; // 소속집단 + pNpc->m_byActType = pNpcTable->m_byActType; // 행동패턴 + pNpc->m_byRank = pNpcTable->m_byRank; // 작위 + pNpc->m_byTitle = pNpcTable->m_byTitle; // 지위 pNpc->m_iSellingGroup = pNpcTable->m_iSellingGroup; pNpc->m_sLevel = pNpcTable->m_sLevel; // level - pNpc->m_iExp = pNpcTable->m_iExp; // ġ + pNpc->m_iExp = pNpcTable->m_iExp; // 경험치 pNpc->m_iLoyalty = pNpcTable->m_iLoyalty; // loyalty - pNpc->m_iHP = pNpcTable->m_iMaxHP; // ִ HP - pNpc->m_iMaxHP = pNpcTable->m_iMaxHP; // HP - pNpc->m_sMP = pNpcTable->m_sMaxMP; // ִ MP - pNpc->m_sMaxMP = pNpcTable->m_sMaxMP; // MP - pNpc->m_sAttack = pNpcTable->m_sAttack; // ݰ - pNpc->m_sDefense = pNpcTable->m_sDefense; //  - pNpc->m_sHitRate = pNpcTable->m_sHitRate; // Ÿݼ - pNpc->m_sEvadeRate = pNpcTable->m_sEvadeRate; // ȸǼ - pNpc->m_sDamage = pNpcTable->m_sDamage; // ⺻ - pNpc->m_sAttackDelay = pNpcTable->m_sAttackDelay; // ݵ - pNpc->m_sSpeed = pNpcTable->m_sSpeed; // ̵ӵ + pNpc->m_iHP = pNpcTable->m_iMaxHP; // 최대 HP + pNpc->m_iMaxHP = pNpcTable->m_iMaxHP; // 현재 HP + pNpc->m_sMP = pNpcTable->m_sMaxMP; // 최대 MP + pNpc->m_sMaxMP = pNpcTable->m_sMaxMP; // 현재 MP + pNpc->m_sAttack = pNpcTable->m_sAttack; // 공격값 + pNpc->m_sDefense = pNpcTable->m_sDefense; // 방어값 + pNpc->m_sHitRate = pNpcTable->m_sHitRate; // 타격성공률 + pNpc->m_sEvadeRate = pNpcTable->m_sEvadeRate; // 회피성공률 + pNpc->m_sDamage = pNpcTable->m_sDamage; // 기본 데미지 + pNpc->m_sAttackDelay = pNpcTable->m_sAttackDelay; // 공격딜레이 + pNpc->m_sSpeed = pNpcTable->m_sSpeed; // 이동속도 dbSpeed = pNpcTable->m_sSpeed; - pNpc->m_fSpeed_1 = (float)pNpcTable->m_bySpeed_1 * (dbSpeed / 1000); // ⺻ ̵ Ÿ - pNpc->m_fSpeed_2 = (float)pNpcTable->m_bySpeed_2 * (dbSpeed / 1000); // ٴ ̵ Ÿ.. - pNpc->m_fOldSpeed_1 = (float)pNpcTable->m_bySpeed_1 * (dbSpeed / 1000); // ⺻ ̵ Ÿ - pNpc->m_fOldSpeed_2 = (float)pNpcTable->m_bySpeed_2 * (dbSpeed / 1000); // ٴ ̵ Ÿ.. - pNpc->m_fSecForMetor = 4.0f; // ʴ ִ Ÿ.. - pNpc->m_sStandTime = pNpcTable->m_sStandTime; // ִ ð - pNpc->m_iMagic1 = pNpcTable->m_iMagic1; // 븶 1 - pNpc->m_iMagic2 = pNpcTable->m_iMagic2; // 븶 2 - pNpc->m_iMagic3 = pNpcTable->m_iMagic3; // 븶 3 - pNpc->m_sFireR = pNpcTable->m_sFireR; // ȭ ׷ - pNpc->m_sColdR = pNpcTable->m_sColdR; // ñ ׷ - pNpc->m_sLightningR = pNpcTable->m_sLightningR; // ׷ - pNpc->m_sMagicR = pNpcTable->m_sMagicR; // ׷ - pNpc->m_sDiseaseR = pNpcTable->m_sDiseaseR; // ׷ - pNpc->m_sPoisonR = pNpcTable->m_sPoisonR; // ׷ - pNpc->m_sLightR = pNpcTable->m_sLightR; // ׷ + pNpc->m_fSpeed_1 = (float)pNpcTable->m_bySpeed_1 * (dbSpeed / 1000); // 기본 이동 타입 + pNpc->m_fSpeed_2 = (float)pNpcTable->m_bySpeed_2 * (dbSpeed / 1000); // 뛰는 이동 타입.. + pNpc->m_fOldSpeed_1 = (float)pNpcTable->m_bySpeed_1 * (dbSpeed / 1000); // 기본 이동 타입 + pNpc->m_fOldSpeed_2 = (float)pNpcTable->m_bySpeed_2 * (dbSpeed / 1000); // 뛰는 이동 타입.. + pNpc->m_fSecForMetor = 4.0f; // 초당 갈 수 있는 거리.. + pNpc->m_sStandTime = pNpcTable->m_sStandTime; // 서있는 시간 + pNpc->m_iMagic1 = pNpcTable->m_iMagic1; // 사용마법 1 + pNpc->m_iMagic2 = pNpcTable->m_iMagic2; // 사용마법 2 + pNpc->m_iMagic3 = pNpcTable->m_iMagic3; // 사용마법 3 + pNpc->m_sFireR = pNpcTable->m_sFireR; // 화염 저항력 + pNpc->m_sColdR = pNpcTable->m_sColdR; // 냉기 저항력 + pNpc->m_sLightningR = pNpcTable->m_sLightningR; // 전기 저항력 + pNpc->m_sMagicR = pNpcTable->m_sMagicR; // 마법 저항력 + pNpc->m_sDiseaseR = pNpcTable->m_sDiseaseR; // 저주 저항력 + pNpc->m_sPoisonR = pNpcTable->m_sPoisonR; // 독 저항력 + pNpc->m_sLightR = pNpcTable->m_sLightR; // 빛 저항력 pNpc->m_fBulk = (float)(((double)pNpcTable->m_sBulk / 100) * ((double)pNpcTable->m_sSize / 100)); - pNpc->m_bySearchRange = pNpcTable->m_bySearchRange; // Ž - pNpc->m_byAttackRange = pNpcTable->m_byAttackRange; // Ÿ - pNpc->m_byTracingRange = pNpcTable->m_byTracingRange; // ߰ݰŸ - pNpc->m_sAI = pNpcTable->m_sAI; // ΰ ε + pNpc->m_bySearchRange = pNpcTable->m_bySearchRange; // 적 탐지 범위 + pNpc->m_byAttackRange = pNpcTable->m_byAttackRange; // 사정거리 + pNpc->m_byTracingRange = pNpcTable->m_byTracingRange; // 추격거리 + pNpc->m_sAI = pNpcTable->m_sAI; // 인공지능 인덱스 pNpc->m_tNpcType = pNpcTable->m_tNpcType; // NPC Type - pNpc->m_byFamilyType = pNpcTable->m_byFamilyType; // ̿ 踦 Ѵ. - pNpc->m_iMoney = pNpcTable->m_iMoney; // - pNpc->m_iItem = pNpcTable->m_iItem; // + pNpc->m_byFamilyType = pNpcTable->m_byFamilyType; // 몹들사이에서 가족관계를 결정한다. + pNpc->m_iMoney = pNpcTable->m_iMoney; // 떨어지는 돈 + pNpc->m_iItem = pNpcTable->m_iItem; // 떨어지는 아이템 pNpc->m_tNpcLongType = pNpcTable->m_byDirectAttack; pNpc->m_byWhatAttackType = pNpcTable->m_byMagicAttack; //////// MONSTER POS //////////////////////////////////////// pNpc->m_sCurZone = NpcPosSet.m_ZoneID; - // map ġ ϰ ġŲ.. (׽Ʈ : -DB оµ ġ ) + // map에 몬스터의 위치를 랜덤하게 위치시킨다.. (테스트 용 : 수정-DB에서 읽어오는데로 몬 위치 결정) nRandom = abs(NpcPosSet.m_LeftX - NpcPosSet.m_RightX); if (nRandom <= 1) { fRandom_X = (float)NpcPosSet.m_LeftX; @@ -1097,7 +1097,7 @@ BOOL CServerDlg::CreateNpcThread() { NpcPosSet.m_RegTime = 30; } - pNpc->m_sRegenTime = NpcPosSet.m_RegTime * 1000; // (DB)-> и + pNpc->m_sRegenTime = NpcPosSet.m_RegTime * 1000; // 초(DB)단위-> 밀리세컨드로 pNpc->m_sMaxPathCount = NpcPosSet.m_DotCnt; @@ -1259,7 +1259,7 @@ BOOL CServerDlg::CreateNpcThread() { pNpcThread->pIOCP = &m_Iocport; pNpcThread->m_sThreadNumber = 1000; - for(int i = 0; i < NPC_NUM; i++) // ̸ ִ ȯ NPC_NUM ޸ Ҵ + for(int i = 0; i < NPC_NUM; i++) // 미리 최대 소환 NPC_NUM마리 메모리 할당 { CNpc* pNpc = new CNpc; pNpc->m_sNid = nSerial++; @@ -1288,7 +1288,7 @@ BOOL CServerDlg::CreateNpcThread() { return TRUE; } -// NPC Thread ۵Ų. +// NPC Thread 들을 작동시킨다. void CServerDlg::ResumeAI() { for (int i = 0; i < m_arNpcThread.size(); i++) { for (int j = 0; j < NPC_NUM; j++) { @@ -1304,7 +1304,7 @@ void CServerDlg::ResumeAI() { /* m_arEventNpcThread[0]->m_ThreadInfo.hWndMsg = this->GetSafeHwnd(); for(int j = 0; j < NPC_NUM; j++) { - m_arEventNpcThread[0]->m_ThreadInfo.pNpc[j] = NULL; // ʱ ȯ 翬 Ƿ NULL ۵ ȽŴ + m_arEventNpcThread[0]->m_ThreadInfo.pNpc[j] = NULL; // 초기 소환 몹이 당연히 없으므로 NULL로 작동을 안시킴 m_arEventNpcThread[0]->m_ThreadInfo.m_byNpcUsed[j] = 0; } m_arEventNpcThread[0]->m_ThreadInfo.pIOCP = &m_Iocport; @@ -1315,7 +1315,7 @@ void CServerDlg::ResumeAI() { ::ResumeThread(m_pZoneEventThread->m_hThread); } -// ޸ +// 메모리 정리 BOOL CServerDlg::DestroyWindow() { // TODO: Add your specialized code here and/or call the base class KillTimer(CHECK_ALIVE); @@ -1342,7 +1342,7 @@ BOOL CServerDlg::DestroyWindow() { WaitForSingleObject(m_pZoneEventThread, INFINITE); - // DB̺ κ + // DB테이블 삭제 부분 // Map(Zone) Array Delete... for (int i = 0; i < g_arZone.size(); i++) { @@ -1464,7 +1464,7 @@ void CServerDlg::DeleteUserList(int uid) { } if (pUser->m_iUserId == uid) { - TRACE("*** UserLogOut ȯ : uid=%d, %s ***\n", uid, pUser->m_strUserID); + TRACE("*** UserLogOut으로 포인터 반환 : uid=%d, %s ***\n", uid, pUser->m_strUserID); pUser->m_lUsed = 1; delete m_pUser[uid]; m_pUser[uid] = NULL; @@ -1501,7 +1501,7 @@ BOOL CServerDlg::MapFileLoad() { szFullPath.Format(".\\AIServer_MAP\\%s", sZoneName); if (!file.Open(szFullPath, CFile::modeRead)) { - errormsg.Format(" Open - %s\n", szFullPath); + errormsg.Format("파일 Open 실패 - %s\n", szFullPath); AfxMessageBox(errormsg); return FALSE; } @@ -1512,7 +1512,7 @@ BOOL CServerDlg::MapFileLoad() { strcpy(pMap->m_MapName, (char *)(LPCTSTR)sZoneName); if (!pMap->LoadMap((HANDLE)file.m_hFile)) { - errormsg.Format("Map Load - %s\n", szFullPath); + errormsg.Format("Map Load 실패 - %s\n", szFullPath); AfxMessageBox(errormsg); delete pMap; return FALSE; @@ -1521,7 +1521,7 @@ BOOL CServerDlg::MapFileLoad() { // dungeon work if (ZoneInfoSet.m_RoomEvent > 0) { if (!pMap->LoadRoomEvent(ZoneInfoSet.m_RoomEvent)) { - errormsg.Format("Map Room Event Load - %s\n", szFullPath); + errormsg.Format("Map Room Event Load 실패 - %s\n", szFullPath); AfxMessageBox(errormsg); delete pMap; return FALSE; @@ -1541,7 +1541,7 @@ BOOL CServerDlg::MapFileLoad() { } // sungyong 2002.05.23 -// game server npc .. +// game server에 모든 npc정보를 전송.. void CServerDlg::AllNpcInfo() { // server alive check CNpc * pNpc = NULL; @@ -1648,7 +1648,7 @@ CUser * CServerDlg::GetUserPtr(int nid) { /* if( !m_ppUserActive[nid] ) return NULL; - if( m_ppUserActive[nid]->m_lUsed == 1 ) return NULL; // ġ .. (logout) + if( m_ppUserActive[nid]->m_lUsed == 1 ) return NULL; // 포인터 사용을 허락치 않음.. (logout중) pUser = (CUser*)m_ppUserActive[nid]; */ @@ -1657,7 +1657,7 @@ CUser * CServerDlg::GetUserPtr(int nid) { return NULL; } if (pUser->m_lUsed == 1) { - return NULL; // ġ .. (logout) + return NULL; // 포인터 사용을 허락치 않음.. (logout중) } if (pUser->m_iUserId < 0 || pUser->m_iUserId >= MAX_USER) { return NULL; @@ -1730,7 +1730,7 @@ void CServerDlg::DeleteAllUserList(int zone) { CString logstr; - if (zone == 9999 && m_bFirstServerFlag == TRUE) { // ... + if (zone == 9999 && m_bFirstServerFlag == TRUE) { // 모든 소켓이 끊어진 상태... CUser * pUser = NULL; MAP * pMap = NULL; @@ -1762,7 +1762,7 @@ void CServerDlg::DeleteAllUserList(int zone) { delete m_pUser[i]; m_pUser[i] = NULL; } - // Ƽ .. + // 파티 정보 삭제.. LeaveCriticalSection(&g_User_critical); // Party Array Delete @@ -2022,7 +2022,7 @@ CNpc * CServerDlg::GetNpcPtr(TCHAR * pNpcName) { return NULL; } -// ߰ ȯ ޸𸮸 ϱ ÷װ 0 °͸ ѱ. +// 추가할 소환몹의 메모리를 참조하기위해 플래그가 0인 상태것만 넘긴다. CNpc * CServerDlg::GetEventNpcPtr() { CNpc * pNpc = NULL; for (int i = m_TotalNPC; i < m_arNpc.GetSize(); i++) { @@ -2044,13 +2044,13 @@ CNpc * CServerDlg::GetEventNpcPtr() { int CServerDlg::MonsterSummon(TCHAR * pNpcName, int zone, float fx, float fz) { if (zone < 0 || zone > (g_arZone.size() + 1)) { - TRACE("#### ȯ : %s, zoneindex=%d #####\n", pNpcName, zone); + TRACE("#### 소환 실패 : %s, zoneindex=%d #####\n", pNpcName, zone); return -1; } CNpc * pNpc = GetNpcPtr(pNpcName); if (pNpc == NULL) { - TRACE("ȯ ̸(%s) ߸Ǿϴ.\n", pNpcName); + TRACE("소환할 몬스터의 이름(%s)이 잘못되었습니다.\n", pNpcName); return -1; } @@ -2060,13 +2060,13 @@ int CServerDlg::MonsterSummon(TCHAR * pNpcName, int zone, float fx, float fz) { return 1; } -// ȯ Ÿ Ѵ. +// 소환할 몹의 데이타값을 셋팅한다. BOOL CServerDlg::SetSummonNpcData(CNpc * pNpc, int zone, float fx, float fz) { int iCount = 0; CNpc * pEventNpc = GetEventNpcPtr(); if (pEventNpc == NULL) { - TRACE("ȯҼ ִ ִ 20Դϴ.\n"); + TRACE("소환할수 있는 몹은 최대 20마리입니다.\n"); return FALSE; } @@ -2078,53 +2078,53 @@ BOOL CServerDlg::SetSummonNpcData(CNpc * pNpc, int zone, float fx, float fz) { pEventNpc->m_byBattlePos = 0; _tcscpy(pEventNpc->m_strName, pNpc->m_strName); // MONSTER(NPC) Name pEventNpc->m_sPid = pNpc->m_sPid; // MONSTER(NPC) Picture ID - pEventNpc->m_sSize = pNpc->m_sSize; // ij (100 ۼƮ ) - pEventNpc->m_iWeapon_1 = pNpc->m_iWeapon_1; // 빫 - pEventNpc->m_iWeapon_2 = pNpc->m_iWeapon_2; // 빫 - pEventNpc->m_byGroup = pNpc->m_byGroup; // Ҽ - pEventNpc->m_byActType = pNpc->m_byActType; // ൿ - pEventNpc->m_byRank = pNpc->m_byRank; // - pEventNpc->m_byTitle = pNpc->m_byTitle; // + pEventNpc->m_sSize = pNpc->m_sSize; // 캐릭터의 비율(100 퍼센트 기준) + pEventNpc->m_iWeapon_1 = pNpc->m_iWeapon_1; // 착용무기 + pEventNpc->m_iWeapon_2 = pNpc->m_iWeapon_2; // 착용무기 + pEventNpc->m_byGroup = pNpc->m_byGroup; // 소속집단 + pEventNpc->m_byActType = pNpc->m_byActType; // 행동패턴 + pEventNpc->m_byRank = pNpc->m_byRank; // 작위 + pEventNpc->m_byTitle = pNpc->m_byTitle; // 지위 pEventNpc->m_iSellingGroup = pNpc->m_iSellingGroup; pEventNpc->m_sLevel = pNpc->m_sLevel; // level - pEventNpc->m_iExp = pNpc->m_iExp; // ġ + pEventNpc->m_iExp = pNpc->m_iExp; // 경험치 pEventNpc->m_iLoyalty = pNpc->m_iLoyalty; // loyalty - pEventNpc->m_iHP = pNpc->m_iMaxHP; // ִ HP - pEventNpc->m_iMaxHP = pNpc->m_iMaxHP; // HP - pEventNpc->m_sMP = pNpc->m_sMaxMP; // ִ MP - pEventNpc->m_sMaxMP = pNpc->m_sMaxMP; // MP - pEventNpc->m_sAttack = pNpc->m_sAttack; // ݰ - pEventNpc->m_sDefense = pNpc->m_sDefense; //  - pEventNpc->m_sHitRate = pNpc->m_sHitRate; // Ÿݼ - pEventNpc->m_sEvadeRate = pNpc->m_sEvadeRate; // ȸǼ - pEventNpc->m_sDamage = pNpc->m_sDamage; // ⺻ - pEventNpc->m_sAttackDelay = pNpc->m_sAttackDelay; // ݵ - pEventNpc->m_sSpeed = pNpc->m_sSpeed; // ̵ӵ - pEventNpc->m_fSpeed_1 = pNpc->m_fSpeed_1; // ⺻ ̵ Ÿ - pEventNpc->m_fSpeed_2 = pNpc->m_fSpeed_2; // ٴ ̵ Ÿ.. - pEventNpc->m_fOldSpeed_1 = pNpc->m_fOldSpeed_1; // ⺻ ̵ Ÿ - pEventNpc->m_fOldSpeed_2 = pNpc->m_fOldSpeed_2; // ٴ ̵ Ÿ.. - pEventNpc->m_fSecForMetor = 4.0f; // ʴ ִ Ÿ.. - pEventNpc->m_sStandTime = pNpc->m_sStandTime; // ִ ð - pEventNpc->m_iMagic1 = pNpc->m_iMagic1; // 븶 1 - pEventNpc->m_iMagic2 = pNpc->m_iMagic2; // 븶 2 - pEventNpc->m_iMagic3 = pNpc->m_iMagic3; // 븶 3 - pEventNpc->m_sFireR = pNpc->m_sFireR; // ȭ ׷ - pEventNpc->m_sColdR = pNpc->m_sColdR; // ñ ׷ - pEventNpc->m_sLightningR = pNpc->m_sLightningR; // ׷ - pEventNpc->m_sMagicR = pNpc->m_sMagicR; // ׷ - pEventNpc->m_sDiseaseR = pNpc->m_sDiseaseR; // ׷ - pEventNpc->m_sPoisonR = pNpc->m_sPoisonR; // ׷ - pEventNpc->m_sLightR = pNpc->m_sLightR; // ׷ + pEventNpc->m_iHP = pNpc->m_iMaxHP; // 최대 HP + pEventNpc->m_iMaxHP = pNpc->m_iMaxHP; // 현재 HP + pEventNpc->m_sMP = pNpc->m_sMaxMP; // 최대 MP + pEventNpc->m_sMaxMP = pNpc->m_sMaxMP; // 현재 MP + pEventNpc->m_sAttack = pNpc->m_sAttack; // 공격값 + pEventNpc->m_sDefense = pNpc->m_sDefense; // 방어값 + pEventNpc->m_sHitRate = pNpc->m_sHitRate; // 타격성공률 + pEventNpc->m_sEvadeRate = pNpc->m_sEvadeRate; // 회피성공률 + pEventNpc->m_sDamage = pNpc->m_sDamage; // 기본 데미지 + pEventNpc->m_sAttackDelay = pNpc->m_sAttackDelay; // 공격딜레이 + pEventNpc->m_sSpeed = pNpc->m_sSpeed; // 이동속도 + pEventNpc->m_fSpeed_1 = pNpc->m_fSpeed_1; // 기본 이동 타입 + pEventNpc->m_fSpeed_2 = pNpc->m_fSpeed_2; // 뛰는 이동 타입.. + pEventNpc->m_fOldSpeed_1 = pNpc->m_fOldSpeed_1; // 기본 이동 타입 + pEventNpc->m_fOldSpeed_2 = pNpc->m_fOldSpeed_2; // 뛰는 이동 타입.. + pEventNpc->m_fSecForMetor = 4.0f; // 초당 갈 수 있는 거리.. + pEventNpc->m_sStandTime = pNpc->m_sStandTime; // 서있는 시간 + pEventNpc->m_iMagic1 = pNpc->m_iMagic1; // 사용마법 1 + pEventNpc->m_iMagic2 = pNpc->m_iMagic2; // 사용마법 2 + pEventNpc->m_iMagic3 = pNpc->m_iMagic3; // 사용마법 3 + pEventNpc->m_sFireR = pNpc->m_sFireR; // 화염 저항력 + pEventNpc->m_sColdR = pNpc->m_sColdR; // 냉기 저항력 + pEventNpc->m_sLightningR = pNpc->m_sLightningR; // 전기 저항력 + pEventNpc->m_sMagicR = pNpc->m_sMagicR; // 마법 저항력 + pEventNpc->m_sDiseaseR = pNpc->m_sDiseaseR; // 저주 저항력 + pEventNpc->m_sPoisonR = pNpc->m_sPoisonR; // 독 저항력 + pEventNpc->m_sLightR = pNpc->m_sLightR; // 빛 저항력 pEventNpc->m_fBulk = pNpc->m_fBulk; - pEventNpc->m_bySearchRange = pNpc->m_bySearchRange; // Ž - pEventNpc->m_byAttackRange = pNpc->m_byAttackRange; // Ÿ - pEventNpc->m_byTracingRange = pNpc->m_byTracingRange; // ߰ݰŸ - pEventNpc->m_sAI = pNpc->m_sAI; // ΰ ε + pEventNpc->m_bySearchRange = pNpc->m_bySearchRange; // 적 탐지 범위 + pEventNpc->m_byAttackRange = pNpc->m_byAttackRange; // 사정거리 + pEventNpc->m_byTracingRange = pNpc->m_byTracingRange; // 추격거리 + pEventNpc->m_sAI = pNpc->m_sAI; // 인공지능 인덱스 pEventNpc->m_tNpcType = pNpc->m_tNpcType; // NPC Type - pEventNpc->m_byFamilyType = pNpc->m_byFamilyType; // ̿ 踦 Ѵ. - pEventNpc->m_iMoney = pNpc->m_iMoney; // - pEventNpc->m_iItem = pNpc->m_iItem; // + pEventNpc->m_byFamilyType = pNpc->m_byFamilyType; // 몹들사이에서 가족관계를 결정한다. + pEventNpc->m_iMoney = pNpc->m_iMoney; // 떨어지는 돈 + pEventNpc->m_iItem = pNpc->m_iItem; // 떨어지는 아이템 pEventNpc->m_tNpcLongType = pNpc->m_tNpcLongType; pEventNpc->m_byWhatAttackType = pNpc->m_byWhatAttackType; @@ -2137,14 +2137,14 @@ BOOL CServerDlg::SetSummonNpcData(CNpc * pNpc, int zone, float fx, float fz) { pEventNpc->m_nInitMinY = pNpc->m_nInitMinY; pEventNpc->m_nInitMaxX = pNpc->m_nInitMaxX; pEventNpc->m_nInitMaxY = pNpc->m_nInitMaxY; - pEventNpc->m_sRegenTime = pNpc->m_sRegenTime; // (DB)-> и + pEventNpc->m_sRegenTime = pNpc->m_sRegenTime; // 초(DB)단위-> 밀리세컨드로 pEventNpc->m_tItemPer = pNpc->m_tItemPer; // NPC Type pEventNpc->m_tDnPer = pNpc->m_tDnPer; // NPC Type pEventNpc->m_ZoneIndex = -1; - pEventNpc->m_NpcState = NPC_DEAD; // ´ ؾ Ѵ.. - pEventNpc->m_bFirstLive = 1; // ó Ƴ Ѵ.. + pEventNpc->m_NpcState = NPC_DEAD; // 상태는 죽은것으로 해야 한다.. + pEventNpc->m_bFirstLive = 1; // 처음 살아난 경우로 해줘야 한다.. for (int i = 0; i < g_arZone.size(); i++) { if (g_arZone[i]->m_nZoneNumber == zone) { @@ -2177,11 +2177,11 @@ BOOL CServerDlg::SetSummonNpcData(CNpc * pNpc, int zone, float fx, float fz) { if (!bSuccess) { pEventNpc->m_lEventNpc = 0; - TRACE("### ȯ ߽ϴ. ###\n"); + TRACE("### 소환에 실패했습니다. ###\n"); return FALSE; } - TRACE("*** %d, %s ȯϿϴ. state = %d ***\n", pEventNpc->m_sNid + NPC_BAND, pEventNpc->m_strName, + TRACE("*** %d, %s 를 소환하였습니다. state = %d ***\n", pEventNpc->m_sNid + NPC_BAND, pEventNpc->m_strName, pEventNpc->m_NpcState); return TRUE; @@ -2412,7 +2412,7 @@ BOOL CServerDlg::AddObjectEventNpc(_OBJECT_EVENT * pEvent, int zone_number) { CNpc * pNpc = new CNpc; - pNpc->m_sNid = m_sMapEventNpc++; // ȣ + pNpc->m_sNid = m_sMapEventNpc++; // 서버 내에서의 고유 번호 pNpc->m_sSid = (short)pEvent->sIndex; // MONSTER(NPC) Serial ID pNpc->m_byMoveType = 100; @@ -2426,53 +2426,53 @@ BOOL CServerDlg::AddObjectEventNpc(_OBJECT_EVENT * pEvent, int zone_number) { _tcscpy(pNpc->m_strName, pNpcTable->m_strName); // MONSTER(NPC) Name pNpc->m_sPid = pNpcTable->m_sPid; // MONSTER(NPC) Picture ID - pNpc->m_sSize = pNpcTable->m_sSize; // ij (100 ۼƮ ) - pNpc->m_iWeapon_1 = pNpcTable->m_iWeapon_1; // 빫 - pNpc->m_iWeapon_2 = pNpcTable->m_iWeapon_2; // 빫 - pNpc->m_byGroup = pNpcTable->m_byGroup; // Ҽ - pNpc->m_byActType = pNpcTable->m_byActType; // ൿ - pNpc->m_byRank = pNpcTable->m_byRank; // - pNpc->m_byTitle = pNpcTable->m_byTitle; // + pNpc->m_sSize = pNpcTable->m_sSize; // 캐릭터의 비율(100 퍼센트 기준) + pNpc->m_iWeapon_1 = pNpcTable->m_iWeapon_1; // 착용무기 + pNpc->m_iWeapon_2 = pNpcTable->m_iWeapon_2; // 착용무기 + pNpc->m_byGroup = pNpcTable->m_byGroup; // 소속집단 + pNpc->m_byActType = pNpcTable->m_byActType; // 행동패턴 + pNpc->m_byRank = pNpcTable->m_byRank; // 작위 + pNpc->m_byTitle = pNpcTable->m_byTitle; // 지위 pNpc->m_iSellingGroup = pNpcTable->m_iSellingGroup; pNpc->m_sLevel = pNpcTable->m_sLevel; // level - pNpc->m_iExp = pNpcTable->m_iExp; // ġ + pNpc->m_iExp = pNpcTable->m_iExp; // 경험치 pNpc->m_iLoyalty = pNpcTable->m_iLoyalty; // loyalty - pNpc->m_iHP = pNpcTable->m_iMaxHP; // ִ HP - pNpc->m_iMaxHP = pNpcTable->m_iMaxHP; // HP - pNpc->m_sMP = pNpcTable->m_sMaxMP; // ִ MP - pNpc->m_sMaxMP = pNpcTable->m_sMaxMP; // MP - pNpc->m_sAttack = pNpcTable->m_sAttack; // ݰ - pNpc->m_sDefense = pNpcTable->m_sDefense; //  - pNpc->m_sHitRate = pNpcTable->m_sHitRate; // Ÿݼ - pNpc->m_sEvadeRate = pNpcTable->m_sEvadeRate; // ȸǼ - pNpc->m_sDamage = pNpcTable->m_sDamage; // ⺻ - pNpc->m_sAttackDelay = pNpcTable->m_sAttackDelay; // ݵ - pNpc->m_sSpeed = pNpcTable->m_sSpeed; // ̵ӵ - pNpc->m_fSpeed_1 = (float)pNpcTable->m_bySpeed_1; // ⺻ ̵ Ÿ - pNpc->m_fSpeed_2 = (float)pNpcTable->m_bySpeed_2; // ٴ ̵ Ÿ.. - pNpc->m_fOldSpeed_1 = (float)pNpcTable->m_bySpeed_1; // ⺻ ̵ Ÿ - pNpc->m_fOldSpeed_2 = (float)pNpcTable->m_bySpeed_2; // ٴ ̵ Ÿ.. - pNpc->m_fSecForMetor = 4.0f; // ʴ ִ Ÿ.. - pNpc->m_sStandTime = pNpcTable->m_sStandTime; // ִ ð - pNpc->m_iMagic1 = pNpcTable->m_iMagic1; // 븶 1 - pNpc->m_iMagic2 = pNpcTable->m_iMagic2; // 븶 2 - pNpc->m_iMagic3 = pNpcTable->m_iMagic3; // 븶 3 - pNpc->m_sFireR = pNpcTable->m_sFireR; // ȭ ׷ - pNpc->m_sColdR = pNpcTable->m_sColdR; // ñ ׷ - pNpc->m_sLightningR = pNpcTable->m_sLightningR; // ׷ - pNpc->m_sMagicR = pNpcTable->m_sMagicR; // ׷ - pNpc->m_sDiseaseR = pNpcTable->m_sDiseaseR; // ׷ - pNpc->m_sPoisonR = pNpcTable->m_sPoisonR; // ׷ - pNpc->m_sLightR = pNpcTable->m_sLightR; // ׷ + pNpc->m_iHP = pNpcTable->m_iMaxHP; // 최대 HP + pNpc->m_iMaxHP = pNpcTable->m_iMaxHP; // 현재 HP + pNpc->m_sMP = pNpcTable->m_sMaxMP; // 최대 MP + pNpc->m_sMaxMP = pNpcTable->m_sMaxMP; // 현재 MP + pNpc->m_sAttack = pNpcTable->m_sAttack; // 공격값 + pNpc->m_sDefense = pNpcTable->m_sDefense; // 방어값 + pNpc->m_sHitRate = pNpcTable->m_sHitRate; // 타격성공률 + pNpc->m_sEvadeRate = pNpcTable->m_sEvadeRate; // 회피성공률 + pNpc->m_sDamage = pNpcTable->m_sDamage; // 기본 데미지 + pNpc->m_sAttackDelay = pNpcTable->m_sAttackDelay; // 공격딜레이 + pNpc->m_sSpeed = pNpcTable->m_sSpeed; // 이동속도 + pNpc->m_fSpeed_1 = (float)pNpcTable->m_bySpeed_1; // 기본 이동 타입 + pNpc->m_fSpeed_2 = (float)pNpcTable->m_bySpeed_2; // 뛰는 이동 타입.. + pNpc->m_fOldSpeed_1 = (float)pNpcTable->m_bySpeed_1; // 기본 이동 타입 + pNpc->m_fOldSpeed_2 = (float)pNpcTable->m_bySpeed_2; // 뛰는 이동 타입.. + pNpc->m_fSecForMetor = 4.0f; // 초당 갈 수 있는 거리.. + pNpc->m_sStandTime = pNpcTable->m_sStandTime; // 서있는 시간 + pNpc->m_iMagic1 = pNpcTable->m_iMagic1; // 사용마법 1 + pNpc->m_iMagic2 = pNpcTable->m_iMagic2; // 사용마법 2 + pNpc->m_iMagic3 = pNpcTable->m_iMagic3; // 사용마법 3 + pNpc->m_sFireR = pNpcTable->m_sFireR; // 화염 저항력 + pNpc->m_sColdR = pNpcTable->m_sColdR; // 냉기 저항력 + pNpc->m_sLightningR = pNpcTable->m_sLightningR; // 전기 저항력 + pNpc->m_sMagicR = pNpcTable->m_sMagicR; // 마법 저항력 + pNpc->m_sDiseaseR = pNpcTable->m_sDiseaseR; // 저주 저항력 + pNpc->m_sPoisonR = pNpcTable->m_sPoisonR; // 독 저항력 + pNpc->m_sLightR = pNpcTable->m_sLightR; // 빛 저항력 pNpc->m_fBulk = (float)(((double)pNpcTable->m_sBulk / 100) * ((double)pNpcTable->m_sSize / 100)); - pNpc->m_bySearchRange = pNpcTable->m_bySearchRange; // Ž - pNpc->m_byAttackRange = pNpcTable->m_byAttackRange; // Ÿ - pNpc->m_byTracingRange = pNpcTable->m_byTracingRange; // ߰ݰŸ - pNpc->m_sAI = pNpcTable->m_sAI; // ΰ ε + pNpc->m_bySearchRange = pNpcTable->m_bySearchRange; // 적 탐지 범위 + pNpc->m_byAttackRange = pNpcTable->m_byAttackRange; // 사정거리 + pNpc->m_byTracingRange = pNpcTable->m_byTracingRange; // 추격거리 + pNpc->m_sAI = pNpcTable->m_sAI; // 인공지능 인덱스 pNpc->m_tNpcType = pNpcTable->m_tNpcType; // NPC Type - pNpc->m_byFamilyType = pNpcTable->m_byFamilyType; // ̿ 踦 Ѵ. - pNpc->m_iMoney = pNpcTable->m_iMoney; // - pNpc->m_iItem = pNpcTable->m_iItem; // + pNpc->m_byFamilyType = pNpcTable->m_byFamilyType; // 몹들사이에서 가족관계를 결정한다. + pNpc->m_iMoney = pNpcTable->m_iMoney; // 떨어지는 돈 + pNpc->m_iItem = pNpcTable->m_iItem; // 떨어지는 아이템 pNpc->m_tNpcLongType = pNpcTable->m_byDirectAttack; pNpc->m_byWhatAttackType = pNpcTable->m_byDirectAttack; @@ -2490,15 +2490,15 @@ BOOL CServerDlg::AddObjectEventNpc(_OBJECT_EVENT * pEvent, int zone_number) { pNpc->m_nInitMaxX = pEvent->fPosX + 1; pNpc->m_nInitMaxY = pEvent->fPosZ + 1; - pNpc->m_sRegenTime = 10000 * 1000; // (DB)-> и - //pNpc->m_sRegenTime = 30 * 1000; // (DB)-> и + pNpc->m_sRegenTime = 10000 * 1000; // 초(DB)단위-> 밀리세컨드로 + //pNpc->m_sRegenTime = 30 * 1000; // 초(DB)단위-> 밀리세컨드로 pNpc->m_sMaxPathCount = 0; pNpc->m_tItemPer = pNpcTable->m_tItemPer; // NPC Type pNpc->m_tDnPer = pNpcTable->m_tDnPer; // NPC Type pNpc->m_ZoneIndex = -1; pNpc->m_byObjectType = SPECIAL_OBJECT; - pNpc->m_bFirstLive = 1; // ó Ƴ Ѵ.. + pNpc->m_bFirstLive = 1; // 처음 살아난 경우로 해줘야 한다.. //pNpc->m_ZoneIndex = GetZoneIndex(pNpc->m_sCurZone); /* if(pNpc->m_ZoneIndex == -1) { @@ -2573,8 +2573,8 @@ void CServerDlg::SendSystemMsg(char * pMsg, int zone, int type, int who) { short sLength = _tcslen(pMsg); SetByte(buff, AG_SYSTEM_MSG, send_index); - SetByte(buff, type, send_index); // ä - SetShort(buff, who, send_index); // + SetByte(buff, type, send_index); // 채팅형식 + SetShort(buff, who, send_index); // 누구에게 SetShort(buff, sLength, send_index); SetString(buff, pMsg, sLength, send_index); @@ -2589,9 +2589,9 @@ void CServerDlg::ResetBattleZone() { continue; } if (pMap->m_byRoomEvent == 0) { - continue; // ϴ ƴϸ .. + continue; // 현재의 존이 던젼담당하는 존이 아니면 리턴.. } - //if( pMap->IsRoomStatusCheck() == TRUE ) continue; // ü Ŭ Ǿٸ + //if( pMap->IsRoomStatusCheck() == TRUE ) continue; // 전체방이 클리어 되었다면 pMap->InitializeRoom(); } TRACE("ServerDlg - ResetBattleZone() : end \n"); diff --git a/src/server/AIServer/AIServerDlg.h b/src/server/AIServer/AIServerDlg.h index d7dc7970..6e51b21c 100644 --- a/src/server/AIServer/AIServerDlg.h +++ b/src/server/AIServer/AIServerDlg.h @@ -19,7 +19,7 @@ #include "Compress.h" #include "Party.h" -#include "extern.h" // ü +#include "extern.h" // 전역 객체 #include "STLMap.h" #include @@ -44,8 +44,8 @@ typedef std::list ZoneNpcInfoList; typedef std::vector ZoneArray; /* - ** Repent AI Server ۾ ** - 1. 3 Լ ߰ + ** Repent AI Server 작업시 참고 사항 ** + 1. 3개의 함수 추가 int GetSpeed(BYTE bySpeed); int GetAttackSpeed(BYTE bySpeed); int GetCatsSpeed(BYTE bySpeed); @@ -71,7 +71,7 @@ class CServerDlg : public CDialog { void GetServerInfoIni(); void SyncTest(); - void RegionCheck(); // regionȿ üũ (忡 FindEnermy()Լ ϸ ̱ Ǽ) + void RegionCheck(); // region안에 들어오는 유저 체크 (스레드에서 FindEnermy()함수의 부하를 줄이기 위한 꽁수) void TestCode(); // Construction public: @@ -93,7 +93,7 @@ class CServerDlg : public CDialog { void CheckAliveTest(); void DeleteUserList(int uid); void DeleteAllUserList(int zone); - void SendCompressedData(int nZone); // Ŷ ؼ .. + void SendCompressedData(int nZone); // 패킷을 압축해서 보낸다.. int Send(char * pData, int length, int nZone = 0); void SendSystemMsg(char * pMsg, int zone, int type = 0, int who = 0); void ResetBattleZone(); @@ -144,32 +144,32 @@ class CServerDlg : public CDialog { CUser * m_pUser[MAX_USER]; - // class ü + // class 객체 CNpcItem m_NpcItem; CFile m_UserLogFile; CFile m_ItemLogFile; - // ü + // 전역 객체 변수 //BOOL m_bNpcExit; - long m_TotalNPC; // DBִ - long m_CurrentNPCError; // ÿ - long m_CurrentNPC; // ӻ󿡼 õ - short m_sTotalMap; // Zone - short m_sMapEventNpc; // Map о̴ event npc + long m_TotalNPC; // DB에있는 총 수 + long m_CurrentNPCError; // 세팅에서 실패한 수 + long m_CurrentNPC; // 현재 게임상에서 실제로 셋팅된 수 + short m_sTotalMap; // Zone 수 + short m_sMapEventNpc; // Map에서 읽어들이는 event npc 수 // sungyong 2002.05.23 - BOOL m_bFirstServerFlag; // ó Ӽ 쿡 1, 0 - short m_sSocketCount; // GameServer ó ʿ - short m_sReSocketCount; // GameServer ʿ - float m_fReConnectStart; // ó ð - short m_sErrorSocketCount; // ̻ ÿ + BOOL m_bFirstServerFlag; // 서버가 처음시작한 후 게임서버가 붙은 경우에는 1, 붙지 않은 경우 0 + short m_sSocketCount; // GameServer와 처음접시 필요 + short m_sReSocketCount; // GameServer와 재접시 필요 + float m_fReConnectStart; // 처음 소켓이 도착한 시간 + short m_sErrorSocketCount; // 이상소켓 감시용 // ~sungyong 2002.05.23 - BYTE m_byBattleEvent; // ̺Ʈ ÷( 1: ƴ, 0:) - short m_sKillKarusNpc, m_sKillElmoNpc; // ﵿȿ npc + BYTE m_byBattleEvent; // 전쟁 이벤트 관련 플래그( 1:전쟁중이 아님, 0:전쟁중) + short m_sKillKarusNpc, m_sKillElmoNpc; // 전쟁동안에 죽은 npc숫자 int m_iYear, m_iMonth, m_iDate, m_iHour, m_iMin, m_iWeather, m_iAmount; - BYTE m_byNight; // ,, Ǵ... 1:, 2: + BYTE m_byNight; // 밤인지,, 낮인지를 판단... 1:낮, 2:밤 BYTE m_byTestMode; char m_szOdbcGameDsn[24]; @@ -179,12 +179,12 @@ class CServerDlg : public CDialog { CIOCPort m_Iocport; private: - // Ŷ ࿡ ʿ ------------- + // 패킷 압축에 필요 변수 ------------- CCompressManager m_CompMng; int m_CompCount; TCHAR m_CompBuf[10240]; int m_iCompIndex; - // ~Ŷ ࿡ ʿ ------------- + // ~패킷 압축에 필요 변수 ------------- BYTE m_byZone; diff --git a/src/server/AIServer/CircularBuffer.h b/src/server/AIServer/CircularBuffer.h index 13a6572f..188fca87 100644 --- a/src/server/AIServer/CircularBuffer.h +++ b/src/server/AIServer/CircularBuffer.h @@ -11,11 +11,11 @@ class CCircularBuffer { void PutData(char * pData, int len); void GetData(char * pData, int len); - int GetOutData(char * pData); //HeadPos, ȭ + int GetOutData(char * pData); //HeadPos, 변화 void PutData(char & data); char & GetHeadData() { return m_pBuffer[m_iHeadPos]; } //1 Byte Operation; - //false : 絥 ٺ, TRUE: + //false : 모든데이터 다빠짐, TRUE: 정상적으로 진행중 BOOL HeadIncrease(int increasement = 1); void SetEmpty() { m_iHeadPos = 0; @@ -28,10 +28,10 @@ class CCircularBuffer { int GetValidCount(); protected: - //over flow IndexOverFlow + //over flow 먼저 점검한 후 IndexOverFlow 점검 BOOL IsOverFlowCondition(int & len) { return (len >= m_iBufSize - GetValidCount()) ? TRUE : FALSE; } BOOL IsIndexOverFlow(int & len) { return (len + m_iTailPos >= m_iBufSize) ? TRUE : FALSE; } - void BufferResize(); //overflow condition ϶ size ι ø + void BufferResize(); //overflow condition 일때 size를 현재의 두배로 늘림 protected: int m_iBufSize; char * m_pBuffer; diff --git a/src/server/AIServer/Define.h b/src/server/AIServer/Define.h index 36cac3c6..adc9498e 100644 --- a/src/server/AIServer/Define.h +++ b/src/server/AIServer/Define.h @@ -1,8 +1,8 @@ #pragma once /* - ** Repent AI Server ۾ ** - 1. #define AI_SOCKET_PORT 10020 -> 11020 .. + ** Repent AI Server 작업시 참고 사항 ** + 1. #define AI_SOCKET_PORT 10020 -> 11020으로 수정됨.. */ // @@ -30,7 +30,7 @@ #define MAX_ID_SIZE 30 #define MAX_WEAPON_NAME_SIZE 40 #define MAX_ITEM 28 -#define VIEW_DIST 48 // ðŸ +#define VIEW_DIST 48 // 가시거리 #define MAX_UPGRADE_WEAPON 12 ///////////////// NATION /////////////////////////////////// @@ -49,8 +49,8 @@ // // User Authority // -#define MANAGER_USER 0 // , -#define GENERAL_USER 1 // Ϲ +#define MANAGER_USER 0 // 운영자, 관리자 +#define GENERAL_USER 1 // 일반유저 // Npc InOut #define NPC_IN 0X01 @@ -127,13 +127,13 @@ struct _NpcMovePosition { }; struct _OBJECT_EVENT { - int sBelong; // Ҽ + int sBelong; // 소속 short - sIndex; // 100 - ī罺 ε Ʈ | 200 ε Ʈ | 1100 - ī罺 1200 - - short sType; // 0 - ε Ʈ.. 1 - ¿ 2 - Ϸ 3 - - short sControlNpcID; // NPC ID ( Object Index) + sIndex; // 100 번대 - 카루스 바인드 포인트 | 200 번대 엘모라드 바인드 포인트 | 1100 번대 - 카루스 성문들 1200 - 엘모라드 성문들 + short sType; // 0 - 바인드 포인트.. 1 - 좌우로 열리는 성문 2 - 상하로 열리는 성문 3 - 레버 + short sControlNpcID; // 조종할 NPC ID (조종할 Object Index) short sStatus; // status - float fPosX; // ġ + float fPosX; // 위치값 float fPosY; float fPosZ; }; @@ -188,9 +188,9 @@ struct _OBJECT_EVENT { // // About Map Object // -#define USER_BAND 0 // Map ִ. -#define NPC_BAND 10000 // Map NPC() ִ. -#define INVALID_BAND 20000 // ߸ ID BAND +#define USER_BAND 0 // Map 위에 유저가 있다. +#define NPC_BAND 10000 // Map 위에 NPC(몹포함)가 있다. +#define INVALID_BAND 20000 // 잘못된 ID BAND // // Defines About Max Value @@ -228,7 +228,7 @@ struct _OBJECT_EVENT { #define ITEM_NAME_LENGTH 20 #define MAX_THROW_ITEM 30000 -#define ITEM_MAX_USE_WEAR 13 // ִ Ӽ鸸 Ƴֱ, ̺Ʈ ۰ +#define ITEM_MAX_USE_WEAR 13 // 아이템중 쓸수있는 속성들만 모아넣기위해, 이벤트 아이템과 구분 //////////////////////////////////////////////////////////// // Durability Type @@ -264,16 +264,16 @@ const BYTE ATTACK_MAX = 80; #define DAMAGE_DELAY_C_TIME 2000 -// Ÿݺ // -#define GREAT_SUCCESS 0X01 // 뼺 -#define SUCCESS 0X02 // -#define NORMAL 0X03 // -#define FAIL 0X04 // +// 타격비별 성공률 // +#define GREAT_SUCCESS 0X01 // 대성공 +#define SUCCESS 0X02 // 성공 +#define NORMAL 0X03 // 보통 +#define FAIL 0X04 // 실패 // // User Status Value // -#define USER_ABILITY_NUM 5 // ⺻ ɷġ +#define USER_ABILITY_NUM 5 // 기본 상태 능력치 종류 #define USER_STR 0 #define USER_CON 1 @@ -281,7 +281,7 @@ const BYTE ATTACK_MAX = 80; #define USER_VOL 3 #define USER_WIS 4 -#define DIR_DOWN 0 // ִ Ѵ. +#define DIR_DOWN 0 // 각 보고있는 방향을 정의한다. #define DIR_DOWNLEFT 1 #define DIR_LEFT 2 #define DIR_UPLEFT 3 @@ -290,36 +290,36 @@ const BYTE ATTACK_MAX = 80; #define DIR_RIGHT 6 #define DIR_DOWNRIGHT 7 -#define NPC_EVENT_MOP 1000 // ̺Ʈ ȣ -#define NPC_MAGIC_ITEM 100 // 1~10000 +#define NPC_EVENT_MOP 1000 // 이벤트 몹 번호 +#define NPC_MAGIC_ITEM 100 // 1~10000번을 기준 #define NPC_RARE_ITEM 120 // -#define NPC_EVENT_CHANCE 20 // ̺Ʈ ϰ Ȯ Ȯ ÷ش. X 20 +#define NPC_EVENT_CHANCE 20 // 이벤트 몹일경우 매직확률과 레어 확률울 올려준다. X 20 //////////////////////////////////////////////////////////// // Npc Type -// Monster 0 10 Ÿ +// Monster는 0부터 시작 10까지의 타입 #define NPCTYPE_MONSTER 0 // monster -#define NPC_BOSS_MONSTER 3 // -#define NPC_DUNGEON_MONSTER 4 // -#define NPC_TRAP_MONSTER 5 // -// NPC 11 -#define NPC_GUARD 11 // ٹ -#define NPC_PATROL_GUARD 12 // Ϲ ʵ忡 ϴ -#define NPC_STORE_GUARD 13 // Ϲ ʵ忡 ֺ ȣϴ -#define NPC_MERCHANT 21 // NPC -#define NPC_TINKER 22 // -#define NPC_WAREHOUSE 23 // â -#define NPC_CAPTAIN_NPC 35 // ִ NPC -#define NPC_KNIGHTS_NPC 36 // NPC -#define NPC_CLERIC 37 // NPC +#define NPC_BOSS_MONSTER 3 // 대장 몬스터 +#define NPC_DUNGEON_MONSTER 4 // 던젼 몬스터 +#define NPC_TRAP_MONSTER 5 // 함정 몬스터 +// NPC는 11부터 시작 +#define NPC_GUARD 11 // 붙박이형 경비병 +#define NPC_PATROL_GUARD 12 // 일반 필드에서 정찰을 담당하는 정찰병 +#define NPC_STORE_GUARD 13 // 일반 필드에서 상점주변을 보호하는 경비병 +#define NPC_MERCHANT 21 // 상점주인 NPC +#define NPC_TINKER 22 // 대장장이 +#define NPC_WAREHOUSE 23 // 창고지기 +#define NPC_CAPTAIN_NPC 35 // 전직 시켜주는 NPC +#define NPC_KNIGHTS_NPC 36 // 기사단 관리 NPC +#define NPC_CLERIC 37 // 대사제 NPC #define NPC_HEALER 40 // Healer -#define NPC_DOOR 50 // (6->50) -#define NPC_PHOENIX_GATE 51 // ʴ (8->51) -#define NPC_SPECIAL_GATE 52 // ʴ ̸鼭 2и ȴ ϴ -#define NPC_GATE_LEVER 55 // ... (9->55) -#define NPC_ARTIFACT 60 // 輮 (7->60) -#define NPC_DESTORY_ARTIFACT 61 // ıǴ 輮 -#define NPC_DOMESTIC_ANIMAL 99 // NPC +#define NPC_DOOR 50 // 성문 (6->50) +#define NPC_PHOENIX_GATE 51 // 깨지지 않는 문 (8->51) +#define NPC_SPECIAL_GATE 52 // 깨지지 않는 문이면서 2분마다 열렸다 닫혔다 하는 문 +#define NPC_GATE_LEVER 55 // 성문 레버... (9->55) +#define NPC_ARTIFACT 60 // 결계석 (7->60) +#define NPC_DESTORY_ARTIFACT 61 // 파괴되는 결계석 +#define NPC_DOMESTIC_ANIMAL 99 // 가축 NPC //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// @@ -328,18 +328,18 @@ const BYTE ATTACK_MAX = 80; #define CASTING 0x02 //////////////////////////////////////////////////////////// -#define MORAL_SELF 1 // ڽ.. -#define MORAL_FRIEND_WITHME 2 // 츮() ϳ .. -#define MORAL_FRIEND_EXCEPTME 3 // 츮 ϳ -#define MORAL_PARTY 4 // 츮Ƽ ϳ.. -#define MORAL_NPC 5 // NPC ϳ. -#define MORAL_PARTY_ALL 6 // ȣ Ƽ .. -#define MORAL_ENEMY 7 // ϳ(NPC) -#define MORAL_ALL 8 // ׻ ϴ ϳ. -#define MORAL_AREA_ENEMY 10 // Ե -#define MORAL_AREA_FRIEND 11 // Ե 츮 -#define MORAL_AREA_ALL 12 // Ե -#define MORAL_SELF_AREA 13 // ߽ +#define MORAL_SELF 1 // 나 자신.. +#define MORAL_FRIEND_WITHME 2 // 나를 포함한 우리편(국가) 중 하나 .. +#define MORAL_FRIEND_EXCEPTME 3 // 나를 뺀 우리편 중 하나 +#define MORAL_PARTY 4 // 나를 포함한 우리파티 중 하나.. +#define MORAL_NPC 5 // NPC중 하나. +#define MORAL_PARTY_ALL 6 // 나를 호함한 파티 모두.. +#define MORAL_ENEMY 7 // 울편을 제외한 모든 적중 하나(NPC포함) +#define MORAL_ALL 8 // 겜상에 존재하는 모든 것중 하나. +#define MORAL_AREA_ENEMY 10 // 지역에 포함된 적 +#define MORAL_AREA_FRIEND 11 // 지역에 포함된 우리편 +#define MORAL_AREA_ALL 12 // 지역에 포함된 모두 +#define MORAL_SELF_AREA 13 // 나를 중심으로 한 지역 //////////////////////////////////////////////////////////////// // Magic Packet sub define diff --git a/src/server/AIServer/Extern.h b/src/server/AIServer/Extern.h index 428a4423..b498238c 100644 --- a/src/server/AIServer/Extern.h +++ b/src/server/AIServer/Extern.h @@ -1,13 +1,13 @@ #pragma once // ------------------------------------------------- -// ü +// 전역 객체 변수 // ------------------------------------------------- extern BOOL g_bNpcExit; struct _PARTY_GROUP { WORD wIndex; - short uid[8]; // ϳ Ƽ 8 ԰ + short uid[8]; // 하나의 파티에 8명까지 가입가능 _PARTY_GROUP() { for (int i = 0; i < 8; i++) { uid[i] = -1; @@ -16,8 +16,8 @@ struct _PARTY_GROUP { }; struct _MAKE_WEAPON { - BYTE byIndex; // - short sClass[MAX_UPGRADE_WEAPON]; // 1 Ȯ + BYTE byIndex; // 몹의 레벨 기준 + short sClass[MAX_UPGRADE_WEAPON]; // 1차무기 확률 _MAKE_WEAPON() { for (int i = 0; i < MAX_UPGRADE_WEAPON; i++) { sClass[i] = 0; @@ -27,7 +27,7 @@ struct _MAKE_WEAPON { struct _MAKE_ITEM_GRADE_CODE { BYTE byItemIndex; // item grade - short sGrade_1; // ܰ躰 Ȯ + short sGrade_1; // 단계별 확률 short sGrade_2; short sGrade_3; short sGrade_4; @@ -39,10 +39,10 @@ struct _MAKE_ITEM_GRADE_CODE { }; struct _MAKE_ITEM_LARE_CODE { - BYTE byItemLevel; // item level Ǵ - short sLareItem; // lareitem Ȯ - short sMagicItem; // magicitem Ȯ - short sGereralItem; // gereralitem Ȯ + BYTE byItemLevel; // item level 판단 + short sLareItem; // lareitem 나올 확률 + short sMagicItem; // magicitem 나올 확률 + short sGereralItem; // gereralitem 나올 확률 }; struct _MAGIC_TABLE { @@ -127,5 +127,5 @@ struct _USERLOG { CTime t; BYTE byFlag; // BYTE byLevel; - char strUserID[MAX_ID_SIZE + 1]; // ̵(ij ̸) + char strUserID[MAX_ID_SIZE + 1]; // 아이디(캐릭터 이름) }; diff --git a/src/server/AIServer/GameSocket.cpp b/src/server/AIServer/GameSocket.cpp index 4156673f..598ebd43 100644 --- a/src/server/AIServer/GameSocket.cpp +++ b/src/server/AIServer/GameSocket.cpp @@ -26,8 +26,8 @@ extern CRITICAL_SECTION g_region_critical; ////////////////////////////////////////////////////////////////////// /* - ** Repent AI Server ۾ ** - 1. RecvUserInfo(), RecvAttackReq(), RecvUserUpdate() + ** Repent AI Server 작업시 참고 사항 ** + 1. RecvUserInfo(), RecvAttackReq(), RecvUserUpdate() 수정 */ CGameSocket::CGameSocket() { @@ -146,7 +146,7 @@ void CGameSocket::RecvServerConnect(char * pBuf) { char pData[1024]; memset(pData, 0, 1024); BYTE byZoneNumber = GetByte(pBuf, index); - BYTE byReConnect = GetByte(pBuf, index); // 0 : ó, 1 : + BYTE byReConnect = GetByte(pBuf, index); // 0 : 처음접속, 1 : 재접속 CString logstr; logstr.Format("[GameServer Connect - %d]", byZoneNumber); @@ -166,27 +166,27 @@ void CGameSocket::RecvServerConnect(char * pBuf) { SetByte(pData, byReConnect, outindex); Send(pData, outindex); - if (byReConnect == 1) { // ؼ Ʈ ޱ () + if (byReConnect == 1) { // 재접속해서 리스트 받기 (강제로) if (m_pMain->m_sReSocketCount == 0) { m_pMain->m_fReConnectStart = TimeGet(); } m_pMain->m_sReSocketCount++; TRACE("**** ReConnect - zone=%d, socket = %d ****\n ", byZoneNumber, m_pMain->m_sReSocketCount); fReConnectEndTime = TimeGet(); - if (fReConnectEndTime > m_pMain->m_fReConnectStart + 120) { // 2оȿ ƴٸ... - TRACE("**** ReConnect - ܼ ... socket = %d ****\n ", m_pMain->m_sReSocketCount); + if (fReConnectEndTime > m_pMain->m_fReConnectStart + 120) { // 2분안에 모든 소켓이 재접됐다면... + TRACE("**** ReConnect - 단순한 접속... socket = %d ****\n ", m_pMain->m_sReSocketCount); m_pMain->m_sReSocketCount = 0; m_pMain->m_fReConnectStart = 0.0f; } if (m_pMain->m_sReSocketCount == MAX_AI_SOCKET) { fReConnectEndTime = TimeGet(); - if (fReConnectEndTime < m_pMain->m_fReConnectStart + 60) { // 1оȿ ƴٸ... - TRACE("**** ReConnect - ʱȭ Ϸ socket = %d ****\n ", m_pMain->m_sReSocketCount); + if (fReConnectEndTime < m_pMain->m_fReConnectStart + 60) { // 1분안에 모든 소켓이 재접됐다면... + TRACE("**** ReConnect - 모든 소켓 초기화 완료 socket = %d ****\n ", m_pMain->m_sReSocketCount); m_pMain->m_bFirstServerFlag = TRUE; m_pMain->m_sReSocketCount = 0; m_pMain->AllNpcInfo(); - } else { // ϳ ̶... + } else { // 하나의 떨어진 소켓이라면... m_pMain->m_sReSocketCount = 0; m_pMain->m_fReConnectStart = 0.0f; } @@ -196,7 +196,7 @@ void CGameSocket::RecvServerConnect(char * pBuf) { m_pMain->m_sSocketCount++; TRACE("**** Connect - zone=%d, socket = %d ****\n ", byZoneNumber, m_pMain->m_sSocketCount); if (m_pMain->m_sSocketCount == MAX_AI_SOCKET) { - TRACE("**** Connect - ʱȭ Ϸ socket = %d ****\n ", m_pMain->m_sSocketCount); + TRACE("**** Connect - 모든 소켓 초기화 완료 socket = %d ****\n ", m_pMain->m_sSocketCount); m_pMain->m_bFirstServerFlag = TRUE; m_pMain->m_sSocketCount = 0; m_pMain->AllNpcInfo(); @@ -227,7 +227,7 @@ void CGameSocket::RecvUserInfo(char * pBuf) { char countstr[256]; memset(countstr, NULL, 256); CTime cur = CTime::GetCurrentTime(); - sprintf(countstr, "RecvUserInfo() Fail : %d %d %d %d - uid=%d, name=%s\r\n", cur.GetMonth(), + sprintf(countstr, "RecvUserInfo() Fail : %d월 %d일 %d시 %d분 - uid=%d, name=%s\r\n", cur.GetMonth(), cur.GetDay(), cur.GetHour(), cur.GetMinute(), uid, strName); LogFileWrite(countstr); TRACE("### RecvUserInfo() Fail ---> uid = %d, name=%s ### \n", uid, strName); @@ -323,7 +323,7 @@ void CGameSocket::RecvUserInOut(char * pBuf) { region_x = (int)fX / VIEW_DIST; region_z = (int)fZ / VIEW_DIST; - // Ұ,,, : ȣ 0 ߴµ.. ȣ о,, ,, + // 수정할것,,, : 지금 존 번호를 0으로 했는데.. 유저의 존 정보의 번호를 읽어야,, 함,, MAP * pMap = NULL; //m_pMain->g_arZone[pUser->m_curZone]; @@ -345,7 +345,7 @@ void CGameSocket::RecvUserInOut(char * pBuf) { TRACE("##### CGameSocket-RecvUserInOut Fail : UserDead [id=%s, bLive=%d, hp=%d], fX=%.2f, fZ=%.2f " "######\n", pUser->m_strUserID, pUser->m_bLive, pUser->m_sHP, fX, fZ); - // ̹Ƿ Ӽ ó Ѵ... + // 죽은 유저이므로 게임서버에 죽은 처리를 한다... //Send_UserError(uid); //return; } @@ -368,7 +368,7 @@ void CGameSocket::RecvUserInOut(char * pBuf) { TRACE("#### RecvUserInOut Fail : [name=%s], x1=%d, z1=%d #####\n", pUser->m_strUserID, pUser->m_sZoneIndex); return; } - // map ̵ Ұ̸ User .. + // map 이동이 불가능이면 User등록 실패.. //if(pMap->m_pMap[x1][z1].m_sEvent == 0) return; if (region_x > pMap->GetXRegionMax() || region_z > pMap->GetZRegionMax()) { TRACE("#### GameSocket-RecvUserInOut() Fail : [name=%s], nRX=%d, nRZ=%d #####\n", pUser->m_strUserID, @@ -384,15 +384,15 @@ void CGameSocket::RecvUserInOut(char * pBuf) { //if(bFlag) pUser->m_byIsOP = 1; if (bType == 2) { // region out - // region User .. + // 기존의 region정보에서 User의 정보 삭제.. pMap->RegionUserRemove(region_x, region_z, uid); - //TRACE("^^& RecvUserInOut()-> User(%s, %d) Region ..,, zone=%d, index=%d, region_x=%d, y=%d\n", pUser->m_strUserID, pUser->m_iUserId, pUser->m_curZone, pUser->m_sZoneIndex, region_x, region_z); + //TRACE("^^& RecvUserInOut()-> User(%s, %d)를 Region에서 삭제..,, zone=%d, index=%d, region_x=%d, y=%d\n", pUser->m_strUserID, pUser->m_iUserId, pUser->m_curZone, pUser->m_sZoneIndex, region_x, region_z); } else { // region in if (pUser->m_sRegionX != region_x || pUser->m_sRegionZ != region_z) { pUser->m_sRegionX = region_x; pUser->m_sRegionZ = region_z; pMap->RegionUserAdd(region_x, region_z, uid); - //TRACE("^^& RecvUserInOut()-> User(%s, %d) Region ,, zone=%d, index=%d, region_x=%d, y=%d\n", pUser->m_strUserID, pUser->m_iUserId, pUser->m_curZone, pUser->m_sZoneIndex, region_x, region_z); + //TRACE("^^& RecvUserInOut()-> User(%s, %d)를 Region에 등록,, zone=%d, index=%d, region_x=%d, y=%d\n", pUser->m_strUserID, pUser->m_iUserId, pUser->m_curZone, pUser->m_sZoneIndex, region_x, region_z); } } } @@ -437,11 +437,11 @@ BOOL CGameSocket::SetUid(float x, float z, int id, int speed) { CUser * pUser = m_pMain->GetUserPtr(id); if (pUser == NULL) { - TRACE("#### User sid = %d ####\n", id); + TRACE("#### User등록 실패 sid = %d ####\n", id); return FALSE; } - // Zoneȣ ޾ƾ ,,, + // Zone번호도 받아야 함,,, if (pUser->m_sZoneIndex < 0 || pUser->m_sZoneIndex > m_pMain->g_arZone.size()) { TRACE("#### GameSocket-SetUid ZoneIndex Fail : [name=%s], zoneindex=%d #####\n", pUser->m_strUserID, pUser->m_sZoneIndex); @@ -449,7 +449,7 @@ BOOL CGameSocket::SetUid(float x, float z, int id, int speed) { } MAP * pMap = m_pMain->g_arZone[pUser->m_sZoneIndex]; if (pMap == NULL) { - TRACE("#### User sid = %d ####\n", id); + TRACE("#### User등록 실패 sid = %d ####\n", id); return FALSE; } @@ -463,14 +463,14 @@ BOOL CGameSocket::SetUid(float x, float z, int id, int speed) { nRZ); return FALSE; } - // map ̵ Ұ̸ User .. + // map 이동이 불가능이면 User등록 실패.. // if(pMap->m_pMap[x1][z1].m_sEvent == 0) return FALSE; if (pUser != NULL) { if (pUser->m_bLive == USER_DEAD || pUser->m_sHP <= 0) { if (pUser->m_sHP > 0) { pUser->m_bLive = USER_LIVE; - TRACE("##### CGameSocket-SetUid Fail : User Heal .. [id=%s, bLive=%d, hp=%d] ######\n", + TRACE("##### CGameSocket-SetUid Fail : User가 Heal된 경우.. [id=%s, bLive=%d, hp=%d] ######\n", pUser->m_strUserID, pUser->m_bLive, pUser->m_sHP); } else { TRACE("##### CGameSocket-SetUid Fail : UserDead [id=%s, bLive=%d, hp=%d] ######\n", pUser->m_strUserID, @@ -494,17 +494,17 @@ BOOL CGameSocket::SetUid(float x, float z, int id, int speed) { //TRACE("GameSocket : SetUid()--> uid = %d, x=%f, z=%f \n", id, x, z); if (pUser->m_sRegionX != nRX || pUser->m_sRegionZ != nRZ) { - //TRACE("*** SetUid()-> User(%s, %d) Region ,, zone=%d, index=%d, region_x=%d, y=%d\n", pUser->m_strUserID, pUser->m_iUserId, pUser->m_curZone, pUser->m_sZoneIndex, pUser->m_sRegionX, pUser->m_sRegionZ); + //TRACE("*** SetUid()-> User(%s, %d)를 Region에 삭제,, zone=%d, index=%d, region_x=%d, y=%d\n", pUser->m_strUserID, pUser->m_iUserId, pUser->m_curZone, pUser->m_sZoneIndex, pUser->m_sRegionX, pUser->m_sRegionZ); pMap->RegionUserRemove(pUser->m_sRegionX, pUser->m_sRegionZ, id); pUser->m_sRegionX = nRX; pUser->m_sRegionZ = nRZ; pMap->RegionUserAdd(pUser->m_sRegionX, pUser->m_sRegionZ, id); - //TRACE("*** SetUid()-> User(%s, %d) Region ,, zone=%d, index=%d, region_x=%d, y=%d\n", pUser->m_strUserID, pUser->m_iUserId, pUser->m_curZone, pUser->m_sZoneIndex, nRX, nRZ); + //TRACE("*** SetUid()-> User(%s, %d)를 Region에 등록,, zone=%d, index=%d, region_x=%d, y=%d\n", pUser->m_strUserID, pUser->m_iUserId, pUser->m_curZone, pUser->m_sZoneIndex, nRX, nRZ); } } // dungeon work - // if( pUser->m_curZone == ) + // if( pUser->m_curZone == 던젼 ) int room = pMap->IsRoomCheck(x, z); return TRUE; @@ -556,12 +556,12 @@ void CGameSocket::RecvAttackReq(char * pBuf) { if (pUser->m_bLive == USER_DEAD || pUser->m_sHP <= 0) { if (pUser->m_sHP > 0) { pUser->m_bLive = USER_LIVE; - TRACE("##### CGameSocket-Attack Fail : User Heal .. [id=%d, %s, bLive=%d, hp=%d] ######\n", + TRACE("##### CGameSocket-Attack Fail : User가 Heal된 경우.. [id=%d, %s, bLive=%d, hp=%d] ######\n", pUser->m_iUserId, pUser->m_strUserID, pUser->m_bLive, pUser->m_sHP); } else { TRACE("##### CGameSocket-Attack Fail : UserDead [id=%d, %s, bLive=%d, hp=%d] ######\n", pUser->m_iUserId, pUser->m_strUserID, pUser->m_bLive, pUser->m_sHP); - // ̹Ƿ Ӽ ó Ѵ... + // 죽은 유저이므로 게임서버에 죽은 처리를 한다... Send_UserError(sid, tid); return; } @@ -595,7 +595,7 @@ void CGameSocket::RecvUserLogOut(char * pBuf) { //return; } - // User List User,, ... + // User List에서 User정보,, 삭제... CUser * pUser = m_pMain->GetUserPtr(uid); if (pUser == NULL) { return; @@ -623,7 +623,7 @@ void CGameSocket::RecvUserRegene(char * pBuf) { uid = GetShort(pBuf, index); sHP = GetShort(pBuf, index); - // User List User,, ... + // User List에서 User정보,, 삭제... CUser * pUser = m_pMain->GetUserPtr(uid); if (pUser == NULL) { return; @@ -646,7 +646,7 @@ void CGameSocket::RecvUserSetHP(char * pBuf) { uid = GetShort(pBuf, index); nHP = GetDWORD(pBuf, index); - // User List User,, ... + // User List에서 User정보,, 삭제... CUser * pUser = m_pMain->GetUserPtr(uid); if (pUser == NULL) { return; @@ -692,7 +692,7 @@ void CGameSocket::RecvUserUpdate(char * pBuf) { sAmountRight = GetShort(pBuf, index); // - // User List User,, ... + // User List에서 User정보,, 삭제... CUser * pUser = m_pMain->GetUserPtr(uid); if (pUser == NULL) { return; @@ -741,7 +741,7 @@ void CGameSocket::Send_UserError(short uid, short tid) { SetShort(buff, tid, send_index); Send(buff, send_index); - TRACE("#### GameSocket-Send_UserError : ̱ uid=%d, tid=%d\n", uid, tid); + TRACE("#### GameSocket-Send_UserError : 유령 유저죽이기 uid=%d, tid=%d\n", uid, tid); } void CGameSocket::RecvZoneChange(char * pBuf) { @@ -754,7 +754,7 @@ void CGameSocket::RecvZoneChange(char * pBuf) { byZoneIndex = GetByte(pBuf, index); byZoneNumber = GetByte(pBuf, index); - // User List User zone + // User List에서 User zone정보 수정 CUser * pUser = m_pMain->GetUserPtr(uid); if (pUser == NULL) { return; @@ -783,12 +783,12 @@ void CGameSocket::RecvMagicAttackReq(char * pBuf) { if (pUser->m_bLive == USER_DEAD || pUser->m_sHP <= 0) { if (pUser->m_sHP > 0) { pUser->m_bLive = USER_LIVE; - TRACE("##### CGameSocket-Magic Attack Fail : User Heal .. [id=%s, bLive=%d, hp=%d] ######\n", + TRACE("##### CGameSocket-Magic Attack Fail : User가 Heal된 경우.. [id=%s, bLive=%d, hp=%d] ######\n", pUser->m_strUserID, pUser->m_bLive, pUser->m_sHP); } else { TRACE("##### CGameSocket-Magic Attack Fail : UserDead [id=%s, bLive=%d, hp=%d] ######\n", pUser->m_strUserID, pUser->m_bLive, pUser->m_sHP); - // ̹Ƿ Ӽ ó Ѵ... + // 죽은 유저이므로 게임서버에 죽은 처리를 한다... Send_UserError(sid, tid); return; } @@ -804,19 +804,19 @@ void CGameSocket::RecvCompressedData(char * pBuf) { char pTempBuf[10001]; memset(pTempBuf, 0x00, 10001); DWORD dwCrcValue; - sCompLen = GetShort(pBuf, index); // Ÿ̾... - sOrgLen = GetShort(pBuf, index); // Ÿ̾... - dwCrcValue = GetDWORD(pBuf, index); // CRC ... - sCompCount = GetShort(pBuf, index); // Ÿ ... - // Ÿ ... + sCompLen = GetShort(pBuf, index); // 압축된 데이타길이얻기... + sOrgLen = GetShort(pBuf, index); // 원래데이타길이얻기... + dwCrcValue = GetDWORD(pBuf, index); // CRC값 얻기... + sCompCount = GetShort(pBuf, index); // 압축 데이타 수 얻기... + // 압축 데이타 얻기... memcpy(pTempBuf, pBuf + index, sCompLen); index += sCompLen; CCompressManager cmpMgrDecode; - /// + /// 압축 해제 cmpMgrDecode.FlushAddData(); - cmpMgrDecode.PreUncompressWork(sCompLen, sOrgLen); // Ǯ... + cmpMgrDecode.PreUncompressWork(sCompLen, sOrgLen); // 압축 풀기... char * pEncodeBuf = cmpMgrDecode.GetCompressionBufferPtr(); memcpy(pEncodeBuf, pTempBuf, sCompLen); @@ -840,25 +840,25 @@ void CGameSocket::RecvCompressedData(char * pBuf) { return; } - // Ǯ Ÿ б + // 압축 풀린 데이타 읽기 char * pDecodeBuf = (char *)cmpMgrDecode.GetExtractedBufferPtr(); Parsing(sOrgLen, pDecodeBuf); - // Ǯ + // 압축 풀기 끝 cmpMgrDecode.FlushExtractedData(); } void CGameSocket::RecvUserInfoAllData(char * pBuf) { int index = 0; - BYTE byCount = 0; // + BYTE byCount = 0; // 마리수 short uid = -1, sHp, sMp, sZoneIndex, len; BYTE bNation, bLevel, bZone, bAuthority = 1; short sDamage, sAC, sPartyIndex = 0; float fHitAgi, fAvoidAgi; char strName[MAX_ID_SIZE + 1]; - TRACE(" ***** ޱ մϴ ****** \n"); + TRACE(" ***** 유저의 모든 정보를 받기 시작합니다 ****** \n"); byCount = GetByte(pBuf, index); for (int i = 0; i < byCount; i++) { @@ -908,8 +908,8 @@ void CGameSocket::RecvUserInfoAllData(char * pBuf) { pUser->m_bLive = USER_LIVE; if (sPartyIndex != -1) { - pUser->m_byNowParty = 1; // Ƽ - pUser->m_sPartyNumber = sPartyIndex; // Ƽ ȣ + pUser->m_byNowParty = 1; // 파티중 + pUser->m_sPartyNumber = sPartyIndex; // 파티 번호 셋팅 } TRACE("**** RecvUserInfoAllData()---> uid = %d, %s, party_number=%d ******\n", uid, strName, @@ -920,7 +920,7 @@ void CGameSocket::RecvUserInfoAllData(char * pBuf) { } } - TRACE(" ***** ޾ҽϴ ****** \n"); + TRACE(" ***** 유저의 모든 정보를 다 받았습니다 ****** \n"); } void CGameSocket::RecvGateOpen(char * pBuf) { @@ -1015,12 +1015,12 @@ void CGameSocket::RecvHealMagic(char * pBuf) { if (pUser->m_bLive == USER_DEAD || pUser->m_sHP <= 0) { if (pUser->m_sHP > 0) { pUser->m_bLive = USER_LIVE; - TRACE("##### CGameSocket-RecvHealMagic Fail : User Heal .. [id=%d, %s, bLive=%d, hp=%d] ######\n", + TRACE("##### CGameSocket-RecvHealMagic Fail : User가 Heal된 경우.. [id=%d, %s, bLive=%d, hp=%d] ######\n", pUser->m_iUserId, pUser->m_strUserID, pUser->m_bLive, pUser->m_sHP); } else { TRACE("##### CGameSocket-RecvHealMagic Fail : UserDead [id=%d, %s, bLive=%d, hp=%d] ######\n", pUser->m_iUserId, pUser->m_strUserID, pUser->m_bLive, pUser->m_sHP); - // ̹Ƿ Ӽ ó Ѵ... + // 죽은 유저이므로 게임서버에 죽은 처리를 한다... //Send_UserError(sid, tid); return; } @@ -1041,12 +1041,12 @@ void CGameSocket::RecvTimeAndWeather(char * pBuf) { m_pMain->m_iAmount = GetShort(pBuf, index); if (m_pMain->m_iHour >= 5 && m_pMain->m_iHour < 21) { - m_pMain->m_byNight = 1; // + m_pMain->m_byNight = 1; // 낮 } else { - m_pMain->m_byNight = 2; // + m_pMain->m_byNight = 2; // 밤 } - m_pMain->m_sErrorSocketCount = 0; // Socket Check ϱ ... + m_pMain->m_sErrorSocketCount = 0; // Socket Check도 같이 하기 때문에... } void CGameSocket::RecvUserFail(char * pBuf) { @@ -1095,10 +1095,10 @@ void CGameSocket::RecvBattleEvent(char * pBuf) { continue; } if (pNpc->m_tNpcType > 10 && - (pNpc->m_byGroup == KARUS_ZONE || pNpc->m_byGroup == ELMORAD_ZONE)) { // npc ǰ, Ҽӵ npc - if (nEvent == BATTLEZONE_OPEN) { // ̺Ʈ (npc ɷġ ٿ) + (pNpc->m_byGroup == KARUS_ZONE || pNpc->m_byGroup == ELMORAD_ZONE)) { // npc에만 적용되고, 국가에 소속된 npc + if (nEvent == BATTLEZONE_OPEN) { // 전쟁 이벤트 시작 (npc의 능력치 다운) pNpc->ChangeAbility(BATTLEZONE_OPEN); - } else if (nEvent == BATTLEZONE_CLOSE) { // ̺Ʈ (npc ɷġ ȸ) + } else if (nEvent == BATTLEZONE_CLOSE) { // 전쟁 이벤트 끝 (npc의 능력치 회복) pNpc->ChangeAbility(BATTLEZONE_CLOSE); } } diff --git a/src/server/AIServer/GameSocket.h b/src/server/AIServer/GameSocket.h index cb10de7f..5326b23e 100644 --- a/src/server/AIServer/GameSocket.h +++ b/src/server/AIServer/GameSocket.h @@ -30,7 +30,7 @@ class CGameSocket : public CIOCPSocket2 { void RecvServerConnect(char * pBuf); BOOL SetUid(float x, float z, int id, int speed); - // GameServer User ޴ κ + // GameServer에서 User정보 받는 부분 void RecvUserInfo(char * pBuf); void RecvUserInOut(char * pBuf); void RecvUserMove(char * pBuf); diff --git a/src/server/AIServer/IOCPSocket2.cpp b/src/server/AIServer/IOCPSocket2.cpp index 89fed610..f370d68e 100644 --- a/src/server/AIServer/IOCPSocket2.cpp +++ b/src/server/AIServer/IOCPSocket2.cpp @@ -242,10 +242,10 @@ void CIOCPSocket2::ReceivedData(int length) { int len = 0; - if (!strlen(m_pRecvBuff)) { // Ŷ̴ ϳ Ͱ 찡 ߻... + if (!strlen(m_pRecvBuff)) { // 패킷길이는 존재하나 실 데이터가 없는 경우가 발생... return; } - m_pBuffer->PutData(m_pRecvBuff, length); // Data ۿ ִ´ + m_pBuffer->PutData(m_pRecvBuff, length); // 받은 Data를 버퍼에 넣는다 if (m_Type == TYPE_CONNECT && length == 7) { TRACE("Received Data : %d\n", m_Sid); @@ -256,7 +256,7 @@ void CIOCPSocket2::ReceivedData(int length) { while (PullOutCore(pData, len)) { if (pData) { - Parsing(len, pData); // Ľ Լ... + Parsing(len, pData); // 실제 파싱 함수... delete[] pData; pData = NULL; diff --git a/src/server/AIServer/IOCPort.cpp b/src/server/AIServer/IOCPort.cpp index 65652d50..70613d1e 100644 --- a/src/server/AIServer/IOCPort.cpp +++ b/src/server/AIServer/IOCPort.cpp @@ -217,7 +217,7 @@ DWORD WINAPI ClientWorkerThread(LPVOID lp) { TRACE("AISocket Closed By 0 Byte Notify\n"); pSocket->CloseProcess(); pIocport->RidIOCPSocket(pSocket->GetSocketID(), pSocket); - // pIocport->PutOldSid( pSocket->GetSocketID() ); // Ŭ̾Ʈ Sid + // pIocport->PutOldSid( pSocket->GetSocketID() ); // 클라이언트 소켓은 Sid 관리하지 않음 LeaveCriticalSection(&g_critical); break; } @@ -427,7 +427,7 @@ void CIOCPort::Init(int serversocksize, int clientsocksize, int workernum) { m_SockArrayInActive[i] = NULL; } - m_ClientSockArray = new CIOCPSocket2 *[clientsocksize]; // ش Ŭ̾Ʈμ ٸ Ϳ ٴ ϼ + m_ClientSockArray = new CIOCPSocket2 *[clientsocksize]; // 해당 서버가 클라이언트로서 다른 컴터에 붙는 소켓수 for (int i = 0; i < clientsocksize; i++) { m_ClientSockArray[i] = NULL; } @@ -666,7 +666,7 @@ int CIOCPort::GetClientSid() { } // sungyong~ 2002.05.22 -// Send Thread . ( CPU * 2) +// Send 를 담당할 Thread를 만든다. (현재는 CPU 갯수 * 2) void CIOCPort::CreateSendThread() { m_hSendIOCP = INVALID_HANDLE_VALUE; // ensure we aren't wiping out a valid completion port diff --git a/src/server/AIServer/IOCPort.h b/src/server/AIServer/IOCPort.h index 33de8648..3845a39e 100644 --- a/src/server/AIServer/IOCPort.h +++ b/src/server/AIServer/IOCPort.h @@ -8,9 +8,9 @@ // sungyong 2002.05.22 typedef struct _SEND_DATA { - short sCurZone; // - short sLength; // Ŷ - char pBuf[2048]; // Ŷ .. + short sCurZone; // 현재의 존 + short sLength; // 패킷의 길이 + char pBuf[2048]; // 패킷의 내용.. } SEND_DATA; // ~sungyong 2002.05.22 @@ -56,7 +56,7 @@ class CIOCPort { CIOCPSocket2 ** m_SockArray; CIOCPSocket2 ** m_SockArrayInActive; - CIOCPSocket2 ** m_ClientSockArray; // Connect + CIOCPSocket2 ** m_ClientSockArray; // Connect용 소켓 CRITICAL_SECTION m_critSendData; // sungyong~ 2002.05.22 diff --git a/src/server/AIServer/Ini.cpp b/src/server/AIServer/Ini.cpp index a6c335cd..df11a2b0 100644 --- a/src/server/AIServer/Ini.cpp +++ b/src/server/AIServer/Ini.cpp @@ -16,7 +16,7 @@ CIni::~CIni() {} int CIni::GetProfileInt(const char * lpAppName, const char * lpKeyName, int nDefault) { if (m_szFileName[0] == '\0') { m_nError = 0X01; - strcpy(m_strError, "File Set ʾҽϴ."); + strcpy(m_strError, "File이 Set되지 않았습니다."); return -1; } @@ -35,7 +35,7 @@ const char * CIni::GetProfileString(const char * lpAppName, const char * lpKeyNa static char retString[200] = ""; if (m_szFileName[0] == '\0') { m_nError = 0X01; - strcpy(m_strError, "File Set ʾҽϴ."); + strcpy(m_strError, "File이 Set되지 않았습니다."); strcpy(retString, ""); return retString; } @@ -73,7 +73,7 @@ int CIni::SetProfileInt(const char * lpAppName, const char * lpKeyName, int nDef int nRet = -1; if (m_szFileName[0] == '\0') { m_nError = 0X01; - strcpy(m_strError, "File Set ʾҽϴ."); + strcpy(m_strError, "File이 Set되지 않았습니다."); return nRet; } @@ -89,7 +89,7 @@ int CIni::SetProfileString(const char * lpAppName, const char * lpKeyName, const int nRet = -1; if (m_szFileName[0] == '\0') { m_nError = 0X01; - strcpy(m_strError, "File Set ʾҽϴ."); + strcpy(m_strError, "File이 Set되지 않았습니다."); return nRet; } diff --git a/src/server/AIServer/MAP.cpp b/src/server/AIServer/MAP.cpp index a49e17a1..a948de3c 100644 --- a/src/server/AIServer/MAP.cpp +++ b/src/server/AIServer/MAP.cpp @@ -113,7 +113,7 @@ BOOL MAP::IsMovable(int dest_x, int dest_y) { } /////////////////////////////////////////////////////////////////////// -// ϰ ִ zone Map εѴ. +// 각 서버가 담당하고 있는 zone의 Map을 로드한다. // BOOL MAP::LoadMap(HANDLE hFile) { LoadTerrain(hFile); @@ -151,7 +151,7 @@ BOOL MAP::LoadMap(HANDLE hFile) { void MAP::LoadTerrain(HANDLE hFile) { DWORD dwRWC; - ReadFile(hFile, &m_nMapSize, sizeof(int), &dwRWC, NULL); // μ ΰ? + ReadFile(hFile, &m_nMapSize, sizeof(int), &dwRWC, NULL); // 가로세로 정보가 몇개씩인가? ReadFile(hFile, &m_fUnitDist, sizeof(float), &dwRWC, NULL); m_fHeight = new float *[m_nMapSize]; @@ -162,7 +162,7 @@ void MAP::LoadTerrain(HANDLE hFile) { int x, z; for (z = 0; z < m_nMapSize; z++) { for (x = 0; x < m_nMapSize; x++) { - ReadFile(hFile, &(m_fHeight[x][z]), sizeof(float), &dwRWC, NULL); // ̰ о + ReadFile(hFile, &(m_fHeight[x][z]), sizeof(float), &dwRWC, NULL); // 높이값 읽어오기 } } } @@ -171,7 +171,7 @@ float MAP::GetHeight(float x, float z) { int iX, iZ; iX = (int)(x / m_fUnitDist); iZ = (int)(z / m_fUnitDist); - //_ASSERT( iX, iZ ִ üũϱ); + //_ASSERT( iX, iZ가 범위내에 있는 값인지 체크하기); float y; float h1, h2, h3; @@ -192,9 +192,9 @@ float MAP::GetHeight(float x, float z) { //if (dX == 1.0f) return h2; - float h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - float h32 = h3 + (h2 - h3) * dX; // h3 h2 ̰ - y = h32 + (h12 - h32) * ((dZ) / (1.0f - dX)); // ã ϴ ̰ + float h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + float h32 = h3 + (h2 - h3) * dX; // h3과 h2사이의 높이값 + y = h32 + (h12 - h32) * ((dZ) / (1.0f - dX)); // 찾고자 하는 높이값 } else { h1 = m_fHeight[iX][iZ + 1]; h2 = m_fHeight[iX + 1][iZ]; @@ -204,9 +204,9 @@ float MAP::GetHeight(float x, float z) { return h1; } - float h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - float h13 = h1 + (h3 - h1) * dX; // h1 h3 ̰ - y = h13 + (h12 - h13) * ((1.0f - dZ) / (dX)); // ã ϴ ̰ + float h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + float h13 = h1 + (h3 - h1) * dX; // h1과 h3사이의 높이값 + y = h13 + (h12 - h13) * ((1.0f - dZ) / (dX)); // 찾고자 하는 높이값 } } else { if (dZ > dX) { @@ -216,9 +216,9 @@ float MAP::GetHeight(float x, float z) { //if (dX == 1.0f) return h2; - float h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - float h32 = h3 + (h2 - h3) * dX; // h3 h2 ̰ - y = h12 + (h32 - h12) * ((1.0f - dZ) / (1.0f - dX)); // ã ϴ ̰ + float h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + float h32 = h3 + (h2 - h3) * dX; // h3과 h2사이의 높이값 + y = h12 + (h32 - h12) * ((1.0f - dZ) / (1.0f - dX)); // 찾고자 하는 높이값 } else { h1 = m_fHeight[iX][iZ]; h2 = m_fHeight[iX + 1][iZ]; @@ -228,9 +228,9 @@ float MAP::GetHeight(float x, float z) { return h1; } - float h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - float h13 = h1 + (h3 - h1) * dX; // h1 h3 ̰ - y = h12 + (h13 - h12) * ((dZ) / (dX)); // ã ϴ ̰ + float h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + float h13 = h1 + (h3 - h1) * dX; // h1과 h3사이의 높이값 + y = h12 + (h13 - h12) * ((dZ) / (dX)); // 찾고자 하는 높이값 } } return y; @@ -319,10 +319,10 @@ Iterator MAP::RegionNpcRemove(int rx, int rz, int nid) { } void MAP::LoadMapTile(HANDLE hFile) { - //MapTileӼ б.. - // Ӽ 0̸ . - // 1̸ ׳ ... - // ׿ܴ ̺Ʈ ID. + //MapTile속성 읽기.. + // 속성이 0이면 못 가는 곳. + // 1이면 그냥 가는 곳... + // 그외는 이벤트 ID. // int x1 = m_sizeMap.cx; int z1 = m_sizeMap.cy; @@ -332,7 +332,7 @@ void MAP::LoadMapTile(HANDLE hFile) { for (int a = 0; a < m_sizeMap.cx; a++) { pEvent[a] = new short[m_sizeMap.cx]; } - // Ƴ.. + // 잠시 막아놓고.. for (int x = 0; x < m_sizeMap.cx; x++) { ReadFile(hFile, pEvent[x], sizeof(short) * m_sizeMap.cy, &dwNum, NULL); } @@ -417,7 +417,7 @@ void MAP::LoadObjectEvent(HANDLE hFile) { ReadFile(hFile, &iEventObjectCount, 4, &dwNum, NULL); for (int i = 0; i < iEventObjectCount; i++) { pEvent = new _OBJECT_EVENT; - ReadFile(hFile, &(pEvent->sBelong), 4, &dwNum, NULL); // Ҽ + ReadFile(hFile, &(pEvent->sBelong), 4, &dwNum, NULL); // 소속 ReadFile(hFile, &(pEvent->sIndex), 2, &dwNum, NULL); // Event Index ReadFile(hFile, &(pEvent->sType), 2, &dwNum, NULL); ReadFile(hFile, &(pEvent->sControlNpcID), 2, &dwNum, NULL); @@ -428,7 +428,7 @@ void MAP::LoadObjectEvent(HANDLE hFile) { //TRACE("Object - belong=%d, index=%d, type=%d, con=%d, sta=%d\n", pEvent->sBelong, pEvent->sIndex, pEvent->sType, pEvent->sControlNpcID, pEvent->sStatus); - // ۾Ұ : ʵͰ ٲ Param1 2̸ ΰ Ǵ.. 3̸ .. + // 작업할것 : 맵데이터가 바뀌면 Param1이 2이면 성문인것을 판단.. 3이면 레버.. if (pEvent->sType == 1 || pEvent->sType == 2 || pEvent->sType == 3) { // sungyong test m_pMain->AddObjectEventNpc(pEvent, m_nZoneNumber); @@ -481,7 +481,7 @@ BOOL MAP::LoadRoomEvent(int zone_number) { buf[index] = (BYTE)0; t_index = 0; - if (buf[t_index] == ';' || buf[t_index] == '/') { // ּ ó + if (buf[t_index] == ';' || buf[t_index] == '/') { // 주석에 대한 처리 index = 0; continue; } @@ -592,7 +592,7 @@ BOOL MAP::LoadRoomEvent(int zone_number) { cancel_event_load: CString str; - str.Format("̺Ʈ б (%d)(%d)", zone_number, event_num); + str.Format("이벤트 정보 읽기 실패(%d)(%d)", zone_number, event_num); AfxMessageBox(str); in.Close(); pFile.Close(); @@ -603,7 +603,7 @@ BOOL MAP::LoadRoomEvent(int zone_number) { int MAP::IsRoomCheck(float fx, float fz) { // dungeion work - // Ǵ, ƴϸ ó + // 현재의 존이 던젼인지를 판단, 아니면 리턴처리 CRoomEvent * pRoom = NULL; char notify[100]; @@ -623,20 +623,20 @@ int MAP::IsRoomCheck(float fx, float fz) { continue; } if (pRoom->m_byStatus == 3) { - continue; // ̰ų (clear) ¶ ˻ + continue; // 방이 실행중이거나 깬(clear) 상태라면 검색하지 않음 } bFlag_1 = FALSE; bFlag_2 = FALSE; - if (pRoom->m_byStatus == 1) { // ʱȭ + if (pRoom->m_byStatus == 1) { // 방이 초기화 상태 minX = pRoom->m_iInitMinX; minZ = pRoom->m_iInitMinZ; maxX = pRoom->m_iInitMaxX; maxZ = pRoom->m_iInitMaxZ; - } else if (pRoom->m_byStatus == 2) { // + } else if (pRoom->m_byStatus == 2) { // 진행중인 상태 if (pRoom->m_Logic[0].sNumber != 4) { - continue; // ǥ ̵ϴ° ƴ϶,, + continue; // 목표지점까지 이동하는게 아니라면,, } minX = pRoom->m_iEndMinX; minZ = pRoom->m_iEndMinZ; @@ -665,16 +665,16 @@ int MAP::IsRoomCheck(float fx, float fz) { } if (bFlag_1 == TRUE && bFlag_2 == TRUE) { - if (pRoom->m_byStatus == 1) { // ʱȭ - pRoom->m_byStatus = 2; // · ȯ + if (pRoom->m_byStatus == 1) { // 방이 초기화 상태 + pRoom->m_byStatus = 2; // 진행중 상태로 방상태 변환 pRoom->m_fDelayTime = TimeGet(); room_number = i; TRACE(" Room Check - number = %d, x=%d, z=%d\n", i, nX, nZ); - //wsprintf(notify, "** ˸ : [%d Zone][%d] 濡 Ű ȯմϴ **", m_nZoneNumber, pRoom->m_sRoomNumber); + //wsprintf(notify, "** 알림 : [%d Zone][%d] 방에 들어오신것을 환영합니다 **", m_nZoneNumber, pRoom->m_sRoomNumber); //m_pMain->SendSystemMsg( notify, m_nZoneNumber, PUBLIC_CHAT, SEND_ALL); - } else if (pRoom->m_byStatus == 2) { // - pRoom->m_byStatus = 3; // Ŭ · - //wsprintf(notify, "** ˸ : [%d Zone][%d] ǥ ؼ Ŭ ˴ϴ٤ **", m_nZoneNumber, pRoom->m_sRoomNumber); + } else if (pRoom->m_byStatus == 2) { // 진행중인 상태 + pRoom->m_byStatus = 3; // 클리어 상태로 + //wsprintf(notify, "** 알림 : [%d Zone][%d] 목표지점까지 도착해서 클리어 됩니다ㅇ **", m_nZoneNumber, pRoom->m_sRoomNumber); //m_pMain->SendSystemMsg( notify, m_nZoneNumber, PUBLIC_CHAT, SEND_ALL); } @@ -710,7 +710,7 @@ BOOL MAP::IsRoomStatusCheck() { int nTotalRoom = m_arRoomEventArray.GetSize() + 1; int nClearRoom = 1; - if (m_byRoomStatus == 2) { // ʱȭ + if (m_byRoomStatus == 2) { // 방을 초기화중 m_byInitRoomCount++; } @@ -722,32 +722,32 @@ BOOL MAP::IsRoomStatusCheck() { //return NULL; } - if (m_byRoomStatus == 1) { // + if (m_byRoomStatus == 1) { // 방 진행중 if (pRoom->m_byStatus == 3) { nClearRoom += 1; } if (m_byRoomType == 0) { - if (nTotalRoom == nClearRoom) { // Ŭ Ǿ.. ʱȭ ࿩,, + if (nTotalRoom == nClearRoom) { // 방이 다 클리어 되었어여.. 초기화 해줘여,, m_byRoomStatus = 2; - TRACE(" Ŭ Ǿ.. ʱȭ ࿩,, zone=%d, type=%d, status=%d\n", m_nZoneNumber, + TRACE("방이 다 클리어 되었어여.. 초기화 해줘여,, zone=%d, type=%d, status=%d\n", m_nZoneNumber, m_byRoomType, m_byRoomStatus); return TRUE; } } - } else if (m_byRoomStatus == 2) { // ʱȭ + } else if (m_byRoomStatus == 2) { // 방을 초기화중 if (m_byInitRoomCount >= 10) { - pRoom->InitializeRoom(); // ʱȭ + pRoom->InitializeRoom(); // 실제 방을 초기화 nClearRoom += 1; - if (nTotalRoom == nClearRoom) { // ʱȭ Ǿ.. + if (nTotalRoom == nClearRoom) { // 방이 초기화 되었어여.. m_byRoomStatus = 3; - TRACE(" ʱȭ Ǿ.. status=%d\n", m_byRoomStatus); + TRACE("방이 초기화 되었어여.. status=%d\n", m_byRoomStatus); return TRUE; } } - } else if (m_byRoomStatus == 3) { // ʱȭ Ϸ + } else if (m_byRoomStatus == 3) { // 방 초기화 완료 m_byRoomStatus = 1; m_byInitRoomCount = 0; - TRACE(" ٽ ۵Ǿ.. status=%d\n", m_byRoomStatus); + TRACE("방이 다시 시작되었군여.. status=%d\n", m_byRoomStatus); return TRUE; } } @@ -765,7 +765,7 @@ void MAP::InitializeRoom() { continue; } - pRoom->InitializeRoom(); // ʱȭ + pRoom->InitializeRoom(); // 실제 방을 초기화 m_byRoomStatus = 1; m_byInitRoomCount = 0; } diff --git a/src/server/AIServer/MAP.h b/src/server/AIServer/MAP.h index 9e148484..9d0fc9b8 100644 --- a/src/server/AIServer/MAP.h +++ b/src/server/AIServer/MAP.h @@ -18,10 +18,10 @@ class CUser; class CServerDlg; //class CRoomEvent; -class CMapInfo // ǥ +class CMapInfo // 각 좌표의 정보 { public: - short m_sEvent; // ǥ ̺Ʈ ȣ + short m_sEvent; // 현좌표의 이벤트 번호 CMapInfo(); virtual ~CMapInfo(); @@ -31,11 +31,11 @@ class MAP { public: CServerDlg * m_pMain; CN3ShapeMgr m_N3ShapeMgr; - CMapInfo ** m_pMap; // Ÿ (1 : 4) - CRegion ** m_ppRegion; // 64 Ÿ.. + CMapInfo ** m_pMap; // 타일의 정보(1셀 : 4미터) + CRegion ** m_ppRegion; // 64미터의 타일정보.. //CRoomEvent* m_pRoomEvent; - CSize m_sizeMap; // ũ - CSize m_sizeRegion; // resion size + CSize m_sizeMap; // 맵의 크기 + CSize m_sizeRegion; // 맵의 resion size int m_nZoneNumber; // zone number int m_nServerNo; char m_MapName[256]; @@ -43,14 +43,14 @@ class MAP { float m_fUnitDist; // i Grid Distance float ** m_fHeight; // short m_arDungeonBossMonster[MAX_DUNGEON_BOSS_MONSTER]; - BYTE m_byRoomType; // ʱȭ( 0:ڵ ʱȭ, 1:̺Ʈ (Ư Ϸ ʱȭ) + BYTE m_byRoomType; // 방의 초기화관련( 0:자동으로 초기화, 1:전쟁이벤트 관련(특정조건이 완료시 초기화) BYTE m_byRoomEvent; // event room(0:empty, 1:use) - BYTE m_byRoomStatus; // room status(1:, 2: ʱȭ, 3:ʱȭ Ϸ) - BYTE m_byInitRoomCount; // room ʱȭ ð (Ϳ ȭ ߱ ) + BYTE m_byRoomStatus; // room status(1:진행중, 2:방을 초기화중, 3:방초기화 완료) + BYTE m_byInitRoomCount; // room 초기화 시간을 제어(몬스터와 동기화를 맞추기 위해) ObjectEventArray m_ObjectEventArray; RoomEventArray m_arRoomEventArray; - short m_sKarusRoom; // karus - short m_sElmoradRoom; // elmorad + short m_sKarusRoom; // karus의 성갯수 + short m_sElmoradRoom; // elmorad의 성갯수 public: MAP(); @@ -76,7 +76,7 @@ class MAP { int GetXRegionMax() { return m_sizeRegion.cx - 1; }; int GetZRegionMax() { return m_sizeRegion.cy - 1; }; - int IsRoomCheck(float fx, float fz); // , ġ ġ ִ Ǵ + int IsRoomCheck(float fx, float fz); // 던젼에서 사용, 유저의 현재위치가 던젼의 어느 위치에 있는지를 판단 BOOL IsRoomStatusCheck(); BOOL IsMovable(int dest_x, int dest_y); diff --git a/src/server/AIServer/MagicProcess.cpp b/src/server/AIServer/MagicProcess.cpp index f29deebb..0bd659ad 100644 --- a/src/server/AIServer/MagicProcess.cpp +++ b/src/server/AIServer/MagicProcess.cpp @@ -186,13 +186,13 @@ BYTE CMagicProcess::ExecuteType1(int magicid, int tid, int data1, int data2, int if (pNpc->SetDamage(magicid, damage, m_pSrcUser->m_strUserID, m_pSrcUser->m_iUserId + USER_BAND, m_pSrcUser->m_pIocport) == FALSE) { - // Npc ,, - pNpc->SendExpToUserList(); // ġ й!! + // Npc가 죽은 경우,, + pNpc->SendExpToUserList(); // 경험치 분배!! pNpc->SendDead(m_pSrcUser->m_pIocport); //m_pSrcUser->SendAttackSuccess(tid, MAGIC_ATTACK_TARGET_DEAD, 0, pNpc->m_iHP); m_pSrcUser->SendAttackSuccess(tid, ATTACK_TARGET_DEAD, damage, pNpc->m_iHP); } else { - // + // 공격 결과 전송 m_pSrcUser->SendAttackSuccess(tid, ATTACK_SUCCESS, damage, pNpc->m_iHP); } // } @@ -263,15 +263,15 @@ BYTE CMagicProcess::ExecuteType2(int magicid, int tid, int data1, int data2, int } m_pMain->Send(send_buff, send_index, m_pSrcUser->m_curZone); - // Npc ,, - pNpc->SendExpToUserList(); // ġ й!! + // Npc가 죽은 경우,, + pNpc->SendExpToUserList(); // 경험치 분배!! pNpc->SendDead(m_pSrcUser->m_pIocport); m_pSrcUser->SendAttackSuccess(tid, MAGIC_ATTACK_TARGET_DEAD, damage, pNpc->m_iHP); //m_pSrcUser->SendAttackSuccess(tid, ATTACK_TARGET_DEAD, damage, pNpc->m_iHP); return result; } else { - // + // 공격 결과 전송 m_pSrcUser->SendAttackSuccess(tid, ATTACK_SUCCESS, damage, pNpc->m_iHP); } } @@ -318,7 +318,7 @@ void CMagicProcess::ExecuteType3( return; } - if (tid == -1) { // + if (tid == -1) { // 지역 공격 result = AreaAttack(3, magicid, moral, data1, data2, data3, dexpoint, righthand_damage); //if(result == 0) goto packet_send; //else @@ -354,19 +354,19 @@ void CMagicProcess::ExecuteType3( } else { damage = abs(damage); if (pType->bAttribute == 3) { - attack_type = 3; // Ű ̶..... + attack_type = 3; // 기절시키는 마법이라면..... } else { attack_type = magicid; } if (pNpc->SetDamage(attack_type, damage, m_pSrcUser->m_strUserID, m_pSrcUser->m_iUserId + USER_BAND, m_pSrcUser->m_pIocport) == FALSE) { - // Npc ,, - pNpc->SendExpToUserList(); // ġ й!! + // Npc가 죽은 경우,, + pNpc->SendExpToUserList(); // 경험치 분배!! pNpc->SendDead(m_pSrcUser->m_pIocport); m_pSrcUser->SendAttackSuccess(tid, MAGIC_ATTACK_TARGET_DEAD, damage, pNpc->m_iHP, MAGIC_ATTACK); } else { - // + // 공격 결과 전송 m_pSrcUser->SendAttackSuccess(tid, ATTACK_SUCCESS, damage, pNpc->m_iHP, MAGIC_ATTACK); } } @@ -380,19 +380,19 @@ void CMagicProcess::ExecuteType3( } else { damage = abs(damage); if (pType->bAttribute == 3) { - attack_type = 3; // Ű ̶..... + attack_type = 3; // 기절시키는 마법이라면..... } else { attack_type = magicid; } if (pNpc->SetDamage(attack_type, damage, m_pSrcUser->m_strUserID, m_pSrcUser->m_iUserId + USER_BAND, m_pSrcUser->m_pIocport) == FALSE) { - // Npc ,, - pNpc->SendExpToUserList(); // ġ й!! + // Npc가 죽은 경우,, + pNpc->SendExpToUserList(); // 경험치 분배!! pNpc->SendDead(m_pSrcUser->m_pIocport); m_pSrcUser->SendAttackSuccess(tid, MAGIC_ATTACK_TARGET_DEAD, damage, pNpc->m_iHP); } else { - // + // 공격 결과 전송 m_pSrcUser->SendAttackSuccess(tid, ATTACK_SUCCESS, damage, pNpc->m_iHP); } } @@ -437,7 +437,7 @@ void CMagicProcess::ExecuteType4(int magicid, int sid, int tid, int data1, int d _MAGIC_TYPE4 * pType = NULL; CNpc * pNpc = NULL; // Pointer initialization! - if (tid == -1) { // + if (tid == -1) { // 지역 공격 result = AreaAttack(4, magicid, moral, data1, data2, data3, 0, 0); if (result == 0) { goto fail_return; @@ -460,19 +460,19 @@ void CMagicProcess::ExecuteType4(int magicid, int sid, int tid, int data1, int d //TRACE("magictype4 ,, magicid=%d\n", magicid); switch (pType->bBuffType) { // Depending on which buff-type it is..... - case 1: // HP ø.. + case 1: // HP 올리기.. break; - case 2: // ø.. + case 2: // 방어력 올리기.. break; - case 4: // ݷ ø.. + case 4: // 공격력 올리기.. break; - case 5: // ӵ ø.. + case 5: // 공격 속도 올리기.. break; - case 6: // ̵ ӵ ø.. + case 6: // 이동 속도 올리기.. // if (pNpc->m_MagicType4[pType->bBuffType-1].sDurationTime > 0) { // result = 0 ; // goto fail_return ; @@ -487,13 +487,13 @@ void CMagicProcess::ExecuteType4(int magicid, int sid, int tid, int data1, int d // } break; - case 7: // ɷġ ø... + case 7: // 능력치 올리기... break; - case 8: // ׷ ø... + case 8: // 저항력 올리기... break; - case 9: // ȸ ø.. + case 9: // 공격 성공율 및 회피 성공율 올리기.. break; default: @@ -558,7 +558,7 @@ short CMagicProcess::GetMagicDamage(int tid, int total_hit, int attribute, int d short damage = 0, temp_hit = 0; int random = 0, total_r = 0; BYTE result; - BOOL bSign = TRUE; // FALSE̸ -, TRUE̸ + + BOOL bSign = TRUE; // FALSE이면 -, TRUE이면 + if (tid < NPC_BAND || tid > INVALID_BAND) { return 0; // Check if target id is valid. @@ -719,7 +719,7 @@ void CMagicProcess::AreaAttackDamage(int magictype, int rx, int rz, int magicid, if (pMap == NULL) { return; } - // ڽ region ִ UserArray ˻Ͽ,, Ÿ ִ Ǵ.. + // 자신의 region에 있는 UserArray을 먼저 검색하여,, 가까운 거리에 유저가 있는지를 판단.. if (rx < 0 || rz < 0 || rx > pMap->GetXRegionMax() || rz > pMap->GetZRegionMax()) { TRACE("#### CMagicProcess-AreaAttackDamage() Fail : [nid=%d, name=%s], nRX=%d, nRZ=%d #####\n", m_pSrcUser->m_iUserId, m_pSrcUser->m_strUserID, rx, rz); @@ -802,8 +802,8 @@ void CMagicProcess::AreaAttackDamage(int magictype, int rx, int rz, int magicid, vEnd.Set(pNpc->m_fCurX, pNpc->m_fCurY, pNpc->m_fCurZ); fDis = pNpc->GetDistance(vStart, vEnd); - if (fDis <= fRadius) { // NPC ݰȿ ... - if (magictype == 3) { // Ÿ 3 ... + if (fDis <= fRadius) { // NPC가 반경안에 있을 경우... + if (magictype == 3) { // 타잎 3일 경우... damage = GetMagicDamage(pNpc->m_sNid + NPC_BAND, target_damage, attribute, dexpoint, righthand_damage); TRACE("Area magictype3 ,, magicid=%d, damage=%d\n", magicid, damage); @@ -812,15 +812,15 @@ void CMagicProcess::AreaAttackDamage(int magictype, int rx, int rz, int magicid, } else { damage = abs(damage); if (pType3->bAttribute == 3) { - attack_type = 3; // Ű ̶..... + attack_type = 3; // 기절시키는 마법이라면..... } else { attack_type = magicid; } if (pNpc->SetDamage(attack_type, damage, m_pSrcUser->m_strUserID, m_pSrcUser->m_iUserId + USER_BAND, m_pSrcUser->m_pIocport) == FALSE) { - // Npc ,, - pNpc->SendExpToUserList(); // ġ й!! + // Npc가 죽은 경우,, + pNpc->SendExpToUserList(); // 경험치 분배!! pNpc->SendDead(m_pSrcUser->m_pIocport); m_pSrcUser->SendAttackSuccess(pNpc->m_sNid + NPC_BAND, MAGIC_ATTACK_TARGET_DEAD, damage, pNpc->m_iHP); @@ -831,7 +831,7 @@ void CMagicProcess::AreaAttackDamage(int magictype, int rx, int rz, int magicid, memset(send_buff, 0x00, 256); send_index = 0; - // Ŷ ..... + // 패킷 전송..... //if ( pMagic->bType2 == 0 || pMagic->bType2 == 3 ) { SetByte(send_buff, AG_MAGIC_ATTACK_RESULT, send_index); @@ -848,24 +848,24 @@ void CMagicProcess::AreaAttackDamage(int magictype, int rx, int rz, int magicid, m_pMain->Send(send_buff, send_index, m_pSrcUser->m_curZone); } - } else if (magictype == 4) { // Ÿ 4 ... + } else if (magictype == 4) { // 타잎 4일 경우... memset(send_buff, 0x00, 256); send_index = 0; result = 1; switch (pType4->bBuffType) { // Depending on which buff-type it is..... - case 1: // HP ø.. + case 1: // HP 올리기.. break; - case 2: // ø.. + case 2: // 방어력 올리기.. break; - case 4: // ݷ ø.. + case 4: // 공격력 올리기.. break; - case 5: // ӵ ø.. + case 5: // 공격 속도 올리기.. break; - case 6: // ̵ ӵ ø.. + case 6: // 이동 속도 올리기.. //if (pNpc->m_MagicType4[pType4->bBuffType-1].sDurationTime > 0) { // result = 0 ; //} @@ -878,13 +878,13 @@ void CMagicProcess::AreaAttackDamage(int magictype, int rx, int rz, int magicid, //} break; - case 7: // ɷġ ø... + case 7: // 능력치 올리기... break; - case 8: // ׷ ø... + case 8: // 저항력 올리기... break; - case 9: // ȸ ø.. + case 9: // 공격 성공율 및 회피 성공율 올리기.. break; default: diff --git a/src/server/AIServer/N3BASE/My_3DStruct.h b/src/server/AIServer/N3BASE/My_3DStruct.h index c3b927eb..5d931f5e 100644 --- a/src/server/AIServer/N3BASE/My_3DStruct.h +++ b/src/server/AIServer/N3BASE/My_3DStruct.h @@ -466,10 +466,10 @@ inline __Matrix44 __Matrix44::operator*(const D3DXMATRIX & mtx) { mtxTmp._43 = _41 * mtx._13 + _42 * mtx._23 + _43 * mtx._33 + _44 * mtx._43; mtxTmp._44 = _41 * mtx._14 + _42 * mtx._24 + _43 * mtx._34 + _44 * mtx._44; - // ȭ ڵ.. - // dino .. Ʒ ڵ 4° Ͽ Ȯ Ѵ. - // 4° (0, 0, 0, 1) matrix projection matrix - // (0, 0, 1, 0) matrix Ƿ ̻ ʷѴ. + // 최적화 된 코드.. + // dino 막음.. 아래 코드는 4번째 행들의 계산을 생략하여서 부정확한 계산을 한다. + // 보통 4번째 행이 (0, 0, 0, 1)인 matrix를 쓰지만 projection matrix의 경우 + // (0, 0, 1, 0)인 matrix를 쓰므로 이상한 결과를 초래한다. // mtxTmp._11 = _11 * mtx._11 + _12 * mtx._21 + _13 * mtx._31; // mtxTmp._12 = _11 * mtx._12 + _12 * mtx._22 + _13 * mtx._32; // mtxTmp._13 = _11 * mtx._13 + _12 * mtx._23 + _13 * mtx._33; @@ -518,9 +518,9 @@ inline void __Matrix44::operator*=(const D3DXMATRIX & mtx) { _43 = mtxTmp._41 * mtx._13 + mtxTmp._42 * mtx._23 + mtxTmp._43 * mtx._33 + mtxTmp._44 * mtx._43; _44 = mtxTmp._41 * mtx._14 + mtxTmp._42 * mtx._24 + mtxTmp._43 * mtx._34 + mtxTmp._44 * mtx._44; - // dino .. Ʒ ڵ 4° Ͽ Ȯ Ѵ. - // 4° (0, 0, 0, 1) matrix projection matrix - // (0, 0, 1, 0) matrix Ƿ ̻ ʷѴ. + // dino 막음.. 아래 코드는 4번째 행들의 계산을 생략하여서 부정확한 계산을 한다. + // 보통 4번째 행이 (0, 0, 0, 1)인 matrix를 쓰지만 projection matrix의 경우 + // (0, 0, 1, 0)인 matrix를 쓰므로 이상한 결과를 초래한다. // _11 = mtxTmp._11 * mtx._11 + mtxTmp._12 * mtx._21 + mtxTmp._13 * mtx._31; // _12 = mtxTmp._11 * mtx._12 + mtxTmp._12 * mtx._22 + mtxTmp._13 * mtx._32; // _13 = mtxTmp._11 * mtx._13 + mtxTmp._12 * mtx._23 + mtxTmp._13 * mtx._33; @@ -677,21 +677,21 @@ const DWORD FVF_XYZNORMALCOLORT1 = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | const DWORD RF_NOTHING = 0x0; const DWORD RF_ALPHABLENDING = 0x1; // Alpha blending -const DWORD RF_NOTUSEFOG = 0x2; // Ȱ -const DWORD RF_DOUBLESIDED = 0x4; // - D3DCULL_NONE -const DWORD RF_BOARD_Y = 0x8; // Y ؼ.. ī޶ . -const DWORD RF_POINTSAMPLING = 0x10; // MipMap .. PointSampling Ѵ.. -const DWORD RF_WINDY = 0x20; // ٶ .. ٶ CN3Base::s_vWindFactor Ѵ.. +const DWORD RF_NOTUSEFOG = 0x2; // 안개 무시 +const DWORD RF_DOUBLESIDED = 0x4; // 양면 - D3DCULL_NONE +const DWORD RF_BOARD_Y = 0x8; // Y 축으로 해서.. 카메라를 본다. +const DWORD RF_POINTSAMPLING = 0x10; // MipMap 에서.. PointSampling 으로 한다.. +const DWORD RF_WINDY = 0x20; // 바람에 날린다.. 바람의 값은 CN3Base::s_vWindFactor 를 참조 한다.. const DWORD RF_NOTUSELIGHT = 0x40; // Light Off -const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse ϰ Alpha blending -const DWORD RF_NOTZWRITE = 0x100; // ZBuffer Ⱦ. +const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse 값을 갖고 투명하게 Alpha blending +const DWORD RF_NOTZWRITE = 0x100; // ZBuffer 에 안쓴다. struct __Material : public _D3DMATERIAL9 { public: DWORD dwColorOp, dwColorArg1, dwColorArg2; - BOOL nRenderFlags; // 1-AlphaBlending | 2-Ȱ | 4-Double Side | 8- ?? - DWORD dwSrcBlend; // ҽ - DWORD dwDestBlend; // Ʈ + BOOL nRenderFlags; // 1-AlphaBlending | 2-안개랑 관계없음 | 4-Double Side | 8- ?? + DWORD dwSrcBlend; // 소스 블렌딩 방법 + DWORD dwDestBlend; // 데스트 블렌딩 방법 public: void Init(const _D3DCOLORVALUE & diffuseColor) { @@ -711,7 +711,7 @@ struct __Material : public _D3DMATERIAL9 { dwDestBlend = D3DBLEND_INVSRCALPHA; } - void Init() // ⺻ .. + void Init() // 기본 흰색으로 만든다.. { D3DCOLORVALUE crDiffuse = {1.0f, 1.0f, 1.0f, 1.0f}; this->Init(crDiffuse); @@ -878,7 +878,7 @@ struct __VertexT2 : public __VertexT1 { struct __VertexTransformed : public __Vector3 { public: float rhw; - D3DCOLOR color; // ʿ .. + D3DCOLOR color; // 필요 없다.. float tu, tv; public: @@ -1203,7 +1203,7 @@ struct __VertexXyzNormalColor : public __Vector3 { } }; -const int MAX_MIPMAP_COUNT = 10; // 1024 * 1024 ܰ +const int MAX_MIPMAP_COUNT = 10; // 1024 * 1024 단계까지 생성 const DWORD OBJ_UNKNOWN = 0; const DWORD OBJ_BASE = 0x1; @@ -1324,7 +1324,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir static __Vector3 Vertices[36]; int nFace = 0; - // z + // z 축 음의 면 nFace = 0; Vertices[nFace + 0].Set(vMin.x, vMax.y, vMin.z); Vertices[nFace + 1].Set(vMax.x, vMax.y, vMin.z); @@ -1333,7 +1333,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMin.x, vMin.y, vMin.z); - // x + // x 축 양의 면 nFace = 6; Vertices[nFace + 0].Set(vMax.x, vMax.y, vMin.z); Vertices[nFace + 1].Set(vMax.x, vMax.y, vMax.z); @@ -1342,7 +1342,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMax.x, vMin.y, vMin.z); - // z + // z 축 양의 면 nFace = 12; Vertices[nFace + 0].Set(vMax.x, vMax.y, vMax.z); Vertices[nFace + 1].Set(vMin.x, vMax.y, vMax.z); @@ -1351,7 +1351,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMax.x, vMin.y, vMax.z); - // x + // x 축 음의 면 nFace = 18; Vertices[nFace + 0].Set(vMin.x, vMax.y, vMax.z); Vertices[nFace + 1].Set(vMin.x, vMax.y, vMin.z); @@ -1360,7 +1360,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMin.x, vMin.y, vMax.z); - // y + // y 축 양의 면 nFace = 24; Vertices[nFace + 0].Set(vMin.x, vMax.y, vMax.z); Vertices[nFace + 1].Set(vMax.x, vMax.y, vMax.z); @@ -1369,7 +1369,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMin.x, vMax.y, vMin.z); - // y + // y 축 음의 면 nFace = 30; Vertices[nFace + 0].Set(vMin.x, vMin.y, vMin.z); Vertices[nFace + 1].Set(vMax.x, vMin.y, vMin.z); @@ -1378,7 +1378,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMin.x, vMin.y, vMax.z); - // 鿡 ؼ 浹 ˻.. + // 각 면에 대해서 충돌 검사.. for (int i = 0; i < 12; i++) { if (true == ::_IntersectTriangle(vOrig, vDir, Vertices[i * 3 + 0], Vertices[i * 3 + 1], Vertices[i * 3 + 2])) { return true; @@ -1401,7 +1401,7 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, __Vector3 pVec; float fDet; - // By : Ecli666 ( On 2001-09-12 10:39:01 ) + // By : Ecli666 ( On 2001-09-12 오전 10:39:01 ) pVec.Cross(vEdge1, vEdge2); fDet = pVec.Dot(vDir); @@ -1409,13 +1409,13 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, return FALSE; } - // ~(By Ecli666 On 2001-09-12 10:39:01 ) + // ~(By Ecli666 On 2001-09-12 오전 10:39:01 ) pVec.Cross(vDir, vEdge2); // If determinant is near zero, ray lies in plane of triangle fDet = vEdge1.Dot(pVec); - if (fDet < 0.0001f) { // 0 ﰢ ϴ. + if (fDet < 0.0001f) { // 거의 0에 가까우면 삼각형 평면과 지나가는 선이 평행하다. return FALSE; } @@ -1445,17 +1445,17 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, fU *= fInvDet; fV *= fInvDet; - // t Ŭ ָ ִ. - // t*dir + orig ϸ ִ. - // u v ǹ̴ ϱ? - // : v0 (0,0), v1(1,0), v2(0,1) <ȣ (U, V)ǥ> ̷ Ÿ + // t가 클수록 멀리 직선과 평면과 만나는 점이 멀다. + // t*dir + orig 를 구하면 만나는 점을 구할 수 있다. + // u와 v의 의미는 무엇일까? + // 추측 : v0 (0,0), v1(1,0), v2(0,1) <괄호안은 (U, V)좌표> 이런식으로 어느 점에 가깝나 나타낸 것 같음 // if (pVCol) { - (*pVCol) = vOrig + (vDir * fT); // .. + (*pVCol) = vOrig + (vDir * fT); // 접점을 계산.. } - // *t < 0 ̸ ... + // *t < 0 이면 뒤쪽... if (fT < 0.0f) { return FALSE; } @@ -1473,7 +1473,7 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, vEdge1 = v1 - v0; vEdge2 = v2 - v0; - // By : Ecli666 ( On 2001-09-12 10:39:01 ) + // By : Ecli666 ( On 2001-09-12 오전 10:39:01 ) pVec.Cross(vEdge1, vEdge2); fDet = pVec.Dot(vDir); @@ -1481,13 +1481,13 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, return FALSE; } - // ~(By Ecli666 On 2001-09-12 10:39:01 ) + // ~(By Ecli666 On 2001-09-12 오전 10:39:01 ) pVec.Cross(vDir, vEdge2); // If determinant is near zero, ray lies in plane of triangle fDet = vEdge1.Dot(pVec); - if (fDet < 0.0001f) { // 0 ﰢ ϴ. + if (fDet < 0.0001f) { // 거의 0에 가까우면 삼각형 평면과 지나가는 선이 평행하다. return FALSE; } @@ -1512,7 +1512,7 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, // Calculate t, scale parameters, ray intersects triangle fT = D3DXVec3Dot(&vEdge2, &qVec) / fDet; - // *t < 0 ̸ ... + // *t < 0 이면 뒤쪽... if (fT < 0.0f) { return FALSE; } @@ -1562,7 +1562,7 @@ inline void _Convert2D_To_3DCoordinate(int ixScreen, int iyScreen, const __Matri inline float _Yaw2D(float fDirX, float fDirZ) { //////////////////////////////// - // ϰ.. -> ȸ ϴ ƾ̴.. + // 방향을 구하고.. -> 회전할 값을 구하는 루틴이다.. if (fDirX >= 0.0f) // ^^ { if (fDirZ >= 0.0f) { @@ -1577,7 +1577,7 @@ inline float _Yaw2D(float fDirX, float fDirZ) { return (D3DXToRadian(180.0f) + (float)(asin(-fDirX))); } } - // ϰ.. + // 방향을 구하고.. //////////////////////////////// } @@ -1596,7 +1596,7 @@ inline short int _IsKeyDowned(int iVirtualKey) { return (GetAsyncKeyState(iVirtualKey) & 0x00ff); } -//macro.. -> Template ٲ.. +//macro.. -> Template 로 바꿨다.. template const T T_Max(const T a, const T b) { return ((a > b) ? b : a); } diff --git a/src/server/AIServer/N3BASE/N3ShapeMgr.cpp b/src/server/AIServer/N3BASE/N3ShapeMgr.cpp index 39c39d54..0b765f03 100644 --- a/src/server/AIServer/N3BASE/N3ShapeMgr.cpp +++ b/src/server/AIServer/N3BASE/N3ShapeMgr.cpp @@ -74,7 +74,7 @@ void CN3ShapeMgr::Release() { #endif // end of #ifndef _3DSERVER #ifdef _N3TOOL - m_CollisionExtras.clear(); // ߰ 浹üũ + m_CollisionExtras.clear(); // 추가로 넣을 충돌체크 데이터 #endif // end of #ifedef _N3TOOL } @@ -100,7 +100,7 @@ bool CN3ShapeMgr::Load(HANDLE hFile) { } #ifdef _N3GAME - CUILoading * pUILoading = CGameProcedure::s_pUILoading; // ε.. + CUILoading * pUILoading = CGameProcedure::s_pUILoading; // 로딩바.. #endif // end of #ifndef _N3GAME char szBuff[128]; @@ -118,34 +118,34 @@ bool CN3ShapeMgr::Load(HANDLE hFile) { for (int i = 0; i < iSC; i++) { ReadFile(hFile, &dwType, 4, &dwRWC, NULL); // Shape Type if (dwType & OBJ_SHAPE_EXTRA) { - pShape = new CN3ShapeExtra(); // Ȯ Object .. + pShape = new CN3ShapeExtra(); // 성문등 확장된 Object 로 쓸경우.. } else { pShape = new CN3Shape(); } m_Shapes.push_back(pShape); - // pShape->m_iEventID; ε Ʈ 100~, 200~ 1100~, 1200~ 2100~, 2200~ - // pShape->m_iEventType; 0-εƮ 1-(¿쿭) 2-(Ͽ) 3-(ϴ) - // pShape->m_iNPC_ID; Object ID + // pShape->m_iEventID; 바인드 포인트 100~, 200~ 성문 1100~, 1200~ 레버 2100~, 2200~ + // pShape->m_iEventType; 0-바인드포인트 1-성문(좌우열림) 2-성문(상하열림) 3-레버(상하당김) + // pShape->m_iNPC_ID; 조종할 Object ID // pShape->m_iNPC_Status; toggle 0, 1 pShape->Load(hFile); - if (pShape->m_iEventID) // ID ִ Ʈ ... NPC ִ.. + if (pShape->m_iEventID) // ID 가 있는 오브젝트 ... NPC 로 쓸수 있다.. { m_ShapesHaveID.push_back(pShape); - pShape->MakeCollisionMeshByParts(); // ״... 浹 ޽ø ... + pShape->MakeCollisionMeshByParts(); // 현재 모습 그대로... 충돌 메시를 만든다... TRACE(" Load OBject Event : ID(%d) Type(%d) CtrlID(%d) Status(%d)\n", pShape->m_iEventID, pShape->m_iEventType, pShape->m_iNPC_ID, pShape->m_iNPC_Status); } #ifdef _N3GAME - // ڵ... .. + // 강제 코딩... 각종 성문 열기.. // if(dwType & OBJ_SHAPE_EXTRA) // { - // CN3ShapeExtra* pSE = (CN3ShapeExtra*)pShape; // Ȯ Object .. - // pSE->RotateTo(0, __Vector3(0,1,0), 80, 1, true); // ٷ . - // pSE->RotateTo(1, __Vector3(0,1,0), -80, 1, true); // ٷ . + // CN3ShapeExtra* pSE = (CN3ShapeExtra*)pShape; // 성문등 확장된 Object 로 쓸경우.. + // pSE->RotateTo(0, __Vector3(0,1,0), 80, 1, true); // 바로 열기. + // pSE->RotateTo(1, __Vector3(0,1,0), -80, 1, true); // 바로 열기. // } if (!(i % 64)) { @@ -169,7 +169,7 @@ bool CN3ShapeMgr::LoadCollisionData(HANDLE hFile) { ReadFile(hFile, &m_fMapLength, 4, &dwRWC, NULL); // Shape Count this->Create(m_fMapWidth, m_fMapLength); - // 浹 üũ б.. + // 충돌 체크 폴리곤 데이터 읽기.. ReadFile(hFile, &m_nCollisionFaceCount, 4, &dwRWC, NULL); delete[] m_pvCollisions; m_pvCollisions = NULL; @@ -178,7 +178,7 @@ bool CN3ShapeMgr::LoadCollisionData(HANDLE hFile) { ReadFile(hFile, m_pvCollisions, sizeof(__Vector3) * m_nCollisionFaceCount * 3, &dwRWC, NULL); } - // Cell Data . + // Cell Data 쓰기. BOOL bExist = FALSE; int z = 0; for (float fZ = 0.0f; fZ < m_fMapLength; fZ += CELL_MAIN_SIZE, z++) { @@ -187,7 +187,7 @@ bool CN3ShapeMgr::LoadCollisionData(HANDLE hFile) { delete m_pCells[x][z]; m_pCells[x][z] = NULL; - ReadFile(hFile, &bExist, 4, &dwRWC, NULL); // Ͱ ִ .. + ReadFile(hFile, &bExist, 4, &dwRWC, NULL); // 데이터가 있는 셀인지 쓰고.. if (FALSE == bExist) { continue; } @@ -216,12 +216,12 @@ bool CN3ShapeMgr::Save(HANDLE hFile) { dwType = m_Shapes[i]->Type(); if (m_Shapes[i]->m_iEventID || m_Shapes[i]->m_iEventType || m_Shapes[i]->m_iNPC_ID || m_Shapes[i]->m_iNPC_Status) { - dwType |= OBJ_SHAPE_EXTRA; // NPC ID .. Ȯ Shape ... + dwType |= OBJ_SHAPE_EXTRA; // NPC ID 가 있으면.. 확장 Shape 로 ... } WriteFile(hFile, &dwType, 4, &dwRWC, NULL); // Shape Type - m_Shapes[i]->CollisionMeshSet(""); // 浹 ޽ô ش.. - m_Shapes[i]->ClimbMeshSet(""); // 浹 ޽ô ش.. + m_Shapes[i]->CollisionMeshSet(""); // 충돌 메시는 지워준다.. + m_Shapes[i]->ClimbMeshSet(""); // 충돌 메시는 지워준다.. m_Shapes[i]->Save(hFile); } #endif // end of #ifndef _3DSERVER @@ -233,16 +233,16 @@ bool CN3ShapeMgr::Save(HANDLE hFile) { bool CN3ShapeMgr::SaveCollisionData(HANDLE hFile) { DWORD dwRWC; - WriteFile(hFile, &m_fMapWidth, 4, &dwRWC, NULL); // ʺ - WriteFile(hFile, &m_fMapLength, 4, &dwRWC, NULL); // + WriteFile(hFile, &m_fMapWidth, 4, &dwRWC, NULL); // 맵 실제 미터 단위 너비 + WriteFile(hFile, &m_fMapLength, 4, &dwRWC, NULL); // 맵 실제 미터 단위 길이 - // 浹 üũ .. + // 충돌 체크 폴리곤 데이터 쓰기.. WriteFile(hFile, &m_nCollisionFaceCount, 4, &dwRWC, NULL); if (m_nCollisionFaceCount > 0) { WriteFile(hFile, m_pvCollisions, sizeof(__Vector3) * m_nCollisionFaceCount * 3, &dwRWC, NULL); } - // Cell Data . + // Cell Data 쓰기. int z = 0; for (float fZ = 0.0f; fZ < m_fMapLength; fZ += CELL_MAIN_SIZE, z++) { int x = 0; @@ -251,7 +251,7 @@ bool CN3ShapeMgr::SaveCollisionData(HANDLE hFile) { if (m_pCells[x][z]) { bExist = TRUE; } - WriteFile(hFile, &bExist, 4, &dwRWC, NULL); // Ͱ ִ .. + WriteFile(hFile, &bExist, 4, &dwRWC, NULL); // 데이터가 있는 셀인지 쓰고.. if (NULL == m_pCells[x][z]) { continue; @@ -265,7 +265,7 @@ bool CN3ShapeMgr::SaveCollisionData(HANDLE hFile) { } #endif // end of _N3TOOL -bool CN3ShapeMgr::Create(float fMapWidth, float fMapLength) // ʺ ̸ ִ´.. +bool CN3ShapeMgr::Create(float fMapWidth, float fMapLength) // 맵의 너비와 높이를 미터 단위로 넣는다.. { if (fMapWidth <= 0.0f || fMapWidth > MAX_CELL_MAIN * CELL_MAIN_SIZE || fMapLength <= 0.0f || fMapLength > MAX_CELL_MAIN * CELL_MAIN_SIZE) { @@ -281,7 +281,7 @@ bool CN3ShapeMgr::SaveCollisionData(HANDLE hFile) { #ifdef _N3TOOL void CN3ShapeMgr::GenerateCollisionData() { int nFC = 0, iSC = m_Shapes.size(); - for (int i = 0; i < iSC; i++) // Shape ִ 浹 ޽ ŭ . + for (int i = 0; i < iSC; i++) // Shape 에 있는 충돌 메시 만큼 생성. { CN3VMesh * pVM = m_Shapes[i]->CollisionMesh(); if (NULL == pVM) { @@ -296,7 +296,7 @@ void CN3ShapeMgr::GenerateCollisionData() { } } - nFC += m_CollisionExtras.size() / 3; // ߰ 浹 .. + nFC += m_CollisionExtras.size() / 3; // 추가 충돌 데이터.. if (nFC <= 0) { return; @@ -305,11 +305,11 @@ void CN3ShapeMgr::GenerateCollisionData() { m_nCollisionFaceCount = nFC; delete[] m_pvCollisions; m_pvCollisions = NULL; - m_pvCollisions = new __Vector3[nFC * 3]; // 浹 + m_pvCollisions = new __Vector3[nFC * 3]; // 충돌 폴리곤 생성 memset(m_pvCollisions, 0, sizeof(__Vector3) * nFC * 3); int nCPC = 0; // Collision Polygon Count - for (int i = 0; i < iSC; i++) // Shape ִ 浹 ޽ ŭ .. + for (int i = 0; i < iSC; i++) // Shape 에 있는 충돌 메시 만큼 데이터 복사.. { CN3VMesh * pVMesh = m_Shapes[i]->CollisionMesh(); if (NULL == pVMesh) { @@ -320,17 +320,17 @@ void CN3ShapeMgr::GenerateCollisionData() { if (nIC > 0) { WORD * pwIs = pVMesh->Indices(); for (int j = 0; j < nIC; j++) { - m_pvCollisions[nCPC++] = pVSrc[pwIs[j]] * m_Shapes[i]->m_Matrix; // ġ̴. + m_pvCollisions[nCPC++] = pVSrc[pwIs[j]] * m_Shapes[i]->m_Matrix; // 월드 위치이다. } } else { int nVC = pVMesh->VertexCount(); for (int j = 0; j < nVC; j++) { - m_pvCollisions[nCPC++] = pVSrc[j] * m_Shapes[i]->m_Matrix; // ġ̴. + m_pvCollisions[nCPC++] = pVSrc[j] * m_Shapes[i]->m_Matrix; // 월드 위치이다. } } } - // ߰ 浹 ֱ.. + // 추가 충돌 데이터 넣기.. it_Vector3 it = m_CollisionExtras.begin(), itEnd = m_CollisionExtras.end(); for (; it != itEnd; it++) { m_pvCollisions[nCPC++] = *it; @@ -338,14 +338,14 @@ void CN3ShapeMgr::GenerateCollisionData() { if (nCPC != (nFC * 3)) { #ifdef _N3GAME - CLogWriter::Write("CN3ShapeMgr::GenerateCollisionData - 浹 üũ ٸϴ. (%s)", + CLogWriter::Write("CN3ShapeMgr::GenerateCollisionData - 충돌 체크 폴리곤의 점갯수와 면 갯수가 다릅니다. (%s)", m_szFileName.c_str()); #endif this->Release(); return; } - // ִ Ȥ ԵǾ ִ Ǵؼ ε Ѵ. + // 각 선분이 셀에 걸쳐 있는지 혹은 포함되어 있는지 등등 판단해서 인덱스 생성을 한다. int xSMax = (int)(m_fMapWidth / CELL_SUB_SIZE); int zSMax = (int)(m_fMapLength / CELL_SUB_SIZE); for (int i = 0; i < nFC; i++) { @@ -358,9 +358,9 @@ void CN3ShapeMgr::GenerateCollisionData() { vEdge[2][0] = m_pvCollisions[i * 3 + 2]; vEdge[2][1] = m_pvCollisions[i * 3]; - for (int j = 0; j < 3; j++) // ִ ޽ ŭ ... + for (int j = 0; j < 3; j++) // 걸쳐 있는 메시 만큼 생성... { - // ϰ.. + // 범위를 정하고.. int xx1 = 0, xx2 = 0, zz1 = 0, zz2 = 0; if (vEdge[j][0].x < vEdge[j][1].x) { @@ -405,7 +405,7 @@ void CN3ShapeMgr::GenerateCollisionData() { zz2 = zSMax - 1; } - for (int z = zz1; z <= zz2; z++) // ŭ ó.. + for (int z = zz1; z <= zz2; z++) // 범위만큼 처리.. { float fZMin = (float)(z * CELL_SUB_SIZE); float fZMax = (float)((z + 1) * CELL_SUB_SIZE); @@ -442,24 +442,24 @@ void CN3ShapeMgr::GenerateCollisionData() { bool bWriteID = false; if (dwOC0 & dwOC1) { - bWriteID = false; // ܺο ִ. + bWriteID = false; // 두 끝점이 같은 변의 외부에 있다. } else if (dwOC0 == 0 && dwOC1 == 0) { - bWriteID = true; // 簢 ο + bWriteID = true; // 선분이 사각형 내부에 있음 } else if ((dwOC0 == 0 && dwOC1 != 0) || (dwOC0 != 0 && dwOC1 == 0)) { - bWriteID = true; // ο ܺο . - } else if ((dwOC0 & dwOC1) == 0) // L ܺο Ǵ ٽ ؾ Ѵ. + bWriteID = true; // 선분 한점은 셀의 내부에 한점은 외부에 있음. + } else if ((dwOC0 & dwOC1) == 0) // 두 꿑점 모두 셀 외부에 있지만 판단을 다시 해야 한다. { float fXCross = vEdge[j][0].x + (fZMax - vEdge[j][0].z) * (vEdge[j][1].x - vEdge[j][0].x) / - (vEdge[j][1].z - vEdge[j][0].z); // ϰ.. + (vEdge[j][1].z - vEdge[j][0].z); // 위의 변과의 교차점을 계산하고.. if (fXCross < fXMin) { - bWriteID = false; // ܰ ִ. + bWriteID = false; // 완전히 외곽에 있다. } else { - bWriteID = true; // óִ. + bWriteID = true; // 걸처있다. } } - if (false == bWriteID) // ɸ ٸ... Ƽ 浹 üũѴ. + if (false == bWriteID) // 만약 걸린게 없다면... 위에서 직선을 쏘아서 충돌인지 체크한다. { __Vector3 vPos, vDir; vDir.Set(0, -1.0f, 0); @@ -469,19 +469,19 @@ void CN3ShapeMgr::GenerateCollisionData() { for (float fX = xx3; fX <= xx4 && false == bWriteID; fX += 0.25f) { vPos.Set(fX, 10000.0f, fZ); if (::_IntersectTriangle(vPos, vDir, m_pvCollisions[i * 3], m_pvCollisions[i * 3 + 1], - m_pvCollisions[i * 3 + 2])) // 浹 üũ.. + m_pvCollisions[i * 3 + 2])) // 폴리곤 충돌 체크.. { - bWriteID = true; // 浹 ε .. + bWriteID = true; // 충돌 폴리곤 인덱스를 쓰게 만든다.. } } } } if (false == bWriteID) { - continue; // 浹 .. + continue; // 충돌 폴리곤 쓸일 없소.. } - // 浹 Ѵ.. + // 충돌 정보를 써야 한다.. int nX = x / CELL_MAIN_DEVIDE; int nZ = z / CELL_MAIN_DEVIDE; if (nX < 0 || nX >= MAX_CELL_MAIN || nZ < 0 && nZ >= MAX_CELL_MAIN) { @@ -499,7 +499,7 @@ void CN3ShapeMgr::GenerateCollisionData() { int nCCPC = pSubCell->nCCPolyCount; // Collision Check Polygon Count bool bOverlapped = false; - for (int k = 0; k < nCCPC; k++) // ߺ Ǵ üũ + for (int k = 0; k < nCCPC; k++) // 중복 되는지 체크 { if (i * 3 == pSubCell->pdwCCVertIndices[k * 3]) { bOverlapped = true; @@ -508,38 +508,38 @@ void CN3ShapeMgr::GenerateCollisionData() { } if (true == bOverlapped) { - continue; // ģ ִ üũ + continue; // 겹친게 있는지 체크 } - // ߺȰ .. - if (0 == nCCPC) // ÷ Ǿ.. + // 중복된게 없으면.. + if (0 == nCCPC) // 첨 생성 되었으면.. { pSubCell->pdwCCVertIndices = new DWORD[768]; memset(pSubCell->pdwCCVertIndices, 0, 768 * 4); } - // else // ̹ .. + // else // 이미 있으면.. // { // DWORD* pwBack = pSubCell->pdwCCVertIndices; // pSubCell->pdwCCVertIndices = new DWORD[(nCCPC+1)*3]; - // memcpy(pSubCell->pdwCCVertIndices, pwBack, nCCPC * 3 * 4); // ϳ ̰ ε̹Ƿ.. + // memcpy(pSubCell->pdwCCVertIndices, pwBack, nCCPC * 3 * 4); // 점세개가 하나의 폴리곤이고 워드 인덱스이므로.. // delete [] pwBack; // } if (nCCPC >= 256) { #ifdef _N3GAME CLogWriter::Write( - "CN3ShapeMgr::GenerateCollisionData - 浹 üũ ʹ ϴ. (%s)", + "CN3ShapeMgr::GenerateCollisionData - 충돌 체크 폴리곤 수가 너무 많습니다. (%s)", m_szFileName.c_str()); #endif continue; } - pSubCell->pdwCCVertIndices[nCCPC * 3 + 0] = i * 3 + 0; // ε .. - pSubCell->pdwCCVertIndices[nCCPC * 3 + 1] = i * 3 + 1; // ε .. - pSubCell->pdwCCVertIndices[nCCPC * 3 + 2] = i * 3 + 2; // ε .. - pSubCell->nCCPolyCount++; // Collision Check Polygon Count ø. + pSubCell->pdwCCVertIndices[nCCPC * 3 + 0] = i * 3 + 0; // 인덱스 저장.. + pSubCell->pdwCCVertIndices[nCCPC * 3 + 1] = i * 3 + 1; // 인덱스 저장.. + pSubCell->pdwCCVertIndices[nCCPC * 3 + 2] = i * 3 + 2; // 인덱스 저장.. + pSubCell->nCCPolyCount++; // Collision Check Polygon Count 를 늘린다. } // end of for(int x = xx1; x <= xx2; x++) - } // end of for(int z = zz1; z <= zz2; z++) // ŭ ó.. - } // end of for(int j = 0; j < 3; j++) // ִ ޽ ŭ ... + } // end of for(int z = zz1; z <= zz2; z++) // 범위만큼 처리.. + } // end of for(int j = 0; j < 3; j++) // 걸쳐 있는 메시 만큼 생성... } } #endif // end of _N3TOOL @@ -559,9 +559,9 @@ int CN3ShapeMgr::Add(CN3Shape * pShape) { return -1; } - pShape->SaveToFile(); // Ϸ ϰ.. + pShape->SaveToFile(); // 파일로 저장하고.. CN3Shape * pShapeAdd = new CN3Shape(); - if (false == pShapeAdd->LoadFromFile(pShape->FileName())) // + if (false == pShapeAdd->LoadFromFile(pShape->FileName())) // 이 파일을 열은 다음 { delete pShapeAdd; return -1; @@ -572,10 +572,10 @@ int CN3ShapeMgr::Add(CN3Shape * pShape) { } int iSC = m_pCells[nX][nZ]->nShapeCount; - if (0 == iSC) // ÷ Ǿ.. + if (0 == iSC) // 첨 생성 되었으면.. { m_pCells[nX][nZ]->pwShapeIndices = new WORD[iSC + 1]; - } else // ̹ .. + } else // 이미 있으면.. { WORD * pwBack = m_pCells[nX][nZ]->pwShapeIndices; m_pCells[nX][nZ]->pwShapeIndices = new WORD[iSC + 1]; @@ -583,10 +583,10 @@ int CN3ShapeMgr::Add(CN3Shape * pShape) { delete[] pwBack; } - m_pCells[nX][nZ]->pwShapeIndices[iSC] = m_Shapes.size(); // ε .. + m_pCells[nX][nZ]->pwShapeIndices[iSC] = m_Shapes.size(); // 인덱스 저장.. - m_Shapes.push_back(pShapeAdd); // ߰ Ѵ.. - m_pCells[nX][nZ]->nShapeCount++; // Shape Count ø. + m_Shapes.push_back(pShapeAdd); // 추가 한다.. + m_pCells[nX][nZ]->nShapeCount++; // Shape Count 를 늘린다. return m_Shapes.size() - 1; } @@ -595,9 +595,9 @@ int CN3ShapeMgr::Add(CN3Shape * pShape) { #ifdef _N3TOOL bool CN3ShapeMgr::AddCollisionTriangle(const __Vector3 & v1, const __Vector3 & v2, const __Vector3 & v3) { int count = m_CollisionExtras.size(); - m_CollisionExtras.push_back(v1); // ߰ 浹üũ - m_CollisionExtras.push_back(v2); // ߰ 浹üũ - m_CollisionExtras.push_back(v3); // ߰ 浹üũ + m_CollisionExtras.push_back(v1); // 추가로 넣을 충돌체크 데이터 + m_CollisionExtras.push_back(v2); // 추가로 넣을 충돌체크 데이터 + m_CollisionExtras.push_back(v3); // 추가로 넣을 충돌체크 데이터 if ((count + 3) == m_CollisionExtras.size()) { return true; @@ -651,7 +651,7 @@ void CN3ShapeMgr::Tick() { __CellMain * pCellCur = NULL; m_ShapesToRender.clear(); - // Ʈ .. + // 렌더링 리스트 비우고.. for (int zM = zMainS; zM < zMainE; zM++) { for (int xM = xMainS; xM < xMainE; xM++) { @@ -692,21 +692,21 @@ void CN3ShapeMgr::Render() { } #endif // end of #ifndef _3DSERVER -bool CN3ShapeMgr::CheckCollision(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol, // 浹 - __Vector3 * pvNormal, // 浹Ѹ - __Vector3 * pVec) // 浹 __Vector3[3] +bool CN3ShapeMgr::CheckCollision(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol, // 충돌 지점 + __Vector3 * pvNormal, // 충돌한면의 법선벡터 + __Vector3 * pVec) // 충돌한 면 의 폴리곤 __Vector3[3] { if (fSpeedPerSec <= 0) { - return false; // ̴ ӵ ų ݴ ̸ Ѿ.. + return false; // 움직이는 속도가 없거나 반대로 움직이면 넘어간다.. } static __CellSub * ppCells[128]; - __Vector3 vPosNext = vPos + (vDir * fSpeedPerSec); // ġ - int nSubCellCount = this->SubCellPathThru(vPos, vPosNext, ppCells); // ϴ 꼿 ´.. + __Vector3 vPosNext = vPos + (vDir * fSpeedPerSec); // 다음 위치 + int nSubCellCount = this->SubCellPathThru(vPos, vPosNext, ppCells); // 통과하는 서브셀을 가져온다.. if (nSubCellCount <= 0 || nSubCellCount > 128) { - return false; // . + return false; // 없음 말자. } __Vector3 vColTmp(0, 0, 0); @@ -730,10 +730,10 @@ void CN3ShapeMgr::Render() { } if (false == ::_IntersectTriangle(vPosNext, vDir, m_pvCollisions[nIndex0], m_pvCollisions[nIndex1], m_pvCollisions[nIndex2])) { - fDistTmp = (vPos - vColTmp).Magnitude(); // Ÿ 纸.. + fDistTmp = (vPos - vColTmp).Magnitude(); // 거리를 재보고.. if (fDistTmp < fDistClosest) { fDistClosest = fDistTmp; - // 浹̴.. + // 충돌이다.. if (pvCol) { *pvCol = vColTmp; } @@ -757,11 +757,11 @@ void CN3ShapeMgr::Render() { } #ifndef _3DSERVER else { - it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // ̴°͸ ؼ... + it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... int iSC = m_ShapesToRender.size(); if (iSC > 0) { - // Ÿ .. + // 거리순으로 정렬.. CN3Shape * pShape = NULL; std::vector Shapes; for (int i = 0; it != itEnd; it++, i++) { @@ -770,7 +770,7 @@ void CN3ShapeMgr::Render() { continue; } if ((pShape->Pos() - vPos).Magnitude() > pShape->Radius() * 2) { - continue; // ָ Ÿ .. + continue; // 멀리 떨어진거면 지나간다.. } Shapes.push_back(pShape); @@ -782,7 +782,7 @@ void CN3ShapeMgr::Render() { iSC = Shapes.size(); if (iSC > 1) { - qsort(&(Shapes[0]), iSC, 4, SortByCameraDistance); // ī޶ Ÿ ϰ.. + qsort(&(Shapes[0]), iSC, 4, SortByCameraDistance); // 카메라 거리에 따라 정렬하고.. } CN3VMesh * pVMesh = NULL; @@ -813,9 +813,9 @@ bool CN3ShapeMgr::CheckCollisionCamera(__Vector3 & vEyeResult, const __Vector3 & return false; } - float fDelta = (vEyeResult - vCol).Magnitude(); // 浹 óٺ Ÿ 纸.. + float fDelta = (vEyeResult - vCol).Magnitude(); // 충돌점과 처다보는 거리를 재보고.. if (fDelta < fNP * 2.0f) { - return false; // ʹ ư.. + return false; // 너무 가까이 붙으면 돌아간다.. } vEyeResult -= vDir * fDelta; @@ -896,10 +896,10 @@ CN3Shape * CN3ShapeMgr::Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __ ::_Convert2D_To_3DCoordinate(iXScreen, iYScreen, s_CameraData.mtxView, s_CameraData.mtxProjection, s_CameraData.vp, vPos, vDir); - it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // ̴°͸ ؼ... + it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... int iSC = m_ShapesToRender.size(); - // Ÿ .. + // 거리순으로 정렬.. std::vector Shapes(iSC, NULL); for (int i = 0; it != itEnd; it++, i++) { Shapes[i] = *it; @@ -908,7 +908,7 @@ CN3Shape * CN3ShapeMgr::Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __ for (int i = 0; i < iSC; i++) { if (bMustHaveEvent && Shapes[i]->m_iEventID <= 0) { - continue; // ̺Ʈ ־ Ѵٸ... + continue; // 이벤트가 있어야 한다면... } if (Shapes[i]->CheckCollisionPrecisely(vPos, vDir, pvPick) >= 0) { return Shapes[i]; @@ -943,7 +943,7 @@ int CN3ShapeMgr::SortByCameraDistance(const void * pArg1, const void * pArg2) { float fDist2 = (CN3Base::s_CameraData.vEye - pShape2->Pos()).Magnitude(); if (fDist1 < fDist2) { - return 1; // true; + return 1; // 가까우면 true; } else if (fDist1 > fDist2) { return -1; } else { @@ -953,13 +953,13 @@ int CN3ShapeMgr::SortByCameraDistance(const void * pArg1, const void * pArg2) { #endif // end of #ifndef _3DSERVER int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, - __CellSub ** ppSubCells) // ̿ ģ ش.. + __CellSub ** ppSubCells) // 벡터 사이에 걸친 셀포인터 돌려준다.. { if (NULL == ppSubCells) { return 0; } - // ϰ.. + // 범위를 정하고.. int xx1 = 0, xx2 = 0, zz1 = 0, zz2 = 0; if (vFrom.x < vAt.x) { @@ -981,7 +981,7 @@ int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, bool bPathThru; float fZMin, fZMax, fXMin, fXMax; int nSubCellCount = 0; - for (int z = zz1; z <= zz2; z++) // ŭ ó.. + for (int z = zz1; z <= zz2; z++) // 범위만큼 처리.. { fZMin = (float)(z * CELL_SUB_SIZE); fZMax = (float)((z + 1) * CELL_SUB_SIZE); @@ -1018,19 +1018,19 @@ int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, bPathThru = false; if (dwOC0 & dwOC1) { - bPathThru = false; // ܺο ִ. + bPathThru = false; // 두 끝점이 같은 변의 외부에 있다. } else if (dwOC0 == 0 && dwOC1 == 0) { - bPathThru = true; // 簢 ο + bPathThru = true; // 선분이 사각형 내부에 있음 } else if ((dwOC0 == 0 && dwOC1 != 0) || (dwOC0 != 0 && dwOC1 == 0)) { - bPathThru = true; // ο ܺο . - } else if ((dwOC0 & dwOC1) == 0) // L ܺο Ǵ ٽ ؾ Ѵ. + bPathThru = true; // 선분 한점은 셀의 내부에 한점은 외부에 있음. + } else if ((dwOC0 & dwOC1) == 0) // 두 꿑점 모두 셀 외부에 있지만 판단을 다시 해야 한다. { float fXCross = vFrom.x + (fZMax - vFrom.z) * (vAt.x - vFrom.x) / - (vAt.z - vFrom.z); // ϰ.. + (vAt.z - vFrom.z); // 위의 변과의 교차점을 계산하고.. if (fXCross < fXMin) { - bPathThru = false; // ܰ ִ. + bPathThru = false; // 완전히 외곽에 있다. } else { - bPathThru = true; // óִ. + bPathThru = true; // 걸처있다. } } @@ -1038,14 +1038,14 @@ int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, continue; } - // 浹 Ѵ.. + // 충돌 정보를 써야 한다.. int nX = x / CELL_MAIN_DEVIDE; int nZ = z / CELL_MAIN_DEVIDE; if (nX < 0 || nX >= MAX_CELL_MAIN || nZ < 0 && nZ >= MAX_CELL_MAIN) { - continue; // μٱ . + continue; // 메인셀바깥에 있음 지나간다. } if (NULL == m_pCells[nX][nZ]) { - continue; // μ ̸ .. + continue; // 메인셀이 널이면 지나간다.. } int nXSub = x % CELL_MAIN_DEVIDE; @@ -1054,41 +1054,41 @@ int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, ppSubCells[nSubCellCount] = &(m_pCells[nX][nZ]->SubCells[nXSub][nZSub]); nSubCellCount++; } // end of for(int x = xx1; x <= xx2; x++) - } // end of for(int z = zz1; z <= zz2; z++) // ŭ ó.. + } // end of for(int z = zz1; z <= zz2; z++) // 범위만큼 처리.. - return nSubCellCount; // ģ ֱ.. + return nSubCellCount; // 걸친 셀 포인터 돌려주기.. } float CN3ShapeMgr::GetHeightNearstPos( - const __Vector3 & vPos, __Vector3 * pvNormal) // ̰ ش. -FLT_MAX ش. + const __Vector3 & vPos, __Vector3 * pvNormal) // 가장 가까운 높이값을 돌려준다. 없으면 -FLT_MAX 을 돌려준다. { - __CellSub * pCell = this->SubCell(vPos.x, vPos.z); // 꼿 ´.. + __CellSub * pCell = this->SubCell(vPos.x, vPos.z); // 서브셀을 가져온다.. if (NULL == pCell || pCell->nCCPolyCount <= 0) { - return -FLT_MAX; // . + return -FLT_MAX; // 없음 말자. } __Vector3 vPosV = vPos; - vPosV.y = 5000.0f; // ⿡ ġ ϰ.. - __Vector3 vDir(0, -1, 0); // - __Vector3 vColTmp(0, 0, 0); // 浹 ġ.. + vPosV.y = 5000.0f; // 꼭대기에 위치를 하고.. + __Vector3 vDir(0, -1, 0); // 수직 방향 벡터 + __Vector3 vColTmp(0, 0, 0); // 최종적으로 가장 가까운 충돌 위치.. int nIndex0, nIndex1, nIndex2; float fT, fU, fV; - float fNearst = FLT_MAX, fMinTmp = 0, fHeight = -FLT_MAX; // ϴ ּҰ ū .. + float fNearst = FLT_MAX, fMinTmp = 0, fHeight = -FLT_MAX; // 일단 최소값을 큰값으로 잡고.. for (int i = 0; i < pCell->nCCPolyCount; i++) { nIndex0 = pCell->pdwCCVertIndices[i * 3]; nIndex1 = pCell->pdwCCVertIndices[i * 3 + 1]; nIndex2 = pCell->pdwCCVertIndices[i * 3 + 2]; - // 浹 .. + // 충돌된 점이 있으면.. if (true == ::_IntersectTriangle(vPosV, vDir, m_pvCollisions[nIndex0], m_pvCollisions[nIndex1], m_pvCollisions[nIndex2], fT, fU, fV, &vColTmp)) { fMinTmp = (vColTmp - vPos).Magnitude(); - if (fMinTmp < fNearst) // 浹 ġ ã ڵ.. + if (fMinTmp < fNearst) // 가장 가까운 충돌 위치를 찾기 위한 코드.. { fNearst = fMinTmp; - fHeight = vColTmp.y; // ̰. + fHeight = vColTmp.y; // 높이값. if (pvNormal) { pvNormal->Cross(m_pvCollisions[nIndex1] - m_pvCollisions[nIndex0], @@ -1103,16 +1103,16 @@ float CN3ShapeMgr::GetHeightNearstPos( } float CN3ShapeMgr::GetHeight(float fX, float fZ, - __Vector3 * pvNormal) // ش.. -FLT_MAX ش. + __Vector3 * pvNormal) // 가장 높은 곳을 돌려준다.. 없으면 -FLT_MAX값을 돌려준다. { - __CellSub * pCell = this->SubCell(fX, fZ); // 꼿 ´.. + __CellSub * pCell = this->SubCell(fX, fZ); // 서브셀을 가져온다.. if (NULL == pCell || pCell->nCCPolyCount <= 0) { - return -FLT_MAX; // . + return -FLT_MAX; // 없음 말자. } - __Vector3 vPosV(fX, 5000.0f, fZ); // ⿡ ġ ϰ.. - __Vector3 vDir(0, -1, 0); // - __Vector3 vColTmp(0, 0, 0); // 浹 ġ.. + __Vector3 vPosV(fX, 5000.0f, fZ); // 꼭대기에 위치를 하고.. + __Vector3 vDir(0, -1, 0); // 수직 방향 벡터 + __Vector3 vColTmp(0, 0, 0); // 최종적으로 가장 가까운 충돌 위치.. int nIndex0, nIndex1, nIndex2; float fT, fU, fV; @@ -1124,7 +1124,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, nIndex1 = pCell->pdwCCVertIndices[i * 3 + 1]; nIndex2 = pCell->pdwCCVertIndices[i * 3 + 2]; - // 浹 .. + // 충돌된 점이 있으면.. if (true == ::_IntersectTriangle(vPosV, vDir, m_pvCollisions[nIndex0], m_pvCollisions[nIndex1], m_pvCollisions[nIndex2], fT, fU, fV, &vColTmp)) { if (vColTmp.y > fMaxTmp) { @@ -1141,7 +1141,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, return fMaxTmp; } -void CN3ShapeMgr::SubCell(const __Vector3 & vPos, __CellSub ** ppSubCell) // ش ġ ͸ ش. +void CN3ShapeMgr::SubCell(const __Vector3 & vPos, __CellSub ** ppSubCell) // 해당 위치의 셀 포인터를 돌려준다. { int x = (int)(vPos.x / CELL_MAIN_SIZE); int z = (int)(vPos.z / CELL_MAIN_SIZE); @@ -1194,7 +1194,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, break; } - if ((x != 0) && (xx == 0)) // x , z . + if ((x != 0) && (xx == 0)) // x 감소, z 증가. { if ((z != (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) { if (m_pCells[x - 1][z + 1] != NULL) { @@ -1210,7 +1210,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, break; } - if ((z != (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) // x , z . + if ((z != (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) // x 감소, z 증가. { if ((x != 0) && (xx == 0)) { if (m_pCells[x - 1][z + 1] != NULL) { @@ -1234,7 +1234,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, break; case 3: - if ((z == (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) // z . + if ((z == (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) // z 증가. { ppSubCell[i] = NULL; break; @@ -1257,7 +1257,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, break; case 4: - if ((x == (MAX_CELL_MAIN - 1)) && (xx == (CELL_MAIN_DEVIDE - 1))) // x , z . + if ((x == (MAX_CELL_MAIN - 1)) && (xx == (CELL_MAIN_DEVIDE - 1))) // x 증가, z 증가. { ppSubCell[i] = NULL; break; @@ -1305,7 +1305,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, } break; - case 5: // x . + case 5: // x 증가. if ((x == (MAX_CELL_MAIN - 1)) && (xx == (CELL_MAIN_DEVIDE - 1))) { ppSubCell[i] = NULL; break; @@ -1327,7 +1327,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, } break; - case 6: // x . z . + case 6: // x 증가. z 감소. if ((x == (MAX_CELL_MAIN - 1)) && (xx == (CELL_MAIN_DEVIDE - 1))) { ppSubCell[i] = NULL; break; @@ -1375,7 +1375,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, } break; - case 7: // z . + case 7: // z 감소. if ((z == 0) && (zz == 0)) { ppSubCell[i] = NULL; break; @@ -1397,7 +1397,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, } break; - case 8: // x , z . + case 8: // x 감소, z 감소. if ((x == 0) && (xx == 0)) { ppSubCell[i] = NULL; break; diff --git a/src/server/AIServer/N3BASE/N3ShapeMgr.h b/src/server/AIServer/N3BASE/N3ShapeMgr.h index 41190c03..5e6c6562 100644 --- a/src/server/AIServer/N3BASE/N3ShapeMgr.h +++ b/src/server/AIServer/N3BASE/N3ShapeMgr.h @@ -12,11 +12,11 @@ #include "N3BaseFileAccess.h" #endif // end of #ifndef _3DSERVER -const int CELL_MAIN_DEVIDE = 4; // μ 4 X 4 꼿 .. -const int CELL_SUB_SIZE = 4; // 4 Meter 꼿 ̴.. -const int CELL_MAIN_SIZE = CELL_MAIN_DEVIDE * CELL_SUB_SIZE; // μ ũ 꼿 X 꼿 ũ̴. -const int MAX_CELL_MAIN = 4096 / CELL_MAIN_SIZE; // μ ִ ũ / μũ ̴. -const int MAX_CELL_SUB = MAX_CELL_MAIN * CELL_MAIN_DEVIDE; // 꼿 ִ μ * μ ̴. +const int CELL_MAIN_DEVIDE = 4; // 메인셀은 4 X 4 의 서브셀로 나뉜다.. +const int CELL_SUB_SIZE = 4; // 4 Meter 가 서브셀의 사이즈이다.. +const int CELL_MAIN_SIZE = CELL_MAIN_DEVIDE * CELL_SUB_SIZE; // 메인셀 크기는 서브셀갯수 X 서브셀 크기이다. +const int MAX_CELL_MAIN = 4096 / CELL_MAIN_SIZE; // 메인셀의 최대 갯수는 지형크기 / 메인셀크기 이다. +const int MAX_CELL_SUB = MAX_CELL_MAIN * CELL_MAIN_DEVIDE; // 서브셀 최대 갯수는 메인셀 * 메인셀나눔수 이다. #ifdef _3DSERVER class CN3ShapeMgr @@ -29,10 +29,10 @@ class CN3ShapeMgr : public CN3BaseFileAccess #endif // end of #ifndef _3DSERVER { public: - struct __CellSub // + struct __CellSub // 하위 셀 데이터 { int nCCPolyCount; // Collision Check Polygon Count - DWORD * pdwCCVertIndices; // Collision Check Polygon Vertex Indices - wCCPolyCount * 3 ŭ ȴ. + DWORD * pdwCCVertIndices; // Collision Check Polygon Vertex Indices - wCCPolyCount * 3 만큼 생성된다. void Load(HANDLE hFile) { DWORD dwRWC = 0; @@ -65,7 +65,7 @@ class CN3ShapeMgr : public CN3BaseFileAccess ~__CellSub() { delete[] pdwCCVertIndices; } }; - struct __CellMain // ⺻ + struct __CellMain // 기본 셀 데이터 { int nShapeCount; // Shape Count; WORD * pwShapeIndices; // Shape Indices @@ -114,27 +114,27 @@ class CN3ShapeMgr : public CN3BaseFileAccess protected: #ifndef _3DSERVER - std::vector m_Shapes; // Ʈ ... 迭 ξ ȿ̱ ̴. - std::list m_ShapesToRender; // Tick ȣϸ ͸ ߸.. - std::list m_ShapesHaveID; // ID ־ NPC ɼ ִ Shapes.... + std::vector m_Shapes; // 리스트로 안 만든 이유는... 배열이 훨씬 효율적이기 때문이다. + std::list m_ShapesToRender; // Tick 을 호출하면 렌더링할 것만 추린다.. + std::list m_ShapesHaveID; // ID 를 갖고 있어 NPC 가 될수 있는 Shapes.... #endif // end of #ifndef _3DSERVER - float m_fMapWidth; // ʺ.. - float m_fMapLength; // .. + float m_fMapWidth; // 맵 너비.. 미터 단위 + float m_fMapLength; // 맵 길이.. 미터 단위 int m_nCollisionFaceCount; __CellMain * m_pCells[MAX_CELL_MAIN][MAX_CELL_MAIN]; #ifdef _N3TOOL - std::list<__Vector3> m_CollisionExtras; // ߰ 浹üũ + std::list<__Vector3> m_CollisionExtras; // 추가로 넣을 충돌체크 데이터 #endif // end of #ifedef _N3TOOL public: #ifndef _3DSERVER - CN3Shape * ShapeGetByID(int iID); // ID Ʈ... NPC ִ Ʈ ˻ؼ ش.. - CN3Shape * Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __Vector3 * pvPick = NULL); // ġ ش.. + CN3Shape * ShapeGetByID(int iID); // 고유 ID 를 가진 오브젝트... NPC 로 쓸수 있는 오브젝트를 검색해서 돌려준다.. + CN3Shape * Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __Vector3 * pvPick = NULL); // 위치를 돌려준다.. #endif // end of #ifndef _3DSERVER void SubCell(const __Vector3 & vPos, __CellSub ** ppSubCell); - __CellSub * SubCell(float fX, float fZ) // ش ġ ͸ ش. + __CellSub * SubCell(float fX, float fZ) // 해당 위치의 셀 포인터를 돌려준다. { int x = (int)(fX / CELL_MAIN_SIZE); int z = (int)(fZ / CELL_MAIN_SIZE); @@ -150,17 +150,17 @@ class CN3ShapeMgr : public CN3BaseFileAccess return &(m_pCells[x][z]->SubCells[xx][zz]); } float GetHeightNearstPos(const __Vector3 & vPos, - __Vector3 * pvNormal = NULL); // ش. -FLT_MAX ش. + __Vector3 * pvNormal = NULL); // 가장 가까운 높이을 돌려준다. 없으면 -FLT_MAX 을 돌려준다. float GetHeight(float fX, float fZ, - __Vector3 * pvNormal = NULL); // ش. -FLT_MAX ش. + __Vector3 * pvNormal = NULL); // 현재 지점에서 제일 높은 값을 돌려준다. 없으면 -FLT_MAX 을 돌려준다. int SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, - __CellSub ** ppSubCells); // ̿ ģ ش.. - float Width() { return m_fMapWidth; } // ʺ. ̴. - float Height() { return m_fMapWidth; } // ʺ. ̴. + __CellSub ** ppSubCells); // 벡터 사이에 걸친 셀포인터 돌려준다.. + float Width() { return m_fMapWidth; } // 맵의 너비. 단위는 미터이다. + float Height() { return m_fMapWidth; } // 맵의 너비. 단위는 미터이다. #ifndef _3DSERVER void ReleaseShapes(); - void RenderCollision(__Vector3 & vPos); // ġ ִ 浹 ޽ø ׷ش.. ... + void RenderCollision(__Vector3 & vPos); // 넣은 위치에 있는 충돌 메시를 그려준다.. 디버깅용... void Tick(); void Render(); bool Load(HANDLE hFile); @@ -168,18 +168,18 @@ class CN3ShapeMgr : public CN3BaseFileAccess static int SortByCameraDistance(const void * pArg1, const void * pArg2); #endif // end of #ifndef _3DSERVER - bool CheckCollision(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol = NULL, // 浹 - __Vector3 * pvNormal = NULL, // 浹Ѹ - __Vector3 * pVec = NULL); // 浹 __Vector3[3] + bool CheckCollision(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol = NULL, // 충돌 지점 + __Vector3 * pvNormal = NULL, // 충돌한면의 법선벡터 + __Vector3 * pVec = NULL); // 충돌한 면 의 폴리곤 __Vector3[3] - bool Create(float fMapWidth, float fMapLength); // ʺ ̸ ִ´.. + bool Create(float fMapWidth, float fMapLength); // 맵의 너비와 높이를 미터 단위로 넣는다.. bool LoadCollisionData(HANDLE hFile); #ifdef _N3TOOL - void MakeMoveTable(short ** pMoveArray); // shape ִ Ÿ 1, Ÿ 0 ̺ . + void MakeMoveTable(short ** pMoveArray); //지형에서 shape가 있는 타일은 1, 없는 타일은 0으로 셋팅한 테이블을 만든다. int Add(CN3Shape * pShape); bool AddCollisionTriangle(const __Vector3 & v1, const __Vector3 & v2, const __Vector3 & v3); void GenerateCollisionData(); diff --git a/src/server/AIServer/N3BASE/N3VectorAndMatrix.cpp b/src/server/AIServer/N3BASE/N3VectorAndMatrix.cpp index 18ee570b..78a7cec0 100644 --- a/src/server/AIServer/N3BASE/N3VectorAndMatrix.cpp +++ b/src/server/AIServer/N3BASE/N3VectorAndMatrix.cpp @@ -14,7 +14,7 @@ inline void InitTrigonometricFunction() { } } -inline float __Sine(float fRadian) // ̺ ﰢԼ ϱ.. +inline float __Sine(float fRadian) // 테이블에 의한 삼각함수 값구하기.. { if (fRadian > -10000.0f && fRadian < 10000.0f) { while (fRadian < 0) { @@ -31,7 +31,7 @@ inline void InitTrigonometricFunction() { } } -inline float __Cosine(float fRadian) // ̺ ﰢԼ ϱ.. +inline float __Cosine(float fRadian) // 테이블에 의한 삼각함수 값구하기.. { if (fRadian > -10000.0f && fRadian < 10000.0f) { while (fRadian < 0) { @@ -48,7 +48,7 @@ inline void InitTrigonometricFunction() { } } -inline float __Tangent(float fRadian) // ̺ ﰢԼ ϱ.. +inline float __Tangent(float fRadian) // 테이블에 의한 삼각함수 값구하기.. { if (fRadian > -10000.0f && fRadian < 10000.0f) { while (fRadian < 0) { @@ -394,7 +394,7 @@ inline __Matrix44 __Matrix44::operator*(const D3DXMATRIX & mtx) { // __tempM._43 = _41 * mtx._13 + _42 * mtx._23 + _43 * mtx._33 + _44 * mtx._43; // __tempM._44 = _41 * mtx._14 + _42 * mtx._24 + _43 * mtx._34 + _44 * mtx._44; - // ȭ ڵ.. + // 최적화 된 코드.. __tempM._11 = _11 * mtx._11 + _12 * mtx._21 + _13 * mtx._31; __tempM._12 = _11 * mtx._12 + _12 * mtx._22 + _13 * mtx._32; __tempM._13 = _11 * mtx._13 + _12 * mtx._23 + _13 * mtx._33; diff --git a/src/server/AIServer/Npc.cpp b/src/server/AIServer/Npc.cpp index 10de96a8..4527a0e6 100644 --- a/src/server/AIServer/Npc.cpp +++ b/src/server/AIServer/Npc.cpp @@ -10,22 +10,22 @@ int surround_x[8] = {-1, -1, 0, 1, 1, 1, 0, -1}; int surround_z[8] = {0, -1, -1, -1, 0, 1, 1, 1}; int test_id = 1056; -int cur_test = 0; // 1 = test , 0̸ +int cur_test = 0; // 1 = test중 , 0이면 정상 #include "extern.h" //BOOL g_bDebug = TRUE; -#define ATROCITY_ATTACK_TYPE 1 // -#define TENDER_ATTACK_TYPE 0 // İ +#define ATROCITY_ATTACK_TYPE 1 // 선공 +#define TENDER_ATTACK_TYPE 0 // 후공 -// ൿ +// 행동변경 관련 #define NO_ACTION 0 -#define ATTACK_TO_TRACE 1 // ݿ ߰ +#define ATTACK_TO_TRACE 1 // 공격에서 추격 #define MONSTER_CHANGED 1 -#define LONG_ATTACK_RANGE 30 // Ÿ ȿŸ -#define SHORT_ATTACK_RANGE 3 // ȿŸ +#define LONG_ATTACK_RANGE 30 // 장거리 공격 유효거리 +#define SHORT_ATTACK_RANGE 3 // 직접공격 유효거리 -// +// 무기 관련 #define WEAPON_ITEM 1 #define DEFENCR_ITEM 2 #define ACCESSORY_ITEM 3 @@ -43,15 +43,15 @@ extern CRITICAL_SECTION g_region_critical; extern CRITICAL_SECTION g_LogFileWrite; /* - ** Repent AI Server ۾ ** - 1. m_fSpeed_1,m_fSpeed_2 Ƿ NPC_SECFORMETER_MOVE(4) ,, - ߿ ̰͵ (̺) - 2. m_byGroup .. (̰ ּ..) - 3. m_byTracingRange . m_bySearchRange*2 ġ - 4. GetFinalDamage(), GetNFinalDamage(), GetDefense() Լ .. ġ .. - 5. FillNpcInfo() - 6. SendNpcInfoAll() - 7. SendAttackSuccess() κ .. ȣϴ κе ... + ** Repent AI Server 작업시 참고 사항 ** + 1. m_fSpeed_1,m_fSpeed_2라는 변수가 없으므로 NPC_SECFORMETER_MOVE(4)로 수정,, + 나중에 이것도 나이츠 방식으로 수정할 것 (테이블) + 2. m_byGroup 변수 없음.. (이것 나오는 것 전부 주석..) + 3. m_byTracingRange 변수 없음 . m_bySearchRange*2으로 대치 + 4. GetFinalDamage(), GetNFinalDamage(), GetDefense() 함수 수정.. 공격치 계산식.. + 5. FillNpcInfo() 수정 + 6. SendNpcInfoAll() 수정 + 7. SendAttackSuccess() 부분 수정.. 호출하는 부분도 수정할 것... */ ////////////////////////////////////////////////////////////////////// @@ -78,8 +78,8 @@ inline BOOL CNpc::SetUid(float x, float z, int id) { return FALSE; } - // map ̵ Ұ̸ npc .. - // ۾ : κ ߿ ó.... + // map 이동이 불가능이면 npc등록 실패.. + // 작업 : 이 부분을 나중에 수정 처리.... // if(pMap->m_pMap[x1][z1].m_sEvent == 0) return FALSE; if (nRX > pMap->GetXRegionMax() || nRY > pMap->GetZRegionMax() || nRX < 0 || nRY < 0) { TRACE("#### SetUid Fail : [nid=%d, sid=%d], nRX=%d, nRZ=%d #####\n", m_sNid + NPC_BAND, m_sSid, nRX, nRY); @@ -93,14 +93,14 @@ inline BOOL CNpc::SetUid(float x, float z, int id) { m_iRegion_Z = nRY; //TRACE("++ Npc-SetUid RegionAdd : [nid=%d, name=%s], x=%.2f, z=%.2f, nRX=%d, nRZ=%d \n", m_sNid+NPC_BAND, m_strName,x,z, nRX, nRY); - // ο region npc̵ - npc ߰.. + // 새로운 region으로 npc이동 - npc의 정보 추가.. CNpc * pNpc = m_pMain->m_arNpc.GetData(id - NPC_BAND); if (pNpc == NULL) { return FALSE; } pMap->RegionNpcAdd(m_iRegion_X, m_iRegion_Z, id); - // region npc .. + // 기존의 region정보에서 npc의 정보 삭제.. pMap->RegionNpcRemove(nOld_RX, nOld_RZ, id); //TRACE("-- Npc-SetUid RegionRemove : [nid=%d, name=%s], nRX=%d, nRZ=%d \n", m_sNid+NPC_BAND, m_strName, nOld_RX, nOld_RZ); } @@ -121,10 +121,10 @@ CNpc::CNpc() { m_Delay = 0; m_fDelayTime = TimeGet(); - m_tNpcAttType = ATROCITY_ATTACK_TYPE; // - m_tNpcOldAttType = ATROCITY_ATTACK_TYPE; // - m_tNpcLongType = 0; // Ÿ(1), ٰŸ(0) - m_tNpcGroupType = 0; // ִ³(1), ִ³?(0) + m_tNpcAttType = ATROCITY_ATTACK_TYPE; // 공격 성향 + m_tNpcOldAttType = ATROCITY_ATTACK_TYPE; // 공격 성향 + m_tNpcLongType = 0; // 원거리(1), 근거리(0) + m_tNpcGroupType = 0; // 도움을 주는냐(1), 안주는냐?(0) m_byNpcEndAttType = 1; m_byWhatAttackType = 0; m_byMoveType = 1; @@ -149,7 +149,7 @@ CNpc::CNpc() { m_fHPChangeTime = TimeGet(); m_fFaintingTime = 0.0f; - ::ZeroMemory(m_pMap, sizeof(m_pMap)); // ʱȭѴ. + ::ZeroMemory(m_pMap, sizeof(m_pMap)); // 일차원 맵으로 초기화한다. m_iRegion_X = 0; m_iRegion_Z = 0; @@ -177,10 +177,10 @@ CNpc::~CNpc() { } /////////////////////////////////////////////////////////////////////// -// ã ͸ . +// 길찾기 데이터를 지운다. // void CNpc::ClearPathFindData() { - ::ZeroMemory(m_pMap, sizeof(m_pMap)); // + ::ZeroMemory(m_pMap, sizeof(m_pMap)); // 일차원 맵을 위해 m_bPathFlag = FALSE; m_sStepCount = 0; @@ -198,7 +198,7 @@ void CNpc::ClearPathFindData() { } ///////////////////////////////////////////////////////////////////////////// -// Ʈ ʱȭѴ. +// 유저리스트를 초기화한다. // void CNpc::InitUserList() { m_sMaxDamageUserid = -1; @@ -212,7 +212,7 @@ void CNpc::InitUserList() { } ///////////////////////////////////////////////////////////////////////////////////////// -// ݴ(Target) ʱȭ Ѵ. +// 공격대상(Target)을 초기화 한다. // inline void CNpc::InitTarget() { if (m_byAttackPos != 0) { @@ -233,7 +233,7 @@ inline void CNpc::InitTarget() { m_Target.failCount = 0; } -// NPC ⺻ ʱȭ +// NPC 기본정보 초기화 void CNpc::Init() { if (m_ZoneIndex == -1) { m_ZoneIndex = m_pMain->GetZoneIndex(m_sCurZone); @@ -245,10 +245,10 @@ void CNpc::Init() { TRACE("#### Npc-Init ZoneIndex Fail : [name=%s], zoneindex=%d #####\n", m_strName, m_ZoneIndex); return; } - m_pOrgMap = m_pMain->g_arZone[m_ZoneIndex]->m_pMap; // MapInfo + m_pOrgMap = m_pMain->g_arZone[m_ZoneIndex]->m_pMap; // MapInfo 정보 셋팅 } -// NPC ⺻ġ ʱȭ(н ̴ NPC ߾ ش.. +// NPC 기본위치 정보 초기화(패스 따라 움직이는 NPC의 진형을 맞추어 준다.. void CNpc::InitPos() { float fDD = 1.5f; if (m_byBattlePos == 0) { @@ -288,16 +288,16 @@ void CNpc::InitMagicValuable() { } } -// NPC º ȭѴ. +// NPC 상태별로 분화한다. void CNpc::NpcLive(CIOCPort * pIOCP) { - // Dungeon Work : ϴ ϰ ó.. - if (m_byRegenType == 2 || (m_byRegenType == 1 && m_byChangeType == 100)) { // ϵ,,, + // Dungeon Work : 변하는 몬스터의 경우 변하게 처리.. + if (m_byRegenType == 2 || (m_byRegenType == 1 && m_byChangeType == 100)) { // 리젠이 되지 못하도록,,, m_NpcState = NPC_LIVE; m_Delay = m_sRegenTime; m_fDelayTime = TimeGet(); return; } - if (m_byChangeType == 1) { // ٲپ ش.. + if (m_byChangeType == 1) { // 몬스터의 정보를 바꾸어 준다.. m_byChangeType = 2; ChangeMonsterInfomation(1); } @@ -314,7 +314,7 @@ void CNpc::NpcLive(CIOCPort * pIOCP) { } ///////////////////////////////////////////////////////////////////////////// -// NPC ϴ . +// NPC가 공격하는 경우. // void CNpc::NpcFighting(CIOCPort * pIOCP) { if (cur_test) { @@ -330,7 +330,7 @@ void CNpc::NpcFighting(CIOCPort * pIOCP) { } ///////////////////////////////////////////////////////////////////////////// -// NPC ϴ . +// NPC가 유저를 추적하는 경우. // void CNpc::NpcTracing(CIOCPort * pIOCP) { char pBuf[1024]; @@ -352,7 +352,7 @@ void CNpc::NpcTracing(CIOCPort * pIOCP) { NpcTrace("NpcTracing()"); } - // ʵѴ. + // 고정 경비병은 추적이 되지 않도록한다. if (m_tNpcType == NPC_DOOR || m_tNpcType == NPC_ARTIFACT || m_tNpcType == NPC_PHOENIX_GATE || m_tNpcType == NPC_GATE_LEVER || m_tNpcType == NPC_DOMESTIC_ANIMAL || m_tNpcType == NPC_SPECIAL_GATE || m_tNpcType == NPC_DESTORY_ARTIFACT) { @@ -363,22 +363,22 @@ void CNpc::NpcTracing(CIOCPort * pIOCP) { return; } - /* ۾Ұ -  ϵ üũϴ ƾ + /* 작업할것 + 던젼 몬스터의 경우 일정영역을 벗어나지 못하도록 체크하는 루틴 */ int nFlag = IsCloseTarget(m_byAttackRange, 1); - if (nFlag == 1) // ϸŭ Ÿΰ? + if (nFlag == 1) // 근접전을 벌일만큼 가까운 거리인가? { - //TRACE("Npc-NpcTracing : trace->attack ٲ : nid=(%d, %s), x=%.2f, z=%.2f\n", m_sNid+NPC_BAND, m_strName, m_fCurX, m_fCurZ); - NpcMoveEnd(pIOCP); // ̵ .. + //TRACE("Npc-NpcTracing : trace->attack으로 바뀜 : nid=(%d, %s), x=%.2f, z=%.2f\n", m_sNid+NPC_BAND, m_strName, m_fCurX, m_fCurZ); + NpcMoveEnd(pIOCP); // 이동 끝.. m_NpcState = NPC_FIGHTING; m_Delay = 0; m_fDelayTime = TimeGet(); return; - } else if (nFlag == -1) // Ÿ ... + } else if (nFlag == -1) // 타겟이 없어짐... { InitTarget(); - NpcMoveEnd(pIOCP); // ̵ .. + NpcMoveEnd(pIOCP); // 이동 끝.. m_NpcState = NPC_STANDING; m_Delay = m_sStandTime; m_fDelayTime = TimeGet(); @@ -386,7 +386,7 @@ void CNpc::NpcTracing(CIOCPort * pIOCP) { } //else if(nFlag == 2 && m_tNpcType == NPC_BOSS_MONSTER) { else if (nFlag == 2 && m_tNpcLongType == 2) { - NpcMoveEnd(pIOCP); // ̵ .. + NpcMoveEnd(pIOCP); // 이동 끝.. m_NpcState = NPC_FIGHTING; m_Delay = 0; m_fDelayTime = TimeGet(); @@ -401,9 +401,9 @@ void CNpc::NpcTracing(CIOCPort * pIOCP) { if (m_byResetFlag == 1) { if (ResetPath() == FALSE) // && !m_tNpcTraceType) { - TRACE("##### NpcTracing Fail : нε , NPC_STANDING ######\n"); + TRACE("##### NpcTracing Fail : 패스파인드 실패 , NPC_STANDING으로 ######\n"); InitTarget(); - NpcMoveEnd(pIOCP); // ̵ .. + NpcMoveEnd(pIOCP); // 이동 끝.. m_NpcState = NPC_STANDING; m_Delay = m_sStandTime; m_fDelayTime = TimeGet(); @@ -413,27 +413,27 @@ void CNpc::NpcTracing(CIOCPort * pIOCP) { if (m_bPathFlag == FALSE) { // TRACE("StepMove : x=%.2f, z=%.2f\n", m_fCurX, m_fCurZ); - if (StepMove(1, pIOCP) == FALSE) // ĭ (ȴµ, ޸ 2ĭ) + if (StepMove(1, pIOCP) == FALSE) // 한칸 움직임(걷는동작, 달릴때는 2칸) { m_NpcState = NPC_STANDING; m_Delay = m_sStandTime; m_fDelayTime = TimeGet(); - TRACE("### NpcTracing Fail : StepMove , %s, %d ### \n", m_strName, m_sNid + NPC_BAND); + TRACE("### NpcTracing Fail : StepMove 실패, %s, %d ### \n", m_strName, m_sNid + NPC_BAND); return; } } else if (m_bPathFlag == TRUE) { // TRACE("StepNoPathMove : x=%.2f, z=%.2f\n", m_fCurX, m_fCurZ); - if (StepNoPathMove(1) == FALSE) // ĭ (ȴµ, ޸ 2ĭ) + if (StepNoPathMove(1) == FALSE) // 한칸 움직임(걷는동작, 달릴때는 2칸) { m_NpcState = NPC_STANDING; m_Delay = m_sStandTime; m_fDelayTime = TimeGet(); - TRACE("### NpcTracing Fail : StepNoPathMove , %s, %d ### \n", m_strName, m_sNid + NPC_BAND); + TRACE("### NpcTracing Fail : StepNoPathMove 실패, %s, %d ### \n", m_strName, m_sNid + NPC_BAND); return; } } - if (IsMovingEnd()) // ̵ + if (IsMovingEnd()) // 이동이 끝났으면 { ::ZeroMemory(pBuf, 1024); index = 0; @@ -445,7 +445,7 @@ void CNpc::NpcTracing(CIOCPort * pIOCP) { Setfloat(pBuf, m_fCurY, index); Setfloat(pBuf, 0, index); //TRACE("Npc TRACE end --> nid = %d, cur=[x=%.2f, y=%.2f, metor=%d], prev=[x=%.2f, z=%.2f], frame=%d, speed = %d \n", m_sNid, m_fCurX, m_fCurZ, 0, m_fPrevX, m_fPrevZ, m_sStepCount, 0); - SendAll(pIOCP, pBuf, index); // thread send + SendAll(pIOCP, pBuf, index); // thread 에서 send } else { SetByte(pBuf, MOVE_RESULT, index); SetByte(pBuf, SUCCESS, index); @@ -457,7 +457,7 @@ void CNpc::NpcTracing(CIOCPort * pIOCP) { Setfloat(pBuf, fMoveSpeed, index); //Setfloat(pBuf, m_fSecForRealMoveMetor, index); //TRACE("Npc Tracing --> nid = %d, cur=[x=%.2f, z=%.2f], prev=[x=%.2f, z=%.2f, metor = %.2f], frame=%d, speed = %d \n", m_sNid, m_fCurX, m_fCurZ, m_fPrevX, m_fPrevZ, m_fSecForRealMoveMetor, m_sStepCount, m_sSpeed); - SendAll(pIOCP, pBuf, index); // thread send + SendAll(pIOCP, pBuf, index); // thread 에서 send } if (nFlag == 2 && m_tNpcLongType == 0 && m_tNpcType != NPC_HEALER) { @@ -466,7 +466,7 @@ void CNpc::NpcTracing(CIOCPort * pIOCP) { //TRACE("--> Npc-NpcTracing : TracingAttack : nid=(%d, %s), x=%.2f, z=%.2f\n", m_sNid+NPC_BAND, m_strName, m_fCurX, m_fCurZ); if (nRet == 0) { InitTarget(); - NpcMoveEnd(pIOCP); // ̵ .. + NpcMoveEnd(pIOCP); // 이동 끝.. m_NpcState = NPC_STANDING; m_Delay = m_sStandTime; m_fDelayTime = TimeGet(); @@ -484,23 +484,23 @@ void CNpc::NpcAttacking(CIOCPort * pIOCP) { } if (m_iHP <= 0) { - Dead(pIOCP); // ٷ ͸ δ.. (ġ ) + Dead(pIOCP); // 바로 몬스터를 죽인다.. (경험치 배분 안함) return; } // TRACE("Npc Attack - [nid=%d, sid=%d]\n", m_sNid, m_sSid); int ret = IsCloseTarget(m_byAttackRange); - if (ret == 1) { // ִ¸ŭ Ÿΰ? + if (ret == 1) { // 공격할 수 있는만큼 가까운 거리인가? m_NpcState = NPC_FIGHTING; m_Delay = 0; m_fDelayTime = TimeGet(); return; } - //if(m_tNpcType == NPCTYPE_DOOR || m_tNpcType == NPCTYPE_ARTIFACT || m_tNpcType == NPCTYPE_PHOENIX_GATE || m_tNpcType == NPCTYPE_GATE_LEVER) return; // NPC ó ϰ + //if(m_tNpcType == NPCTYPE_DOOR || m_tNpcType == NPCTYPE_ARTIFACT || m_tNpcType == NPCTYPE_PHOENIX_GATE || m_tNpcType == NPCTYPE_GATE_LEVER) return; // 성문 NPC는 공격처리 안하게 - // ۾ : κп.. 񺴵 ϰ... + // 작업 : 이 부분에서.. 경비병도 공격이 가능하게... if (m_tNpcType == NPC_DOOR || m_tNpcType == NPC_ARTIFACT || m_tNpcType == NPC_PHOENIX_GATE || m_tNpcType == NPC_GATE_LEVER || m_tNpcType == NPC_DOMESTIC_ANIMAL || m_tNpcType == NPC_SPECIAL_GATE || m_tNpcType == NPC_DESTORY_ARTIFACT) { @@ -511,7 +511,7 @@ void CNpc::NpcAttacking(CIOCPort * pIOCP) { } int nValue = GetTargetPath(); - if (nValue == -1) { // Ÿ ų,, ־... + if (nValue == -1) { // 타겟이 없어지거나,, 멀어졌음으로... if (RandomMove() == FALSE) { InitTarget(); m_NpcState = NPC_STANDING; @@ -526,8 +526,8 @@ void CNpc::NpcAttacking(CIOCPort * pIOCP) { m_fDelayTime = TimeGet(); return; } else if (nValue == 0) { - m_fSecForMetor = m_fSpeed_2; // ϶ ٴ ӵ... - IsNoPathFind(m_fSecForMetor); // Ÿ ٷ .. + m_fSecForMetor = m_fSpeed_2; // 공격일때는 뛰는 속도로... + IsNoPathFind(m_fSecForMetor); // 타겟 방향으로 바로 간다.. } m_NpcState = NPC_TRACING; @@ -536,7 +536,7 @@ void CNpc::NpcAttacking(CIOCPort * pIOCP) { } ///////////////////////////////////////////////////////////////////////////// -// NPC ̵ϴ . +// NPC가 이동하는 경우. // void CNpc::NpcMoving(CIOCPort * pIOCP) { if (cur_test) { @@ -562,17 +562,17 @@ void CNpc::NpcMoving(CIOCPort * pIOCP) { } } - if (FindEnemy() == TRUE) { // ã´. + if (FindEnemy() == TRUE) { // 적을 찾는다. /* if(m_tNpcType == NPCTYPE_GUARD) { - NpcMoveEnd(pIOCP); // ̵ .. + NpcMoveEnd(pIOCP); // 이동 끝.. m_NpcState = NPC_FIGHTING; m_Delay = 0; m_fDelayTime = TimeGet(); } else */ { - NpcMoveEnd(pIOCP); // ̵ .. + NpcMoveEnd(pIOCP); // 이동 끝.. m_NpcState = NPC_ATTACKING; m_Delay = m_sSpeed; m_fDelayTime = TimeGet(); @@ -580,7 +580,7 @@ void CNpc::NpcMoving(CIOCPort * pIOCP) { return; } - if (IsMovingEnd()) { // ̵ + if (IsMovingEnd()) { // 이동이 끝났으면 m_fCurX = m_fPrevX; m_fCurZ = m_fPrevZ; if (m_fCurX < 0 || m_fCurZ < 0) { @@ -589,7 +589,7 @@ void CNpc::NpcMoving(CIOCPort * pIOCP) { int rx = m_fCurX / VIEW_DIST; int rz = m_fCurZ / VIEW_DIST; - //TRACE("** NpcMoving --> IsMovingEnd() ̵ ,, rx=%d, rz=%d, stand\n", rx, rz); + //TRACE("** NpcMoving --> IsMovingEnd() 이동이 끝남,, rx=%d, rz=%d, stand로\n", rx, rz); m_NpcState = NPC_STANDING; m_Delay = m_sStandTime; m_fDelayTime = TimeGet(); @@ -603,14 +603,14 @@ void CNpc::NpcMoving(CIOCPort * pIOCP) { } if (m_bPathFlag == FALSE) { - if (StepMove(1, pIOCP) == FALSE) { // ĭ (ȴµ, ޸ 2ĭ) + if (StepMove(1, pIOCP) == FALSE) { // 한칸 움직임(걷는동작, 달릴때는 2칸) m_NpcState = NPC_STANDING; m_Delay = m_sStandTime; m_fDelayTime = TimeGet(); return; } } else if (m_bPathFlag == TRUE) { - if (StepNoPathMove(1) == FALSE) { // ĭ (ȴµ, ޸ 2ĭ) + if (StepNoPathMove(1) == FALSE) { // 한칸 움직임(걷는동작, 달릴때는 2칸) m_NpcState = NPC_STANDING; m_Delay = m_sStandTime; m_fDelayTime = TimeGet(); @@ -618,7 +618,7 @@ void CNpc::NpcMoving(CIOCPort * pIOCP) { } } - if (IsMovingEnd()) { // ̵ + if (IsMovingEnd()) { // 이동이 끝났으면 ::ZeroMemory(pBuf, 1024); index = 0; SetByte(pBuf, MOVE_RESULT, index); @@ -629,7 +629,7 @@ void CNpc::NpcMoving(CIOCPort * pIOCP) { Setfloat(pBuf, m_fPrevY, index); Setfloat(pBuf, 0, index); //TRACE("Npc Move end --> nid = %d, cur=[x=%.2f, y=%.2f, metor=%d], prev=[x=%.2f, z=%.2f], frame=%d, speed = %d \n", m_sNid+NPC_BAND, m_fCurX, m_fCurZ, 0, m_fPrevX, m_fPrevZ, m_sStepCount, 0); - SendAll(pIOCP, pBuf, index); // thread send + SendAll(pIOCP, pBuf, index); // thread 에서 send } else { SetByte(pBuf, MOVE_RESULT, index); SetByte(pBuf, SUCCESS, index); @@ -641,7 +641,7 @@ void CNpc::NpcMoving(CIOCPort * pIOCP) { Setfloat(pBuf, fMoveSpeed, index); //Setfloat(pBuf, m_fSecForRealMoveMetor, index); //TRACE("Npc Move --> nid = %d, cur=[x=%.2f, z=%.2f], prev=[x=%.2f, z=%.2f, metor = %.2f], frame=%d, speed = %d \n", m_sNid+NPC_BAND, m_fCurX, m_fCurZ, m_fPrevX, m_fPrevZ, m_fSecForRealMoveMetor, m_sStepCount, m_sSpeed); - SendAll(pIOCP, pBuf, index); // thread send + SendAll(pIOCP, pBuf, index); // thread 에서 send } m_Delay = m_sSpeed; @@ -649,7 +649,7 @@ void CNpc::NpcMoving(CIOCPort * pIOCP) { } ///////////////////////////////////////////////////////////////////////////// -// NPC ִ°. +// NPC가 서있는경우. // void CNpc::NpcStanding() { if (cur_test) { @@ -659,7 +659,7 @@ void CNpc::NpcStanding() { char send_buff[128]; int send_index = 0; - /* if(m_pMain->m_byNight == 2) { // ̸ + /* if(m_pMain->m_byNight == 2) { // 밤이면 m_NpcState = NPC_SLEEPING; m_Delay = 0; m_fDelayTime = TimeGet(); @@ -675,25 +675,25 @@ void CNpc::NpcStanding() { /* BOOL bCheckRange = FALSE; bCheckRange = IsInRange( (int)m_fCurX, (int)m_fCurZ); - if( bCheckRange ) { // Ȱȿ ִٸ + if( bCheckRange ) { // 활동영역안에 있다면 if( m_tNpcAttType != m_tNpcOldAttType ) { - m_tNpcAttType = ATROCITY_ATTACK_TYPE; // ݼ - //TRACE("ݼ \n"); + m_tNpcAttType = ATROCITY_ATTACK_TYPE; // 공격성향으로 + //TRACE("공격성향이 선공으로 변함\n"); } } else { if( m_tNpcAttType == ATROCITY_ATTACK_TYPE ) { m_tNpcAttType = TENDER_ATTACK_TYPE; - //TRACE("ݼ İ \n"); + //TRACE("공격성향이 후공으로 변함\n"); } } */ // dungeon work - // Ǵ + // 던젼 존인지를 먼저 판단 CRoomEvent * pRoom = NULL; pRoom = pMap->m_arRoomEventArray.GetData(m_byDungeonFamily); if (pRoom) { - if (pRoom->m_byStatus == 1) { // ° ʾҴٸ,, ʹ standing + if (pRoom->m_byStatus == 1) { // 방의 상태가 실행되지 않았다면,, 몬스터는 standing m_NpcState = NPC_STANDING; m_Delay = m_sStandTime; m_fDelayTime = TimeGet(); @@ -714,9 +714,9 @@ void CNpc::NpcStanding() { m_fDelayTime = TimeGet(); if (m_tNpcType == NPC_SPECIAL_GATE && m_pMain->m_byBattleEvent == BATTLEZONE_OPEN) { - // ڵ (2 ֱ-standing time ̿) + // 문이 자동으로 열리고 닫히도록(2분을 주기로-standing time을 이용) m_byGateOpen = !m_byGateOpen; // - // client gameserver + // client와 gameserver에 정보전송 memset(send_buff, NULL, 128); send_index = 0; SetByte(send_buff, AG_NPC_GATE_OPEN, send_index); @@ -727,11 +727,11 @@ void CNpc::NpcStanding() { } ///////////////////////////////////////////////////////////////////////////// -// Ÿٰ Ÿ Ÿ Ѵ.() +// 타겟과의 거리를 사정거리 범위로 유지한다.(셀단위) // void CNpc::NpcBack(CIOCPort * pIOCP) { if (m_Target.id >= 0 && m_Target.id < NPC_BAND) { - if (m_pMain->GetUserPtr((m_Target.id - USER_BAND)) == NULL) { // Target User ϴ ˻ + if (m_pMain->GetUserPtr((m_Target.id - USER_BAND)) == NULL) { // Target User 가 존재하는지 검사 m_NpcState = NPC_STANDING; m_Delay = m_sSpeed; //STEP_DELAY; m_fDelayTime = TimeGet(); @@ -765,7 +765,7 @@ void CNpc::NpcBack(CIOCPort * pIOCP) { } } - if (IsMovingEnd()) { // ̵ + if (IsMovingEnd()) { // 이동이 끝났으면 m_fCurX = m_fPrevX; m_fCurZ = m_fPrevZ; if (m_fCurX < 0 || m_fCurZ < 0) { @@ -782,12 +782,12 @@ void CNpc::NpcBack(CIOCPort * pIOCP) { Setfloat(pBuf, m_fCurY, index); Setfloat(pBuf, 0, index); // TRACE("NpcBack end --> nid = %d, cur=[x=%.2f, y=%.2f, metor=%d], prev=[x=%.2f, z=%.2f], frame=%d, speed = %d \n", m_sNid, m_fCurX, m_fCurZ, 0, m_fPrevX, m_fPrevZ, m_sStepCount, 0); - SendAll(pIOCP, pBuf, index); // thread send + SendAll(pIOCP, pBuf, index); // thread 에서 send - // TRACE("** NpcBack ̵ ,, stand\n"); + // TRACE("** NpcBack 이동이 끝남,, stand로\n"); m_NpcState = NPC_STANDING; - // ۿ ִ ð ª... + //영역 밖에 있으면 서있는 시간을 짧게... m_Delay = m_sStandTime; m_fDelayTime = TimeGet(); @@ -828,18 +828,18 @@ void CNpc::NpcBack(CIOCPort * pIOCP) { //Setfloat(pBuf, m_fSecForRealMoveMetor, index); // TRACE("NpcBack --> nid = %d, cur=[x=%.2f, z=%.2f], prev=[x=%.2f, z=%.2f, metor = %.2f], frame=%d, speed = %d \n", m_sNid, m_fCurX, m_fCurZ, m_fPrevX, m_fPrevZ, m_fSecForRealMoveMetor, m_sStepCount, m_sSpeed); - SendAll(pIOCP, pBuf, index); // thread send + SendAll(pIOCP, pBuf, index); // thread 에서 send m_Delay = m_sSpeed; //STEP_DELAY; */ m_fDelayTime = TimeGet(); } /////////////////////////////////////////////////////////////////////// -// NPC ó ų ׾ٰ Ƴ ó +// NPC 가 처음 생기거나 죽었다가 살아날 때의 처리 // BOOL CNpc::SetLive(CIOCPort * pIOCP) { //TRACE("**** Npc SetLive ***********\n"); - // NPC HP, PP ʱȭ ----------------------// + // NPC의 HP, PP 초기화 ----------------------// int i = 0, j = 0; m_iHP = m_iMaxHP; m_sMP = m_sMaxMP; @@ -861,12 +861,12 @@ BOOL CNpc::SetLive(CIOCPort * pIOCP) { InitTarget(); ClearPathFindData(); - InitUserList(); // Ÿ Ʈ ʱȭ. + InitUserList(); // 타겟을위한 리스트를 초기화. //InitPos(); CNpc * pNpc = NULL; - /* Event Monster ٽ Ƴ 쿡 Event Monster δ ̺Ʈ 忡 ͸ NULL */ + /* Event Monster가 다시 살아날 경우에는 Event Monster를 죽인다 이벤트 스레드에서도 포인터를 NULL */ if (m_lEventNpc == 1 && !m_bFirstLive) { for (int i = 0; i < NPC_NUM; i++) { pNpc = m_pMain->m_arEventNpcThread[0]->m_ThreadInfo.pNpc[i]; @@ -875,7 +875,7 @@ BOOL CNpc::SetLive(CIOCPort * pIOCP) { m_pMain->m_arEventNpcThread[0]->m_ThreadInfo.m_byNpcUsed[i] = 0; m_lEventNpc = 0; m_pMain->m_arEventNpcThread[0]->m_ThreadInfo.pNpc[i] = NULL; - TRACE("ȯ ȯ ,, thread index=%d, nid=%d\n", i, m_sNid + NPC_BAND); + TRACE("소환 몬스터 포인터 반환 ,, thread index=%d, nid=%d\n", i, m_sNid + NPC_BAND); return TRUE; } } @@ -883,7 +883,7 @@ BOOL CNpc::SetLive(CIOCPort * pIOCP) { return TRUE; } - // NPC ʱġ ------------------------// + // NPC 초기위치 결정 ------------------------// if (m_ZoneIndex < 0 || m_ZoneIndex > m_pMain->g_arZone.size()) { TRACE("#### Npc-SetLive ZoneIndex Fail : [nid=%d,sid=%d,name=%s], th_num=%d, zoneindex=%d #####\n", m_sNid + NPC_BAND, m_sSid, m_strName, m_sThreadNumber, m_ZoneIndex); @@ -894,7 +894,7 @@ BOOL CNpc::SetLive(CIOCPort * pIOCP) { return FALSE; } - if (m_bFirstLive) { // NPC ó Ƴ + if (m_bFirstLive) { // NPC 가 처음 살아나는 경우 m_nInitX = m_fPrevX = m_fCurX; m_nInitY = m_fPrevY = m_fCurY; m_nInitZ = m_fPrevZ = m_fCurZ; @@ -963,7 +963,7 @@ BOOL CNpc::SetLive(CIOCPort * pIOCP) { m_nInitX = m_fPrevX = m_fCurX; m_nInitY = m_fPrevY = m_fCurY; m_nInitZ = m_fPrevZ = m_fCurZ; - TRACE("### fail : sid = %d, nid = %d, zone=%d, loop = %d ڸ ̻... ... x = %d, y " + TRACE("### fail : sid = %d, nid = %d, zone=%d, loop = %d 나 설자리가 이상해... 고쳐줘... x = %d, y " "= %d\n", m_sSid, m_sNid + NPC_BAND, m_sCurZone, i, nX, nZ); return FALSE; @@ -984,35 +984,35 @@ BOOL CNpc::SetLive(CIOCPort * pIOCP) { //SetUid(m_fCurX, m_fCurZ, m_sNid + NPC_BAND); - // ̻ ʱȭ + // 상태이상 정보 초기화 m_fHPChangeTime = TimeGet(); m_fFaintingTime = 0.0f; InitMagicValuable(); - if (m_bFirstLive) { // NPC ó Ƴ + if (m_bFirstLive) { // NPC 가 처음 살아나는 경우 NpcTypeParser(); m_bFirstLive = FALSE; InterlockedIncrement(&m_pMain->m_CurrentNPC); //TRACE("Npc - SerLive : cur = %d\n", m_pMain->m_CurrentNPC); - if (m_pMain->m_TotalNPC == m_pMain->m_CurrentNPC) // ʱȭ ٸ + if (m_pMain->m_TotalNPC == m_pMain->m_CurrentNPC) // 몬스터 총 수와 초기화한 몬스터의 수가 같다면 { CString logstr; logstr.Format("Monster All Init Success - %d", m_pMain->m_CurrentNPC); m_pMain->m_StatusList.AddString(logstr); TRACE("Npc - SerLive : GameServerAcceptThread, cur = %d\n", m_pMain->m_CurrentNPC); - m_pMain->GameServerAcceptThread(); // Ӽ Accept + m_pMain->GameServerAcceptThread(); // 게임서버 Accept } //TRACE("Npc - SerLive : CurrentNpc = %d\n", m_pMain->m_CurrentNPC); } - // NPC ʱ ִ ,, + // NPC의 초기 보고 있는 방향,, int degree = 0; degree = myrand(0, 360); m_fDir = D3DXToRadian(degree); - // ؾ : Npc ʱ ,, ϱ.. - if (m_byMoveType == 3 && m_sMaxPathCount == 2) // Npc ʱ ߿ν.. + // 해야 할 일 : Npc의 초기 방향,, 결정하기.. + if (m_byMoveType == 3 && m_sMaxPathCount == 2) // Npc인 경우 초기 방향이 중요함으로써.. { __Vector3 vS, vE, vDir; vS.Set((float)m_PathList.pPattenPos[0].x, 0, (float)m_PathList.pPattenPos[0].z); @@ -1022,13 +1022,13 @@ BOOL CNpc::SetLive(CIOCPort * pIOCP) { Yaw2D(vDir.x, vDir.z, m_fDir); } - if (m_bySpecialType == 5 && m_byChangeType == 0) { // ó ׾ִٰ Ƴ + if (m_bySpecialType == 5 && m_byChangeType == 0) { // 처음에 죽어있다가 살아나는 몬스터 return FALSE; - } else if (m_bySpecialType == 5 && m_byChangeType == 3) { // ,,, - //else if( m_byChangeType == 3) { // ,,, + } else if (m_bySpecialType == 5 && m_byChangeType == 3) { // 몬스터의 출현,,, + //else if( m_byChangeType == 3) { // 몬스터의 출현,,, char notify[50]; memset(notify, 0x00, 50); - //wsprintf( notify, "** ˸ : %s Ͱ Ͽϴ **", m_strName); + //wsprintf( notify, "** 알림 : %s 몬스터가 출현하였습니다 **", m_strName); //m_pMain->SendSystemMsg( notify, m_sCurZone, PUBLIC_CHAT, SEND_ALL); } @@ -1039,23 +1039,23 @@ BOOL CNpc::SetLive(CIOCPort * pIOCP) { m_sNid + NPC_BAND, m_sSid, m_sThreadNumber, m_strName, m_fCurX, m_fCurZ, m_byGateOpen, m_byDeadType, t.GetHour(), t.GetMinute(), t.GetSecond()); - // NPC ... - // NPC ... + // 유저에게 NPC 정보전송... + // 유저에게 NPC 정보전송... int modify_index = 0; char modify_send[2048]; ::ZeroMemory(modify_send, sizeof(modify_send)); FillNpcInfo(modify_send, modify_index, INFO_MODIFY); - SendAll(pIOCP, modify_send, modify_index); // thread send + SendAll(pIOCP, modify_send, modify_index); // thread 에서 send return TRUE; } //////////////////////////////////////////////////////////////////////////////// -// ֺ ų ã⸦ δ. +// 주변에 적이 없거나 수동몹의 경우 임의의 점으로 길찾기를 한 후 움직인다. // BOOL CNpc::RandomMove() { - // ̵϶ ȴ ӵ ߾ش... + // 보통이동일때는 걷는 속도로 맞추어준다... m_fSecForMetor = m_fSpeed_1; if (m_bySearchRange == 0) { @@ -1063,11 +1063,11 @@ BOOL CNpc::RandomMove() { } if (m_byMoveType == 0) { - return FALSE; // ڸ,, ִ npc + return FALSE; // 제자리에서,, 서있는 npc } - /* ̰ ˻ؼ npc ðŸ ϳ ٸ standing·... - ִٸ ̳,, 带 ൿϰ ó... */ + /* 이곳에서 영역 검사해서 npc의 가시거리에 유저가 하나도 없다면 standing상태로... + 있다면 패턴이나,, 노드를 따라서 행동하게 처리... */ if (!GetUserInView()) { return FALSE; } @@ -1088,13 +1088,13 @@ BOOL CNpc::RandomMove() { int random_x = 0, random_z = 0; BOOL bPeedBack = FALSE; - if (m_byMoveType == 1) { // ϰ ݾ ̴ NPC + if (m_byMoveType == 1) { // 랜덤하게 조금씩 움직이는 NPC bPeedBack = IsInRange((int)m_fCurX, (int)m_fCurZ); if (bPeedBack == FALSE) { - //TRACE("ʱġ ,,, patten=%d \n", m_iPattenFrame); + //TRACE("초기위치를 벗어났군,,, patten=%d \n", m_iPattenFrame); } - if (m_iPattenFrame == 0) { // óġ ư... + if (m_iPattenFrame == 0) { // 처음위치로 돌아가도록... m_pPattenPos.x = (short)m_nInitX; m_pPattenPos.z = (short)m_nInitZ; } @@ -1116,34 +1116,34 @@ BOOL CNpc::RandomMove() { vStart.Set(m_fCurX, m_fCurY, m_fCurZ); vEnd.Set(fDestX, 0, fDestZ); fDis = GetDistance(vStart, vEnd); - if (fDis > 50) { // ʱȿŸ 50m  + if (fDis > 50) { // 초기유효거리 50m를 벗어난 경우 vNewPos = GetVectorPosition(vStart, vEnd, 40); fDestX = vNewPos.x; fDestZ = vNewPos.z; m_iPattenFrame = 2; bPeedBack = TRUE; - //TRACE("&&& RandomMove ʱġ Ż.. %d,%s ==> x=%.2f, z=%.2f,, init_x=%.2f, init_z=%.2f\n", m_sNid+NPC_BAND, m_strName, fDestX, fDestZ, m_nInitX, m_nInitZ); + //TRACE("&&& RandomMove 초기위치 이탈.. %d,%s ==> x=%.2f, z=%.2f,, init_x=%.2f, init_z=%.2f\n", m_sNid+NPC_BAND, m_strName, fDestX, fDestZ, m_nInitX, m_nInitZ); } // TRACE("&&& RandomMove ==> x=%.2f, z=%.2f,, dis=%.2f, patten = %d\n", fDestX, fDestZ, fDis, m_iPattenFrame); - } else if (m_byMoveType == 2) { // PathLine ̴ NPC + } else if (m_byMoveType == 2) { // PathLine을 따라서 움직이는 NPC if (m_sPathCount == m_sMaxPathCount) { m_sPathCount = 0; } - // ġ,, н Ʈ ־ٸ,, m_sPathCount m_sPathCount ġ - // Ǵؼ ġ ã⸦ Ѵ,, + // 나의 위치가,, 패스 리스트에서 멀어졌다면,, 현재의 m_sPathCount나 다음의 m_sPathCount의 위치를 + // 판단해서 가까운 위치로 길찾기를 한다,, if (m_sPathCount != 0 && IsInPathRange() == FALSE) { m_sPathCount--; nPathCount = GetNearPathPoint(); - // ̵ ʹ հŸ npc ̵Ǿ ,, npc ̰, ٽ 츮.. - // npc ʱġ Ű.. Ѵ.. + // 이동할 수 없는 너무 먼거리로 npc가 이동되었을 경우,, npc를 죽이고, 다시 살리던지.. + // npc를 초기위치로 워프 시키든지.. 한다.. if (nPathCount == -1) { - TRACE("##### RandomMove Fail : [nid = %d, sid=%d], path = %d/%d, ̵ ִ Ÿ ʹ " - "־,, #####\n", + TRACE("##### RandomMove Fail : [nid = %d, sid=%d], path = %d/%d, 이동할 수 있는 거리에서 너무 " + "멀어졌당,, 어케해 #####\n", m_sNid + NPC_BAND, m_sSid, m_sPathCount, m_sMaxPathCount); - // 0 ġ 40m ̵ϰ ó.. + // 무조건 0번 위치 방향으로 40m 이동하게 처리하장.. vStart.Set(m_fCurX, m_fCurY, m_fCurZ); fDestX = (float)m_PathList.pPattenPos[0].x + m_fBattlePos_x; fDestZ = (float)m_PathList.pPattenPos[0].z + m_fBattlePos_z; @@ -1152,9 +1152,9 @@ BOOL CNpc::RandomMove() { fDestX = vNewPos.x; fDestZ = vNewPos.z; //m_sPathCount++; - //return FALSE; // standing·.. + //return FALSE; // 지금은 standing상태로.. } else { - //m_byPathCount; ȣ ֱ + //m_byPathCount; 번호를 더해주기 if (nPathCount < 0) { return FALSE; } @@ -1170,27 +1170,27 @@ BOOL CNpc::RandomMove() { fDestZ = (float)m_PathList.pPattenPos[m_sPathCount].z + m_fBattlePos_z; } - //TRACE("RandomMove ̵ : [nid=%d, sid=%d, name=%s], path=%d/%d, nPathCount=%d, curx=%.2f, z=%.2f -> dest_X=%.2f, z=%.2f\n", m_sNid+NPC_BAND, m_sSid, m_strName, m_sPathCount, m_sMaxPathCount, nPathCount, m_fCurX, m_fCurZ, fDestX, fDestZ); + //TRACE("RandomMove 길따라 이동 : [nid=%d, sid=%d, name=%s], path=%d/%d, nPathCount=%d, curx=%.2f, z=%.2f -> dest_X=%.2f, z=%.2f\n", m_sNid+NPC_BAND, m_sSid, m_strName, m_sPathCount, m_sMaxPathCount, nPathCount, m_fCurX, m_fCurZ, fDestX, fDestZ); m_sPathCount++; - } else if (m_byMoveType == 3) { // PathLine ̴ NPC + } else if (m_byMoveType == 3) { // PathLine을 따라서 움직이는 NPC if (m_sPathCount == m_sMaxPathCount) { m_byMoveType = 0; m_sPathCount = 0; return FALSE; } - // ġ,, н Ʈ ־ٸ,, m_sPathCount m_sPathCount ġ - // Ǵؼ ġ ã⸦ Ѵ,, + // 나의 위치가,, 패스 리스트에서 멀어졌다면,, 현재의 m_sPathCount나 다음의 m_sPathCount의 위치를 + // 판단해서 가까운 위치로 길찾기를 한다,, if (m_sPathCount != 0 && IsInPathRange() == FALSE) { m_sPathCount--; nPathCount = GetNearPathPoint(); - // ̵ ʹ հŸ npc ̵Ǿ ,, npc ̰, ٽ 츮.. - // npc ʱġ Ű.. Ѵ.. + // 이동할 수 없는 너무 먼거리로 npc가 이동되었을 경우,, npc를 죽이고, 다시 살리던지.. + // npc를 초기위치로 워프 시키든지.. 한다.. if (nPathCount == -1) { - // 0 ġ 40m ̵ϰ ó.. - TRACE("##### RandomMove Fail : [nid = %d, sid=%d], path = %d/%d, ̵ ִ Ÿ ʹ " - "־,, #####\n", + // 무조건 0번 위치 방향으로 40m 이동하게 처리하장.. + TRACE("##### RandomMove Fail : [nid = %d, sid=%d], path = %d/%d, 이동할 수 있는 거리에서 너무 " + "멀어졌당,, 어케해 #####\n", m_sNid + NPC_BAND, m_sSid, m_sPathCount, m_sMaxPathCount); vStart.Set(m_fCurX, m_fCurY, m_fCurZ); fDestX = (float)m_PathList.pPattenPos[0].x + m_fBattlePos_x; @@ -1199,7 +1199,7 @@ BOOL CNpc::RandomMove() { vNewPos = GetVectorPosition(vStart, vEnd, 40); fDestX = vNewPos.x; fDestZ = vNewPos.z; - //return FALSE; // standing·.. + //return FALSE; // 지금은 standing상태로.. } else { if (nPathCount < 0) { return FALSE; @@ -1238,7 +1238,7 @@ BOOL CNpc::RandomMove() { return FALSE; } - // ۾Ұ :  ϵ üũϴ ƾ + // 작업할것 : 던젼 몬스터의 경우 일정영역을 벗어나지 못하도록 체크하는 루틴 if (m_tNpcType == NPC_DUNGEON_MONSTER) { if (IsInRange((int)fDestX, (int)fDestZ) == FALSE) { return FALSE; @@ -1246,7 +1246,7 @@ BOOL CNpc::RandomMove() { } fDis = GetDistance(vStart, vEnd); - if (fDis > NPC_MAX_MOVE_RANGE) { // 100 ĵ·.. + if (fDis > NPC_MAX_MOVE_RANGE) { // 100미터 보다 넓으면 스탠딩상태로.. if (m_byMoveType == 2 || m_byMoveType == 3) { m_sPathCount--; if (m_sPathCount <= 0) { @@ -1259,7 +1259,7 @@ BOOL CNpc::RandomMove() { return FALSE; } - if (fDis <= m_fSecForMetor) { // ̵Ÿ ȿ ǥ ִٸ ٷ ̵ϰ ó... + if (fDis <= m_fSecForMetor) { // 이동거리 안에 목표점이 있다면 바로 이동하게 처리... ClearPathFindData(); m_fStartPoint_X = m_fCurX; m_fStartPoint_Y = m_fCurZ; @@ -1273,7 +1273,7 @@ BOOL CNpc::RandomMove() { return TRUE; } - float fTempRange = (float)fDis + 2; // Ͻ Ѵ. + float fTempRange = (float)fDis + 2; // 일시적으로 보정한다. int min_x = (int)(m_fCurX - fTempRange) / TILE_SIZE; if (min_x < 0) { min_x = 0; @@ -1311,7 +1311,7 @@ BOOL CNpc::RandomMove() { m_max_x = max_x; m_max_y = max_z; - // н ͳ NPC нε ʰ ǥ ٷ ̵.. + // 패스를 따라 가는 몬스터나 NPC는 패스파인딩을 하지않고 실좌표로 바로 이동.. if (m_byMoveType == 2 || m_byMoveType == 3 || bPeedBack == TRUE) { IsNoPathFind(m_fSecForMetor); return TRUE; @@ -1325,9 +1325,9 @@ BOOL CNpc::RandomMove() { return FALSE; } -// Target User ݴ ϰ δ. +// Target User와 반대 방향으로 랜덤하게 움직인다. BOOL CNpc::RandomBackMove() { - m_fSecForMetor = m_fSpeed_2; // .. ӵ ٴ ӵ ߾ش.. + m_fSecForMetor = m_fSpeed_2; // 도망갈때도.. 속도를 뛰는 속도로 맞추어준다.. if (m_bySearchRange == 0) { return FALSE; @@ -1342,7 +1342,7 @@ BOOL CNpc::RandomBackMove() { int max_xx = m_pMain->g_arZone[m_ZoneIndex]->m_sizeMap.cx; int max_zz = m_pMain->g_arZone[m_ZoneIndex]->m_sizeMap.cy; int x = 0, y = 0; - float fTempRange = (float)m_bySearchRange * 2; // Ͻ Ѵ. + float fTempRange = (float)m_bySearchRange * 2; // 일시적으로 보정한다. int min_x = (int)(m_fCurX - fTempRange) / TILE_SIZE; if (min_x < 0) { min_x = 0; @@ -1364,7 +1364,7 @@ BOOL CNpc::RandomBackMove() { float fDis = 0.0f; vStart.Set(m_fCurX, m_fCurY, m_fCurZ); - int nID = m_Target.id; // Target Ѵ. + int nID = m_Target.id; // Target 을 구한다. CUser * pUser = NULL; int iDir = 0; @@ -1372,13 +1372,13 @@ BOOL CNpc::RandomBackMove() { int iRandomX = 0, iRandomZ = 0, iRandomValue = 0; iRandomValue = rand() % 2; - if (nID >= USER_BAND && nID < NPC_BAND) // Target User + if (nID >= USER_BAND && nID < NPC_BAND) // Target 이 User 인 경우 { pUser = m_pMain->GetUserPtr(nID - USER_BAND); if (pUser == NULL) { return FALSE; } - // ,, x + // 도주할 방향을 결정,, 먼저 x축으로 if ((int)pUser->m_curx != (int)m_fCurX) { iRandomX = myrand((int)m_bySearchRange, (int)(m_bySearchRange * 1.5)); iRandomZ = myrand(0, (int)m_bySearchRange); @@ -1388,7 +1388,7 @@ BOOL CNpc::RandomBackMove() { } else { iDir = 2; } - } else // z + } else // z축으로 { iRandomZ = myrand((int)m_bySearchRange, (int)(m_bySearchRange * 1.5)); iRandomX = myrand(0, (int)m_bySearchRange); @@ -1436,13 +1436,13 @@ BOOL CNpc::RandomBackMove() { vEnd.Set(fDestX, 0, fDestZ); fDis = GetDistance(vStart, vEnd); - if (fDis > 20) // 20 ̸̻ 20ͷ ,, + if (fDis > 20) // 20미터 이상이면 20미터로 맞춘다,, { vEnd22 = GetVectorPosition(vStart, vEnd, 20); fDestX = vEnd22.x; fDestZ = vEnd22.z; } - } else if (nID >= NPC_BAND && m_Target.id < INVALID_BAND) // Target Npc + } else if (nID >= NPC_BAND && m_Target.id < INVALID_BAND) // Target 이 Npc 인 경우 { } @@ -1478,7 +1478,7 @@ BOOL CNpc::IsInPathRange() { if (m_sNid == test_id) { int x = 0; } - float fPathRange = 40.0f; // н + float fPathRange = 40.0f; // 오차 패스 범위 __Vector3 vStart, vEnd; float fDistance = 0.0f; vStart.Set(m_fCurX, m_fCurY, m_fCurZ); @@ -1536,10 +1536,10 @@ int CNpc::GetNearPathPoint() { } ///////////////////////////////////////////////////////////////////////////////////// -// NPC ʱ ġ ȿ ִ ˻ +// NPC 가 초기 생성위치 안에 있는지 검사 // BOOL CNpc::IsInRange(int nX, int nZ) { - // NPC ʱ ġ  ǴѴ. + // NPC 가 초기 위치를 벗어났는지 판단한다. BOOL bFlag_1 = FALSE, bFlag_2 = FALSE; if (m_nLimitMinX < m_nLimitMaxX) { if (COMPARE(nX, m_nLimitMinX, m_nLimitMaxX)) { @@ -1569,7 +1569,7 @@ BOOL CNpc::IsInRange(int nX, int nZ) { } ///////////////////////////////////////////////////////////////////////////////////////// -// PathFind Ѵ. +// PathFind 를 수행한다. // int CNpc::PathFind(CPoint start, CPoint end, float fDistance) { ClearPathFindData(); @@ -1578,17 +1578,17 @@ int CNpc::PathFind(CPoint start, CPoint end, float fDistance) { return -1; } - if (start.x == end.x && start.y == end.y) // Ÿ ȿ,, ־ٸ,, + if (start.x == end.x && start.y == end.y) // 같은 타일 안에서,, 조금 움직임이 있었다면,, { m_bPathFlag = TRUE; m_iAniFrameIndex = 1; m_pPoint[0].fXPos = m_fEndPoint_X; m_pPoint[0].fZPos = m_fEndPoint_Y; - TRACE(" ȿ .... x=%.2f, z=%.2f\n", m_pPoint[0].fXPos, m_pPoint[0].fZPos); + TRACE("같은 영역안에서 조금 움직임.... x=%.2f, z=%.2f\n", m_pPoint[0].fXPos, m_pPoint[0].fZPos); return 1; } - // ⿡ нε带 Ұ.. ٷ ǥ Ǵ.. + // 여기에서 패스파인드를 실행할건지.. 바로 목표점으로 갈건인지를 판단.. if (IsPathFindCheck(fDistance) == TRUE) { m_bPathFlag = TRUE; return 1; @@ -1674,7 +1674,7 @@ int CNpc::PathFind(CPoint start, CPoint end, float fDistance) { return 1; } -// NPC ó +// NPC 사망처리 void CNpc::Dead(CIOCPort * pIOCP, int iDeadType) { if (m_ZoneIndex < 0 || m_ZoneIndex > m_pMain->g_arZone.size()) { TRACE("#### Npc-Dead ZoneIndex Fail : [name=%s], zoneindex=%d #####\n", m_strName, m_ZoneIndex); @@ -1691,14 +1691,14 @@ void CNpc::Dead(CIOCPort * pIOCP, int iDeadType) { m_Delay = m_sRegenTime; m_fDelayTime = TimeGet(); m_bFirstLive = FALSE; - m_byDeadType = 100; // ̺Ʈ߿ ״ + m_byDeadType = 100; // 전쟁이벤트중에서 죽는 경우 if (m_iRegion_X > pMap->GetXRegionMax() || m_iRegion_Z > pMap->GetZRegionMax()) { TRACE("#### Npc-Dead() Fail : [nid=%d, sid=%d], nRX=%d, nRZ=%d #####\n", m_sNid + NPC_BAND, m_sSid, m_iRegion_X, m_iRegion_Z); return; } - // map region .. + // map에 region에서 나의 정보 삭제.. //pMap->m_ppRegion[m_iRegion_X][m_iRegion_Z].DeleteNpc(m_sNid); pMap->RegionNpcRemove(m_iRegion_X, m_iRegion_Z, m_sNid + NPC_BAND); @@ -1706,7 +1706,7 @@ void CNpc::Dead(CIOCPort * pIOCP, int iDeadType) { CTime t = CTime::GetCurrentTime(); //TRACE("****** (%s,%d) Dead regentime = %d , m_byDeadType=%d, dungeonfam=%d, time=%d:%d-%d ****************\n", m_strName, m_sNid+NPC_BAND, m_sRegenTime, m_byDeadType, m_byDungeonFamily, t.GetHour(), t.GetMinute(), t.GetSecond()); - if (iDeadType == 1) { // User ƴϱ ... Ŭ̾Ʈ DeadŶ... + if (iDeadType == 1) { // User에 의해 죽은것이 아니기 때문에... 클라이언트에 Dead패킷전송... char buff[256]; int send_index = 0; SetByte(buff, AG_DEAD, send_index); @@ -1714,12 +1714,12 @@ void CNpc::Dead(CIOCPort * pIOCP, int iDeadType) { SendAll(pIOCP, buff, send_index); } - // Dungeon Work : ϴ ϰ ó.. + // Dungeon Work : 변하는 몬스터의 경우 변하게 처리.. if (m_bySpecialType == 1 || m_bySpecialType == 4) { if (m_byChangeType == 0) { m_byChangeType = 1; //ChangeMonsterInfomation( 1 ); - } else if (m_byChangeType == 2) { // ( Ÿ ˻ؾ ) + } else if (m_byChangeType == 2) { // 대장 몬스터의 죽음 (몬스터 타입이 대장몬스터인지도 검사해야 함) if (m_byDungeonFamily < 0 || m_byDungeonFamily >= MAX_DUNGEON_BOSS_MONSTER) { TRACE("#### Npc-Dead() m_byDungeonFamily Fail : [nid=%d, name=%s], m_byDungeonFamily=%d #####\n", m_sNid + NPC_BAND, m_strName, m_byDungeonFamily); @@ -1737,15 +1737,15 @@ void CNpc::Dead(CIOCPort * pIOCP, int iDeadType) { return; } if( pMap->m_arDungeonBossMonster[m_byDungeonFamily] == 0 ) { - m_byRegenType = 2; // ȵǵ.. + m_byRegenType = 2; // 리젠이 안되도록.. } */ - // ȯ ׽Ʈ + // 몬스터 소환 테스트 //if(m_sNid == 0) - // m_pMain->MonsterSummon("Ŭ䵷", m_sCurZone, 2605.0, 1375.0); + // m_pMain->MonsterSummon("클립토돈", m_sCurZone, 2605.0, 1375.0); } -// NPC ֺ ã´. +// NPC 주변의 적을 찾는다. BOOL CNpc::FindEnemy() { if (m_tNpcType == NPC_DOOR || m_tNpcType == NPC_ARTIFACT || m_tNpcType == NPC_PHOENIX_GATE || m_tNpcType == NPC_GATE_LEVER || m_tNpcType == NPC_DOMESTIC_ANIMAL || m_tNpcType == NPC_SPECIAL_GATE || @@ -1761,16 +1761,16 @@ BOOL CNpc::FindEnemy() { /* BOOL bCheckRange = FALSE; if( m_NpcState == NPC_STANDING ) { bCheckRange = IsInRange( (int)m_fCurX, (int)m_fCurZ); - if( bCheckRange ) { // Ȱȿ ִٸ + if( bCheckRange ) { // 활동영역안에 있다면 if( m_tNpcAttType != m_tNpcOldAttType ) { - m_tNpcAttType = ATROCITY_ATTACK_TYPE; // ݼ - //TRACE("ݼ \n"); + m_tNpcAttType = ATROCITY_ATTACK_TYPE; // 공격성향으로 + //TRACE("공격성향이 선공으로 변함\n"); } } else { if( m_tNpcAttType == ATROCITY_ATTACK_TYPE ) { m_tNpcAttType = TENDER_ATTACK_TYPE; - //TRACE("ݼ İ \n"); + //TRACE("공격성향이 후공으로 변함\n"); } } } */ @@ -1801,7 +1801,7 @@ BOOL CNpc::FindEnemy() { int iExpand = FindEnemyRegion(); - // ڽ region ִ UserArray ˻Ͽ,, Ÿ ִ Ǵ.. + // 자신의 region에 있는 UserArray을 먼저 검색하여,, 가까운 거리에 유저가 있는지를 판단.. if (m_iRegion_X > pMap->GetXRegionMax() || m_iRegion_Z > pMap->GetZRegionMax() || m_iRegion_X < 0 || m_iRegion_Z < 0) { // TRACE("#### Npc-FindEnemy() Fail : [nid=%d, sid=%d, name=%s, th_num=%d, cur_x=%.2f, cur_z=%.2f], nRX=%d, nRZ=%d #####\n", m_sNid+NPC_BAND, m_sSid, m_strName, m_sThreadNumber, m_fCurX, m_fCurZ, m_iRegion_X, m_iRegion_Z); @@ -1812,7 +1812,7 @@ BOOL CNpc::FindEnemy() { int x = 0, y = 0; - // ̿ ִ Region ˻ؼ,, ġ User .. ̵.. + // 이웃해 있는 Region을 검색해서,, 몬의 위치와 제일 가까운 User을 향해.. 이동.. for (int l = 0; l < 4; l++) { if (m_iFind_X[l] == 0 && m_iFind_Y[l] == 0) { continue; @@ -1821,7 +1821,7 @@ BOOL CNpc::FindEnemy() { x = m_iRegion_X + (m_iFind_X[l]); y = m_iRegion_Z + (m_iFind_Y[l]); - // ̺κ ,, + // 이부분 수정요망,, if (x < 0 || y < 0 || x > pMap->GetXRegionMax() || y > pMap->GetZRegionMax()) { continue; } @@ -1835,7 +1835,7 @@ BOOL CNpc::FindEnemy() { fCompareDis = 0.0f; - // Ÿ 쿡 Ͱ ƴѰ쿡 ͸ ϵ Ѵ.. + // 타입이 경비병인 경우에는 같은 나라의 몬스터가 아닌경우에는 몬스터를 공격하도록 한다.. if (m_tNpcType == NPC_GUARD || m_tNpcType == NPC_PATROL_GUARD || m_tNpcType == NPC_STORE_GUARD) // || m_tNpcType == NPCTYPE_MONSTER) { @@ -1843,7 +1843,7 @@ BOOL CNpc::FindEnemy() { int x = 0, y = 0; - // ̿ ִ Region ˻ؼ,, ġ User .. ̵.. + // 이웃해 있는 Region을 검색해서,, 몬의 위치와 제일 가까운 User을 향해.. 이동.. for (int l = 0; l < 4; l++) { if (m_iFind_X[l] == 0 && m_iFind_Y[l] == 0) { continue; @@ -1852,7 +1852,7 @@ BOOL CNpc::FindEnemy() { x = m_iRegion_X + (m_iFind_X[l]); y = m_iRegion_Z + (m_iFind_Y[l]); - // ̺κ ,, + // 이부분 수정요망,, if (x < 0 || y < 0 || x > pMap->GetXRegionMax() || y > pMap->GetZRegionMax()) { continue; } @@ -1865,13 +1865,13 @@ BOOL CNpc::FindEnemy() { return TRUE; } - // ƹ Ƿ Ʈ ϴ ʱȭѴ. + // 아무도 없으므로 리스트에 관리하는 유저를 초기화한다. InitUserList(); InitTarget(); return FALSE; } -// Npc ˻Ҷ Region ˻ؾ ϴ Ǵ.. +// Npc가 유저를 검색할때 어느 Region까지 검색해야 하는지를 판단.. int CNpc::FindEnemyRegion() { /* 1 2 3 @@ -1938,7 +1938,7 @@ int CNpc::FindEnemyRegion() { break; } - if (iRetValue <= 0) { // ӽ÷ (),, ϱ Ѱ.. + if (iRetValue <= 0) { // 임시로 보정(문제시),, 하기 위한것.. iRetValue = 0; } @@ -2056,7 +2056,7 @@ float CNpc::FindEnemyExpand(int nRX, int nRZ, float fCompDis, int nType) { int * pIDList = NULL; int iLevelComprison = 0; - if (nType == 1) { // user Ÿ + if (nType == 1) { // user을 타겟으로 잡는 경우 int nUserid = 0, count = 0; CUser * pUser = NULL; @@ -2089,25 +2089,25 @@ float CNpc::FindEnemyExpand(int nRX, int nRZ, float fCompDis, int nType) { } pUser = (CUser *)m_pMain->GetUserPtr(nUserid); if (pUser != NULL && pUser->m_bLive == USER_LIVE) { - // ʵ Ѵ... + // 같은 국가의 유저는 공격을 하지 않도록 한다... if (m_byGroup == pUser->m_bNation) { continue; } if (pUser->m_byIsOP == MANAGER_USER) { - continue; //  + continue; // 운영자 무시 } vUser.Set(pUser->m_curx, pUser->m_cury, pUser->m_curz); fDis = GetDistance(vUser, vNpc); - // ۾ : ⿡ ݰŸ ִ Ǵ + // 작업 : 여기에서 나의 공격거리에 있는 유저인지를 판단 if (fDis <= fSearchRange) { if (fDis >= fComp) { // target_uid = pUser->m_iUserId; fComp = fDis; - //İ... - if (!m_tNpcAttType) { // ã´. + //후공몹... + if (!m_tNpcAttType) { // 날 공격한 놈을 찾는다. if (IsDamagedUserList(pUser) || (m_tNpcGroupType && m_Target.id == target_uid)) { m_Target.id = target_uid; m_Target.failCount = 0; @@ -2115,9 +2115,9 @@ float CNpc::FindEnemyExpand(int nRX, int nRZ, float fCompDis, int nType) { m_Target.y = pUser->m_cury; m_Target.z = pUser->m_curz; } - } else { // ... + } else { // 선공몹... iLevelComprison = pUser->m_sLevel - m_sLevel; - // ۾ : ŸԿ ݼ.. + // 작업할 것 : 타입에 따른 공격성향으로.. //if(iLevelComprison > ATTACK_LIMIT_LEVEL) continue; m_Target.id = target_uid; @@ -2133,7 +2133,7 @@ float CNpc::FindEnemyExpand(int nRX, int nRZ, float fCompDis, int nType) { } } } - } else if (nType == 2) { // ͸ Ÿ + } else if (nType == 2) { // 경비병이 몬스터를 타겟으로 잡는 경우 int nNpcid = 0, count = 0; CNpc * pNpc = NULL; @@ -2173,7 +2173,7 @@ float CNpc::FindEnemyExpand(int nRX, int nRZ, float fCompDis, int nType) { } if (pNpc != NULL && pNpc->m_NpcState != NPC_DEAD && pNpc->m_sNid != m_sNid) { - // ʹ ʵ Ѵ... + // 같은 국가의 몬스터는 공격을 하지 않도록 한다... if (m_byGroup == pNpc->m_byGroup) { continue; } @@ -2181,7 +2181,7 @@ float CNpc::FindEnemyExpand(int nRX, int nRZ, float fCompDis, int nType) { vMon.Set(pNpc->m_fCurX, pNpc->m_fCurY, pNpc->m_fCurZ); fDis = GetDistance(vMon, vNpc); - // ۾ : ⿡ ݰŸ ִ Ǵ + // 작업 : 여기에서 나의 공격거리에 있는 유저인지를 판단 if (fDis <= fSearchRange) { if (fDis >= fComp) { // target_uid = nNpcid; @@ -2208,7 +2208,7 @@ float CNpc::FindEnemyExpand(int nRX, int nRZ, float fCompDis, int nType) { return fComp; } -// region 4ؼ ġ region κп  Ǵ +// region을 4등분해서 몬스터의 현재 위치가 region의 어느 부분에 들어가는지를 판단 int CNpc::GetMyField() { int iRet = 0; int iX = m_iRegion_X * VIEW_DIST; @@ -2229,7 +2229,7 @@ int CNpc::GetMyField() { return iRet; } -// ֺ ִ ˾ƺ +// 주변에 나를 공격한 유저가 있는지 알아본다 BOOL CNpc::IsDamagedUserList(CUser * pUser) { if (pUser == NULL) { return FALSE; @@ -2244,24 +2244,24 @@ BOOL CNpc::IsDamagedUserList(CUser * pUser) { return FALSE; } -// Ÿ ѷ ׿ Ÿ ã´. +// 타겟이 둘러 쌓여 있으면 다음 타겟을 찾는다. int CNpc::IsSurround(CUser * pUser) { if (m_tNpcLongType) { - return 0; //Ÿ + return 0; //원거리는 통과 } if (pUser == NULL) { - return -2; // User Ƿ Ÿ .. + return -2; // User가 없으므로 타겟지정 실패.. } int nDir = pUser->IsSurroundCheck(m_fCurX, 0.0f, m_fCurZ, m_sNid + NPC_BAND); if (nDir != 0) { m_byAttackPos = nDir; return nDir; } - return -1; // Ÿ ѷ ׿ ... + return -1; // 타겟이 둘러 쌓여 있음... } -// x, y ִ ǥ Ǵ +// x, y 가 움직일 수 있는 좌표인지 판단 BOOL CNpc::IsMovable(float x, float z) { if (x < 0 || z < 0) { return FALSE; @@ -2288,7 +2288,7 @@ BOOL CNpc::IsMovable(float x, float z) { return TRUE; } -// Path Find ã ̵ ߴ Ǵ +// Path Find 로 찾은길을 다 이동 했는지 판단 BOOL CNpc::IsMovingEnd() { //if(m_fCurX == m_fEndPoint_X && m_fCurZ == m_fEndPoint_Y) if (m_fPrevX == m_fEndPoint_X && m_fPrevZ == m_fEndPoint_Y) { @@ -2300,7 +2300,7 @@ BOOL CNpc::IsMovingEnd() { return FALSE; } -// Step ŭ Ÿ ̵Ѵ. +// Step 수 만큼 타켓을 향해 이동한다. BOOL CNpc::StepMove(int nStep, CIOCPort * pIOCP) { if (m_NpcState != NPC_MOVING && m_NpcState != NPC_TRACING && m_NpcState != NPC_BACK) { return FALSE; @@ -2324,7 +2324,7 @@ BOOL CNpc::StepMove(int nStep, CIOCPort * pIOCP) { vStart.Set(fOldCurX, 0, fOldCurZ); vEnd.Set(m_pPoint[m_iAniFrameCount].fXPos, 0, m_pPoint[m_iAniFrameCount].fZPos); - // ڵ.. + // 안전 코드.. if (m_pPoint[m_iAniFrameCount].fXPos < 0 || m_pPoint[m_iAniFrameCount].fZPos < 0) { m_fPrevX = m_fEndPoint_X; m_fPrevZ = m_fEndPoint_Y; @@ -2345,7 +2345,7 @@ BOOL CNpc::StepMove(int nStep, CIOCPort * pIOCP) { if (m_iAniFrameCount == m_iAniFrameIndex) { vEnd.Set(m_pPoint[m_iAniFrameCount].fXPos, 0, m_pPoint[m_iAniFrameCount].fZPos); fDis = GetDistance(vStart, vEnd); - // ǥ m_fSecForMetor ~ m_fSecForMetor+1 ̵ ϰ ̵ + // 마지막 좌표는 m_fSecForMetor ~ m_fSecForMetor+1 사이도 가능하게 이동 if (fDis > m_fSecForMetor) { vDis = GetVectorPosition(vStart, vEnd, m_fSecForMetor); m_fPrevX = vDis.x; @@ -2456,16 +2456,16 @@ BOOL CNpc::StepNoPathMove(int nStep) { return TRUE; } -// NPC Target Ÿ Ǵ +// NPC와 Target 과의 거리가 지정 범위보다 작은지 판단 int CNpc::IsCloseTarget(int nRange, int Flag) { __Vector3 vUser, vWillUser, vNpc, vDistance; CUser * pUser = NULL; CNpc * pNpc = NULL; float fDis = 0.0f, fWillDis = 0.0f, fX = 0.0f, fZ = 0.0f; - BOOL bUserType = FALSE; // Ÿ ̸ TRUE + BOOL bUserType = FALSE; // 타겟이 유저이면 TRUE vNpc.Set(m_fCurX, m_fCurY, m_fCurZ); - if (m_Target.id >= USER_BAND && m_Target.id < NPC_BAND) { // Target User + if (m_Target.id >= USER_BAND && m_Target.id < NPC_BAND) { // Target 이 User 인 경우 pUser = m_pMain->GetUserPtr(m_Target.id - USER_BAND); if (pUser == NULL) { InitTarget(); @@ -2480,7 +2480,7 @@ int CNpc::IsCloseTarget(int nRange, int Flag) { fWillDis = vDistance.Magnitude(); fWillDis = fWillDis - m_fBulk; bUserType = TRUE; - } else if (m_Target.id >= NPC_BAND && m_Target.id < INVALID_BAND) // Target mon + } else if (m_Target.id >= NPC_BAND && m_Target.id < INVALID_BAND) // Target 이 mon 인 경우 { pNpc = m_pMain->m_arNpc.GetData(m_Target.id - NPC_BAND); if (pNpc == NULL) { @@ -2499,7 +2499,7 @@ int CNpc::IsCloseTarget(int nRange, int Flag) { fDis = fDis - m_fBulk; - // ۾Ұ :  ϵ üũϴ ƾ + // 작업할것 : 던젼 몬스터의 경우 일정영역을 벗어나지 못하도록 체크하는 루틴 if (m_tNpcType == NPC_DUNGEON_MONSTER) { if (IsInRange((int)vUser.x, (int)vUser.z) == FALSE) { return -1; @@ -2526,30 +2526,30 @@ int CNpc::IsCloseTarget(int nRange, int Flag) { return 0; } - /* Ÿ ǥ ֽ ϰ, ǥ Ѵ,, */ + /* 타겟의 좌표를 최신 것으로 수정하고, 마지막 포인터 좌표를 수정한다,, */ m_fEndPoint_X = m_fCurX; m_fEndPoint_Y = m_fCurZ; m_Target.x = fX; m_Target.z = fZ; - //if( m_tNpcLongType && m_tNpcType != NPC_BOSS_MONSTER) { // Ÿ Ѱ ݰŸ Ǵ.. - if (m_tNpcLongType == 1) { // Ÿ Ѱ ݰŸ Ǵ.. + //if( m_tNpcLongType && m_tNpcType != NPC_BOSS_MONSTER) { // 장거리 공격이 가능한것은 공격거리로 판단.. + if (m_tNpcLongType == 1) { // 장거리 공격이 가능한것은 공격거리로 판단.. if (fDis < LONG_ATTACK_RANGE) { return 1; } else if (fDis > LONG_ATTACK_RANGE && fDis <= nRange) { return 2; } - } else { // ܰŸ() - if (Flag == 1) { // ̵ϸ鼭 Ÿüũ + } else { // 단거리(직접공격) + if (Flag == 1) { // 몬스터의 이동하면서이 거리체크시 if (fDis < (SHORT_ATTACK_RANGE + m_fBulk)) { return 1; } if (fDis > (SHORT_ATTACK_RANGE + m_fBulk) && fDis <= nRange) { - return 2; // ǥ + return 2; // 유저의 현재좌표를 기준으로 } - if (bUserType == TRUE) { // ϶,, Willǥ Ѵ + if (bUserType == TRUE) { // 유저일때만,, Will좌표를 기준으로 한다 if (fWillDis > (SHORT_ATTACK_RANGE + m_fBulk) && fWillDis <= nRange) { - return 2; // Willǥ + return 2; // 유저의 Will돠표를 기준으로 } } } else { @@ -2565,24 +2565,24 @@ int CNpc::IsCloseTarget(int nRange, int Flag) { return 0; } -// Target NPC Path Finding Ѵ. +// Target 과 NPC 간 Path Finding을 수행한다. int CNpc::GetTargetPath(int option) { // sungyong 2002.06.12 int nInitType = m_byInitMoveType; if (m_byInitMoveType >= 100) { nInitType = m_byInitMoveType - 100; } - // ൿ Ÿ + // 행동 타입 수정 if (m_tNpcType != 0) { //if(m_byMoveType != m_byInitMoveType) - // m_byMoveType = m_byInitMoveType; // ڱ ڸ ư ֵ.. + // m_byMoveType = m_byInitMoveType; // 자기 자리로 돌아갈 수 있도록.. if (m_byMoveType != nInitType) { - m_byMoveType = nInitType; // ڱ ڸ ư ֵ.. + m_byMoveType = nInitType; // 자기 자리로 돌아갈 수 있도록.. } } // ~sungyong 2002.06.12 - // ߰Ҷ ٴ ӵ ߾ش... + // 추격할때는 뛰는 속도로 맞추어준다... m_fSecForMetor = m_fSpeed_2; CUser * pUser = NULL; CNpc * pNpc = NULL; @@ -2599,7 +2599,7 @@ int CNpc::GetTargetPath(int option) { float surround_fx[8] = {0.0f, -1.4142f, -2.0f, -1.4167f, 0.0f, 1.4117f, 2.0000f, 1.4167f}; float surround_fz[8] = {2.0f, 1.4142f, 0.0f, -1.4167f, -2.0f, -1.4167f, -0.0035f, 1.4117f}; - if (m_Target.id >= USER_BAND && m_Target.id < NPC_BAND) { // Target User + if (m_Target.id >= USER_BAND && m_Target.id < NPC_BAND) { // Target 이 User 인 경우 pUser = m_pMain->GetUserPtr(m_Target.id - USER_BAND); if (pUser == NULL) { InitTarget(); @@ -2614,23 +2614,23 @@ int CNpc::GetTargetPath(int option) { return -1; } - if (option == 1) { // magic̳ Ȱ ߴٸ... + if (option == 1) { // magic이나 활등으로 공격 당했다면... vNpc.Set(m_fCurX, m_fCurY, m_fCurZ); vUser.Set(pUser->m_curx, pUser->m_cury, pUser->m_curz); fDis = GetDistance(vNpc, vUser); if (fDis >= NPC_MAX_MOVE_RANGE) { - return -1; // ʹ Ÿ ־,, ȵǰ.. + return -1; // 너무 거리가 멀어서,, 추적이 안되게.. } iTempRange = fDis + 10; } else { - iTempRange = (float)m_bySearchRange; // Ͻ Ѵ. + iTempRange = (float)m_bySearchRange; // 일시적으로 보정한다. if (IsDamagedUserList(pUser)) { - iTempRange = (float)m_byTracingRange; // ݹ ¸ ã . + iTempRange = (float)m_byTracingRange; // 공격받은 상태면 찾을 범위 증가. } else { iTempRange += 2; } } - } else if (m_Target.id >= NPC_BAND && m_Target.id < INVALID_BAND) { // Target mon + } else if (m_Target.id >= NPC_BAND && m_Target.id < INVALID_BAND) { // Target 이 mon 인 경우 pNpc = m_pMain->m_arNpc.GetData(m_Target.id - NPC_BAND); if (pNpc == NULL) { InitTarget(); @@ -2641,7 +2641,7 @@ int CNpc::GetTargetPath(int option) { return -1; } - iTempRange = (float)m_byTracingRange; // Ͻ Ѵ. + iTempRange = (float)m_byTracingRange; // 일시적으로 보정한다. } if (m_ZoneIndex < 0 || m_ZoneIndex > m_pMain->g_arZone.size()) { @@ -2673,8 +2673,8 @@ int CNpc::GetTargetPath(int option) { min_z = max_zz - 1; } - if (m_Target.id >= USER_BAND && m_Target.id < NPC_BAND) { // Target User - // ǥ Search Range  ʴ ˻ + if (m_Target.id >= USER_BAND && m_Target.id < NPC_BAND) { // Target 이 User 인 경우 + // 목표점이 Search Range를 벗어나지 않는지 검사 CRect r = CRect(min_x, min_z, max_x + 1, max_z + 1); if (r.PtInRect(CPoint((int)pUser->m_curx / TILE_SIZE, (int)pUser->m_curz / TILE_SIZE)) == FALSE) { TRACE("### Npc-GetTargetPath() User Fail return -1: [nid=%d] t_Name=%s, AttackPos=%d ###\n", @@ -2688,9 +2688,9 @@ int CNpc::GetTargetPath(int option) { vNpc.Set(m_fCurX, m_fCurY, m_fCurZ); vUser.Set(pUser->m_curx, pUser->m_cury, pUser->m_curz); - // ⿡ Ұ Ǵ...() - // κп Npc ˾ƿͼ ϵ Ѵ,, - IsSurround(pUser); //ѷ ׿ Ѵ.(Ÿ, ٰŸ ) + // 여기에서 유저의 어느 방향으로 공격할것인지를 판단...(셋팅) + // 이 부분에서 Npc의 공격점을 알아와서 공격하도록 한다,, + IsSurround(pUser); //둘러 쌓여 있으면 무시한다.(원거리, 근거리 무시) //vEnd22 = CalcAdaptivePosition(vNpc, vUser, 2.0+m_fBulk); @@ -2710,8 +2710,8 @@ int CNpc::GetTargetPath(int option) { m_fEndPoint_X = vEnd22.x; m_fEndPoint_Y = vEnd22.z; } - } else if (m_Target.id >= NPC_BAND && m_Target.id < INVALID_BAND) { // Target mon - // ǥ Search Range  ʴ ˻ + } else if (m_Target.id >= NPC_BAND && m_Target.id < INVALID_BAND) { // Target 이 mon 인 경우 + // 목표점이 Search Range를 벗어나지 않는지 검사 CRect r = CRect(min_x, min_z, max_x + 1, max_z + 1); if (r.PtInRect(CPoint((int)pNpc->m_fCurX / TILE_SIZE, (int)pNpc->m_fCurZ / TILE_SIZE)) == FALSE) { TRACE("### Npc-GetTargetPath() Npc Fail return -1: [nid=%d] t_Name=%s, AttackPos=%d ###\n", @@ -2748,8 +2748,8 @@ int CNpc::GetTargetPath(int option) { return -1; } - if (m_tNpcType != NPC_DUNGEON_MONSTER) { // ʹ нε ϵ.. - // ݴ нε ʰ ٷ Ÿ Ѵ. + if (m_tNpcType != NPC_DUNGEON_MONSTER) { // 던젼 몬스터는 무조건 패스파인딩을 하도록.. + // 공격대상이 있으면 패스파인딩을 하지 않고 바로 타겟으로 가게 한다. if (m_Target.id != -1) { return 0; } @@ -2761,7 +2761,7 @@ int CNpc::GetTargetPath(int option) { end.x = (int)(vEnd22.x / TILE_SIZE) - min_x; end.y = (int)(vEnd22.z / TILE_SIZE) - min_z; - // ۾Ұ :  ϵ üũϴ ƾ + // 작업할것 : 던젼 몬스터의 경우 일정영역을 벗어나지 못하도록 체크하는 루틴 if (m_tNpcType == NPC_DUNGEON_MONSTER) { if (IsInRange((int)vEnd22.x, (int)vEnd22.z) == FALSE) { return -1; @@ -2782,7 +2782,7 @@ int CNpc::Attack(CIOCPort * pIOCP) { return 10000; } - // ڷƮ ϰ,, (,, ) + // 텔레포트 가능하게,, (렌덤으로,, ) int nRandom = 0, nPercent = 1000; int send_index = 0; BOOL bTeleport = FALSE; @@ -2796,7 +2796,7 @@ int CNpc::Attack(CIOCPort * pIOCP) { } */ //if( m_tNpcLongType==1 && m_tNpcType != NPC_BOSS_MONSTER ) { - if (m_tNpcLongType == 1) { // Ÿ Ѱ ݰŸ Ǵ.. + if (m_tNpcLongType == 1) { // 장거리 공격이 가능한것은 공격거리로 판단.. m_Delay = LongAndMagicAttack(pIOCP); return m_Delay; } @@ -2809,7 +2809,7 @@ int CNpc::Attack(CIOCPort * pIOCP) { if (ret == 0) { if (m_tNpcType == NPC_DOOR || m_tNpcType == NPC_ARTIFACT || m_tNpcType == NPC_PHOENIX_GATE || m_tNpcType == NPC_GATE_LEVER || m_tNpcType == NPC_DOMESTIC_ANIMAL || m_tNpcType == NPC_SPECIAL_GATE || - m_tNpcType == NPC_DESTORY_ARTIFACT) // ʵ.. + m_tNpcType == NPC_DESTORY_ARTIFACT) // 고정 경비병은 추적을 하지 않도록.. { m_NpcState = NPC_STANDING; InitTarget(); @@ -2817,17 +2817,17 @@ int CNpc::Attack(CIOCPort * pIOCP) { } m_sStepCount = 0; m_byActionFlag = ATTACK_TO_TRACE; - m_NpcState = NPC_TRACING; // ϰ ( ) - return 0; // IsCloseTarget() x, y ϰ Delay = 0 + m_NpcState = NPC_TRACING; // 공격하고 도망가는 유저를 따라 잡기위해(반응을 좀더 빠르게) + return 0; // IsCloseTarget()에 유저 x, y값을 갱신하고 Delay = 0으로 줌 } else if (ret == 2) { - //if(m_tNpcType == NPC_BOSS_MONSTER) { // ̸..... - if (m_tNpcLongType == 2) { // , () ̹Ƿ Ÿ ִ. + //if(m_tNpcType == NPC_BOSS_MONSTER) { // 대장 몬스터이면..... + if (m_tNpcLongType == 2) { // 직접, 간접(롱)공격이 가능한 몬스터 이므로 장거리 공격을 할 수 있다. m_Delay = LongAndMagicAttack(pIOCP); return m_Delay; } else { if (m_tNpcType == NPC_DOOR || m_tNpcType == NPC_ARTIFACT || m_tNpcType == NPC_PHOENIX_GATE || m_tNpcType == NPC_GATE_LEVER || m_tNpcType == NPC_DOMESTIC_ANIMAL || m_tNpcType == NPC_SPECIAL_GATE || - m_tNpcType == NPC_DESTORY_ARTIFACT) // ʵ.. + m_tNpcType == NPC_DESTORY_ARTIFACT) // 고정 경비병은 추적을 하지 않도록.. { m_NpcState = NPC_STANDING; InitTarget(); @@ -2835,8 +2835,8 @@ int CNpc::Attack(CIOCPort * pIOCP) { } m_sStepCount = 0; m_byActionFlag = ATTACK_TO_TRACE; - m_NpcState = NPC_TRACING; // ϰ ( ) - return 0; // IsCloseTarget() x, y ϰ Delay = 0 + m_NpcState = NPC_TRACING; // 공격하고 도망가는 유저를 따라 잡기위해(반응을 좀더 빠르게) + return 0; // IsCloseTarget()에 유저 x, y값을 갱신하고 Delay = 0으로 줌 } } else if (ret == -1) { m_NpcState = NPC_STANDING; @@ -2847,19 +2847,19 @@ int CNpc::Attack(CIOCPort * pIOCP) { CNpc * pNpc = NULL; CUser * pUser = NULL; int nDamage = 0; - int nID = m_Target.id; // Target Ѵ. + int nID = m_Target.id; // Target 을 구한다. - // ȸǰ// -----------------------------------------// - if (nID >= USER_BAND && nID < NPC_BAND) { // Target User + // 회피값/명중판정/데미지 계산 -----------------------------------------// + if (nID >= USER_BAND && nID < NPC_BAND) { // Target 이 User 인 경우 pUser = m_pMain->GetUserPtr(nID - USER_BAND); - if (pUser == NULL) { // User Invalid + if (pUser == NULL) { // User 가 Invalid 한 경우 InitTarget(); m_NpcState = NPC_STANDING; return nStandingTime; } - if (pUser->m_bLive == USER_DEAD) { // User ̹ + if (pUser->m_bLive == USER_DEAD) { // User 가 이미 죽은경우 //SendAttackSuccess(pIOCP, ATTACK_TARGET_DEAD_OK, pUser->m_iUserId, 0, pUser->m_iHP); SendAttackSuccess(pIOCP, ATTACK_TARGET_DEAD_OK, pUser->m_iUserId, 0, 0); InitTarget(); @@ -2873,12 +2873,12 @@ int CNpc::Attack(CIOCPort * pIOCP) { return nStandingTime; } - if (pUser->m_byIsOP == MANAGER_USER) { // ڴ ϰ.. + if (pUser->m_byIsOP == MANAGER_USER) { // 운영자는 공격을 안하게.. InitTarget(); m_NpcState = NPC_MOVING; return nStandingTime; } - // Npc HP Ͽ.. Ǵ... + // Npc와 유저와의 HP를 비교하여.. 도망을 갈 것인지를 판단... /* if(m_byNpcEndAttType) { if(IsCompStatus(pUser) == TRUE) { m_NpcState = NPC_BACK; @@ -2886,16 +2886,16 @@ int CNpc::Attack(CIOCPort * pIOCP) { } } */ - //if(m_tNpcType == NPC_BOSS_MONSTER) { // ̸..... - if (m_byWhatAttackType == 4 || m_byWhatAttackType == 5) { // ̸..... + //if(m_tNpcType == NPC_BOSS_MONSTER) { // 대장 몬스터이면..... + if (m_byWhatAttackType == 4 || m_byWhatAttackType == 5) { // 지역 마법 사용 몬스터이면..... nRandom = myrand(1, 10000); - if (nRandom < nPercent) { // ... + if (nRandom < nPercent) { // 지역마법공격... memset(buff, 0x00, 256); send_index = 0; SetByte(buff, MAGIC_EFFECTING, send_index); SetDWORD(buff, m_iMagic2, send_index); // Area Magic SetShort(buff, m_sNid + NPC_BAND, send_index); - SetShort(buff, -1, send_index); // tid ݵ -1 + SetShort(buff, -1, send_index); // tid는 반드시 -1 SetShort(buff, (short)m_fCurX, send_index); // terget point SetShort(buff, (short)m_fCurY, send_index); SetShort(buff, (short)m_fCurZ, send_index); @@ -2905,16 +2905,16 @@ int CNpc::Attack(CIOCPort * pIOCP) { m_MagicProcess.MagicPacket(buff, send_index, pIOCP); //TRACE("++++ AreaMagicAttack --- sid=%d, magicid=%d\n", m_sNid+NPC_BAND, m_iMagic2); - return m_sAttackDelay + 1000; // ð ɸ..... + return m_sAttackDelay + 1000; // 지역마법은 조금 시간이 걸리도록..... } } else { - if (m_byWhatAttackType == 2) { // ϴ Ͷ... (10% ) + if (m_byWhatAttackType == 2) { // 독 공격하는 몬스터라면... (10%의 공격으로) nRandom = myrand(1, 10000); - // sungyong test ,, ݸ + // sungyong test ,, 무조건 독공격만 //nRandom = 100; - if (nRandom < nPercent) { // ... + if (nRandom < nPercent) { // 독공격... memset(buff, 0x00, 256); send_index = 0; SetByte(buff, AG_MAGIC_ATTACK_RESULT, send_index); @@ -2938,8 +2938,8 @@ int CNpc::Attack(CIOCPort * pIOCP) { } } - // ̸ //Damage ó ----------------------------------------------------------------// - nDamage = GetFinalDamage(pUser); // + // 명중이면 //Damage 처리 ----------------------------------------------------------------// + nDamage = GetFinalDamage(pUser); // 최종 대미지 if (m_pMain->m_byTestMode) { nDamage = 10; // sungyong test } @@ -2955,17 +2955,17 @@ int CNpc::Attack(CIOCPort * pIOCP) { SendAttackSuccess(pIOCP, ATTACK_FAIL, pUser->m_iUserId, nDamage, pUser->m_sHP); } - // + // 방어측 내구도 감소 } else if (nID >= NPC_BAND && m_Target.id < INVALID_BAND) { pNpc = m_pMain->m_arNpc.GetData(nID - NPC_BAND); - if (pNpc == NULL) { // User Invalid + if (pNpc == NULL) { // User 가 Invalid 한 경우 InitTarget(); m_NpcState = NPC_STANDING; return nStandingTime; } - if (m_tNpcType == NPC_HEALER && pNpc->m_byGroup == m_byGroup) { // healer̸鼭 NPCΰ쿡 + if (m_tNpcType == NPC_HEALER && pNpc->m_byGroup == m_byGroup) { // healer이면서 같은국가의 NPC인경우에는 힐 m_NpcState = NPC_HEALING; return 0; } @@ -2977,7 +2977,7 @@ int CNpc::Attack(CIOCPort * pIOCP) { return nStandingTime; } - // Npc HP Ͽ.. Ǵ... + // Npc와 유저와의 HP를 비교하여.. 도망을 갈 것인지를 판단... /* if(IsCompStatus(pUser) == TRUE) { m_NpcState = NPC_BACK; return 0; @@ -2986,8 +2986,8 @@ int CNpc::Attack(CIOCPort * pIOCP) { // MoveAttack //MoveAttack(pIOCP); - // ̸ //Damage ó ----------------------------------------------------------------// - nDamage = GetNFinalDamage(pNpc); // + // 명중이면 //Damage 처리 ----------------------------------------------------------------// + nDamage = GetNFinalDamage(pNpc); // 최종 대미지 if (pUser) { //TRACE("Npc-Attack() : [mon: x=%.2f, z=%.2f], [user : x=%.2f, z=%.2f]\n", m_fCurX, m_fCurZ, pUser->m_curx, pUser->m_curz); @@ -3021,15 +3021,15 @@ int CNpc::LongAndMagicAttack(CIOCPort * pIOCP) { if (ret == 0) { m_sStepCount = 0; m_byActionFlag = ATTACK_TO_TRACE; - m_NpcState = NPC_TRACING; // ϰ ( ) - return 0; // IsCloseTarget() x, y ϰ Delay = 0 + m_NpcState = NPC_TRACING; // 공격하고 도망가는 유저를 따라 잡기위해(반응을 좀더 빠르게) + return 0; // IsCloseTarget()에 유저 x, y값을 갱신하고 Delay = 0으로 줌 } else if (ret == 2) { - //if(m_tNpcType != NPC_BOSS_MONSTER) { // ̸..... - if (m_tNpcLongType == 1) { // Ÿ ̸..... + //if(m_tNpcType != NPC_BOSS_MONSTER) { // 대장 몬스터이면..... + if (m_tNpcLongType == 1) { // 장거리 몬스터이면..... m_sStepCount = 0; m_byActionFlag = ATTACK_TO_TRACE; - m_NpcState = NPC_TRACING; // ϰ ( ) - return 0; // IsCloseTarget() x, y ϰ Delay = 0 + m_NpcState = NPC_TRACING; // 공격하고 도망가는 유저를 따라 잡기위해(반응을 좀더 빠르게) + return 0; // IsCloseTarget()에 유저 x, y값을 갱신하고 Delay = 0으로 줌 } } if (ret == -1) { @@ -3041,19 +3041,19 @@ int CNpc::LongAndMagicAttack(CIOCPort * pIOCP) { CNpc * pNpc = NULL; CUser * pUser = NULL; int nDamage = 0; - int nID = m_Target.id; // Target Ѵ. + int nID = m_Target.id; // Target 을 구한다. - // ȸǰ// -----------------------------------------// - if (nID >= USER_BAND && nID < NPC_BAND) { // Target User + // 회피값/명중판정/데미지 계산 -----------------------------------------// + if (nID >= USER_BAND && nID < NPC_BAND) { // Target 이 User 인 경우 pUser = m_pMain->GetUserPtr(nID - USER_BAND); - if (pUser == NULL) { // User Invalid + if (pUser == NULL) { // User 가 Invalid 한 경우 InitTarget(); m_NpcState = NPC_STANDING; return nStandingTime; } - if (pUser->m_bLive == USER_DEAD) { // User ̹ + if (pUser->m_bLive == USER_DEAD) { // User 가 이미 죽은경우 SendAttackSuccess(pIOCP, ATTACK_TARGET_DEAD_OK, pUser->m_iUserId, 0, 0); InitTarget(); m_NpcState = NPC_STANDING; @@ -3066,12 +3066,12 @@ int CNpc::LongAndMagicAttack(CIOCPort * pIOCP) { return nStandingTime; } - if (pUser->m_byIsOP == MANAGER_USER) { // ڴ ϰ.. + if (pUser->m_byIsOP == MANAGER_USER) { // 운영자는 공격을 안하게.. InitTarget(); m_NpcState = NPC_MOVING; return nStandingTime; } - // Npc HP Ͽ.. Ǵ... + // Npc와 유저와의 HP를 비교하여.. 도망을 갈 것인지를 판단... /* if(m_byNpcEndAttType) { if(IsCompStatus(pUser) == TRUE) @@ -3081,7 +3081,7 @@ int CNpc::LongAndMagicAttack(CIOCPort * pIOCP) { } } */ - // Ǵؼ ( 1 ) + // 조건을 판단해서 마법 공격 사용 (지금은 마법 1만 사용토록 하자) SetByte(buff, MAGIC_CASTING, send_index); SetDWORD(buff, m_iMagic1, send_index); // FireBall SetShort(buff, m_sNid + NPC_BAND, send_index); @@ -3100,7 +3100,7 @@ int CNpc::LongAndMagicAttack(CIOCPort * pIOCP) { pNpc = m_pMain->m_arNpc.GetData(nID - NPC_BAND); //pNpc = m_pMain->m_arNpc[nID - NPC_BAND]; - if (pNpc == NULL) { // User Invalid + if (pNpc == NULL) { // User 가 Invalid 한 경우 InitTarget(); m_NpcState = NPC_STANDING; return nStandingTime; @@ -3113,7 +3113,7 @@ int CNpc::LongAndMagicAttack(CIOCPort * pIOCP) { return nStandingTime; } - // Npc HP Ͽ.. Ǵ... + // Npc와 유저와의 HP를 비교하여.. 도망을 갈 것인지를 판단... /* if(IsCompStatus(pUser) == TRUE) { m_NpcState = NPC_BACK; @@ -3142,15 +3142,15 @@ int CNpc::TracingAttack(CIOCPort * pIOCP) // 0:attack fail, 1:attack success int nDamage = 0; - int nID = m_Target.id; // Target Ѵ. + int nID = m_Target.id; // Target 을 구한다. - // ȸǰ// -----------------------------------------// - if (nID >= USER_BAND && nID < NPC_BAND) { // Target User + // 회피값/명중판정/데미지 계산 -----------------------------------------// + if (nID >= USER_BAND && nID < NPC_BAND) { // Target 이 User 인 경우 pUser = m_pMain->GetUserPtr(nID - USER_BAND); if (pUser == NULL) { - return 0; // User Invalid + return 0; // User 가 Invalid 한 경우 } - if (pUser->m_bLive == USER_DEAD) { // User ̹ + if (pUser->m_bLive == USER_DEAD) { // User 가 이미 죽은경우 SendAttackSuccess(pIOCP, ATTACK_TARGET_DEAD_OK, pUser->m_iUserId, 0, 0); return 0; } @@ -3158,11 +3158,11 @@ int CNpc::TracingAttack(CIOCPort * pIOCP) // 0:attack fail, 1:attack success return 0; } if (pUser->m_byIsOP == MANAGER_USER) { - return 0; // ڴ ϰ.. + return 0; // 운영자는 공격을 안하게.. } - // ̸ //Damage ó ----------------------------------------------------------------// - nDamage = GetFinalDamage(pUser); // + // 명중이면 //Damage 처리 ----------------------------------------------------------------// + nDamage = GetFinalDamage(pUser); // 최종 대미지 if (m_pMain->m_byTestMode) { nDamage = 1; // sungyong test } @@ -3177,12 +3177,12 @@ int CNpc::TracingAttack(CIOCPort * pIOCP) // 0:attack fail, 1:attack success SendAttackSuccess(pIOCP, ATTACK_FAIL, pUser->m_iUserId, nDamage, pUser->m_sHP); } - // + // 방어측 내구도 감소 } else if (nID >= NPC_BAND && m_Target.id < INVALID_BAND) { pNpc = m_pMain->m_arNpc.GetData(nID - NPC_BAND); if (pNpc == NULL) { - return 0; // User Invalid + return 0; // User 가 Invalid 한 경우 } if (pNpc->m_iHP <= 0 || pNpc->m_NpcState == NPC_DEAD) { @@ -3190,8 +3190,8 @@ int CNpc::TracingAttack(CIOCPort * pIOCP) // 0:attack fail, 1:attack success return 0; } - // ̸ //Damage ó ----------------------------------------------------------------// - nDamage = GetNFinalDamage(pNpc); // + // 명중이면 //Damage 처리 ----------------------------------------------------------------// + nDamage = GetNFinalDamage(pNpc); // 최종 대미지 //TRACE("Npc-Attack() : [mon: x=%.2f, z=%.2f], [user : x=%.2f, z=%.2f]\n", m_fCurX, m_fCurZ, pUser->m_curx, pUser->m_curz); if (nDamage > 0) { @@ -3231,7 +3231,7 @@ void CNpc::MoveAttack(CIOCPort * pIOCP) { float surround_fx[8] = {0.0f, -1.4142f, -2.0f, -1.4167f, 0.0f, 1.4117f, 2.0000f, 1.4167f}; float surround_fz[8] = {2.0f, 1.4142f, 0.0f, -1.4167f, -2.0f, -1.4167f, -0.0035f, 1.4117f}; - if (m_Target.id >= USER_BAND && m_Target.id < NPC_BAND) // Target User + if (m_Target.id >= USER_BAND && m_Target.id < NPC_BAND) // Target 이 User 인 경우 { pUser = m_pMain->GetUserPtr(m_Target.id - USER_BAND); if (pUser == NULL) { @@ -3252,7 +3252,7 @@ void CNpc::MoveAttack(CIOCPort * pIOCP) { fZ = vEnd22.z; //TRACE("MoveAttack 22 - nid(%s, %d), fx=%.2f, fz=%.2f, attackpos=%d\n", m_strName, m_sNid+NPC_BAND, fX, fZ, m_byAttackPos); } - } else if (m_Target.id >= NPC_BAND && m_Target.id < INVALID_BAND) // Target mon + } else if (m_Target.id >= NPC_BAND && m_Target.id < INVALID_BAND) // Target 이 mon 인 경우 { pNpc = m_pMain->m_arNpc.GetData(m_Target.id - NPC_BAND); //pNpc = m_pMain->m_arNpc[m_Target.id - NPC_BAND]; @@ -3271,15 +3271,15 @@ void CNpc::MoveAttack(CIOCPort * pIOCP) { fDis = vDistance.Magnitude(); if ((int)fDis < 3) { - return; // target Ÿ 3 ̸̸ ¿ ̰.. + return; // target과의 거리가 3미터 미만이면 멈춘상태에서 공격이고.. } - /* if(m_tNpcLongType) // Ÿ Ѱ ݰŸ Ǵ.. + /* if(m_tNpcLongType) // 장거리 공격이 가능한것은 공격거리로 판단.. { if((int)fDis > nRange) return FALSE; } - else // ܰŸ() + else // 단거리(직접공격) { - if(fDis > 2.5) return FALSE; // ۾ :ݰɰŸ 2.5 ӽ .. + if(fDis > 2.5) return FALSE; // 작업 :공격가능거리를 2.5로 임시 수정함.. } */ vDistance = vEnd22 - vNpc; @@ -3291,7 +3291,7 @@ void CNpc::MoveAttack(CIOCPort * pIOCP) { TRACE("Npc-MoveAttack : nid=(%d, %s), x=%.2f, z=%.2f\n", m_sNid + NPC_BAND, m_strName, m_fCurX, m_fCurZ); } - // ̵.. + // 이동공격.. ::ZeroMemory(pBuf, 1024); index = 0; SetByte(pBuf, MOVE_RESULT, index); @@ -3302,9 +3302,9 @@ void CNpc::MoveAttack(CIOCPort * pIOCP) { Setfloat(pBuf, m_fCurY, index); Setfloat(pBuf, fDis, index); //TRACE("Npc moveattack --> nid = %d, cur=[x=%.2f, y=%.2f, metor=%.2f]\n", m_sNid+NPC_BAND, m_fCurX, m_fCurZ, fDis); - SendAll(pIOCP, pBuf, index); // thread send + SendAll(pIOCP, pBuf, index); // thread 에서 send - // ̵ + // 이동 끝 ::ZeroMemory(pBuf, 1024); index = 0; SetByte(pBuf, MOVE_RESULT, index); @@ -3315,11 +3315,11 @@ void CNpc::MoveAttack(CIOCPort * pIOCP) { Setfloat(pBuf, m_fCurY, index); Setfloat(pBuf, 0, index); //TRACE("Npc moveattack end --> nid = %d, cur=[x=%.2f, y=%.2f, metor=%d]\n", m_sNid+NPC_BAND, m_fCurX, m_fCurZ, 0); - SendAll(pIOCP, pBuf, index); // thread send + SendAll(pIOCP, pBuf, index); // thread 에서 send SetUid(m_fCurX, m_fCurZ, m_sNid + NPC_BAND); - /* Ÿ ǥ ֽ ϰ, ǥ Ѵ,, */ + /* 타겟의 좌표를 최신 것으로 수정하고, 마지막 포인터 좌표를 수정한다,, */ m_fEndPoint_X = m_fCurX; m_fEndPoint_Y = m_fCurZ; @@ -3340,19 +3340,19 @@ int CNpc::GetNFinalDamage(CNpc * pNpc) { return damage; } - // ݹø + // 공격민첩 Attack = (float)m_sHitRate; - // ø + // 방어민첩 Avoid = (float)pNpc->m_sEvadeRate; - // Hit + //공격자 Hit Hit = m_sDamage; - // Ac + // 방어자 Ac Ac = (short)pNpc->m_sDefense; - // Ÿݺ ϱ + // 타격비 구하기 result = GetHitRate(Attack / Avoid); switch (result) { @@ -3408,9 +3408,9 @@ BOOL CNpc::IsCompStatus(CUser * pUser) { return FALSE; } -// Target ġ ٽ ã⸦ ߴ Ǵ +// Target 의 위치가 다시 길찾기를 할 정도로 변했는지 판단 BOOL CNpc::IsChangePath(int nStep) { - // нε ǥ ,, Target ݰŸ ִ Ǵ,, + // 패스파인드의 마지막 좌표를 가지고,, Target이 내 공격거리에 있는지를 판단,, // if(!m_pPath) return TRUE; float fCurX = 0.0f, fCurZ = 0.0f; @@ -3429,14 +3429,14 @@ BOOL CNpc::IsChangePath(int nStep) { return FALSE; } - //TRACE("#### IsChangePath() - [ - cur:x=%.2f, z=%.2f, ǥ:x=%.2f, z=%.2f], [target : x=%.2f, z=%.2f]\n", + //TRACE("#### IsChangePath() - [몬 - cur:x=%.2f, z=%.2f, 목표점:x=%.2f, z=%.2f], [target : x=%.2f, z=%.2f]\n", // m_fCurX, m_fCurZ, m_fEndPoint_X, m_fEndPoint_Y, fCurX, fCurZ); return TRUE; } -// Target ġ ´. +// Target 의 현재 위치를 얻는다. BOOL CNpc::GetTargetPos(float & x, float & z) { - if (m_Target.id >= USER_BAND && m_Target.id < NPC_BAND) // Target User + if (m_Target.id >= USER_BAND && m_Target.id < NPC_BAND) // Target 이 User 인 경우 { CUser * pUser = m_pMain->GetUserPtr(m_Target.id - USER_BAND); @@ -3460,7 +3460,7 @@ BOOL CNpc::GetTargetPos(float & x, float & z) { return TRUE; } -// Target NPC ã⸦ ٽѴ. +// Target 과 NPC 간에 길찾기를 다시한다. BOOL CNpc::ResetPath() { float cur_x, cur_z; GetTargetPos(cur_x, cur_z); @@ -3471,13 +3471,13 @@ BOOL CNpc::ResetPath() { m_Target.z = cur_z; int nValue = GetTargetPath(); - if (nValue == -1) // Ÿ ų,, ־... + if (nValue == -1) // 타겟이 없어지거나,, 멀어졌음으로... { TRACE("Npc-ResetPath Fail - target_x = %.2f, z=%.2f, value=%d\n", m_Target.x, m_Target.z, nValue); return FALSE; - } else if (nValue == 0) // Ÿ ٷ .. + } else if (nValue == 0) // 타겟 방향으로 바로 간다.. { - m_fSecForMetor = m_fSpeed_2; // ϶ ٴ ӵ... + m_fSecForMetor = m_fSpeed_2; // 공격일때는 뛰는 속도로... IsNoPathFind(m_fSecForMetor); } @@ -3500,13 +3500,13 @@ int CNpc::GetFinalDamage(CUser * pUser, int type) { return damage; } - Attack = (float)m_sHitRate; // ݹø - Avoid = (float)pUser->m_fAvoidrate; // ø - Hit = m_sDamage; // Hit - // Ac = (short)pUser->m_sAC ; // Ac + Attack = (float)m_sHitRate; // 공격민첩 + Avoid = (float)pUser->m_fAvoidrate; // 방어민첩 + Hit = m_sDamage; // 공격자 Hit + // Ac = (short)pUser->m_sAC ; // 방어자 Ac - // Ac = (short)pUser->m_sItemAC + (short)pUser->m_sLevel ; // Ac - // Ac = (short)pUser->m_sAC - (short)pUser->m_sLevel ; // Ac. ... ̿ . + // Ac = (short)pUser->m_sItemAC + (short)pUser->m_sLevel ; // 방어자 Ac + // Ac = (short)pUser->m_sAC - (short)pUser->m_sLevel ; // 방어자 Ac. 잉...성래씨 미워 ㅜ.ㅜ Ac = (short)pUser->m_sItemAC + (short)pUser->m_sLevel + (short)(pUser->m_sAC - pUser->m_sLevel - pUser->m_sItemAC); // ASSERT(Ac != 0); @@ -3518,7 +3518,7 @@ int CNpc::GetFinalDamage(CUser * pUser, int type) { int nMaxDamage = (int)(2.6 * m_sDamage); - // Ÿݺ ϱ + // 타격비 구하기 result = GetHitRate(Attack / Avoid); // TRACE("Hitrate : %d %f/%f\n", result, Attack, Avoid); @@ -3635,7 +3635,7 @@ int CNpc::GetFinalDamage(CUser * pUser, int type) { //return 1; } -// Ÿ ´.( : HP ) +// 나를 공격한 유저를 타겟으로 삼는다.(기준 : 렙과 HP를 기준으로 선정) void CNpc::ChangeTarget(int nAttackType, CUser * pUser, CIOCPort * pIOCP) { int preDamage, lastDamage; __Vector3 vUser, vNpc; @@ -3649,18 +3649,18 @@ void CNpc::ChangeTarget(int nAttackType, CUser * pUser, CIOCPort * pIOCP) { return; } if (pUser->m_bNation == m_byGroup) { - return; // ϵ... + return; // 같은 국가는 공격을 안하도록... } if (pUser->m_byIsOP == MANAGER_USER) { - return; // ڴ ...^^ + return; // 운영자는 무시...^^ } if (m_tNpcType == NPC_DOOR || m_tNpcType == NPC_ARTIFACT || m_tNpcType == NPC_PHOENIX_GATE || m_tNpcType == NPC_GATE_LEVER || m_tNpcType == NPC_DOMESTIC_ANIMAL || m_tNpcType == NPC_SPECIAL_GATE || m_tNpcType == NPC_DESTORY_ARTIFACT) { - return; // NPC ó ϰ + return; // 성문 NPC는 공격처리 안하게 } if (m_NpcState == NPC_FAINTING) { - return; // ̸ .. + return; // 기절상태이면 무시.. } CUser * preUser = NULL; @@ -3669,7 +3669,7 @@ void CNpc::ChangeTarget(int nAttackType, CUser * pUser, CIOCPort * pIOCP) { } if (pUser == preUser) { - if (m_tNpcGroupType) { // Ÿ̸ þ߾ȿ ŸԿ ǥ + if (m_tNpcGroupType) { // 가족타입이면 시야안에 같은 타입에게 목표 지정 m_Target.failCount = 0; if (m_tNpcType == NPC_BOSS_MONSTER) { FindFriend(1); @@ -3688,14 +3688,14 @@ void CNpc::ChangeTarget(int nAttackType, CUser * pUser, CIOCPort * pIOCP) { preDamage = 0; lastDamage = 0; - if (iRandom >= 0 && iRandom < 50) { // ڽ ϰ Ÿ + if (iRandom >= 0 && iRandom < 50) { // 몬스터 자신을 가장 강하게 타격한 유저 preDamage = preUser->GetDamage(m_sNid + NPC_BAND); lastDamage = pUser->GetDamage(m_sNid + NPC_BAND); //TRACE("Npc-changeTarget 111 - iRandom=%d, pre=%d, last=%d\n", iRandom, preDamage, lastDamage); if (preDamage > lastDamage) { return; } - } else if (iRandom >= 50 && iRandom < 80) { // ÷̾ + } else if (iRandom >= 50 && iRandom < 80) { // 가장 가까운 플레이어 vNpc.Set(m_fCurX, m_fCurY, m_fCurZ); vUser.Set(preUser->m_curx, 0, preUser->m_curz); fDistance1 = GetDistance(vNpc, vUser); @@ -3706,7 +3706,7 @@ void CNpc::ChangeTarget(int nAttackType, CUser * pUser, CIOCPort * pIOCP) { return; } } - if (iRandom >= 80 && iRandom < 95) { // Ͱ Ÿ ִ + if (iRandom >= 80 && iRandom < 95) { // 몬스터가 유저에게 가장 많이 타격을 줄 수 있는 유저 preDamage = GetFinalDamage(preUser, 0); lastDamage = GetFinalDamage(pUser, 0); //TRACE("Npc-changeTarget 333 - iRandom=%d, pre=%d, last=%d\n", iRandom, preDamage, lastDamage); @@ -3714,10 +3714,10 @@ void CNpc::ChangeTarget(int nAttackType, CUser * pUser, CIOCPort * pIOCP) { return; } } - if (iRandom >= 95 && iRandom < 101) { // Heal Magic + if (iRandom >= 95 && iRandom < 101) { // Heal Magic을 사용한 유저 } } else if (preUser == NULL && nAttackType == 1004) { - return; // Heal magic ʵ.. + return; // Heal magic에 반응하지 않도록.. } m_Target.id = pUser->m_iUserId + USER_BAND; @@ -3728,17 +3728,17 @@ void CNpc::ChangeTarget(int nAttackType, CUser * pUser, CIOCPort * pIOCP) { //TRACE("Npc-changeTarget - target_x = %.2f, z=%.2f\n", m_Target.x, m_Target.z); int nValue = 0; - //  Ÿµ ϸ ٷ ݰ + // 어슬렁 거리는데 공격하면 바로 반격 if (m_NpcState == NPC_STANDING || m_NpcState == NPC_MOVING || - m_NpcState == NPC_SLEEPING) { // ݰ ̾ + m_NpcState == NPC_SLEEPING) { // 가까이 있으면 반격으로 이어지구 if (IsCloseTarget(pUser, m_byAttackRange) == TRUE) { m_NpcState = NPC_FIGHTING; m_Delay = 0; m_fDelayTime = TimeGet(); - } else // ٷ ǥ ϰ + } else // 바로 도망가면 좌표를 갱신하고 추적 { nValue = GetTargetPath(1); - if (nValue == 1) // ݰ ణ ð + if (nValue == 1) // 반격 동작후 약간의 딜레이 시간이 있음 { m_NpcState = NPC_TRACING; m_Delay = 0; @@ -3748,7 +3748,7 @@ void CNpc::ChangeTarget(int nAttackType, CUser * pUser, CIOCPort * pIOCP) { m_Delay = 0; m_fDelayTime = TimeGet(); } else if (nValue == 0) { - m_fSecForMetor = m_fSpeed_2; // ϶ ٴ ӵ... + m_fSecForMetor = m_fSpeed_2; // 공격일때는 뛰는 속도로... IsNoPathFind(m_fSecForMetor); m_NpcState = NPC_TRACING; m_Delay = 0; @@ -3756,9 +3756,9 @@ void CNpc::ChangeTarget(int nAttackType, CUser * pUser, CIOCPort * pIOCP) { } } } - // else m_NpcState = NPC_ATTACKING; // ϴµ ϸ ǥ ٲ + // else m_NpcState = NPC_ATTACKING; // 한참 공격하는데 누가 방해하면 목표를 바꿈 - if (m_tNpcGroupType) { // Ÿ̸ þ߾ȿ ŸԿ ǥ + if (m_tNpcGroupType) { // 가족타입이면 시야안에 같은 타입에게 목표 지정 m_Target.failCount = 0; if (m_tNpcType == NPC_BOSS_MONSTER) { FindFriend(1); @@ -3773,7 +3773,7 @@ void CNpc::ChangeTarget(int nAttackType, CUser * pUser, CIOCPort * pIOCP) { } } -// Npc Ÿ ´.( : HP ) +// 나를 공격한 Npc를 타겟으로 삼는다.(기준 : 렙과 HP를 기준으로 선정) void CNpc::ChangeNTarget(CNpc * pNpc, CIOCPort * pIOCP) { int preDamage, lastDamage; __Vector3 vMonster, vNpc; @@ -3802,7 +3802,7 @@ void CNpc::ChangeNTarget(CNpc * pNpc, CIOCPort * pIOCP) { preDamage = GetNFinalDamage(preNpc); lastDamage = GetNFinalDamage(pNpc); - // ˻,, (Ÿ ݷ Ǵؼ,,) + // 조건을 검색,, (거리와 유저의 공격력을 판단해서,,) vNpc.Set(m_fCurX, m_fCurY, m_fCurZ); vMonster.Set(preNpc->m_fCurX, 0, preNpc->m_fCurZ); fDist = GetDistance(vNpc, vMonster); @@ -3822,17 +3822,17 @@ void CNpc::ChangeNTarget(CNpc * pNpc, CIOCPort * pIOCP) { m_Target.z = pNpc->m_fCurZ; int nValue = 0; - //  Ÿµ ϸ ٷ ݰ + // 어슬렁 거리는데 공격하면 바로 반격 if (m_NpcState == NPC_STANDING || m_NpcState == NPC_MOVING || - m_NpcState == NPC_SLEEPING) { // ݰ ̾ + m_NpcState == NPC_SLEEPING) { // 가까이 있으면 반격으로 이어지구 if (IsCloseTarget(m_byAttackRange) == 1) { m_NpcState = NPC_FIGHTING; m_Delay = 0; m_fDelayTime = TimeGet(); - } else // ٷ ǥ ϰ + } else // 바로 도망가면 좌표를 갱신하고 추적 { nValue = GetTargetPath(); - if (nValue == 1) // ݰ ణ ð + if (nValue == 1) // 반격 동작후 약간의 딜레이 시간이 있음 { m_NpcState = NPC_TRACING; m_Delay = 0; @@ -3842,7 +3842,7 @@ void CNpc::ChangeNTarget(CNpc * pNpc, CIOCPort * pIOCP) { m_Delay = 0; m_fDelayTime = TimeGet(); } else if (nValue == 0) { - m_fSecForMetor = m_fSpeed_2; // ϶ ٴ ӵ... + m_fSecForMetor = m_fSpeed_2; // 공격일때는 뛰는 속도로... IsNoPathFind(m_fSecForMetor); m_NpcState = NPC_TRACING; m_Delay = 0; @@ -3850,9 +3850,9 @@ void CNpc::ChangeNTarget(CNpc * pNpc, CIOCPort * pIOCP) { } } } - // else m_NpcState = NPC_ATTACKING; // ϴµ ϸ ǥ ٲ + // else m_NpcState = NPC_ATTACKING; // 한참 공격하는데 누가 방해하면 목표를 바꿈 - if (m_tNpcGroupType) // Ÿ̸ þ߾ȿ ŸԿ ǥ + if (m_tNpcGroupType) // 가족타입이면 시야안에 같은 타입에게 목표 지정 { m_Target.failCount = 0; FindFriend(); @@ -3860,15 +3860,15 @@ void CNpc::ChangeNTarget(CNpc * pNpc, CIOCPort * pIOCP) { } void CNpc::ToTargetMove(CIOCPort * pIOCP, CUser * pUser) { - TRACE("### ToTargetMove() ã ### \n"); + TRACE("### ToTargetMove() 유저 길찾기 실패 ### \n"); } -// NPC ´. +// NPC 의 방어력을 얻어온다. int CNpc::GetDefense() { return m_sDefense; } -// Damage , m_iHP 0 ̸ ó +// Damage 계산, 만약 m_iHP 가 0 이하이면 사망처리 BOOL CNpc::SetDamage(int nAttackType, int nDamage, const std::string & id, int uid, CIOCPort * pIOCP) { int userDamage = 0; BOOL bFlag = FALSE; @@ -3883,7 +3883,7 @@ BOOL CNpc::SetDamage(int nAttackType, int nDamage, const std::string & id, int u if (nDamage < 0) { return TRUE; } - if (m_ZoneIndex < 0 || m_ZoneIndex > m_pMain->g_arZone.size()) { // Npc Ͱ ߸ 쿡 .. + if (m_ZoneIndex < 0 || m_ZoneIndex > m_pMain->g_arZone.size()) { // Npc의 포인터가 잘못된 경우에는 리턴.. TRACE("#### Npc-Setdamage ZoneIndex Fail : [name=%d,%s], zoneindex=%d #####\n", m_sNid + NPC_BAND, m_strName, m_ZoneIndex); return TRUE; @@ -3894,12 +3894,12 @@ BOOL CNpc::SetDamage(int nAttackType, int nDamage, const std::string & id, int u char strDurationID[MAX_ID_SIZE + 1]; memset(strDurationID, 0x00, MAX_ID_SIZE + 1); - if (uid >= USER_BAND && uid < NPC_BAND) { // Target User - pUser = m_pMain->GetUserPtr(uid); // ش + if (uid >= USER_BAND && uid < NPC_BAND) { // Target 이 User 인 경우 + pUser = m_pMain->GetUserPtr(uid); // 해당 사용자인지 인증 if (pUser == NULL) { return TRUE; } - } else if (uid >= NPC_BAND && m_Target.id < INVALID_BAND) { // Target mon + } else if (uid >= NPC_BAND && m_Target.id < INVALID_BAND) { // Target 이 mon 인 경우 pNpc = m_pMain->m_arNpc.GetData(uid - NPC_BAND); if (pNpc == NULL) { return TRUE; @@ -3909,7 +3909,7 @@ BOOL CNpc::SetDamage(int nAttackType, int nDamage, const std::string & id, int u } userDamage = nDamage; - // ׿ ҿ. + // 잉여 데미지는 소용없다. if ((m_iHP - nDamage) < 0) { userDamage = m_iHP; } @@ -3930,7 +3930,7 @@ BOOL CNpc::SetDamage(int nAttackType, int nDamage, const std::string & id, int u } } - for (int i = 0; i < NPC_HAVE_USER_LIST; i++) // ο ġ? + for (int i = 0; i < NPC_HAVE_USER_LIST; i++) // 인원 제한이 최종 대미지에 영향을 미치나? { if (m_DamagedUserList[i].iUid == -1) { if (m_DamagedUserList[i].nDamage <= 0) { @@ -3971,10 +3971,10 @@ BOOL CNpc::SetDamage(int nAttackType, int nDamage, const std::string & id, int u int iRandom = myrand(1, 100); int iLightningR = 0; - if (uid >= USER_BAND && uid < NPC_BAND) // Target User + if (uid >= USER_BAND && uid < NPC_BAND) // Target 이 User 인 경우 { - if (nAttackType == 3 && m_NpcState != NPC_FAINTING) { // Ű ų ߴٸ.. - // Ȯ .. + if (nAttackType == 3 && m_NpcState != NPC_FAINTING) { // 기절 시키는 스킬을 사용했다면.. + // 확률 계산.. iLightningR = 10 + (40 - 40 * ((double)m_sLightningR / 80)); if (COMPARE(iRandom, 0, iLightningR)) { m_NpcState = NPC_FAINTING; @@ -3988,7 +3988,7 @@ BOOL CNpc::SetDamage(int nAttackType, int nDamage, const std::string & id, int u ChangeTarget(nAttackType, pUser, pIOCP); } } - if (uid >= NPC_BAND && m_Target.id < INVALID_BAND) // Target mon + if (uid >= NPC_BAND && m_Target.id < INVALID_BAND) // Target 이 mon 인 경우 { ChangeNTarget(pNpc, pIOCP); } @@ -3996,7 +3996,7 @@ BOOL CNpc::SetDamage(int nAttackType, int nDamage, const std::string & id, int u return TRUE; } -// Heal迭 +// Heal계열 마법공격 BOOL CNpc::SetHMagicDamage(int nDamage, CIOCPort * pIOCP) { if (m_NpcState == NPC_DEAD) { return FALSE; @@ -4008,7 +4008,7 @@ BOOL CNpc::SetHMagicDamage(int nDamage, CIOCPort * pIOCP) { return FALSE; } if (m_iHP < 1) { - return FALSE; // ױ϶ ȸ ȵ... + return FALSE; // 죽기직전일때는 회복 안됨... } if (pIOCP == NULL) { return FALSE; @@ -4036,7 +4036,7 @@ BOOL CNpc::SetHMagicDamage(int nDamage, CIOCPort * pIOCP) { return TRUE; } -// NPC ó ġ й踦 Ѵ.(Ϲ ڱ) +// NPC 사망처리시 경험치 분배를 계산한다.(일반 유저와 버디 사용자구분) void CNpc::SendExpToUserList() { if (m_ZoneIndex < 0 || m_ZoneIndex > m_pMain->g_arZone.size()) { TRACE("#### Npc-SendExpToUserList() ZoneIndex Fail : [name=%s], zoneindex=%d #####\n", m_strName, m_ZoneIndex); @@ -4062,9 +4062,9 @@ void CNpc::SendExpToUserList() { return; } - IsUserInSight(); // þ߱dz ִ .. + IsUserInSight(); // 시야권내에 있는 유저 셋팅.. - for (int i = 0; i < NPC_HAVE_USER_LIST; i++) // ϴ Ʈ ˻Ѵ. + for (int i = 0; i < NPC_HAVE_USER_LIST; i++) // 일단 리스트를 검색한다. { if (m_DamagedUserList[i].iUid < 0 || m_DamagedUserList[i].nDamage <= 0) { continue; @@ -4076,7 +4076,7 @@ void CNpc::SendExpToUserList() { continue; } - if (pUser->m_byNowParty == 1) // Ƽ Ҽ + if (pUser->m_byNowParty == 1) // 파티 소속 { totalDamage = GetPartyDamage(pUser->m_sPartyNumber); if (totalDamage == 0 || m_TotalDamage == 0) { @@ -4110,7 +4110,7 @@ void CNpc::SendExpToUserList() { nPartyLoyalty = nPartyLoyalty + 1; } } - // Ƽ ü 鼭 ġ й + // 파티원 전체를 돌면서 경험치 분배 if (i != 0) { BOOL bFlag = FALSE; int count = 0; @@ -4134,7 +4134,7 @@ void CNpc::SendExpToUserList() { bFlag = TRUE; } - // ⿡ ۾... + // 여기에서 또 작업... if (bFlag == TRUE) { int uid = 0; pParty = m_pMain->m_arParty.GetData(pUser->m_sPartyNumber); @@ -4157,7 +4157,7 @@ void CNpc::SendExpToUserList() { uid = pParty->uid[k]; pPartyUser = m_pMain->GetUserPtr(uid); if (pPartyUser) { - // monster Ÿ Ǵ + // monster와 거리를 판단 if (IsInExpRange(pPartyUser) == TRUE) { TempValue = (nPartyExp * (1 + 0.3 * (nTotalMan - 1))) * (double)pPartyUser->m_sLevel / (double)nTotalLevel; @@ -4206,7 +4206,7 @@ void CNpc::SendExpToUserList() { uid = pParty->uid[k]; pPartyUser = m_pMain->GetUserPtr(uid); if (pPartyUser) { - // monster Ÿ Ǵ + // monster와 거리를 판단 if (IsInExpRange(pPartyUser) == TRUE) { TempValue = (nPartyExp * (1 + 0.3 * (nTotalMan - 1))) * (double)pPartyUser->m_sLevel / (double)nTotalLevel; @@ -4234,9 +4234,9 @@ void CNpc::SendExpToUserList() { } } //nExp = - } else if (pUser->m_byNowParty == 2) // δ Ҽ + } else if (pUser->m_byNowParty == 2) // 부대 소속 { - } else // + } else // 개인 { totalDamage = m_DamagedUserList[i].nDamage; @@ -4279,9 +4279,9 @@ void CNpc::SendExpToUserList() { } } - if (m_pMain->m_byBattleEvent == BATTLEZONE_OPEN) { // - if (m_bySpecialType >= 90 && m_bySpecialType <= 100) { // ׾ ּ - if (strlen(strMaxDamageUser) != 0) { // Ϳ ̸ + if (m_pMain->m_byBattleEvent == BATTLEZONE_OPEN) { // 전쟁중 + if (m_bySpecialType >= 90 && m_bySpecialType <= 100) { // 죽었을때 데미지를 많이 입힌 유저를 기록해 주세여 + if (strlen(strMaxDamageUser) != 0) { // 몬스터에게 가장 데미지를 많이 입힌 유저의 이름을 전송 char send_buff[100]; memset(send_buff, 0x00, 100); int send_index = 0; @@ -4347,13 +4347,13 @@ int CNpc::SendDead(CIOCPort * pIOCP, int type) { } if (type) { - GiveNpcHaveItem(pIOCP); // (̸ ȶƮ) + GiveNpcHaveItem(pIOCP); // 아이템 떨구기(경비면이면 안떨어트림) } return m_sRegenTime; } -// NPC Target Ÿ Ǵ +// NPC와 Target 과의 거리가 지정 범위보다 작은지 판단 BOOL CNpc::IsCloseTarget(CUser * pUser, int nRange) { if (pUser == NULL) { return FALSE; @@ -4369,7 +4369,7 @@ BOOL CNpc::IsCloseTarget(CUser * pUser, int nRange) { vUser.Set(pUser->m_curx, pUser->m_cury, pUser->m_curz); fDis = GetDistance(vNpc, vUser); - // ݹ ± 2 Ÿ,, + // 공격받은 상태기 때문에 2배의 거리감지영역,, if ((int)fDis > nRange * 2) { return FALSE; } @@ -4385,9 +4385,9 @@ BOOL CNpc::IsCloseTarget(CUser * pUser, int nRange) { } ///////////////////////////////////////////////////////////////////////////// -// þ Ḧ ã´. -// type = 0: ׷̸鼭 йи ŸԸ , 1:׷̳ йи , -// 2:NPC Ʊ ¸ üũؼ ġ ,, ġ Ʊ NID Ѵ +// 시야 범위내의 내동료를 찾는다. +// type = 0: 같은 그룹이면서 같은 패밀리 타입만 도움, 1:그룹이나 패밀리에 관계없이 도움, +// 2:사제NPC가 같은 아군의 상태를 체크해서 치료할 목적으로,, 리턴으로 치료될 아군의 NID를 리턴한다 int CNpc::FindFriend(int type) { CNpc * pNpc = NULL; if (m_ZoneIndex < 0 || m_ZoneIndex > m_pMain->g_arZone.size()) { @@ -4465,7 +4465,7 @@ int CNpc::FindFriend(int type) { void CNpc::FindFriendRegion(int x, int z, MAP * pMap, _TargetHealer * pHealer, int type) //void CNpc::FindFriendRegion(int x, int z, MAP* pMap, int type) { - // ڽ region ִ UserArray ˻Ͽ,, Ÿ ִ Ǵ.. + // 자신의 region에 있는 UserArray을 먼저 검색하여,, 가까운 거리에 유저가 있는지를 판단.. if (x < 0 || z < 0 || x > pMap->GetXRegionMax() || z > pMap->GetZRegionMax()) { TRACE("#### Npc-FindFriendRegion() Fail : [nid=%d, sid=%d], nRX=%d, nRZ=%d #####\n", m_sNid + NPC_BAND, m_sSid, x, z); @@ -4494,7 +4494,7 @@ void CNpc::FindFriendRegion(int x, int z, MAP * pMap, _TargetHealer * pHealer, i CNpc * pNpc = NULL; __Vector3 vStart, vEnd; float fDis = 0.0f; - // ̱⶧.. searchrange 2.. + // 공격 받은 상태이기때문에.. searchrange를 2배로.. float fSearchRange = 0.0f; if (type == 2) { fSearchRange = (float)m_byAttackRange; @@ -4515,15 +4515,15 @@ void CNpc::FindFriendRegion(int x, int z, MAP * pMap, _TargetHealer * pHealer, i vEnd.Set(pNpc->m_fCurX, pNpc->m_fCurY, pNpc->m_fCurZ); fDis = GetDistance(vStart, vEnd); - // ⿡ ݰŸ ִ Ǵ + // 여기에서 나의 공격거리에 있는 유저인지를 판단 if (fDis <= fSearchRange) { if (type == 1) { if (m_sNid != pNpc->m_sNid) { if (pNpc->m_Target.id > -1 && pNpc->m_NpcState == NPC_FIGHTING) { continue; } - pNpc->m_Target.id = m_Target.id; // ῡ ûѴ. - pNpc->m_Target.x = m_Target.x; // ǥ ڰ... + pNpc->m_Target.id = m_Target.id; // 모든 동료에게 도움을 요청한다. + pNpc->m_Target.x = m_Target.x; // 같은 목표를 공격하자고... pNpc->m_Target.y = m_Target.y; pNpc->m_Target.z = m_Target.z; pNpc->m_Target.failCount = 0; @@ -4534,8 +4534,8 @@ void CNpc::FindFriendRegion(int x, int z, MAP * pMap, _TargetHealer * pHealer, i if (pNpc->m_Target.id > -1 && pNpc->m_NpcState == NPC_FIGHTING) { continue; } - pNpc->m_Target.id = m_Target.id; // Ÿ ῡ ûѴ. - pNpc->m_Target.x = m_Target.x; // ǥ ڰ... + pNpc->m_Target.id = m_Target.id; // 같은 타입의 동료에게 도움을 요청한다. + pNpc->m_Target.x = m_Target.x; // 같은 목표를 공격하자고... pNpc->m_Target.y = m_Target.y; pNpc->m_Target.z = m_Target.z; pNpc->m_Target.failCount = 0; @@ -4545,9 +4545,9 @@ void CNpc::FindFriendRegion(int x, int z, MAP * pMap, _TargetHealer * pHealer, i if (pHealer == NULL) { continue; } - // HP¸ üũ + // HP상태를 체크 iHP = pNpc->m_iMaxHP * 0.9; - if (pNpc->m_iHP <= iHP) { // HP üũ + if (pNpc->m_iHP <= iHP) { // HP 체크 iCompValue = (pNpc->m_iMaxHP - pNpc->m_iHP) / (pNpc->m_iMaxHP * 0.01); if (iValue < iCompValue) { iValue = iCompValue; @@ -4578,13 +4578,13 @@ void CNpc::NpcStrategy(BYTE type) { } } -// NPC ۿ Ѵ. +// NPC 정보를 버퍼에 저장한다. void CNpc::FillNpcInfo(char * temp_send, int & index, BYTE flag) { SetByte(temp_send, AG_NPC_INFO, index); if (m_bySpecialType == 5 && m_byChangeType == 0) { - SetByte(temp_send, 0, index); // region ƶ + SetByte(temp_send, 0, index); // region에 등록하지 말아라 } else { - SetByte(temp_send, 1, index); // region + SetByte(temp_send, 1, index); // region에 등록 } SetShort(temp_send, m_sNid + NPC_BAND, index); SetShort(temp_send, m_sSid, index); @@ -4617,12 +4617,12 @@ void CNpc::FillNpcInfo(char * temp_send, int & index, BYTE flag) { SetByte(temp_send, m_byObjectType, index); } -// game server npc ... +// game server에 npc정보를 전부 전송... void CNpc::SendNpcInfoAll(char * temp_send, int & index, int count) { if (m_bySpecialType == 5 && m_byChangeType == 0) { - SetByte(temp_send, 0, index); // region ƶ + SetByte(temp_send, 0, index); // region에 등록하지 말아라 } else { - SetByte(temp_send, 1, index); // region + SetByte(temp_send, 1, index); // region에 등록 } SetShort(temp_send, m_sNid + NPC_BAND, index); SetShort(temp_send, m_sSid, index); @@ -4757,8 +4757,8 @@ inline float CNpc::RandomGenf(float max, float min) { } ////////////////////////////////////////////////////////////////////// -// : ġ, , random, ̵Ÿ -// ȯ: ġ +// 인자: 현재 위치, 방향, random각, 이동거리 +// 반환값: 최종위치 ////////////////////////////////////////////////////////////////////// __Vector3 CNpc::MyFunc(__Vector3 vCur, __Vector3 vDir, float fYDegree, float fDistance) { float fYRandom = RandomGenf(fYDegree / 2.0f, -fYDegree / 2.0f); @@ -4834,7 +4834,7 @@ void CNpc::NpcMoveEnd(CIOCPort * pIOCP) { int rx = m_fCurX / VIEW_DIST; int rz = m_fCurZ / VIEW_DIST; //TRACE("NpcMoveEnd() --> nid = %d, x=%f, y=%f, rx=%d,rz=%d, frame=%d, speed = %d \n", m_sNid, m_fCurX, m_fCurZ, rx,rz, m_iAniFrameCount, m_sSpeed); - SendAll(pIOCP, pBuf, index); // thread send + SendAll(pIOCP, pBuf, index); // thread 에서 send } __Vector3 CNpc::GetVectorPosition(__Vector3 vOrig, __Vector3 vDest, float fDis) { @@ -4860,7 +4860,7 @@ BOOL CNpc::GetUserInView() { if (pMap == NULL) { return FALSE; } - //if( m_ZoneIndex > 5 || m_ZoneIndex < 0) return FALSE; // ӽڵ ( 2002.03.24 ) + //if( m_ZoneIndex > 5 || m_ZoneIndex < 0) return FALSE; // 임시코드 ( 2002.03.24 ) int max_xx = pMap->m_sizeRegion.cx; int max_zz = pMap->m_sizeRegion.cy; int min_x = (int)(m_fCurX - NPC_VIEW_RANGE) / VIEW_DIST; @@ -4932,7 +4932,7 @@ BOOL CNpc::GetUserInViewRange(int x, int z) { if (!pUser) { continue; } - // Ÿ + // 가시 거리 계산 vEnd.Set(pUser->m_curx, 0, pUser->m_curz); fDis = GetDistance(vStart, vEnd); if (fDis <= NPC_VIEW_RANGE) { @@ -4985,7 +4985,7 @@ void CNpc::SendAttackSuccess(CIOCPort * pIOCP, BYTE byResult, int tuid, short sD //TRACE("Npc - SendAttackSuccess() : [sid=%d, tid=%d, result=%d], damage=%d, hp = %d\n", sid, tid, byResult, sDamage, sHP); //SetShort( buff, sMaxHP, send_index ); - SendAll(pIOCP, buff, send_index); // thread send + SendAll(pIOCP, buff, send_index); // thread 에서 send } __Vector3 CNpc::CalcAdaptivePosition(__Vector3 vPosOrig, __Vector3 vPosDest, float fAttackDistance) { @@ -4997,10 +4997,10 @@ __Vector3 CNpc::CalcAdaptivePosition(__Vector3 vPosOrig, __Vector3 vPosDest, flo return vReturn; } -// ȭ ȿ ִ Ǵ +// 현재 몹을 기준으로 한 화면 범위안에 있는지 판단 void CNpc::IsUserInSight() { CUser * pUser = NULL; - // Npc User Ÿ 50 ȿ ִ Ը,, ġ ش.. + // Npc와 User와의 거리가 50미터 안에 있는 사람에게만,, 경험치를 준다.. int iSearchRange = NPC_EXP_RANGE; __Vector3 vStart, vEnd; @@ -5022,11 +5022,11 @@ void CNpc::IsUserInSight() { fDis = GetDistance(vStart, vEnd); if ((int)fDis <= iSearchRange) { - // ִ Ʈ ٸ + // 갖고있는 리스트상의 유저와 같다면 if (m_DamagedUserList[i].iUid == pUser->m_iUserId) { - // ID ؼ ϸ + // 최종 ID를 비교해서 동일하면 if (N3::iequals(m_DamagedUserList[i].strUserID, pUser->m_strUserID)) { - // ̶ Ѵٴ ǥø Ѵ + // 이때서야 존재한다는 표시를 한다 m_DamagedUserList[i].bIs = TRUE; } } @@ -5281,7 +5281,7 @@ BYTE CNpc::GetHitRate(float rate) { } BOOL CNpc::IsLevelCheck(int iLevel) { - // ,,, ٷ + // 몬스터의 레벨보다 낮으면,,, 바로 공격 if (iLevel <= m_sLevel) { return FALSE; } @@ -5290,7 +5290,7 @@ BOOL CNpc::IsLevelCheck(int iLevel) { compLevel = iLevel - m_sLevel; - // ؼ 8̸̸ ٷ + // 레벨을 비교해서 8미만이면 바로 공격 if (compLevel < 8) { return FALSE; } @@ -5307,7 +5307,7 @@ BOOL CNpc::IsHPCheck(int iHP) { return FALSE; } -// н ε带 Ұ üũϴ ƾ.. +// 패스 파인드를 할것인지를 체크하는 루틴.. BOOL CNpc::IsPathFindCheck(float fDistance) { int nX = 0, nZ = 0; __Vector3 vStart, vEnd, vDis, vOldDis; @@ -5391,7 +5391,7 @@ BOOL CNpc::IsPathFindCheck(float fDistance) { return TRUE; } -// н ε带 ʰ ݴ ƾ.. +// 패스 파인드를 하지 않고 공격대상으로 가는 루틴.. void CNpc::IsNoPathFind(float fDistance) { ClearPathFindData(); m_bPathFlag = TRUE; @@ -5406,7 +5406,7 @@ void CNpc::IsNoPathFind(float fDistance) { int nError = 0; fDis = GetDistance(vStart, vEnd); - if (fDis > NPC_MAX_MOVE_RANGE) { // 100 ĵ·.. + if (fDis > NPC_MAX_MOVE_RANGE) { // 100미터 보다 넓으면 스탠딩상태로.. ClearPathFindData(); TRACE("#### Npc-IsNoPathFind Fail : NPC_MAX_MOVE_RANGE overflow .. [nid = %d, name=%s], cur_x=%.2f, z=%.2f, " "dest_x=%.2f, dest_z=%.2f, fDis=%.2f#####\n", @@ -5461,7 +5461,7 @@ void CNpc::IsNoPathFind(float fDistance) { m_iAniFrameIndex = count; } -// NPC . +// NPC 가 가진 아이템을 떨군다. void CNpc::GiveNpcHaveItem(CIOCPort * pIOCP) { char pBuf[1024]; ::ZeroMemory(pBuf, 1024); @@ -5486,13 +5486,13 @@ void CNpc::GiveNpcHaveItem(CIOCPort * pIOCP) { iRandom = myrand(70, 100); iMoney = m_iMoney * iRandom / 100; //m_iMoney, m_iItem; - _NpcGiveItem m_GiveItemList[NPC_HAVE_ITEM_LIST]; // Npc ItemList + _NpcGiveItem m_GiveItemList[NPC_HAVE_ITEM_LIST]; // Npc의 ItemList if (iMoney <= 0) { nCount = 0; } else { m_GiveItemList[0].sSid = TYPE_MONEY_SID; if (iMoney > 32767) { - iMoney = 32000; // sungyong : shorṯ ,, + iMoney = 32000; // sungyong : short형이기 때문에,, m_GiveItemList[0].count = iMoney; } else { m_GiveItemList[0].count = iMoney; @@ -5512,8 +5512,8 @@ void CNpc::GiveNpcHaveItem(CIOCPort * pIOCP) { if (iPer == 0) { continue; } - if (iRandom <= iPer) { // 켱 ⺻̺ ϱ - if (j == 1) { // .. + if (iRandom <= iPer) { // 우선 기본테이블를 참조하기위해 + if (j == 1) { // 아이템 생성.. iMakeItemCode = ItemProdution(m_pMain->m_NpcItem.m_ppItem[i][j]); if (iMakeItemCode == 0) { continue; @@ -5523,7 +5523,7 @@ void CNpc::GiveNpcHaveItem(CIOCPort * pIOCP) { m_GiveItemList[nCount].count = 1; } else { m_GiveItemList[nCount].sSid = m_pMain->m_NpcItem.m_ppItem[i][j]; - if (COMPARE(m_GiveItemList[nCount].sSid, ARROW_MIN, ARROW_MAX)) { // ȭ̶ + if (COMPARE(m_GiveItemList[nCount].sSid, ARROW_MIN, ARROW_MAX)) { // 화살이라면 m_GiveItemList[nCount].count = 20; } else { m_GiveItemList[nCount].count = 1; @@ -5564,7 +5564,7 @@ void CNpc::GiveNpcHaveItem(CIOCPort * pIOCP) { //TRACE("Npc-GiveNpcHaveItem() : [nid - %d,%s, giveme=%d, count=%d, num=%d], list=%d, count=%d\n", m_sNid+NPC_BAND, m_strName, m_sMaxDamageUserid, nCount, i, m_GiveItemList[i].sSid, m_GiveItemList[i].count); } - SendAll(pIOCP, pBuf, index); // thread send + SendAll(pIOCP, pBuf, index); // thread 에서 send } void CNpc::Yaw2D(float fDirX, float fDirZ, float & fYawResult) { @@ -5597,7 +5597,7 @@ __Vector3 CNpc::ComputeDestPos(__Vector3 vCur, float fDegree, float fDegreeOffse int CNpc::GetPartyDamage(int iNumber) { int nDamage = 0; CUser * pUser = NULL; - for (int i = 0; i < NPC_HAVE_USER_LIST; i++) // ϴ Ʈ ˻Ѵ. + for (int i = 0; i < NPC_HAVE_USER_LIST; i++) // 일단 리스트를 검색한다. { if (m_DamagedUserList[i].iUid < 0 || m_DamagedUserList[i].nDamage <= 0) { continue; @@ -5620,7 +5620,7 @@ int CNpc::GetPartyDamage(int iNumber) { } void CNpc::NpcTypeParser() { - // İ Ѵ + // 선공인지 후공인지를 결정한다 switch (m_byActType) { case 1: m_tNpcAttType = m_tNpcOldAttType = 0; @@ -5658,10 +5658,10 @@ void CNpc::HpChange(CIOCPort * pIOCP) { return; } if (m_iHP < 1) { - return; // ױ϶ ȸ ȵ... + return; // 죽기직전일때는 회복 안됨... } if (m_iHP == m_iMaxHP) { - return; // HP ̱ .. + return; // HP가 만빵이기 때문에.. } if (pIOCP == NULL) { return; @@ -5696,11 +5696,11 @@ void CNpc::HpChange(CIOCPort * pIOCP) { SetDWORD(buff, m_iHP, send_index); SetDWORD(buff, m_iMaxHP, send_index); - SendAll(pIOCP, buff, send_index); // thread send + SendAll(pIOCP, buff, send_index); // thread 에서 send } BOOL CNpc::IsInExpRange(CUser * pUser) { - // Npc User Ÿ 50 ȿ ִ Ը,, ġ ش.. + // Npc와 User와의 거리가 50미터 안에 있는 사람에게만,, 경험치를 준다.. int iSearchRange = NPC_EXP_RANGE; __Vector3 vStart, vEnd; float fDis = 0.0f; @@ -5718,7 +5718,7 @@ BOOL CNpc::IsInExpRange(CUser * pUser) { } BOOL CNpc::CheckFindEnermy() { - // ͵ ϹǷ + // 경비병은 몬스터도 공격하므로 제외 if (m_tNpcType == NPC_GUARD || m_tNpcType == NPC_PATROL_GUARD || m_tNpcType == NPC_STORE_GUARD) { // || m_tNpcType == NPCTYPE_MONSTER) return TRUE; @@ -5753,15 +5753,15 @@ void CNpc::MSpChange(int type, int amount) { } else if (m_sMP > m_sMaxMP) { m_sMP = m_sMaxMP; } - } else if (type == 3) { // monster SP .. + } else if (type == 3) { // monster는 SP가 없음.. } } void CNpc::ItemWoreOut(int type, int damage) { - //  ҷ.. + // 몬스터의 방어구 내구력 감소로직.. } -int CNpc::ItemProdution(int item_number) // +int CNpc::ItemProdution(int item_number) // 아이템 제작 { int iItemNumber = 0, iRandom = 0, i = 0, iItemGrade = 0, iItemLevel = 0; int iDefault = 0, iItemCode = 0, iItemKey = 0, iRand2 = 0, iRand3 = 0, iRand4 = 0, iRand5 = 0; @@ -5778,9 +5778,9 @@ void CNpc::ItemWoreOut(int type, int damage) { } iItemLevel = m_sLevel / 5; - if (COMPARE(iRandom, 1, 4001)) { // ⱸ + if (COMPARE(iRandom, 1, 4001)) { // 무기구 아이템 iDefault = 100000000; - iRandom = myrand(1, 10000); // (ܰ, , ,,,,) + iRandom = myrand(1, 10000); // 무기의 종류를 결정(단검, 검, 도끼,,,,) if (COMPARE(iRandom, 1, 701)) { iRand2 = 10000000; } else if (COMPARE(iRandom, 701, 1401)) { @@ -5806,31 +5806,31 @@ void CNpc::ItemWoreOut(int type, int damage) { if (iTemp1 == 0) { return 0; } - iItemCode = iTemp1 * 100000; // úǥ + iItemCode = iTemp1 * 100000; // 루팅분포표 참조 - iRand3 = myrand(1, 10000); // (, ī罺) + iRand3 = myrand(1, 10000); // 종족(엘모, 카루스) if (COMPARE(iRand3, 1, 5000)) { iRand3 = 10000; } else { iRand3 = 50000; } - iRand4 = myrand(1, 10000); // Ѽ, չ + iRand4 = myrand(1, 10000); // 한손, 양손무기인지를 결정 if (COMPARE(iRand4, 1, 5000)) { iRand4 = 0; } else { iRand4 = 5000000; } - iRandom = GetItemCodeNumber(iItemLevel, 1); // ̸ǥ + iRandom = GetItemCodeNumber(iItemLevel, 1); // 레이매직표 적용 //TRACE("ItemProdution : GetItemCodeNumber() = %d, iRand2=%d, iRand3=%d, iRand4=%d\n", iRandom, iRand2, iRand3, iRand4); - if (iRandom == -1) { // ߸ + if (iRandom == -1) { // 잘못된 아이템 생성실패 return 0; } iRand5 = iRandom * 10; iItemNumber = iDefault + iItemCode + iRand2 + iRand3 + iRand4 + iRand5 + iItemGrade; //TRACE("ItemProdution : Weapon Success item_number = %d, default=%d, itemcode=%d, iRand2=%d, iRand3=%d, iRand4=%d, iRand5, iItemGrade=%d\n", iItemNumber, iDefault, iItemCode, iRand2, iRand3, iRand4, iRand5, iItemGrade); - } else if (COMPARE(iRandom, 4001, 8001)) { //  + } else if (COMPARE(iRandom, 4001, 8001)) { // 방어구 아이템 iDefault = 200000000; iTemp1 = GetWeaponItemCodeNumber(2); @@ -5838,33 +5838,33 @@ void CNpc::ItemWoreOut(int type, int damage) { if (iTemp1 == 0) { return 0; } - iItemCode = iTemp1 * 1000000; // úǥ + iItemCode = iTemp1 * 1000000; // 루팅분포표 참조 - if (m_byMaxDamagedNation == KARUS_MAN) { // - iRandom = myrand(0, 10000); // + if (m_byMaxDamagedNation == KARUS_MAN) { // 종족 + iRandom = myrand(0, 10000); // 직업의 갑옷을 결정 if (COMPARE(iRandom, 0, 2000)) { iRand2 = 0; - iRand3 = 10000; // 簩 ũƷ + iRand3 = 10000; // 전사갑옷은 아크투아렉만 가지도록 } else if (COMPARE(iRandom, 2000, 4000)) { iRand2 = 40000000; - iRand3 = 20000; // αװ Ʒ + iRand3 = 20000; // 로그갑옷은 투아렉만 가지도록 } else if (COMPARE(iRandom, 4000, 6000)) { iRand2 = 60000000; - iRand3 = 30000; // 簩 Ŭ Ʒ + iRand3 = 30000; // 마법사갑옷은 링클 투아렉만 가지도록 } else if (COMPARE(iRandom, 6000, 10001)) { iRand2 = 80000000; iRandom = myrand(0, 10000); if (COMPARE(iRandom, 0, 5000)) { - iRand3 = 20000; // Ʒ + iRand3 = 20000; // 사제갑옷은 투아렉 } else { - iRand3 = 40000; // ǻƷ + iRand3 = 40000; // 사제갑옷은 퓨리투아렉 } } } else if (m_byMaxDamagedNation == ELMORAD_MAN) { - iRandom = myrand(0, 10000); // + iRandom = myrand(0, 10000); // 직업의 갑옷을 결정 if (COMPARE(iRandom, 0, 3300)) { iRand2 = 0; - iItemKey = myrand(0, 10000); // 簩 + iItemKey = myrand(0, 10000); // 전사갑옷은 모든 종족이 가짐 if (COMPARE(iItemKey, 0, 3333)) { iRand3 = 110000; } else if (COMPARE(iItemKey, 3333, 6666)) { @@ -5874,7 +5874,7 @@ void CNpc::ItemWoreOut(int type, int damage) { } } else if (COMPARE(iRandom, 3300, 5600)) { iRand2 = 40000000; - iItemKey = myrand(0, 10000); // αװ ڿ ڸ + iItemKey = myrand(0, 10000); // 로그갑옷은 남자와 여자만 가짐 if (COMPARE(iItemKey, 0, 5000)) { iRand3 = 120000; } else { @@ -5882,7 +5882,7 @@ void CNpc::ItemWoreOut(int type, int damage) { } } else if (COMPARE(iRandom, 5600, 7800)) { iRand2 = 60000000; - iItemKey = myrand(0, 10000); // 簩 ڿ ڸ + iItemKey = myrand(0, 10000); // 마법사갑옷은 남자와 여자만 가짐 if (COMPARE(iItemKey, 0, 5000)) { iRand3 = 120000; } else { @@ -5890,7 +5890,7 @@ void CNpc::ItemWoreOut(int type, int damage) { } } else if (COMPARE(iRandom, 7800, 10001)) { iRand2 = 80000000; - iItemKey = myrand(0, 10000); // ڿ ڸ + iItemKey = myrand(0, 10000); // 사제갑옷은 남자와 여자만 가짐 if (COMPARE(iItemKey, 0, 5000)) { iRand3 = 120000; } else { @@ -5899,7 +5899,7 @@ void CNpc::ItemWoreOut(int type, int damage) { } } - iTemp2 = myrand(0, 10000); // + iTemp2 = myrand(0, 10000); // 몸의 부위 아이템 결정 if (COMPARE(iTemp2, 0, 2000)) { iRand4 = 1000; } else if (COMPARE(iTemp2, 2000, 4000)) { @@ -5911,17 +5911,17 @@ void CNpc::ItemWoreOut(int type, int damage) { } else if (COMPARE(iTemp2, 8000, 10001)) { iRand4 = 5000; } - iRandom = GetItemCodeNumber(iItemLevel, 2); // ̸ǥ - if (iRandom == -1) { // ߸ + iRandom = GetItemCodeNumber(iItemLevel, 2); // 레이매직표 적용 + if (iRandom == -1) { // 잘못된 아이템 생성실패 return 0; } iRand5 = iRandom * 10; iItemNumber = iDefault + iRand2 + iItemCode + iRand3 + iRand4 + iRand5 + - iItemGrade; // iItemGrade : ޻ǥ + iItemGrade; // iItemGrade : 아이템 등급생성표 적용 //TRACE("ItemProdution : Defensive Success item_number = %d, default=%d, iRand2=%d, itemcode=%d, iRand3=%d, iRand4=%d, iRand5, iItemGrade=%d\n", iItemNumber, iDefault, iRand2, iItemCode, iRand3, iRand4, iRand5, iItemGrade); - } else if (COMPARE(iRandom, 8001, 10001)) { // Ǽ縮 + } else if (COMPARE(iRandom, 8001, 10001)) { // 악세사리 아이템 iDefault = 300000000; - iRandom = myrand(0, 10000); // Ǽ縮 (Ͱ, , , Ʈ) + iRandom = myrand(0, 10000); // 악세사리 종류결정(귀고리, 목걸이, 반지, 벨트) if (COMPARE(iRandom, 0, 2500)) { iRand2 = 10000000; } else if (COMPARE(iRandom, 2500, 5000)) { @@ -5931,15 +5931,15 @@ void CNpc::ItemWoreOut(int type, int damage) { } else if (COMPARE(iRandom, 7500, 10001)) { iRand2 = 40000000; } - iRand3 = myrand(1, 10000); // (, ī罺) + iRand3 = myrand(1, 10000); // 종족(엘모라드, 카루스) if (COMPARE(iRand3, 1, 5000)) { iRand3 = 110000; } else { iRand3 = 150000; } - iRandom = GetItemCodeNumber(iItemLevel, 3); // ̸ǥ + iRandom = GetItemCodeNumber(iItemLevel, 3); // 레이매직표 적용 //TRACE("ItemProdution : GetItemCodeNumber() = %d\n", iRandom); - if (iRandom == -1) { // ߸ + if (iRandom == -1) { // 잘못된 아이템 생성실패 return 0; } iRand4 = iRandom * 10; @@ -6006,10 +6006,10 @@ int CNpc::GetWeaponItemCodeNumber(int item_type) { _MAKE_WEAPON * pItemData = NULL; iRandom = myrand(0, 1000); - if (item_type == 1) { // ⱸ + if (item_type == 1) { // 무기구 iItem_level = m_sLevel / 10; pItemData = m_pMain->m_MakeWeaponItemArray.GetData(iItem_level); - } else if (item_type == 2) { //  + } else if (item_type == 2) { // 방어구 iItem_level = m_sLevel / 10; pItemData = m_pMain->m_MakeDefensiveItemArray.GetData(iItem_level); } @@ -6083,33 +6083,33 @@ int CNpc::GetItemCodeNumber(int level, int item_type) { } switch (iItemType) { - case 0: // ߸ + case 0: // 잘못된 아이템 iItemCode = 0; break; case 1: // lare item - if (item_type == 1) { // ⱸ + if (item_type == 1) { // 무기구 iItemCode = myrand(16, 24); - } else if (item_type == 2) { //  + } else if (item_type == 2) { // 방어구 iItemCode = myrand(12, 24); - } else if (item_type == 3) { // Ǽ縮 + } else if (item_type == 3) { // 악세사리 iItemCode = myrand(0, 10); } break; case 2: // magic item - if (item_type == 1) { // ⱸ + if (item_type == 1) { // 무기구 iItemCode = myrand(6, 15); - } else if (item_type == 2) { //  + } else if (item_type == 2) { // 방어구 iItemCode = myrand(6, 11); - } else if (item_type == 3) { // Ǽ縮 + } else if (item_type == 3) { // 악세사리 iItemCode = myrand(0, 10); } break; case 3: // general item - if (item_type == 1) { // ⱸ + if (item_type == 1) { // 무기구 iItemCode = 5; - } else if (item_type == 2) { //  + } else if (item_type == 2) { // 방어구 iItemCode = 5; - } else if (item_type == 3) { // Ǽ縮 + } else if (item_type == 3) { // 악세사리 iItemCode = myrand(0, 10); } break; @@ -6123,7 +6123,7 @@ void CNpc::DurationMagic_4(CIOCPort * pIOCP, float currenttime) { char send_buff[128]; memset(send_buff, 0x00, 128); - // Dungeon Work : ش Ͱ ¸ ·.... + // Dungeon Work : 던젼몬스터의 경우 해당 대장몬스터가 죽은경우 나의 상태를 죽은 상태로.... if (m_ZoneIndex < 0 || m_ZoneIndex > m_pMain->g_arZone.size()) { TRACE("#### Npc-DurationMagic_4() ZoneIndex Fail : [nid=%d, name=%s], zoneindex=%d #####\n", m_sNid + NPC_BAND, m_strName, m_ZoneIndex); @@ -6147,11 +6147,11 @@ void CNpc::DurationMagic_4(CIOCPort * pIOCP, float currenttime) { TRACE("#### Npc-DurationMagic_4() room Fail : [nid=%d, name=%s], m_byDungeonFamily=%d #####\n", m_sNid + NPC_BAND, m_strName, m_byDungeonFamily); } else { - //if( pMap->m_arDungeonBossMonster[m_byDungeonFamily] == 0 ) { // Ͱ - if (pRoom->m_byStatus == 3) { // Ŭ Ȱ + //if( pMap->m_arDungeonBossMonster[m_byDungeonFamily] == 0 ) { // 대장 몬스터가 죽은 경우 + if (pRoom->m_byStatus == 3) { // 방이 클리어 된경우 if (m_NpcState != NPC_DEAD) { if (m_byRegenType == 0) { - m_byRegenType = 2; // ʵ,, + m_byRegenType = 2; // 리젠이 되지 않도록,, Dead(pIOCP, 1); return; } @@ -6169,7 +6169,7 @@ void CNpc::DurationMagic_4(CIOCPort * pIOCP, float currenttime) { m_MagicType4[i].fStartTime = 0.0f; m_MagicType4[i].byAmount = 0; buff_type = i + 1; - if (i == 5) { // ӵ ... ɷġ.. + if (i == 5) { // 속도 관련... 능력치.. m_fSpeed_1 = m_fOldSpeed_1; m_fSpeed_2 = m_fOldSpeed_2; } @@ -6185,32 +6185,32 @@ void CNpc::DurationMagic_4(CIOCPort * pIOCP, float currenttime) { } */ } -// ȭǴ ٲپش... +// 변화되는 몬스터의 정보를 바꾸어준다... void CNpc::ChangeMonsterInfomation(int iChangeType) { // sungyong test //m_sChangeSid = 500; m_byChangeType = 2; if (m_sChangeSid == 0 || m_byChangeType == 0) { - return; // ʴ + return; // 변하지 않는 몬스터 } if (m_NpcState != NPC_DEAD) { - return; // + return; // 죽은 상태 } CNpcTable * pNpcTable = NULL; if (m_byInitMoveType >= 0 && m_byInitMoveType < 100) { - if (iChangeType == 1) { // ٸ ͷ ȯ.. + if (iChangeType == 1) { // 다른 몬스터로 변환.. pNpcTable = m_pMain->m_arMonTable.GetData(m_sChangeSid); - } else if (iChangeType == 2) { // ͷ ȯ.. + } else if (iChangeType == 2) { // 원래의 몬스터로 변환.. pNpcTable = m_pMain->m_arMonTable.GetData(m_sSid); } if (pNpcTable == NULL) { TRACE("##### ChangeMonsterInfomation Sid Fail -- Sid = %d #####\n", m_sChangeSid); } } else if (m_byInitMoveType >= 100) { - if (iChangeType == 1) { // ٸ ͷ ȯ.. + if (iChangeType == 1) { // 다른 몬스터로 변환.. pNpcTable = m_pMain->m_arNpcTable.GetData(m_sChangeSid); - } else if (iChangeType == 2) { // ͷ ȯ.. + } else if (iChangeType == 2) { // 원래의 몬스터로 변환.. pNpcTable = m_pMain->m_arNpcTable.GetData(m_sSid); } if (pNpcTable == NULL) { @@ -6218,55 +6218,55 @@ void CNpc::ChangeMonsterInfomation(int iChangeType) { } } - // ...... + // 정보수정...... _tcscpy(m_strName, pNpcTable->m_strName); // MONSTER(NPC) Name m_sPid = pNpcTable->m_sPid; // MONSTER(NPC) Picture ID - m_sSize = pNpcTable->m_sSize; // ij (100 ۼƮ ) - m_iWeapon_1 = pNpcTable->m_iWeapon_1; // 빫 - m_iWeapon_2 = pNpcTable->m_iWeapon_2; // 빫 - m_byGroup = pNpcTable->m_byGroup; // Ҽ - m_byActType = pNpcTable->m_byActType; // ൿ - m_byRank = pNpcTable->m_byRank; // - m_byTitle = pNpcTable->m_byTitle; // + m_sSize = pNpcTable->m_sSize; // 캐릭터의 비율(100 퍼센트 기준) + m_iWeapon_1 = pNpcTable->m_iWeapon_1; // 착용무기 + m_iWeapon_2 = pNpcTable->m_iWeapon_2; // 착용무기 + m_byGroup = pNpcTable->m_byGroup; // 소속집단 + m_byActType = pNpcTable->m_byActType; // 행동패턴 + m_byRank = pNpcTable->m_byRank; // 작위 + m_byTitle = pNpcTable->m_byTitle; // 지위 m_iSellingGroup = pNpcTable->m_iSellingGroup; m_sLevel = pNpcTable->m_sLevel; // level - m_iExp = pNpcTable->m_iExp; // ġ + m_iExp = pNpcTable->m_iExp; // 경험치 m_iLoyalty = pNpcTable->m_iLoyalty; // loyalty - m_iHP = pNpcTable->m_iMaxHP; // ִ HP - m_iMaxHP = pNpcTable->m_iMaxHP; // HP - m_sMP = pNpcTable->m_sMaxMP; // ִ MP - m_sMaxMP = pNpcTable->m_sMaxMP; // MP - m_sAttack = pNpcTable->m_sAttack; // ݰ - m_sDefense = pNpcTable->m_sDefense; //  - m_sHitRate = pNpcTable->m_sHitRate; // Ÿݼ - m_sEvadeRate = pNpcTable->m_sEvadeRate; // ȸǼ - m_sDamage = pNpcTable->m_sDamage; // ⺻ - m_sAttackDelay = pNpcTable->m_sAttackDelay; // ݵ - m_sSpeed = pNpcTable->m_sSpeed; // ̵ӵ - m_fSpeed_1 = (float)pNpcTable->m_bySpeed_1; // ⺻ ̵ Ÿ - m_fSpeed_2 = (float)pNpcTable->m_bySpeed_2; // ٴ ̵ Ÿ.. - m_fOldSpeed_1 = (float)pNpcTable->m_bySpeed_1; // ⺻ ̵ Ÿ - m_fOldSpeed_2 = (float)pNpcTable->m_bySpeed_2; // ٴ ̵ Ÿ.. - m_sStandTime = pNpcTable->m_sStandTime; // ִ ð - m_iMagic1 = pNpcTable->m_iMagic1; // 븶 1 - m_iMagic2 = pNpcTable->m_iMagic2; // 븶 2 - m_iMagic3 = pNpcTable->m_iMagic3; // 븶 3 - m_sFireR = pNpcTable->m_sFireR; // ȭ ׷ - m_sColdR = pNpcTable->m_sColdR; // ñ ׷ - m_sLightningR = pNpcTable->m_sLightningR; // ׷ - m_sMagicR = pNpcTable->m_sMagicR; // ׷ - m_sDiseaseR = pNpcTable->m_sDiseaseR; // ׷ - m_sPoisonR = pNpcTable->m_sPoisonR; // ׷ - m_sLightR = pNpcTable->m_sLightR; // ׷ + m_iHP = pNpcTable->m_iMaxHP; // 최대 HP + m_iMaxHP = pNpcTable->m_iMaxHP; // 현재 HP + m_sMP = pNpcTable->m_sMaxMP; // 최대 MP + m_sMaxMP = pNpcTable->m_sMaxMP; // 현재 MP + m_sAttack = pNpcTable->m_sAttack; // 공격값 + m_sDefense = pNpcTable->m_sDefense; // 방어값 + m_sHitRate = pNpcTable->m_sHitRate; // 타격성공률 + m_sEvadeRate = pNpcTable->m_sEvadeRate; // 회피성공률 + m_sDamage = pNpcTable->m_sDamage; // 기본 데미지 + m_sAttackDelay = pNpcTable->m_sAttackDelay; // 공격딜레이 + m_sSpeed = pNpcTable->m_sSpeed; // 이동속도 + m_fSpeed_1 = (float)pNpcTable->m_bySpeed_1; // 기본 이동 타입 + m_fSpeed_2 = (float)pNpcTable->m_bySpeed_2; // 뛰는 이동 타입.. + m_fOldSpeed_1 = (float)pNpcTable->m_bySpeed_1; // 기본 이동 타입 + m_fOldSpeed_2 = (float)pNpcTable->m_bySpeed_2; // 뛰는 이동 타입.. + m_sStandTime = pNpcTable->m_sStandTime; // 서있는 시간 + m_iMagic1 = pNpcTable->m_iMagic1; // 사용마법 1 + m_iMagic2 = pNpcTable->m_iMagic2; // 사용마법 2 + m_iMagic3 = pNpcTable->m_iMagic3; // 사용마법 3 + m_sFireR = pNpcTable->m_sFireR; // 화염 저항력 + m_sColdR = pNpcTable->m_sColdR; // 냉기 저항력 + m_sLightningR = pNpcTable->m_sLightningR; // 전기 저항력 + m_sMagicR = pNpcTable->m_sMagicR; // 마법 저항력 + m_sDiseaseR = pNpcTable->m_sDiseaseR; // 저주 저항력 + m_sPoisonR = pNpcTable->m_sPoisonR; // 독 저항력 + m_sLightR = pNpcTable->m_sLightR; // 빛 저항력 m_fBulk = (float)(((double)pNpcTable->m_sBulk / 100) * ((double)pNpcTable->m_sSize / 100)); - m_bySearchRange = pNpcTable->m_bySearchRange; // Ž - m_byAttackRange = pNpcTable->m_byAttackRange; // Ÿ - m_byTracingRange = pNpcTable->m_byTracingRange; // ߰ݰŸ - m_sAI = pNpcTable->m_sAI; // ΰ ε + m_bySearchRange = pNpcTable->m_bySearchRange; // 적 탐지 범위 + m_byAttackRange = pNpcTable->m_byAttackRange; // 사정거리 + m_byTracingRange = pNpcTable->m_byTracingRange; // 추격거리 + m_sAI = pNpcTable->m_sAI; // 인공지능 인덱스 m_tNpcType = pNpcTable->m_tNpcType; // NPC Type - m_byFamilyType = pNpcTable->m_byFamilyType; // ̿ 踦 Ѵ. - m_iMoney = pNpcTable->m_iMoney; // - m_iItem = pNpcTable->m_iItem; // + m_byFamilyType = pNpcTable->m_byFamilyType; // 몹들사이에서 가족관계를 결정한다. + m_iMoney = pNpcTable->m_iMoney; // 떨어지는 돈 + m_iItem = pNpcTable->m_iItem; // 떨어지는 아이템 m_tNpcLongType = pNpcTable->m_byDirectAttack; m_byWhatAttackType = pNpcTable->m_byMagicAttack; } @@ -6276,19 +6276,19 @@ void CNpc::DurationMagic_3(CIOCPort * pIOCP, float currenttime) { for (int i = 0; i < MAX_MAGIC_TYPE3; i++) { if (m_MagicType3[i].byHPDuration) { - if (currenttime >= (m_MagicType3[i].fStartTime + m_MagicType3[i].byHPInterval)) { // 2ʰ + if (currenttime >= (m_MagicType3[i].fStartTime + m_MagicType3[i].byHPInterval)) { // 2초간격으로 m_MagicType3[i].byHPInterval += 2; //TRACE("DurationMagic_3,, [%d] curtime = %.2f, dur=%.2f, nid=%d, damage=%d\n", i, currenttime, m_MagicType3[i].fStartTime, m_sNid+NPC_BAND, m_MagicType3[i].sHPAmount); if (m_MagicType3[i].sHPAmount >= 0) { // healing } else { - // damage ... + // damage 계산식... duration_damage = m_MagicType3[i].sHPAmount; duration_damage = abs(duration_damage); if (SetDamage(0, duration_damage, "**duration**", m_MagicType3[i].sHPAttackUserID, pIOCP) == FALSE) { - // Npc ,, - SendExpToUserList(); // ġ й!! + // Npc가 죽은 경우,, + SendExpToUserList(); // 경험치 분배!! SendDead(pIOCP); SendAttackSuccess(pIOCP, MAGIC_ATTACK_TARGET_DEAD, m_MagicType3[i].sHPAttackUserID, duration_damage, m_iHP, 1, DURATION_ATTACK); @@ -6306,7 +6306,7 @@ void CNpc::DurationMagic_3(CIOCPort * pIOCP, float currenttime) { } } - if (currenttime >= (m_MagicType3[i].fStartTime + m_MagicType3[i].byHPDuration)) { // ݽð.. + if (currenttime >= (m_MagicType3[i].fStartTime + m_MagicType3[i].byHPDuration)) { // 총 공격시간.. m_MagicType3[i].fStartTime = 0.0f; m_MagicType3[i].byHPDuration = 0; m_MagicType3[i].byHPInterval = 2; @@ -6320,7 +6320,7 @@ void CNpc::DurationMagic_3(CIOCPort * pIOCP, float currenttime) { } ///////////////////////////////////////////////////////////////////////////// -// NPC ڴ°. +// NPC가 잠자는경우. // void CNpc::NpcSleeping(CIOCPort * pIOCP) { if (cur_test) { @@ -6336,10 +6336,10 @@ void CNpc::NpcSleeping(CIOCPort * pIOCP) { } */ // ~sungyong test - if (m_pMain->m_byNight == 1) { // + if (m_pMain->m_byNight == 1) { // 낮 m_NpcState = NPC_STANDING; m_Delay = 0; - } else { // + } else { // 밤 m_NpcState = NPC_SLEEPING; m_Delay = m_sStandTime; } @@ -6348,12 +6348,12 @@ void CNpc::NpcSleeping(CIOCPort * pIOCP) { } ///////////////////////////////////////////////////////////////////////////// -// Ͱ ·.......... +// 몬스터가 기절상태로.......... void CNpc::NpcFainting(CIOCPort * pIOCP, float currenttime) { if (cur_test) { NpcTrace("NpcFainting()"); } - // 2ʵ ִٰ,, standing·.... + // 2초동안 기절해 있다가,, standing상태로.... if (currenttime > (m_fFaintingTime + FAINTING_TIME)) { m_NpcState = NPC_STANDING; m_Delay = 0; @@ -6363,7 +6363,7 @@ void CNpc::NpcFainting(CIOCPort * pIOCP, float currenttime) { } ///////////////////////////////////////////////////////////////////////////// -// Ͱ ġ·.......... +// 몬스터가 치료상태로.......... void CNpc::NpcHealing(CIOCPort * pIOCP) { if (cur_test) { NpcTrace("NpcHealing()"); @@ -6377,7 +6377,7 @@ void CNpc::NpcHealing(CIOCPort * pIOCP) { return; } - // ġ ġᰡ ƴ Ǵ.. + // 치료대상이 치료가 다 됐는지를 판단.. CNpc * pNpc = NULL; int nID = m_Target.id; BOOL bFlag = FALSE; @@ -6394,7 +6394,7 @@ void CNpc::NpcHealing(CIOCPort * pIOCP) { if (ret == 0) { if (m_tNpcType == NPC_DOOR || m_tNpcType == NPC_ARTIFACT || m_tNpcType == NPC_PHOENIX_GATE || m_tNpcType == NPC_GATE_LEVER || m_tNpcType == NPC_DOMESTIC_ANIMAL || m_tNpcType == NPC_SPECIAL_GATE || - m_tNpcType == NPC_DESTORY_ARTIFACT) // ʵ.. + m_tNpcType == NPC_DESTORY_ARTIFACT) // 고정 경비병은 추적을 하지 않도록.. { m_NpcState = NPC_STANDING; InitTarget(); @@ -6404,20 +6404,20 @@ void CNpc::NpcHealing(CIOCPort * pIOCP) { } m_sStepCount = 0; m_byActionFlag = ATTACK_TO_TRACE; - m_NpcState = NPC_TRACING; // ϰ ( ) + m_NpcState = NPC_TRACING; // 공격하고 도망가는 유저를 따라 잡기위해(반응을 좀더 빠르게) m_Delay = 0; m_fDelayTime = TimeGet(); - return; // IsCloseTarget() x, y ϰ Delay = 0 + return; // IsCloseTarget()에 유저 x, y값을 갱신하고 Delay = 0으로 줌 } else if (ret == 2) { - //if(m_tNpcType == NPC_BOSS_MONSTER) { // ̸..... - if (m_tNpcLongType == 2) { // , () ̹Ƿ Ÿ ִ. + //if(m_tNpcType == NPC_BOSS_MONSTER) { // 대장 몬스터이면..... + if (m_tNpcLongType == 2) { // 직접, 간접(롱)공격이 가능한 몬스터 이므로 장거리 공격을 할 수 있다. m_Delay = LongAndMagicAttack(pIOCP); m_fDelayTime = TimeGet(); return; } else { if (m_tNpcType == NPC_DOOR || m_tNpcType == NPC_ARTIFACT || m_tNpcType == NPC_PHOENIX_GATE || m_tNpcType == NPC_GATE_LEVER || m_tNpcType == NPC_DOMESTIC_ANIMAL || m_tNpcType == NPC_SPECIAL_GATE || - m_tNpcType == NPC_DESTORY_ARTIFACT) // ʵ.. + m_tNpcType == NPC_DESTORY_ARTIFACT) // 고정 경비병은 추적을 하지 않도록.. { m_NpcState = NPC_STANDING; InitTarget(); @@ -6427,10 +6427,10 @@ void CNpc::NpcHealing(CIOCPort * pIOCP) { } m_sStepCount = 0; m_byActionFlag = ATTACK_TO_TRACE; - m_NpcState = NPC_TRACING; // ϰ ( ) + m_NpcState = NPC_TRACING; // 공격하고 도망가는 유저를 따라 잡기위해(반응을 좀더 빠르게) m_Delay = 0; m_fDelayTime = TimeGet(); - return; // IsCloseTarget() x, y ϰ Delay = 0 + return; // IsCloseTarget()에 유저 x, y값을 갱신하고 Delay = 0으로 줌 } } else if (ret == -1) { m_NpcState = NPC_STANDING; @@ -6443,7 +6443,7 @@ void CNpc::NpcHealing(CIOCPort * pIOCP) { if (nID >= NPC_BAND && nID < INVALID_BAND) { pNpc = m_pMain->m_arNpc.GetData(nID - NPC_BAND); - if (pNpc == NULL) { // User Invalid + if (pNpc == NULL) { // User 가 Invalid 한 경우 InitTarget(); } @@ -6451,11 +6451,11 @@ void CNpc::NpcHealing(CIOCPort * pIOCP) { InitTarget(); } - // ġ üũ - iHP = pNpc->m_iMaxHP * 0.9; // 90ۼƮ HP - if (pNpc->m_iHP >= iHP) { // Heal Ϸ.. + // 치료 체크여부 + iHP = pNpc->m_iMaxHP * 0.9; // 90퍼센트의 HP + if (pNpc->m_iHP >= iHP) { // Heal 완료상태.. InitTarget(); - } else { // Heal ֱ + } else { // Heal 해주기 memset(buff, 0x00, 256); send_index = 0; //SetByte( buff, AG_MAGIC_ATTACK_RESULT, send_index ); @@ -6478,7 +6478,7 @@ void CNpc::NpcHealing(CIOCPort * pIOCP) { } } - // ο ġ ãƼ ش + // 새로운 치료대상을 찾아서 힐해준다 int iMonsterNid = FindFriend(2); if (iMonsterNid == 0) { @@ -6539,7 +6539,7 @@ int CNpc::GetPartyExp(int party_level, int man, int nNpcExp) { return nPartyExp; } -void CNpc::ChangeAbility(int iChangeType) // iChangeType - 0:ɷġ ٿ, 1:ɷġ ȸ +void CNpc::ChangeAbility(int iChangeType) // iChangeType - 0:능력치 다운, 1:능력치 회복 { if (iChangeType > 2) { return; // @@ -6560,8 +6560,8 @@ int CNpc::GetPartyExp(int party_level, int man, int nNpcExp) { } } - // ...... - if (iChangeType == BATTLEZONE_OPEN) { // ɷġ ٿ + // 정보수정...... + if (iChangeType == BATTLEZONE_OPEN) { // 능력치 다운 nHP = pNpcTable->m_iMaxHP * 0.5; nAC = pNpcTable->m_sDefense * 0.2; nDamage = pNpcTable->m_sDamage * 0.3; @@ -6573,35 +6573,35 @@ int CNpc::GetPartyExp(int party_level, int man, int nNpcExp) { nFireR = pNpcTable->m_sFireR * 0.5; nColdR = pNpcTable->m_sColdR * 0.5; m_iMaxHP = nHP; - if (m_iHP > nHP) { // HP ٲ ڱ,, + if (m_iHP > nHP) { // HP도 바꿔야 겠군,, HpChange(&m_pMain->m_Iocport); } m_sDefense = nAC; m_sDamage = nDamage; - m_sFireR = nFireR; // ȭ ׷ - m_sColdR = nColdR; // ñ ׷ - m_sLightningR = nLightningR; // ׷ - m_sMagicR = nMagicR; // ׷ - m_sDiseaseR = nDiseaseR; // ׷ - m_sPoisonR = nPoisonR; // ׷ - m_sLightR = nLightR; // ׷ + m_sFireR = nFireR; // 화염 저항력 + m_sColdR = nColdR; // 냉기 저항력 + m_sLightningR = nLightningR; // 전기 저항력 + m_sMagicR = nMagicR; // 마법 저항력 + m_sDiseaseR = nDiseaseR; // 저주 저항력 + m_sPoisonR = nPoisonR; // 독 저항력 + m_sLightR = nLightR; // 빛 저항력 //TRACE("-- ChangeAbility down : nid=%d, name=%s, hp:%d->%d, damage=%d->%d\n", m_sNid+NPC_BAND, m_strName, pNpcTable->m_iMaxHP, nHP, pNpcTable->m_sDamage, nDamage); - } else if (iChangeType == BATTLEZONE_CLOSE) { // ɷġ ȸ - m_iMaxHP = pNpcTable->m_iMaxHP; // HP + } else if (iChangeType == BATTLEZONE_CLOSE) { // 능력치 회복 + m_iMaxHP = pNpcTable->m_iMaxHP; // 현재 HP //TRACE("++ ChangeAbility up : nid=%d, name=%s, hp:%d->%d, damage=%d->%d\n", m_sNid+NPC_BAND, m_strName, m_iHP, m_iMaxHP, pNpcTable->m_sDamage, nDamage); - if (m_iMaxHP > m_iHP) { // HP ٲ ڱ,, + if (m_iMaxHP > m_iHP) { // HP도 바꿔야 겠군,, m_iHP = m_iMaxHP - 50; HpChange(&m_pMain->m_Iocport); } - m_sDamage = pNpcTable->m_sDamage; // ⺻ - m_sDefense = pNpcTable->m_sDefense; //  - m_sFireR = pNpcTable->m_sFireR; // ȭ ׷ - m_sColdR = pNpcTable->m_sColdR; // ñ ׷ - m_sLightningR = pNpcTable->m_sLightningR; // ׷ - m_sMagicR = pNpcTable->m_sMagicR; // ׷ - m_sDiseaseR = pNpcTable->m_sDiseaseR; // ׷ - m_sPoisonR = pNpcTable->m_sPoisonR; // ׷ - m_sLightR = pNpcTable->m_sLightR; // ׷ + m_sDamage = pNpcTable->m_sDamage; // 기본 데미지 + m_sDefense = pNpcTable->m_sDefense; // 방어값 + m_sFireR = pNpcTable->m_sFireR; // 화염 저항력 + m_sColdR = pNpcTable->m_sColdR; // 냉기 저항력 + m_sLightningR = pNpcTable->m_sLightningR; // 전기 저항력 + m_sMagicR = pNpcTable->m_sMagicR; // 마법 저항력 + m_sDiseaseR = pNpcTable->m_sDiseaseR; // 저주 저항력 + m_sPoisonR = pNpcTable->m_sPoisonR; // 독 저항력 + m_sLightR = pNpcTable->m_sLightR; // 빛 저항력 } } @@ -6638,7 +6638,7 @@ BOOL CNpc::Teleport(CIOCPort * pIOCP) { if (pMap->m_pMap[nTileX][nTileZ].m_sEvent <= 0) { if (i >= 500) { - TRACE("### Teleport fail : sid = %d, nid = %d, zone=%d, loop = %d ̵ڸ ̻... ... x " + TRACE("### Teleport fail : sid = %d, nid = %d, zone=%d, loop = %d 나 이동자리가 이상해... 고쳐줘... x " "= %d, y = %d\n", m_sSid, m_sNid + NPC_BAND, m_sCurZone, i, nX, nZ); return FALSE; @@ -6654,7 +6654,7 @@ BOOL CNpc::Teleport(CIOCPort * pIOCP) { Setfloat(buff, m_fCurX, send_index); Setfloat(buff, m_fCurZ, send_index); Setfloat(buff, m_fCurY, send_index); - SendAll(pIOCP, buff, send_index); // thread send + SendAll(pIOCP, buff, send_index); // thread 에서 send m_fCurX = nX; m_fCurZ = nZ; @@ -6667,7 +6667,7 @@ BOOL CNpc::Teleport(CIOCPort * pIOCP) { Setfloat(buff, m_fCurX, send_index); Setfloat(buff, m_fCurZ, send_index); Setfloat(buff, 0, send_index); - SendAll(pIOCP, buff, send_index); // thread send + SendAll(pIOCP, buff, send_index); // thread 에서 send SetUid(m_fCurX, m_fCurZ, m_sNid + NPC_BAND); diff --git a/src/server/AIServer/Npc.h b/src/server/AIServer/Npc.h index 6eff538c..4aad1059 100644 --- a/src/server/AIServer/Npc.h +++ b/src/server/AIServer/Npc.h @@ -44,22 +44,22 @@ struct _NpcSkillList { struct _NpcGiveItem { int sSid; // item serial number - short count; // item ( ) + short count; // item 갯수(돈은 단위) }; struct _ExpUserList { - TCHAR strUserID[MAX_ID_SIZE + 1]; // ̵(ij ̸) + TCHAR strUserID[MAX_ID_SIZE + 1]; // 아이디(캐릭터 이름) int iUid; // User uid - int nDamage; // Ÿġ - BOOL bIs; // þ߿ ϴ Ǵ(true:) - // BOOL bSameParty; // Ƽ Ҽ ִٸ TRUE, ׷ FALSE + int nDamage; // 타격치 합 + BOOL bIs; // 시야에 존재하는지를 판단(true:존재) + // BOOL bSameParty; // 같은 파티 소속이 있다면 TRUE, 그렇지 않으면 FALSE }; struct _Target { - int id; // ݴ User uid - float x; // User x pos - float y; // User y pos - float z; // User z pos + int id; // 공격대상 User uid + float x; // User의 x pos + float y; // User의 y pos + float z; // User의 z pos int failCount; }; @@ -78,29 +78,29 @@ struct _PathList { }; struct _MagicType3 { - short sHPAttackUserID; // ̵ - short sHPAmount; // damage ( Ѿ / (ӽð / 2) ) - BYTE byHPDuration; // ð - BYTE byHPInterval; // - float fStartTime; // ۵Ǵ ð.. + short sHPAttackUserID; // 지속 마법을 사용한 유저의 아이디 저장 + short sHPAmount; // 지속 damage ( 지속총양 / (지속시간 / 2) ) + BYTE byHPDuration; // 지속 시간 + BYTE byHPInterval; // 지속 간격 + float fStartTime; // 지속이 시작되는 시간.. }; struct _MagicType4 { - BYTE byAmount; // - short sDurationTime; // ð - float fStartTime; // ۵Ǵ ð.. + BYTE byAmount; // 양 + short sDurationTime; // 지속 시간 + float fStartTime; // 지속이 시작되는 시간.. }; struct _TargetHealer { short sNID; // npc nid - short sValue; // + short sValue; // 점수 }; class CServerDlg; /* - ** Repent AI Server ۾ ** - 1. MONSTER DB ʿ ִ .. + ** Repent AI Server 작업시 참고 사항 ** + 1. MONSTER DB 쪽에 있는 변수들 전부 수정.. */ class CNpc { @@ -108,35 +108,35 @@ class CNpc { CServerDlg * m_pMain; CNpcMagicProcess m_MagicProcess; - _Target m_Target; // ,, - short m_ItemUserLevel; // ̻ ۸ ؾϴ Ƿ + _Target m_Target; // 공격할 유저 저장,, + short m_ItemUserLevel; // 죽을때 매직 이상 아이템를 떨구기위해 참조해야하는 유저의레벨 - int m_TotalDamage; // - _ExpUserList m_DamagedUserList[NPC_HAVE_USER_LIST]; // Ÿġ Ʈ Ѵ.(ġ й) - short m_sMaxDamageUserid; // ְ ̵ .. + int m_TotalDamage; // 총 누적된 대미지양 + _ExpUserList m_DamagedUserList[NPC_HAVE_USER_LIST]; // 나에게 타격치를 준 유저정보를 리스트로 관리한다.(경험치 분배) + short m_sMaxDamageUserid; // 나에게 최고의 데미지를 준 유저의 아이디 저장.. - _PathList m_PathList; // Npc н Ʈ - _PattenPos m_pPattenPos; // Npc ,, + _PathList m_PathList; // Npc의 패스 리스트 + _PattenPos m_pPattenPos; // Npc의 패턴,, - //int m_iPattenNumber; // Ϲȣ - short m_iPattenFrame; // ġ.. + //int m_iPattenNumber; // 현재의 패턴번호 + short m_iPattenFrame; // 패턴의 현재 위치.. - BYTE m_byMoveType; // NPC ൿŸ(̵) - BYTE m_byInitMoveType; // NPC ʱ ൿŸ(̵) - short m_sPathCount; // NPC PathList Count - short m_sMaxPathCount; // NPC PathList Max Count + BYTE m_byMoveType; // NPC의 행동타입(이동관련) + BYTE m_byInitMoveType; // NPC의 초기 행동타입(이동관련) + short m_sPathCount; // NPC의 PathList Count + short m_sMaxPathCount; // NPC의 PathList Max Count - BOOL m_bFirstLive; // NPC ó Ǵ ׾ Ƴ Ǵ. - BYTE m_NpcState; // NPC - Ҵ, ׾, ִ ... - short m_ZoneIndex; // NPC ϰ ִ ε + BOOL m_bFirstLive; // NPC 가 처음 생성되는지 죽었다 살아나는지 판단. + BYTE m_NpcState; // NPC의 상태 - 살았다, 죽었다, 서있다 등등... + short m_ZoneIndex; // NPC 가 존재하고 있는 존의 인덱스 - short m_sNid; // NPC ()Ϸùȣ + short m_sNid; // NPC (서버상의)일련번호 - CMapInfo ** m_pOrgMap; // MapInfo + CMapInfo ** m_pOrgMap; // 원본 MapInfo 에 대한 포인터 - float m_nInitX; // ó ġ X - float m_nInitY; // ó ġ Y - float m_nInitZ; // ó ġ Z + float m_nInitX; // 처음 생성된 위치 X + float m_nInitY; // 처음 생성된 위치 Y + float m_nInitZ; // 처음 생성된 위치 Z short m_sCurZone; // Current Zone; float m_fCurX; // Current X Pos; @@ -155,7 +155,7 @@ class CNpc { short m_max_x; short m_max_y; - int m_pMap[MAX_MAP_SIZE]; // 2 -> 1 迭 x * sizey + y + int m_pMap[MAX_MAP_SIZE]; // 2차원 -> 1차원 배열로 x * sizey + y SIZE m_vMapSize; @@ -167,125 +167,125 @@ class CNpc { CPathFind m_vPathFind; _PathNode * m_pPath; - int m_nInitMinX; // ʱġ + int m_nInitMinX; // 초기위치 int m_nInitMinY; int m_nInitMaxX; int m_nInitMaxY; // NPC Class, Skill - //_NpcSkillList m_NpcSkill[SKILL_NUM]; // NPC ִ ų - //BYTE m_tWeaponClass; // NPC Ŭ + //_NpcSkillList m_NpcSkill[SKILL_NUM]; // NPC 가 가지고 있는 스킬 + //BYTE m_tWeaponClass; // NPC 의 무기 클래스 - // .. - float m_fHPChangeTime; // Hp ȸ - float m_fFaintingTime; // ִ ð.. - _MagicType3 m_MagicType3[MAX_MAGIC_TYPE3]; // HP õ .. - _MagicType4 m_MagicType4[MAX_MAGIC_TYPE4]; // ɷġ õ .. + // 지속 마법 관련.. + float m_fHPChangeTime; // Hp 회복율 + float m_fFaintingTime; // 기절해 있는 시간.. + _MagicType3 m_MagicType3[MAX_MAGIC_TYPE3]; // HP 관련된 마법.. + _MagicType4 m_MagicType4[MAX_MAGIC_TYPE4]; // 능력치 관련된 마법.. //---------------------------------------------------------------- - // MONSTER DB ʿ ִ + // MONSTER DB 쪽에 있는 변수들 //---------------------------------------------------------------- short m_sSid; // MONSTER(NPC) Serial ID TCHAR m_strName[MAX_ID_SIZE + 1]; // MONSTER(NPC) Name short m_sPid; // MONSTER(NPC) Picture ID - short m_sSize; // ij (100 ۼƮ ) - int m_iWeapon_1; // - int m_iWeapon_2; // - BYTE m_byGroup; // Ҽ( ) - BYTE m_byActType; // ൿ - BYTE m_byRank; // - BYTE m_byTitle; // - int m_iSellingGroup; // ׷(ǸŸ NPC 츸) + short m_sSize; // 캐릭터의 비율(100 퍼센트 기준) + int m_iWeapon_1; // 착용 무기 + int m_iWeapon_2; // 착용 무기 + BYTE m_byGroup; // 소속집단(국가 개념) + BYTE m_byActType; // 행동패턴 + BYTE m_byRank; // 작위 + BYTE m_byTitle; // 지위 + int m_iSellingGroup; // 아이템 그룹(물건매매 담당 NPC의 경우만) short m_sLevel; // level - int m_iExp; // ġ + int m_iExp; // 경험치 int m_iLoyalty; // loyalty - int m_iMaxHP; // ִ HP - short m_sMaxMP; // ִ MP - short m_sAttack; // ݰ( ..) - short m_sDefense; //  - short m_sHitRate; // ݹø - short m_sEvadeRate; // ø - short m_sDamage; // ⺻ - ݰ - short m_sAttackDelay; // ݵ - short m_sSpeed; // ̵ӵ - float m_fSpeed_1; // ⺻ ̵ Ÿ (1ʿ ִ Ÿ) - float m_fSpeed_2; // ٴ ̵ Ÿ.. (1ʿ ִ Ÿ) - short m_sStandTime; // ִ ð - int m_iMagic1; // 븶 1 () - int m_iMagic2; // 븶 2 () - int m_iMagic3; // 븶 3 (ɷġ, ) - short m_sFireR; // ȭ ׷ - short m_sColdR; // ñ ׷ - short m_sLightningR; // ׷ - short m_sMagicR; // ׷ - short m_sDiseaseR; // ׷ - short m_sPoisonR; // ׷ - short m_sLightR; // ׷ - float m_fBulk; // ũ ( ) - BYTE m_bySearchRange; // Ž - BYTE m_byAttackRange; // Ÿ - BYTE m_byTracingRange; // ߰ Ÿ - - short m_sAI; // ΰ ε + int m_iMaxHP; // 최대 HP + short m_sMaxMP; // 최대 MP + short m_sAttack; // 공격값(지금 사용하지 않음..) + short m_sDefense; // 방어값 + short m_sHitRate; // 공격민첩 + short m_sEvadeRate; // 방어민첩 + short m_sDamage; // 기본 데미지 - 공격값 + short m_sAttackDelay; // 공격딜레이 + short m_sSpeed; // 이동속도 + float m_fSpeed_1; // 기본 이동 타입 (1초에 갈 수 있는 거리) + float m_fSpeed_2; // 뛰는 이동 타입.. (1초에 갈 수 있는 거리) + short m_sStandTime; // 서있는 시간 + int m_iMagic1; // 사용마법 1 (공격) + int m_iMagic2; // 사용마법 2 (지역) + int m_iMagic3; // 사용마법 3 (능력치, 힐링) + short m_sFireR; // 화염 저항력 + short m_sColdR; // 냉기 저항력 + short m_sLightningR; // 전기 저항력 + short m_sMagicR; // 마법 저항력 + short m_sDiseaseR; // 저주 저항력 + short m_sPoisonR; // 독 저항력 + short m_sLightR; // 빛 저항력 + float m_fBulk; // 몬스터의 크기 (실제 비율) + BYTE m_bySearchRange; // 적 탐지 범위 + BYTE m_byAttackRange; // 사정거리 + BYTE m_byTracingRange; // 추격 거리 + + short m_sAI; // 인공지능 인덱스 BYTE m_tNpcType; // NPC Type // 0 : Normal Monster // 1 : NPC - short m_byFamilyType; // ̿ 踦 Ѵ. - BYTE m_tItemPer; // Ȯ - BYTE m_tDnPer; // Ȯ - BYTE m_byMoneyType; // Event ִ , (0:, 1: ʰ ٷ ´) + short m_byFamilyType; // 몹들사이에서 가족관계를 결정한다. + BYTE m_tItemPer; // 아이템이 떨어질 확률 + BYTE m_tDnPer; // 돈이 떨어질확률 + BYTE m_byMoneyType; // Event몬스터일 경우 돈을 많이 주는 것, (0:루팅, 1:루팅을 하지 않고 바로 나눠갖는다) - int m_iMoney; // - int m_iItem; // - //BYTE m_byMemory; // Ÿ + int m_iMoney; // 떨어지는 돈 + int m_iItem; // 떨어지는 아이템 + //BYTE m_byMemory; // 공격 타입 - int m_iHP; // HP - short m_sMP; // MP + int m_iHP; // 현재 HP + short m_sMP; // 현재 MP - float m_fSecForMetor; // ʴ ִ Ÿ.. + float m_fSecForMetor; // 초당 갈 수 있는 거리.. //---------------------------------------------------------------- - // MONSTER AI õ + // MONSTER AI에 관련된 변수들 //---------------------------------------------------------------- - BYTE m_tNpcLongType; // Ÿ : Ÿ(1), ٰŸ(0), .(2) - BYTE m_tNpcAttType; // : (1), İ(0) - BYTE m_tNpcOldAttType; // : (1), İ(0) (Ȱ ) - BYTE m_tNpcGroupType; // ϳ(1), ϳ?(0) - BYTE m_byNpcEndAttType; // ο(1), ׷ (0) - // BYTE m_tNpcTraceType; // 󰣴(1), þ߿ ׸(0) - BYTE m_byAttackPos; // User κп ϴ Ǵ(8) - BYTE m_byBattlePos; //  Ǵ.. - BYTE m_byWhatAttackType; // Ÿ : Normal(0), .Ÿ(1), (2), (3), (4), 1+4 (5) - BYTE m_byGateOpen; // 쿡.. ... Gate Npc Status -> 1 : open 0 : close - BYTE m_byMaxDamagedNation; // .. (1:ī罺, 2:) - BYTE m_byObjectType; // 0, objectŸ(, ) 1 - BYTE m_byDungeonFamily; // йи ( ) - BYTE m_bySpecialType; // ° ϴ Ǵ(0: , 1:ϴ , - // 2:״° ϴ ( ), - // 3: ִ (Ͱ Ǵ ʹ ׵) - // 4:ϸ鼭 ״° ϴ (m_sControlSid) - // 5:ó ׾ִٰ ϴ ,, - // 6:ð Ŀ ൿϴ ,, - // 100:׾ ּ - BYTE m_byTrapNumber; // Ʈ ȣ,, - BYTE m_byChangeType; // 0:, 1:ϱ غ, 2:ٸͷ , 3: , 100: - BYTE m_byRegenType; // 0: .. , 1:ѹ ȵǴ Ư , 2: ȵ - BYTE m_byDeadType; // 0: ִ , 100:̺Ʈ - short m_sChangeSid; // ϴ Sidȣ.. - short m_sControlSid; // ϴ Sidȣ.. + BYTE m_tNpcLongType; // 공격 거리 : 원거리(1), 근거리(0), 직.간접(2) + BYTE m_tNpcAttType; // 공격 성향 : 선공(1), 후공(0) + BYTE m_tNpcOldAttType; // 공격 성향 : 선공(1), 후공(0) (활동영역 제어) + BYTE m_tNpcGroupType; // 군집을 형성하냐(1), 안하냐?(0) + BYTE m_byNpcEndAttType; // 마지막까지 싸우면(1), 그렇지 않으면(0) + // BYTE m_tNpcTraceType; // 끝까지 따라간다(1), 시야에서 없어지면 그만(0) + BYTE m_byAttackPos; // User의 어느 부분에서 공격하느지를 판단(8방향) + BYTE m_byBattlePos; // 어떤 진형을 선택할 것인지를 판단.. + BYTE m_byWhatAttackType; // 공격 타입 : Normal(0), 근.장거리마법(1), 독(2), 힐링(3), 지역마법만(4), 1+4번 마법(5) + BYTE m_byGateOpen; // 성문일 경우에.. 사용... Gate Npc Status -> 1 : open 0 : close + BYTE m_byMaxDamagedNation; // 나를 죽인 유저의 국가를 저장.. (1:카루스, 2:엘모라드) + BYTE m_byObjectType; // 보통은 0, object타입(성문, 레버)은 1 + BYTE m_byDungeonFamily; // 던젼에서 같은 패밀리 묶음 (같은 방) + BYTE m_bySpecialType; // 몬스터의 형태가 변하는지를 판단(0:변하지 않음, 1:변하는 몬스터, + // 2:죽는경우 조정하는 몬스터(대장몬스터 죽을경우 성문이 열림), + // 3:대장몬스터의 죽음과 관련이 있는 몬스터(대장몬스터가 죽으면 관계되는 몬스터는 같이 죽도록) + // 4:변하면서 죽는경우 조정하는 몬스터 (m_sControlSid) + // 5:처음에 죽었있다가 출현하는 몬스터,, + // 6:일정시간이 지난 후에 행동하는 몬스터,, + // 100:죽었을때 데미지를 많이 입힌 유저를 기록해 주세여 + BYTE m_byTrapNumber; // 던젼에서 트랩의 번호,, + BYTE m_byChangeType; // 0:정상상태, 1:변하기 위한 준비, 2:다른몬스터로 변함, 3:몬스터의 출현, 100:몬스터의 죽음 + BYTE m_byRegenType; // 0:정상적으로 리젠이 됨.. , 1:한번 죽으면 리젠이 안되는 특수 몸, 2:리젠이 안됨 + BYTE m_byDeadType; // 0:살아 있는 경우, 100:전쟁이벤트중 죽은 경우 + short m_sChangeSid; // 변하는 몬스터의 Sid번호.. + short m_sControlSid; // 조정하는 몬스터의 Sid번호.. //---------------------------------------------------------------- - // MONSTER_POS DB ʿ ִ + // MONSTER_POS DB 쪽에 있는 변수들 //---------------------------------------------------------------- - int m_Delay; // · ̵DZ ð - float m_fDelayTime; // Npc Threadüũ Ÿ... + int m_Delay; // 다음 상태로 전이되기 까지의 시간 + float m_fDelayTime; // Npc Thread체크 타임... BYTE m_byType; - int m_sRegenTime; // NPC ð + int m_sRegenTime; // NPC 재생시간 - int m_nLimitMinX; // Ȱ + int m_nLimitMinX; // 활동 영역 int m_nLimitMinZ; int m_nLimitMaxX; int m_nLimitMaxZ; @@ -298,38 +298,38 @@ class CNpc { float m_fBattlePos_x; float m_fBattlePos_z; - float m_fSecForRealMoveMetor; // ʴ ִ Ÿ..( Ŭ̾Ʈ ִ Ÿ) - float m_fDir; // NPC + float m_fSecForRealMoveMetor; // 초당 갈 수 있는 거리..(실제 클라이언트에 보내주는 거리) + float m_fDir; // NPC의 방향 - BOOL m_bPathFlag; // н ε ࿩ üũ .. + BOOL m_bPathFlag; // 패스 파인드 실행여부 체크 변수.. //---------------------------------------------------------------- - // NPC ̵ + // NPC 이동 관련 //---------------------------------------------------------------- - _NpcPosition m_pPoint[MAX_PATH_LINE]; // ̵ ǥ + _NpcPosition m_pPoint[MAX_PATH_LINE]; // 이동시 참고 좌표 short m_iAniFrameIndex; short m_iAniFrameCount; - BYTE m_byPathCount; // н ̵ϴ ġ ʵ,, - BYTE m_byResetFlag; // ݽ нε ٽ Ұ,, Ǵ.. - BYTE m_byActionFlag; // ൿȭ ÷ ( 0 : ൿȭ , 1 : ݿ ߰) + BYTE m_byPathCount; // 패스를 따라 이동하는 몬스터 끼리 겹치지 않도록,, + BYTE m_byResetFlag; // 추적공격시 패스파인딩을 다시 할것인지,, 말것인지를 판단.. + BYTE m_byActionFlag; // 행동변화 플래그 ( 0 : 행동변화 없음, 1 : 공격에서 추격) - short m_iRegion_X; // region - x pos - short m_iRegion_Z; // region - z pos - short m_iFind_X[4]; // find enemy ã Region˻翵 + short m_iRegion_X; // 현재의 region - x pos + short m_iRegion_Z; // 현재의 region - z pos + short m_iFind_X[4]; // find enemy에서 찾을 Region검사영역 short m_iFind_Y[4]; - float m_fOldSpeed_1; // ⺻ ̵ Ÿ (1ʿ ִ Ÿ) - float m_fOldSpeed_2; // ٴ ̵ Ÿ.. (1ʿ ִ Ÿ) + float m_fOldSpeed_1; // 기본 이동 타입 (1초에 갈 수 있는 거리) + float m_fOldSpeed_2; // 뛰는 이동 타입.. (1초에 갈 수 있는 거리) // test - short m_sThreadNumber; // ڽ ȣ + short m_sThreadNumber; // 자신이 속한 스레드의 번호 public: CNpc(); virtual ~CNpc(); - void Init(); // NPC ⺻ ʱȭ + void Init(); // NPC 기본정보 초기화 void InitTarget(void); void InitUserList(); void InitPos(); @@ -348,11 +348,11 @@ class CNpc { BOOL IsCloseTarget(CUser * pUser, int nRange); void ToTargetMove(CIOCPort * pIOCP, CUser * pUser); int SendDead(CIOCPort * pIOCP, int type = 1); // Npc Dead - void SendExpToUserList(); // User ġ й.. + void SendExpToUserList(); // User 경험치 분배.. BOOL SetDamage(int nAttackType, int nDamage, const std::string & id, int uid, - CIOCPort * pIOCP); // Npc .. - BOOL SetHMagicDamage(int nDamage, CIOCPort * pIOCP); // Npc .. - int GetDefense(); // Npc .. + CIOCPort * pIOCP); // Npc의 데미지 계산.. + BOOL SetHMagicDamage(int nDamage, CIOCPort * pIOCP); // Npc의 데미지 계산.. + int GetDefense(); // Npc의 방어값.. void ChangeTarget(int nAttackType, CUser * pUser, CIOCPort * pIOCP); void ChangeNTarget(CNpc * pNpc, CIOCPort * pIOCP); int GetFinalDamage(CUser * pUser, int type = 1); @@ -377,10 +377,10 @@ class CNpc { BOOL IsLevelCheck(int iLevel); BOOL IsHPCheck(int iHP); BOOL IsCompStatus(CUser * pUser); - BOOL IsPathFindCheck(float fDistance); // н ε带 Ұ üũϴ ƾ.. - void IsNoPathFind(float fDistance); // н ε带 ʰ ݴ ƾ.. + BOOL IsPathFindCheck(float fDistance); // 패스 파인드를 할것인지를 체크하는 루틴.. + void IsNoPathFind(float fDistance); // 패스 파인드를 하지 않고 공격대상으로 가는 루틴.. BOOL IsInExpRange(CUser * pUser); - void GiveNpcHaveItem(CIOCPort * pIOCP); // NPC + void GiveNpcHaveItem(CIOCPort * pIOCP); // NPC 가 가진 아이템을 떨군다 void NpcLive(CIOCPort * pIOCP); void NpcFighting(CIOCPort * pIOCP); @@ -400,11 +400,11 @@ class CNpc { BOOL IsInPathRange(); // int GetNearPathPoint(); // - // Packet Sendκ.. + // Packet Send부분.. void SendAll(CIOCPort * pIOCP, TCHAR * pBuf, int nLength); void SendAttackSuccess(CIOCPort * pIOCP, BYTE byResult, int tuid, short sDamage, int nHP = 0, BYTE byFlag = 0, short sAttack_type = 1); - void SendNpcInfoAll(char * temp_send, int & index, int count); // game server npc ... + void SendNpcInfoAll(char * temp_send, int & index, int count); // game server에 npc정보를 전부 전송... // Inline Function BOOL SetUid(float x, float z, int id); @@ -424,15 +424,15 @@ class CNpc { inline float RandomGenf(float max, float min); __Vector3 MyFunc(__Vector3 vCur, __Vector3 vDir, float fYDegree, float fDistance); __Vector3 GetDirection(__Vector3 vStart, __Vector3 vEnd); - // GetVectorPosition : vOrig->vDest vOrig fDisŸŭ ǥ + // GetVectorPosition : vOrig->vDest방향으로 vOrig에서 fDis거리만큼 떨어진 좌표를 리턴 __Vector3 GetVectorPosition(__Vector3 vOrig, __Vector3 vDest, float fDis); - // CalcAdaptivePosition : vPosDest->vPosOrig vPosDest fDisŸŭ ǥ + // CalcAdaptivePosition : vPosDest->vPosOrig방향으로 vPosDest에서 fDis거리만큼 떨어진 좌표를 리턴 __Vector3 CalcAdaptivePosition(__Vector3 vPosOrig, __Vector3 vPosDest, float fAttackDistance); __Vector3 ComputeDestPos(__Vector3 vCur, float fDegree, float fDegreeOffset, float fDistance); void Yaw2D(float fDirX, float fDirZ, float & fYawResult); float GetDistance(__Vector3 vOrig, __Vector3 vDest); int PathFind(CPoint start, CPoint end, float fDistance); - BOOL GetUserInView(); // Npc Ÿȿ User ִ Ǵ + BOOL GetUserInView(); // Npc의 가시 거리안에 User가 있는지를 판단 BOOL GetUserInViewRange(int x, int z); void MoveAttack(CIOCPort * pIOCP); void HpChange(CIOCPort * pIOCP); diff --git a/src/server/AIServer/NpcInfoTable.cpp b/src/server/AIServer/NpcInfoTable.cpp index c4be1b85..be371bf9 100644 --- a/src/server/AIServer/NpcInfoTable.cpp +++ b/src/server/AIServer/NpcInfoTable.cpp @@ -27,16 +27,16 @@ void CNpcInfoTable::Initialize() { m_sSid = ini.GetProfileInt("MAIN", "sSid", 0); strcpy(m_strName, ini.GetProfileString("MAIN", "strName", "monster")); - m_sMaxHP = ini.GetProfileInt("MAIN", "ִHP", 0); - m_sMaxMP = ini.GetProfileInt("MAIN", "ִPP", 0); - m_byClass = ini.GetProfileInt("MAIN", "迭", 0); - m_iExp = ini.GetProfileInt("MAIN", "ġ", 0); - m_sDefense = ini.GetProfileInt("MAIN", "", 0); - m_byAttackRange = ini.GetProfileInt("MAIN", "Ÿ", 0); - m_sAI = ini.GetProfileInt("MAIN", "ΰε", 0); - m_sAttackDelay = ini.GetProfileInt("MAIN", "ݵ", 0); - m_bySearchRange = ini.GetProfileInt("MAIN", "Ž", 0); - m_sSpeed = ini.GetProfileInt("MAIN", "̵ӵ", 0); + m_sMaxHP = ini.GetProfileInt("MAIN", "최대HP", 0); + m_sMaxMP = ini.GetProfileInt("MAIN", "최대PP", 0); + m_byClass = ini.GetProfileInt("MAIN", "무기계열", 0); + m_iExp = ini.GetProfileInt("MAIN", "경험치", 0); + m_sDefense = ini.GetProfileInt("MAIN", "방어값", 0); + m_byAttackRange = ini.GetProfileInt("MAIN", "사정거리", 0); + m_sAI = ini.GetProfileInt("MAIN", "인공지능인덱스", 0); + m_sAttackDelay = ini.GetProfileInt("MAIN", "공격딜레이", 0); + m_bySearchRange = ini.GetProfileInt("MAIN", "적탐지범위", 0); + m_sSpeed = ini.GetProfileInt("MAIN", "이동속도", 0); m_sStandTime = ini.GetProfileInt("MAIN", "StandTime", 0); m_tNpcType = ini.GetProfileInt("MAIN", "NpcType", 0); m_sFamilyType = ini.GetProfileInt("MAIN", "FamilyType", 0); diff --git a/src/server/AIServer/NpcInfoTable.h b/src/server/AIServer/NpcInfoTable.h index 3f6f3728..ee598f47 100644 --- a/src/server/AIServer/NpcInfoTable.h +++ b/src/server/AIServer/NpcInfoTable.h @@ -9,30 +9,30 @@ class CNpcInfoTable { short m_sSid; // MONSTER(NPC) Serial ID TCHAR m_strName[20]; // MONSTER(NPC) Name - short m_sMaxHP; // ִ HP - short m_sMaxMP; // ִ PP + short m_sMaxHP; // 최대 HP + short m_sMaxMP; // 최대 PP - BYTE m_byClass; // 迭 + BYTE m_byClass; // 무기계열 - int m_iExp; // ġ + int m_iExp; // 경험치 - short m_sDefense; //  - BYTE m_byAttackRange; // Ÿ + short m_sDefense; // 방어값 + BYTE m_byAttackRange; // 사정거리 - int m_sAI; // ΰ ε - int m_sAttackDelay; // ݵ + int m_sAI; // 인공지능 인덱스 + int m_sAttackDelay; // 공격딜레이 - BYTE m_bySearchRange; // Ž - int m_sSpeed; // ̵ӵ + BYTE m_bySearchRange; // 적 탐지 범위 + int m_sSpeed; // 이동속도 - int m_sStandTime; // ִ ð + int m_sStandTime; // 서있는 시간 BYTE m_tNpcType; // NPC Type // 0 : Monster // 1 : Normal NPC - int m_sFamilyType; // ̿ 踦 Ѵ. - BYTE m_tItemPer; // Ȯ - BYTE m_tDnPer; // Ȯ + int m_sFamilyType; // 몹들사이에서 가족관계를 결정한다. + BYTE m_tItemPer; // 아이템이 떨어질 확률 + BYTE m_tDnPer; // 돈이 떨어질확률 public: void Initialize(); diff --git a/src/server/AIServer/NpcMagicProcess.cpp b/src/server/AIServer/NpcMagicProcess.cpp index 87f2a416..e066dc4d 100644 --- a/src/server/AIServer/NpcMagicProcess.cpp +++ b/src/server/AIServer/NpcMagicProcess.cpp @@ -170,7 +170,7 @@ _MAGIC_TABLE * CNpcMagicProcess::IsAvailable(int magicid, int tid, BYTE type) { } else if (tid == -1) { // Party Moral check routine. if (pTable->bMoral == MORAL_AREA_ENEMY) { if (m_pSrcNpc->m_byGroup == - 0) { // Switch morals. ۾Ұ : ʹ .. ߿ NPC ϸ + 0) { // Switch morals. 작업할것 : 몬스터는 국가라는 개념이 없기 때문에.. 나중에 NPC가 이 마법을 사용하면 문제가 됨 moral = 2; } else { moral = 1; @@ -231,7 +231,7 @@ _MAGIC_TABLE * CNpcMagicProcess::IsAvailable(int magicid, int tid, BYTE type) { if (type == MAGIC_EFFECTING) // Make sure you subtract MPs (SPs) after you use spell (skill). { - // MP ޴ٷ óѴ.. Npc SP .. + // MP만 달다록 처리한당.. Npc는 SP가 없음.. //if( pTable->sMsp > m_pSrcNpc->m_sMP ) // goto fail_return; //m_pSrcNpc->MSpChange(2, -(pTable->sMsp) ); @@ -292,7 +292,7 @@ void CNpcMagicProcess::ExecuteType3(int magicid, int tid, int data1, int data2, return; } - if (tid == -1) { // ,, Ӽ óѴ.. .. + if (tid == -1) { // 지역 공격,, 몬스터의 지역공격은 게임서버에서 처리한다.. 유저들을 상대로.. goto packet_send; } @@ -318,17 +318,17 @@ void CNpcMagicProcess::ExecuteType3(int magicid, int tid, int data1, int data2, result = pNpc->SetHMagicDamage(damage, &m_pMain->m_Iocport); } else { damage = abs(damage); - /* if(pType->bAttribute == 3) attack_type = 3; // Ű ̶..... + /* if(pType->bAttribute == 3) attack_type = 3; // 기절시키는 마법이라면..... else attack_type = magicid; if(pNpc->SetDamage(attack_type, damage, m_pSrcUser->m_strUserID, m_pSrcUser->m_iUserId + USER_BAND, m_pSrcUser->m_pIocport) == FALSE) { - // Npc ,, - pNpc->SendExpToUserList(); // ġ й!! + // Npc가 죽은 경우,, + pNpc->SendExpToUserList(); // 경험치 분배!! pNpc->SendDead(m_pSrcUser->m_pIocport); m_pSrcUser->SendAttackSuccess(tid, MAGIC_ATTACK_TARGET_DEAD, damage, pNpc->m_iHP, MAGIC_ATTACK); } else { - // + // 공격 결과 전송 m_pSrcUser->SendAttackSuccess(tid, ATTACK_SUCCESS, damage, pNpc->m_iHP, MAGIC_ATTACK); } */ } @@ -402,7 +402,7 @@ short CNpcMagicProcess::GetMagicDamage(int tid, int total_hit, int attribute, in short damage = 0, temp_hit = 0; int random = 0, total_r = 0; BYTE result; - BOOL bSign = TRUE; // FALSE̸ -, TRUE̸ + + BOOL bSign = TRUE; // FALSE이면 -, TRUE이면 + if (tid < NPC_BAND || tid > INVALID_BAND) { return 0; // Check if target id is valid. diff --git a/src/server/AIServer/NpcPosTable.h b/src/server/AIServer/NpcPosTable.h index 1544e253..0fdf2a52 100644 --- a/src/server/AIServer/NpcPosTable.h +++ b/src/server/AIServer/NpcPosTable.h @@ -14,7 +14,7 @@ class CNpcPosTable { float m_sY; // MONSTER(NPC) y position float m_sZ; // MONSTER(NPC) z position int m_sArea; // MONSTER(NPC) area - int m_sMinX; // .. + int m_sMinX; // 몬스터의 움직임 영역.. int m_sMinY; int m_sMaxX; int m_sMaxY; diff --git a/src/server/AIServer/NpcTable.cpp b/src/server/AIServer/NpcTable.cpp index 806fd0de..e08b14f2 100644 --- a/src/server/AIServer/NpcTable.cpp +++ b/src/server/AIServer/NpcTable.cpp @@ -25,48 +25,48 @@ void CNpcTable::Initialize() { memset(m_strName, 0x00, MAX_ID_SIZE + 1); // MONSTER(NPC) Name m_sPid = 0; m_sSize = 0; - m_iWeapon_1 = 0; // 迭 - m_iWeapon_2 = 0; // 迭 - m_byGroup = 0; // Ҽ - m_byActType = 0; // ൿ - m_byRank = 0; // - m_byTitle = 0; // - m_iSellingGroup = 0; // ׷(ǸŸ NPC 츸) + m_iWeapon_1 = 0; // 무기계열 + m_iWeapon_2 = 0; // 무기계열 + m_byGroup = 0; // 소속집단 + m_byActType = 0; // 행동패턴 + m_byRank = 0; // 작위 + m_byTitle = 0; // 지위 + m_iSellingGroup = 0; // 아이템 그룹(물건매매 담당 NPC의 경우만) m_sLevel = 0; // level - m_iExp = 0; // ġ + m_iExp = 0; // 경험치 m_iLoyalty = 0; // loyalty - m_iMaxHP = 0; // ִ HP - m_sMaxMP = 0; // ִ MP - m_sAttack = 0; // ݰ - m_sDefense = 0; //  - m_sHitRate = 0; // Ÿݼ - m_sEvadeRate = 0; // ȸǼ - m_sDamage = 0; // ⺻ - m_sAttackDelay = 0; // ݵ - m_sSpeed = 0; // ̵ӵ - m_sStandTime = 0; // ִ ð - m_iMagic1 = 0; // 븶 1 - m_iMagic2 = 0; // 븶 2 - m_iMagic3 = 0; // 븶 3 - m_sFireR = 0; // ȭ ׷ - m_sColdR = 0; // ñ ׷ - m_sLightR = 0; // ׷ - m_sMagicR = 0; // ׷ - m_sDiseaseR = 0; // ׷ - m_sPoisonR = 0; // ׷ + m_iMaxHP = 0; // 최대 HP + m_sMaxMP = 0; // 최대 MP + m_sAttack = 0; // 공격값 + m_sDefense = 0; // 방어값 + m_sHitRate = 0; // 타격성공률 + m_sEvadeRate = 0; // 회피성공률 + m_sDamage = 0; // 기본 데미지 + m_sAttackDelay = 0; // 공격딜레이 + m_sSpeed = 0; // 이동속도 + m_sStandTime = 0; // 서있는 시간 + m_iMagic1 = 0; // 사용마법 1 + m_iMagic2 = 0; // 사용마법 2 + m_iMagic3 = 0; // 사용마법 3 + m_sFireR = 0; // 화염 저항력 + m_sColdR = 0; // 냉기 저항력 + m_sLightR = 0; // 빛 저항력 + m_sMagicR = 0; // 마법 저항력 + m_sDiseaseR = 0; // 저주 저항력 + m_sPoisonR = 0; // 독 저항력 m_sBulk = 0; - m_bySearchRange = 0; // Ž - m_byAttackRange = 0; // Ÿ + m_bySearchRange = 0; // 적 탐지 범위 + m_byAttackRange = 0; // 사정거리 m_byTracingRange = 0; - m_sAI = 0; // ΰ ε + m_sAI = 0; // 인공지능 인덱스 m_tNpcType = 0; // NPC Type // 0 : Monster // 1 : Normal NPC - m_byFamilyType = 0; // ̿ 踦 Ѵ. - m_tItemPer = 0; // Ȯ - m_tDnPer = 0; // Ȯ - m_iMoney = 0; // - m_iItem = 0; // - m_byDirectAttack = 0; // ݹ( 0 : , 1:հ(), 2:, ) - m_byMagicAttack = 0; // ( 0: , 1:, 2:, 3:) + m_byFamilyType = 0; // 몹들사이에서 가족관계를 결정한다. + m_tItemPer = 0; // 아이템이 떨어질 확률 + m_tDnPer = 0; // 돈이 떨어질확률 + m_iMoney = 0; // 떨어지는 돈 + m_iItem = 0; // 떨어지는 아이템 + m_byDirectAttack = 0; // 공격방법( 0 : 직접, 1:롱공격(간접공격), 2:직,간접공격 ) + m_byMagicAttack = 0; // 마법공격( 0:마법공격 없음, 1:마법공격, 2:독공격, 3:힐링) } diff --git a/src/server/AIServer/NpcTable.h b/src/server/AIServer/NpcTable.h index e8cafa35..89728a15 100644 --- a/src/server/AIServer/NpcTable.h +++ b/src/server/AIServer/NpcTable.h @@ -9,61 +9,61 @@ class CNpcTable { short m_sSid; // MONSTER(NPC) Serial ID TCHAR m_strName[MAX_ID_SIZE + 1]; // MONSTER(NPC) Name short m_sPid; // MONSTER(NPC) Picture ID - short m_sSize; // ij (100 ۼƮ ) - int m_iWeapon_1; // 迭() - int m_iWeapon_2; // 迭(޼) - BYTE m_byGroup; // Ҽ - BYTE m_byActType; // ൿ + short m_sSize; // 캐릭터의 비율(100 퍼센트 기준) + int m_iWeapon_1; // 무기계열(오른손) + int m_iWeapon_2; // 무기계열(왼손) + BYTE m_byGroup; // 소속집단 + BYTE m_byActType; // 행동패턴 BYTE m_tNpcType; // NPC Type // 0 : Monster // 1 : Normal NPC - BYTE m_byFamilyType; // ̿ 踦 Ѵ. - BYTE m_byRank; // - BYTE m_byTitle; // - int m_iSellingGroup; // ׷(ǸŸ NPC 츸) + BYTE m_byFamilyType; // 몹들사이에서 가족관계를 결정한다. + BYTE m_byRank; // 작위 + BYTE m_byTitle; // 지위 + int m_iSellingGroup; // 아이템 그룹(물건매매 담당 NPC의 경우만) short m_sLevel; // level - int m_iExp; // ġ + int m_iExp; // 경험치 int m_iLoyalty; // loyalty - int m_iMaxHP; // ִ HP - short m_sMaxMP; // ִ MP + int m_iMaxHP; // 최대 HP + short m_sMaxMP; // 최대 MP - short m_sAttack; // ݰ - short m_sDefense; //  - short m_sHitRate; // Ÿݼ - short m_sEvadeRate; // ȸǼ - short m_sDamage; // ⺻ - short m_sAttackDelay; // ݵ - short m_sSpeed; // ̵ӵ - BYTE m_bySpeed_1; // ⺻ ̵ Ÿ - BYTE m_bySpeed_2; // ٴ ̵ Ÿ.. - short m_sStandTime; // ִ ð - int m_iMagic1; // 븶 1 - int m_iMagic2; // 븶 2 - int m_iMagic3; // 븶 3 + short m_sAttack; // 공격값 + short m_sDefense; // 방어값 + short m_sHitRate; // 타격성공률 + short m_sEvadeRate; // 회피성공률 + short m_sDamage; // 기본 데미지 + short m_sAttackDelay; // 공격딜레이 + short m_sSpeed; // 이동속도 + BYTE m_bySpeed_1; // 기본 이동 타입 + BYTE m_bySpeed_2; // 뛰는 이동 타입.. + short m_sStandTime; // 서있는 시간 + int m_iMagic1; // 사용마법 1 + int m_iMagic2; // 사용마법 2 + int m_iMagic3; // 사용마법 3 - short m_sFireR; // ȭ ׷ - short m_sColdR; // ñ ׷ - short m_sLightningR; // ׷ - short m_sMagicR; // ׷ - short m_sDiseaseR; // ׷ - short m_sPoisonR; // ׷ - short m_sLightR; // ׷ - short m_sBulk; // ũ ( * 100) + short m_sFireR; // 화염 저항력 + short m_sColdR; // 냉기 저항력 + short m_sLightningR; // 전기 저항력 + short m_sMagicR; // 마법 저항력 + short m_sDiseaseR; // 저주 저항력 + short m_sPoisonR; // 독 저항력 + short m_sLightR; // 빛 저항력 + short m_sBulk; // 몬스터의 크기 (실제 길이 * 100) - BYTE m_bySearchRange; // Ž - BYTE m_byAttackRange; // Ÿ - BYTE m_byTracingRange; // ߰ݰŸ + BYTE m_bySearchRange; // 적 탐지 범위 + BYTE m_byAttackRange; // 사정거리 + BYTE m_byTracingRange; // 추격거리 - short m_sAI; // ΰ ε + short m_sAI; // 인공지능 인덱스 - BYTE m_tItemPer; // Ȯ - BYTE m_tDnPer; // Ȯ + BYTE m_tItemPer; // 아이템이 떨어질 확률 + BYTE m_tDnPer; // 돈이 떨어질확률 - int m_iMoney; // - int m_iItem; // - BYTE m_byDirectAttack; // ݹ( 0 : , 1:հ(), 2:, ) - BYTE m_byMagicAttack; // ( 0: , 1:, 2:, 3:) + int m_iMoney; // 떨어지는 돈 + int m_iItem; // 떨어지는 아이템 + BYTE m_byDirectAttack; // 공격방법( 0 : 직접, 1:롱공격(간접공격), 2:직,간접공격 ) + BYTE m_byMagicAttack; // 마법공격( 0:마법공격 없음, 1:마법공격, 2:독공격, 3:힐링) public: CNpcTable(); diff --git a/src/server/AIServer/NpcThread.cpp b/src/server/AIServer/NpcThread.cpp index 69b1c14c..2c332396 100644 --- a/src/server/AIServer/NpcThread.cpp +++ b/src/server/AIServer/NpcThread.cpp @@ -55,7 +55,7 @@ UINT NpcThreadProc(LPVOID pParam /* NPC_THREAD_INFO ptr */) { //if((pNpc->m_tNpcType == NPCTYPE_DOOR || pNpc->m_tNpcType == NPCTYPE_ARTIFACT || pNpc->m_tNpcType == NPCTYPE_PHOENIX_GATE || pNpc->m_tNpcType == NPCTYPE_GATE_LEVER) && !pNpc->m_bFirstLive) continue; //if( pNpc->m_bFirstLive ) continue; if (pNpc->m_sNid < 0) { - continue; // ߸ (ӽڵ 2002.03.24) + continue; // 잘못된 몬스터 (임시코드 2002.03.24) } fTime3 = fTime2 - pNpc->m_fDelayTime; @@ -69,7 +69,7 @@ UINT NpcThreadProc(LPVOID pParam /* NPC_THREAD_INFO ptr */) { pNpc->m_Delay = 0; } - //߽߰... (2002. 04.23, ̱) + //적발견시... (2002. 04.23수정, 부하줄이기) if (pNpc->m_NpcState == NPC_STANDING && pNpc->CheckFindEnermy()) { if (pNpc->FindEnemy()) { pNpc->m_NpcState = NPC_ATTACKING; @@ -82,19 +82,19 @@ UINT NpcThreadProc(LPVOID pParam /* NPC_THREAD_INFO ptr */) { fTime3 = fTime2 - pNpc->m_fHPChangeTime; dwTickTime = fTime3 * 1000; - if (10000 < dwTickTime) { // 10ʸ HP ȸ ش + if (10000 < dwTickTime) { // 10초마다 HP를 회복 시켜준다 pNpc->HpChange(pIOCP); } - pNpc->DurationMagic_4(pIOCP, fTime2); // ó... - pNpc->DurationMagic_3(pIOCP, fTime2); // Ӹ.. + pNpc->DurationMagic_4(pIOCP, fTime2); // 마법 처리... + pNpc->DurationMagic_3(pIOCP, fTime2); // 지속마법.. switch (pNpc->m_NpcState) { - case NPC_LIVE: // Ƴ + case NPC_LIVE: // 방금 살아난 경우 pNpc->NpcLive(pIOCP); break; - case NPC_STANDING: // ϴ ִ + case NPC_STANDING: // 하는 일 없이 서있는 경우 pNpc->NpcStanding(); break; @@ -164,12 +164,12 @@ UINT ZoneEventThreadProc(LPVOID pParam /* = NULL */) { continue; } if (pMap->m_byRoomEvent == 0) { - continue; // ϴ ƴϸ .. + continue; // 현재의 존이 던젼담당하는 존이 아니면 리턴.. } if (pMap->IsRoomStatusCheck() == TRUE) { - continue; // ü Ŭ Ǿٸ + continue; // 전체방이 클리어 되었다면 } - for (int j = 1; j < pMap->m_arRoomEventArray.GetSize() + 1; j++) { // ȣ 1 + for (int j = 1; j < pMap->m_arRoomEventArray.GetSize() + 1; j++) { // 방번호는 1번부터 시작 pRoom = pMap->m_arRoomEventArray.GetData(j); if (!pRoom) { continue; @@ -177,11 +177,11 @@ UINT ZoneEventThreadProc(LPVOID pParam /* = NULL */) { if (pRoom->m_byStatus == 1 || pRoom->m_byStatus == 3) { continue; // 1:init, 2:progress, 3:clear } - // ⼭ óϴ ... + // 여기서 처리하는 로직... pRoom->MainRoom(fCurrentTime); } } - Sleep(1000); // 1ʴ ѹ + Sleep(1000); // 1초당 한번 } return 0; diff --git a/src/server/AIServer/Packet.h b/src/server/AIServer/Packet.h index 831006fd..b0216b1b 100644 --- a/src/server/AIServer/Packet.h +++ b/src/server/AIServer/Packet.h @@ -3,7 +3,7 @@ const BYTE INFO_MODIFY = 1; const BYTE INFO_DELETE = 2; -// ̻ +// 상태이상 정보 #define _ABNORMAL_DB 5 const BYTE ABNORMAL_NONE = 0; @@ -18,13 +18,13 @@ const BYTE ABNORMAL_HASTE = 8; const BYTE ABNORMAL_SHIELD = 9; const BYTE ABNORMAL_INFRAVISION = 10; -const int TYPE_MONEY_SID = 900000000; // ϱ sid ũ Ҵ. +const int TYPE_MONEY_SID = 900000000; // 아이템 과 돈을 구분하기위해 sid를 크게 잡았다. #define SERVER_INFO_START 0X01 #define SERVER_INFO_END 0X02 // --------------------------------------------------------------------- -// AI Server Ӽ Npc õ Ŷ 1~49 +// AI Server와 게임서버간의 Npc에 관련된 패킷은 1번~49번 // --------------------------------------------------------------------- // A : AIServer , G : GameServer @@ -42,7 +42,7 @@ const BYTE AG_NPC_INOUT = 11; const BYTE AG_NPC_EVENT_ITEM = 12; // --------------------------------------------------------------------- -// AI Server Ӽ User, Npc õ Ŷ 50~100 +// AI Server와 게임서버간의 User, Npc 공통 관련된 패킷은 50번~100번 // --------------------------------------------------------------------- const BYTE AG_SERVER_INFO = 50; // const BYTE AG_ATTACK_REQ = 51; // Attck Packet @@ -54,9 +54,9 @@ const BYTE AG_COMPRESSED_DATA = 56; // Packet Data compressed const BYTE AG_ZONE_CHANGE = 57; // Zone change const BYTE AG_MAGIC_ATTACK_REQ = 58; // Magic Attck Packet (User->Monster const BYTE AG_MAGIC_ATTACK_RESULT = 59; // Magic Attck Packet -const BYTE AG_USER_INFO_ALL = 60; // User +const BYTE AG_USER_INFO_ALL = 60; // User의 모든 정보 전송 const BYTE AG_LONG_MAGIC_ATTACK = 61; // Magic Attck Packet -const BYTE AG_PARTY_INFO_ALL = 62; // Party +const BYTE AG_PARTY_INFO_ALL = 62; // Party의 모든 정보 전송 const BYTE AG_HEAL_MAGIC = 63; // Healing magic const BYTE AG_TIME_WEATHER = 64; // time and whether info const BYTE AG_BATTLE_EVENT = 65; // battle event @@ -69,20 +69,20 @@ const BYTE BATTLE_EVENT_RESULT = 3; // battle event result ( victory nation const BYTE BATTLE_EVENT_MAX_USER = 4; // battle event result ( user name ) // --------------------------------------------------------------------- -// AI Server Ӽ User õ Ŷ 101 +// AI Server와 게임서버간의 User에 관련된 패킷은 101번 부터 시작 // --------------------------------------------------------------------- -const BYTE AG_USER_INFO = 101; // User -const BYTE AG_USER_INOUT = 102; // User In,Out -const BYTE AG_USER_MOVE = 103; // User move -const BYTE AG_USER_MOVEEDGE = 104; // User move end -const BYTE AG_USER_SET_HP = 105; // User HP -const BYTE AG_USER_LOG_OUT = 106; // User LogOut -const BYTE AG_USER_REGENE = 107; // User Regene -const BYTE AG_USER_EXP = 108; // User ġ -const BYTE AG_USER_UPDATE = 109; // User Update Info -const BYTE AG_USER_FAIL = 110; // ߸ ó... -const BYTE AG_USER_PARTY = 111; // Ƽó +const BYTE AG_USER_INFO = 101; // User의 정보 +const BYTE AG_USER_INOUT = 102; // User의 In,Out 정보 +const BYTE AG_USER_MOVE = 103; // User의 move +const BYTE AG_USER_MOVEEDGE = 104; // User의 move end +const BYTE AG_USER_SET_HP = 105; // User의 HP +const BYTE AG_USER_LOG_OUT = 106; // User의 LogOut +const BYTE AG_USER_REGENE = 107; // User의 Regene +const BYTE AG_USER_EXP = 108; // User의 경험치 +const BYTE AG_USER_UPDATE = 109; // User의 Update Info +const BYTE AG_USER_FAIL = 110; // 잘못된 유저 처리... +const BYTE AG_USER_PARTY = 111; // 파티처리 담당 //////////////////////////////////////////////////////////////// // Party Related subpacket define diff --git a/src/server/AIServer/Party.cpp b/src/server/AIServer/Party.cpp index f057d321..46f260c0 100644 --- a/src/server/AIServer/Party.cpp +++ b/src/server/AIServer/Party.cpp @@ -76,7 +76,7 @@ void CParty::PartyCreate(char * pBuf) { pParty->uid[0] = sUid; if (m_pMain->m_arParty.PutData(pParty->wIndex, pParty)) { - TRACE("Party - Create() : Party number = %d, uid=%d, %d \n", sPartyIndex, pParty->uid[0], pParty->uid[1]); + TRACE("Party - Create() : Party 생성 number = %d, uid=%d, %d \n", sPartyIndex, pParty->uid[0], pParty->uid[1]); } LeaveCriticalSection(&g_region_critical); } @@ -98,7 +98,7 @@ void CParty::PartyInsert(char * pBuf) { //sClass = GetShort(pBuf, index); pParty = m_pMain->m_arParty.GetData(sPartyIndex); - if (!pParty) { // ̻ + if (!pParty) { // 이상한 경우 return; } @@ -131,7 +131,7 @@ void CParty::PartyRemove(char * pBuf) { } pParty = m_pMain->m_arParty.GetData(sPartyIndex); - if (!pParty) { // ̻ + if (!pParty) { // 이상한 경우 return; } @@ -163,7 +163,7 @@ void CParty::PartyDelete(char * pBuf) { } pParty = m_pMain->m_arParty.GetData(sPartyIndex); - if (!pParty) { // ̻ + if (!pParty) { // 이상한 경우 return; } diff --git a/src/server/AIServer/Party.h b/src/server/AIServer/Party.h index e8d2758b..ccef83cb 100644 --- a/src/server/AIServer/Party.h +++ b/src/server/AIServer/Party.h @@ -13,8 +13,8 @@ class CServerDlg; class CParty { public: //int m_iSid; // Party Number - //short m_sCurUser; // Ƽ ο - //short m_sCurLevel; // Ƽ + //short m_sCurUser; // 파티 인원 수 + //short m_sCurLevel; // 파티원의 총 레벨 합 CServerDlg * m_pMain; //PartyUserArray m_arPartyUser; diff --git a/src/server/AIServer/PartyUser.h b/src/server/AIServer/PartyUser.h index 478fdb02..34c83f56 100644 --- a/src/server/AIServer/PartyUser.h +++ b/src/server/AIServer/PartyUser.h @@ -6,8 +6,8 @@ class CPartyUser { public: - char m_strUserID[MAX_ID_SIZE + 1]; // ij ̸ - int m_iUserId; // User ȣ + char m_strUserID[MAX_ID_SIZE + 1]; // 캐릭터의 이름 + int m_iUserId; // User의 번호 public: CPartyUser(); virtual ~CPartyUser(); diff --git a/src/server/AIServer/PathFind.cpp b/src/server/AIServer/PathFind.cpp index 8b81d149..16a97e35 100644 --- a/src/server/AIServer/PathFind.cpp +++ b/src/server/AIServer/PathFind.cpp @@ -76,7 +76,7 @@ void CPathFind::SetMap(int x, int y, int * pMap) { m_pMap = map; ::InterlockedExchange(&m_lMapUse, 0); } - else TRACE("߸ ʼ\n"); */ + else TRACE("잘못된 맵셋팅\n"); */ } _PathNode * CPathFind::FindPath(int start_x, int start_y, int dest_x, int dest_y) { @@ -96,7 +96,7 @@ _PathNode * CPathFind::FindPath(int start_x, int start_y, int dest_x, int dest_y t_node->x = start_x; t_node->y = start_y; - // int maxtry = (X ̵ * ִ X ) + (Y ̵ * ִ Y) + 1; + // int maxtry = (X 이동폭 * 최대 X구간 ) + (Y 이동폭 * 최대 Y구간) + 1; int maxtry = abs(start_x - dest_x) * m_vMapSize.cx + abs(start_y - dest_y) * m_vMapSize.cy + 1; int count = 0; @@ -104,7 +104,7 @@ _PathNode * CPathFind::FindPath(int start_x, int start_y, int dest_x, int dest_y while (1) { if (count > maxtry * 2) { // BREAKPOINT(); - //TRACE("нε ߵ...%d\n", count); + //TRACE("패스파인드 중도포기...%d\n", count); return NULL; } count += 1; diff --git a/src/server/AIServer/RoomEvent.cpp b/src/server/AIServer/RoomEvent.cpp index e9d727f9..7ffa977e 100644 --- a/src/server/AIServer/RoomEvent.cpp +++ b/src/server/AIServer/RoomEvent.cpp @@ -60,7 +60,7 @@ void CRoomEvent::Initialize() { } void CRoomEvent::MainRoom(float fcurtime) { - // ˻ ؾ .. + // 조건 검색먼저 해야 겠지.. BOOL bCheck = FALSE, bRunCheck = FALSE; char notify[50]; memset(notify, 0x00, 50); @@ -73,7 +73,7 @@ void CRoomEvent::MainRoom(float fcurtime) { event_num = m_Exec[m_byLogicNumber - 1].sNumber; bRunCheck = RunEvent(event_num); if (bRunCheck) { - //wsprintf(notify, "** ˸ : [%d] Ŭ Ǿϴ. **", m_sRoomNumber); + //wsprintf(notify, "** 알림 : [%d]방이 클리어 되어습니다. **", m_sRoomNumber); //m_pMain->SendSystemMsg( notify, m_iZoneNumber, PUBLIC_CHAT, SEND_ALL); m_byStatus = 3; } @@ -91,7 +91,7 @@ BOOL CRoomEvent::CheckEvent(int event_num, float fcurtime) { } switch (event_num) { - case 1: // Ư ͸ ̴ + case 1: // 특정 몬스터를 죽이는 경우 nOption_1 = m_Logic[m_byLogicNumber - 1].sOption_1; pNpc = GetNpcPtr(nOption_1); if (pNpc) { @@ -103,32 +103,32 @@ BOOL CRoomEvent::CheckEvent(int event_num, float fcurtime) { } //TRACE("---Check Event : monster dead = %d \n", nMonsterNid); break; - case 2: // ͸ ׿ + case 2: // 모든 몬스터를 죽여라 bRetValue = CheckMonsterCount(0, 0, 3); if (bRetValue) { - TRACE(" ͸ ׿ \n"); + TRACE("모든 몬스터를 죽여라 죽임\n"); return TRUE; } break; - case 3: // е ߶ + case 3: // 몇분동안 버텨라 nMinute = m_Logic[m_byLogicNumber - 1].sOption_1; - nMinute = nMinute * 60; // ʷ ȯ - if (fcurtime >= m_fDelayTime + nMinute) { // ѽð + nMinute = nMinute * 60; // 분을 초로 변환 + if (fcurtime >= m_fDelayTime + nMinute) { // 제한시간 종료 TRACE("---Check Event : curtime=%.2f, starttime=%.2f \n", fcurtime, m_fDelayTime); - TRACE("Ƽ \n"); + TRACE("버티기 성공\n"); return TRUE; } //TRACE("---Check Event : curtime=%.2f, starttime=%.2f \n", fcurtime, m_fDelayTime); break; - case 4: // ǥ ̵ + case 4: // 목표지점까지 이동 break; - case 5: // Ư͸ ɼ2 ŭ ׿ + case 5: // 특정몬스터를 옵션2의 마리수 만큼 죽여라 nOption_1 = m_Logic[m_byLogicNumber - 1].sOption_1; nOption_2 = m_Logic[m_byLogicNumber - 1].sOption_2; bRetValue = CheckMonsterCount(nOption_1, nOption_2, 1); if (bRetValue) { - TRACE("Ư(%d) %d \n", nOption_1, nOption_2); + TRACE("특정몬스터(%d)를 %d마리 죽임\n", nOption_1, nOption_2); return TRUE; } break; @@ -147,61 +147,61 @@ BOOL CRoomEvent::RunEvent(int event_num) { int nOption_1 = 0, nOption_2 = 0; BOOL bRetValue = FALSE; switch (event_num) { - case 1: // ٸ + case 1: // 다른 몬스터의 출현 nOption_1 = m_Exec[m_byLogicNumber - 1].sOption_1; pNpc = GetNpcPtr(nOption_1); if (pNpc) { - pNpc->m_byChangeType = 3; // ּ... + pNpc->m_byChangeType = 3; // 몬스터 출현해주세여... pNpc->SetLive(&m_pMain->m_Iocport); } else { - TRACE("### RunEvent Error : = %d, logic=%d ###\n", nOption_1, m_byLogicNumber); + TRACE("### RunEvent Error : 몬스터 출현 할 수 없당 = %d, logic=%d ###\n", nOption_1, m_byLogicNumber); } - if (m_byCheck == m_byLogicNumber) { // Ŭ + if (m_byCheck == m_byLogicNumber) { // 방이 클리어 return TRUE; } else { m_byLogicNumber++; } break; - case 2: // + case 2: // 문이 열림 nOption_1 = m_Exec[m_byLogicNumber - 1].sOption_1; pNpc = GetNpcPtr(nOption_1); if (pNpc) { } else { - TRACE("### RunEvent Error : = %d, logic=%d ###\n", nOption_1, + TRACE("### RunEvent Error : 문 담당 몬스터 출현 할 수 없당 = %d, logic=%d ###\n", nOption_1, m_byLogicNumber); } - //wsprintf(notify, "** ˸ : [%d] ϴ **", m_sRoomNumber); + //wsprintf(notify, "** 알림 : [%d] 문이 열립니다 **", m_sRoomNumber); //m_pMain->SendSystemMsg( notify, m_iZoneNumber, PUBLIC_CHAT, SEND_ALL); - if (m_byCheck == m_byLogicNumber) { // Ŭ + if (m_byCheck == m_byLogicNumber) { // 방이 클리어 return TRUE; } else { m_byLogicNumber++; } break; - case 3: // ٸ ͷ ȯ - if (m_byCheck == m_byLogicNumber) { // Ŭ + case 3: // 다른 몬스터로 변환 + if (m_byCheck == m_byLogicNumber) { // 방이 클리어 return TRUE; } break; - case 4: // Ư ɼ2 ŭ + case 4: // 특정몬스터 옵션2의 마리수만큼 출현 nOption_1 = m_Exec[m_byLogicNumber - 1].sOption_1; nOption_2 = m_Exec[m_byLogicNumber - 1].sOption_2; bRetValue = CheckMonsterCount(nOption_1, nOption_2, 2); - //wsprintf(notify, "** ˸ : [%d, %d] **", nOption_1, nOption_2); + //wsprintf(notify, "** 알림 : [%d, %d] 몬스터 출현 **", nOption_1, nOption_2); //m_pMain->SendSystemMsg( notify, m_iZoneNumber, PUBLIC_CHAT, SEND_ALL); - if (m_byCheck == m_byLogicNumber) { // Ŭ + if (m_byCheck == m_byLogicNumber) { // 방이 클리어 return TRUE; } else { m_byLogicNumber++; } break; - case 100: // Ư ɼ2 ŭ + case 100: // 특정몬스터 옵션2의 마리수만큼 출현 nOption_1 = m_Exec[m_byLogicNumber - 1].sOption_1; nOption_2 = m_Exec[m_byLogicNumber - 1].sOption_2; @@ -209,7 +209,7 @@ BOOL CRoomEvent::RunEvent(int event_num) { if (nOption_1 != 0) { EndEventSay(nOption_1, nOption_2); } - if (m_byCheck == m_byLogicNumber) { // Ŭ + if (m_byCheck == m_byLogicNumber) { // 방이 클리어 return TRUE; } else { m_byLogicNumber++; @@ -319,7 +319,7 @@ BOOL CRoomEvent::CheckMonsterCount(int sid, int count, int type) { pNpc->m_byRegenType = 0; } pNpc->m_byChangeType = 0; - } else if (type == 3) { // ͸ ׾ Ǵ + } else if (type == 3) { // 모든 몬스터를 죽었는지를 판단 if (pNpc->m_byDeadType == 100) { nMonsterCount++; } @@ -327,14 +327,14 @@ BOOL CRoomEvent::CheckMonsterCount(int sid, int count, int type) { bRetValue = TRUE; } } else if (pNpc->m_sSid == sid) { - if (type == 1) { // Ư Ͱ ŭ ׾ Ǵ + if (type == 1) { // 특정 몬스터가 마리수 만큼 죽었는지를 판단 if (pNpc->m_byChangeType == 100) { nMonsterCount++; } if (nMonsterCount == count) { bRetValue = TRUE; } - } else if (type == 2) { // Ư ͸ ŭ Ѷ,, + } else if (type == 2) { // 특정 몬스터를 마리수 만큼 출현 시켜라,, pNpc->m_byChangeType = 3; nMonsterCount++; if (nMonsterCount == count) { @@ -357,7 +357,7 @@ void CRoomEvent::InitializeRoom() { m_fDelayTime = 0.0f; m_byLogicNumber = 1; - CheckMonsterCount(0, 0, 4); // m_byChangeType=0 ʱȭ + CheckMonsterCount(0, 0, 4); // 몬스터의 m_byChangeType=0으로 초기화 } void CRoomEvent::EndEventSay(int option1, int option2) { @@ -370,7 +370,7 @@ void CRoomEvent::EndEventSay(int option1, int option2) { std::string buff; switch (option1) { - case 1: // Ŭ ¿ Ŭ̾Ʈ + case 1: // 클리어 상태에서 클라이언트에 내려줄 내용 switch (option2) { case 1: ::_LoadStringFromResource(IDS_KARUS_CATCH_1, buff); @@ -393,7 +393,7 @@ void CRoomEvent::EndEventSay(int option1, int option2) { m_pMain->SendSystemMsg(notify, m_iZoneNumber, WAR_SYSTEM_CHAT, SEND_ALL); break; - case 2: // Ŭ ¿ Ŭ̾Ʈ ִ ̺Ʈ ֱ + case 2: // 클리어 상태에서 클라이언트에 내려줄 내용와 적국으로 갈 수 있는 이벤트 존 열어주기 if (option2 == KARUS_ZONE) { ::_LoadStringFromResource(IDS_KARUS_PATHWAY, buff); sprintf(notify, buff.c_str()); @@ -415,7 +415,7 @@ void CRoomEvent::EndEventSay(int option1, int option2) { m_pMain->SendSystemMsg(notify, m_iZoneNumber, WAR_SYSTEM_CHAT, SEND_ALL); break; - case 3: // Ŭ ¿ Ŭ̾Ʈ ¸ ˷ش. + case 3: // 클리어 상태에서 클라이언트에 내려줄 내용와 승리팀을 알려준다. if (option2 == KARUS_ZONE) { SetByte(send_buff, AG_BATTLE_EVENT, send_index); SetByte(send_buff, BATTLE_EVENT_RESULT, send_index); diff --git a/src/server/AIServer/RoomEvent.h b/src/server/AIServer/RoomEvent.h index c3750eee..f79ad55c 100644 --- a/src/server/AIServer/RoomEvent.h +++ b/src/server/AIServer/RoomEvent.h @@ -11,9 +11,9 @@ typedef CSTLMap mapNpcArray; struct _RoomEvent { - short sNumber; // ɾ, ǹ ȣ - short sOption_1; // option 1 ( ȣ ַ ) - short sOption_2; // option 2 ( ) + short sNumber; // 명령어, 조건문 번호 + short sOption_1; // option 1 (몬스터의 번호를 주로 가지고 있음) + short sOption_2; // option 2 (몬스터의 마리수) }; class CNpc; @@ -24,21 +24,21 @@ class CRoomEvent { int m_iZoneNumber; // zone number short m_sRoomNumber; // room number (0:empty room) BYTE m_byStatus; // room status (1:init, 2:progress, 3:clear) - BYTE m_byCheck; // ǹ - BYTE m_byRoomType; // Ÿ(0:Ϲ, 1:, 2:,,,,) + BYTE m_byCheck; // 조건문의 갯수 + BYTE m_byRoomType; // 방의 타입(0:일반, 1:함정방, 2:,,,,) int m_iInitMinX; // room region x int m_iInitMinZ; int m_iInitMaxX; int m_iInitMaxZ; - int m_iEndMinX; // room end region x ,, + int m_iEndMinX; // room end region x 도착지점,, int m_iEndMinZ; int m_iEndMaxX; int m_iEndMaxZ; - _RoomEvent m_Logic[MAX_CHECK_EVENT]; // ǵ - _RoomEvent m_Exec[MAX_CHECK_EVENT]; // ๮ + _RoomEvent m_Logic[MAX_CHECK_EVENT]; // 조건들 + _RoomEvent m_Exec[MAX_CHECK_EVENT]; // 실행문 float m_fDelayTime; // time @@ -47,7 +47,7 @@ class CRoomEvent { private: BYTE - m_byLogicNumber; // ǹ ˻ ȣ (ǹȣ 1 ۵) (m_byCheck m_byLogicNumber ٸ Ŭ ) + m_byLogicNumber; // 현재의 조건문 검사 번호 (조건번호는 1부터 시작됨) (m_byCheck와 m_byLogicNumber이 같다면 클리어 상태) public: CRoomEvent(); diff --git a/src/server/AIServer/Server/MAP.cpp b/src/server/AIServer/Server/MAP.cpp index f9dd7ee4..1b279146 100644 --- a/src/server/AIServer/Server/MAP.cpp +++ b/src/server/AIServer/Server/MAP.cpp @@ -100,7 +100,7 @@ BOOL MAP::IsMovable(int dest_x, int dest_y) { } /////////////////////////////////////////////////////////////////////// -// ϰ ִ zone Map εѴ. +// 각 서버가 담당하고 있는 zone의 Map을 로드한다. // BOOL MAP::LoadMap(HANDLE hFile) { LoadTerrain(hFile); @@ -138,7 +138,7 @@ BOOL MAP::LoadMap(HANDLE hFile) { void MAP::LoadTerrain(HANDLE hFile) { DWORD dwRWC; - ReadFile(hFile, &m_nMapSize, sizeof(int), &dwRWC, NULL); // μ ΰ? + ReadFile(hFile, &m_nMapSize, sizeof(int), &dwRWC, NULL); // 가로세로 정보가 몇개씩인가? ReadFile(hFile, &m_fUnitDist, sizeof(float), &dwRWC, NULL); m_fHeight = new float *[m_nMapSize]; @@ -149,7 +149,7 @@ void MAP::LoadTerrain(HANDLE hFile) { int x, z; for (z = 0; z < m_nMapSize; z++) { for (x = 0; x < m_nMapSize; x++) { - ReadFile(hFile, &(m_fHeight[x][z]), sizeof(float), &dwRWC, NULL); // ̰ о + ReadFile(hFile, &(m_fHeight[x][z]), sizeof(float), &dwRWC, NULL); // 높이값 읽어오기 } } } @@ -158,7 +158,7 @@ float MAP::GetHeight(float x, float z) { int iX, iZ; iX = (int)(x / m_fUnitDist); iZ = (int)(z / m_fUnitDist); - //_ASSERT( iX, iZ ִ üũϱ); + //_ASSERT( iX, iZ가 범위내에 있는 값인지 체크하기); float y; float h1, h2, h3; @@ -179,9 +179,9 @@ float MAP::GetHeight(float x, float z) { //if (dX == 1.0f) return h2; - float h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - float h32 = h3 + (h2 - h3) * dX; // h3 h2 ̰ - y = h32 + (h12 - h32) * ((dZ) / (1.0f - dX)); // ã ϴ ̰ + float h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + float h32 = h3 + (h2 - h3) * dX; // h3과 h2사이의 높이값 + y = h32 + (h12 - h32) * ((dZ) / (1.0f - dX)); // 찾고자 하는 높이값 } else { h1 = m_fHeight[iX][iZ + 1]; h2 = m_fHeight[iX + 1][iZ]; @@ -191,9 +191,9 @@ float MAP::GetHeight(float x, float z) { return h1; } - float h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - float h13 = h1 + (h3 - h1) * dX; // h1 h3 ̰ - y = h13 + (h12 - h13) * ((1.0f - dZ) / (dX)); // ã ϴ ̰ + float h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + float h13 = h1 + (h3 - h1) * dX; // h1과 h3사이의 높이값 + y = h13 + (h12 - h13) * ((1.0f - dZ) / (dX)); // 찾고자 하는 높이값 } } else { if (dZ > dX) { @@ -203,9 +203,9 @@ float MAP::GetHeight(float x, float z) { //if (dX == 1.0f) return h2; - float h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - float h32 = h3 + (h2 - h3) * dX; // h3 h2 ̰ - y = h12 + (h32 - h12) * ((1.0f - dZ) / (1.0f - dX)); // ã ϴ ̰ + float h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + float h32 = h3 + (h2 - h3) * dX; // h3과 h2사이의 높이값 + y = h12 + (h32 - h12) * ((1.0f - dZ) / (1.0f - dX)); // 찾고자 하는 높이값 } else { h1 = m_fHeight[iX][iZ]; h2 = m_fHeight[iX + 1][iZ]; @@ -215,9 +215,9 @@ float MAP::GetHeight(float x, float z) { return h1; } - float h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - float h13 = h1 + (h3 - h1) * dX; // h1 h3 ̰ - y = h12 + (h13 - h12) * ((dZ) / (dX)); // ã ϴ ̰ + float h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + float h13 = h1 + (h3 - h1) * dX; // h1과 h3사이의 높이값 + y = h12 + (h13 - h12) * ((dZ) / (dX)); // 찾고자 하는 높이값 } } return y; @@ -306,10 +306,10 @@ Iterator MAP::RegionNpcRemove(int rx, int rz, int nid) { } void MAP::LoadMapTile(HANDLE hFile) { - //MapTileӼ б.. - // Ӽ 0̸ . - // 1̸ ׳ ... - // ׿ܴ ̺Ʈ ID. + //MapTile속성 읽기.. + // 속성이 0이면 못 가는 곳. + // 1이면 그냥 가는 곳... + // 그외는 이벤트 ID. // int x1 = m_sizeMap.cx; int z1 = m_sizeMap.cy; @@ -319,7 +319,7 @@ void MAP::LoadMapTile(HANDLE hFile) { for (int a = 0; a < m_sizeMap.cx; a++) { pEvent[a] = new short[m_sizeMap.cx]; } - // Ƴ.. + // 잠시 막아놓고.. for (int x = 0; x < m_sizeMap.cx; x++) { ReadFile(hFile, pEvent[x], sizeof(short) * m_sizeMap.cy, &dwNum, NULL); } @@ -405,7 +405,7 @@ void MAP::LoadObjectEvent(HANDLE hFile) { ReadFile(hFile, &iEventObjectCount, 4, &dwNum, NULL); for (int i = 0; i < iEventObjectCount; i++) { pEvent = new _OBJECT_EVENT; - ReadFile(hFile, &(pEvent->sBelong), 4, &dwNum, NULL); // Ҽ + ReadFile(hFile, &(pEvent->sBelong), 4, &dwNum, NULL); // 소속 ReadFile(hFile, &(pEvent->sIndex), 2, &dwNum, NULL); // Event Index ReadFile(hFile, &(pEvent->sType), 2, &dwNum, NULL); ReadFile(hFile, &(pEvent->sControlNpcID), 2, &dwNum, NULL); @@ -414,7 +414,7 @@ void MAP::LoadObjectEvent(HANDLE hFile) { ReadFile(hFile, &(pEvent->fPosY), 4, &dwNum, NULL); ReadFile(hFile, &(pEvent->fPosZ), 4, &dwNum, NULL); - // ۾Ұ : ʵͰ ٲ Param1 2̸ ΰ Ǵ.. 3̸ .. + // 작업할것 : 맵데이터가 바뀌면 Param1이 2이면 성문인것을 판단.. 3이면 레버.. if (pEvent->sType == 1 || pEvent->sType == 2 || pEvent->sType == 3) { // sungyong test m_pMain->AddObjectEventNpc(pEvent, m_nZoneNumber); diff --git a/src/server/AIServer/StdAfx.h b/src/server/AIServer/StdAfx.h index ab9881f6..27a063c0 100644 --- a/src/server/AIServer/StdAfx.h +++ b/src/server/AIServer/StdAfx.h @@ -35,10 +35,10 @@ //#include "Imm.h" //#include "N3Base/My_3DStruct.h" -#include "packet.h" // packet -#include "global.h" // funtion +#include "packet.h" // packet 정의 +#include "global.h" // 전역 funtion #include "define.h" // define -//#include "extern.h" // ü +//#include "extern.h" // 전역 객체 //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. diff --git a/src/server/AIServer/User.cpp b/src/server/AIServer/User.cpp index 8d97f6d5..ec08c5a4 100644 --- a/src/server/AIServer/User.cpp +++ b/src/server/AIServer/User.cpp @@ -22,25 +22,25 @@ static char THIS_FILE[] = __FILE__; ////////////////////////////////////////////////////////////////////// /* - ** Repent AI Server ۾ ** - 1. Initialize() - 2. SendAttackSuccess() - 3. GetDamage() + ** Repent AI Server 작업시 참고 사항 ** + 1. Initialize() 수정 + 2. SendAttackSuccess() 수정 + 3. GetDamage() 수정 */ #define MORAL_GOOD 0x01 #define MORAL_BAD 0x02 #define MORAL_NEUTRAL 0x03 -//  ̵ ֱ.. +// 운영자 아이디 넣기.. /*const char* g_pszOPID[] = { - //"2", - //"", - //"̻ۿ2" + //"여우야2", + //"난강해", + //"이쁜여우2" //"Morpheus" -// "Ǽ", -// "μ" +// "맨순", +// "민순" };*/ float surround_fx[8] = {0.0f, -0.7071f, -1.0f, -0.7083f, 0.0f, 0.7059f, 1.0000f, 0.7083f}; @@ -60,39 +60,39 @@ void CUser::Initialize() { m_MagicProcess.m_pMain = m_pMain; m_MagicProcess.m_pSrcUser = this; - memset(m_strUserID, 0, MAX_ID_SIZE + 1); // ij ̸ - m_iUserId = -1; // User ȣ - m_bLive = USER_DEAD; // ׾? Ҵ? - m_curx = 0.0f; // X ǥ - m_cury = 0.0f; // Y ǥ - m_curz = 0.0f; // Z ǥ + memset(m_strUserID, 0, MAX_ID_SIZE + 1); // 캐릭터의 이름 + m_iUserId = -1; // User의 번호 + m_bLive = USER_DEAD; // 죽었니? 살았니? + m_curx = 0.0f; // 현재 X 좌표 + m_cury = 0.0f; // 현재 Y 좌표 + m_curz = 0.0f; // 현재 Z 좌표 m_fWill_x = 0.0f; m_fWill_y = 0.0f; m_fWill_z = 0.0f; - m_curZone = -1; // + m_curZone = -1; // 현재 존 m_sZoneIndex = -1; - m_bNation = 0; // Ҽӱ - m_sLevel = 0; // + m_bNation = 0; // 소속국가 + m_sLevel = 0; // 레벨 m_sHP = 0; // HP m_sMP = 0; // MP m_sSP = 0; // SP m_sMaxHP = 0; // MaxHP m_sMaxMP = 0; // MaxMP m_sMaxSP = 0; // MaxSP - m_state = 0; // User - m_sRegionX = 0; // X ǥ - m_sRegionZ = 0; // Z ǥ + m_state = 0; // User의 상태 + m_sRegionX = 0; // 현재 영역 X 좌표 + m_sRegionZ = 0; // 현재 영역 Z 좌표 m_sOldRegionX = 0; m_sOldRegionZ = 0; - m_bResHp = 0; // ȸ + m_bResHp = 0; // 회복량 m_bResMp = 0; m_bResSta = 0; m_sHitDamage = 0; // Hit m_sAC = 0; m_sItemAC = 0; - m_fHitrate = 0.0f; // Ÿ - m_fAvoidrate = 0; // ȸ - m_bLogOut = FALSE; // Logout ΰ? + m_fHitrate = 0.0f; // 타격 성공률 + m_fAvoidrate = 0; // 회피 성공률 + m_bLogOut = FALSE; // Logout 중인가? m_byNowParty = 0; m_sPartyTotalLevel = 0; m_byPartyTotalMan = 0; @@ -119,7 +119,7 @@ void CUser::Attack(int sid, int tid) { return; } - /* if(pNpc->m_tNpcType == NPCTYPE_GUARD) // ̸ Ÿ ش + /* if(pNpc->m_tNpcType == NPCTYPE_GUARD) // 경비병이면 타겟을 해당 유저로 { pNpc->m_Target.id = m_iUserId + USER_BAND; pNpc->m_Target.x = m_curx; @@ -130,10 +130,10 @@ void CUser::Attack(int sid, int tid) { } */ int nDefence = 0, nFinalDamage = 0; - // NPC  + // NPC 방어값 nDefence = pNpc->GetDefense(); - // ̸ //Damage ó ----------------------------------------------------------------// + // 명중이면 //Damage 처리 ----------------------------------------------------------------// nFinalDamage = GetDamage(tid); if (m_pMain->m_byTestMode) { nFinalDamage = 3000; // sungyong test @@ -143,15 +143,15 @@ void CUser::Attack(int sid, int tid) { short sOldNpcHP = pNpc->m_iHP; if (pNpc->SetDamage(0, nFinalDamage, m_strUserID, m_iUserId + USER_BAND, m_pIocport) == FALSE) { - // Npc ,, - pNpc->SendExpToUserList(); // ġ й!! + // Npc가 죽은 경우,, + pNpc->SendExpToUserList(); // 경험치 분배!! pNpc->SendDead(m_pIocport); SendAttackSuccess(tid, ATTACK_TARGET_DEAD, nFinalDamage, pNpc->m_iHP); - // CheckMaxValue(m_dwXP, 1); // 1 ! + // CheckMaxValue(m_dwXP, 1); // 몹이 죽을때만 1 증가! // SendXP(); } else { - // + // 공격 결과 전송 SendAttackSuccess(tid, ATTACK_SUCCESS, nFinalDamage, pNpc->m_iHP); } // m_dwLastAttackTime = GetTickCount(); @@ -181,7 +181,7 @@ void CUser::SendAttackSuccess(int tuid, BYTE result, short sDamage, int nHP, sho //TRACE("User - SendAttackSuccess() : [sid=%d, tid=%d, result=%d], damage=%d, hp = %d\n", sid, tid, bResult, sDamage, sHP); - SendAll(buff, send_index); // thread send + SendAll(buff, send_index); // thread 에서 send } void CUser::SendMagicAttackResult(int tuid, BYTE result, short sDamage, short sHP) { @@ -207,7 +207,7 @@ void CUser::SendMagicAttackResult(int tuid, BYTE result, short sDamage, short sH //TRACE("User - SendAttackSuccess() : [sid=%d, tid=%d, result=%d], damage=%d, hp = %d\n", sid, tid, bResult, sDamage, sHP); - SendAll(buff, send_index); // thread send + SendAll(buff, send_index); // thread 에서 send } // sungyong 2002.05.22 @@ -246,7 +246,7 @@ void CUser::SendAll(TCHAR * pBuf, int nLength) { } // ~sungyong 2002.05.22 -// Damage , m_sHP 0 ̸ ó +// Damage 계산, 만약 m_sHP 가 0 이하이면 사망처리 void CUser::SetDamage(int damage, int tid) { if (damage <= 0) { return; @@ -267,7 +267,7 @@ void CUser::SetDamage(int damage, int tid) { } //SendHP(); - // ̸ ٸ . + // 버디중이면 다른 버디원에게 날린다. } void CUser::Dead(int tid, int nDamage) { @@ -275,13 +275,13 @@ void CUser::Dead(int tid, int nDamage) { return; } - // κп update ؾ ,, Ӽ,, óϵ,,, + // 이 부분에서 update를 해야 함,, 게임서버에서,, 처리하도록,,, m_sHP = 0; m_bLive = USER_DEAD; InitNpcAttack(); - // region ... + // region에서 삭제... if (m_sZoneIndex < 0 || m_sZoneIndex > m_pMain->g_arZone.size()) { TRACE("#### User-Dead ZoneIndex Fail : [name=%s], zoneindex=%d #####\n", m_strUserID, m_sZoneIndex); return; @@ -291,7 +291,7 @@ void CUser::Dead(int tid, int nDamage) { TRACE("#### CUser-Dead() Fail : [nid=%d, name=%s], pMap == NULL #####\n", m_iUserId, m_strUserID); return; } - // map region .. + // map에 region에서 나의 정보 삭제.. if (m_sRegionX < 0 || m_sRegionZ < 0 || m_sRegionX > pMap->GetXRegionMax() || m_sRegionZ > pMap->GetZRegionMax()) { TRACE("#### CUser-Dead() Fail : [nid=%d, name=%s], x1=%d, z1=%d #####\n", m_iUserId, m_strUserID, m_sRegionX, m_sRegionZ); @@ -299,7 +299,7 @@ void CUser::Dead(int tid, int nDamage) { } //pMap->m_ppRegion[m_sRegionX][m_sRegionZ].DeleteUser(m_iUserId); pMap->RegionUserRemove(m_sRegionX, m_sRegionZ, m_iUserId); - //TRACE("*** User Dead()-> User(%s, %d) Region ,, region_x=%d, y=%d\n", m_strUserID, m_iUserId, m_sRegionX, m_sRegionZ); + //TRACE("*** User Dead()-> User(%s, %d)를 Region에 삭제,, region_x=%d, y=%d\n", m_strUserID, m_iUserId, m_sRegionX, m_sRegionZ); m_sRegionX = -1; m_sRegionZ = -1; @@ -334,7 +334,7 @@ void CUser::Dead(int tid, int nDamage) { //TRACE("Npc - SendAttackSuccess()-User Dead : [sid=%d, tid=%d, result=%d], damage=%d, hp = %d\n", sid, targid, result, nDamage, m_sHP); if (tid > 0) { - SendAll(buff, send_index); // thread send + SendAll(buff, send_index); // thread 에서 send } /* SetByte(buff, AG_DEAD, send_index ); @@ -342,14 +342,14 @@ void CUser::Dead(int tid, int nDamage) { Setfloat(buff, m_curx, send_index); Setfloat(buff, m_curz, send_index); - SendAll(buff, send_index); // thread send */ + SendAll(buff, send_index); // thread 에서 send */ } void CUser::SendHP() { if (m_bLive == USER_DEAD) { return; } - // HP Ӽ... + // HP 변동량을 게임서버로... int send_index = 0; char buff[256]; memset(buff, 0x00, 256); @@ -451,7 +451,7 @@ void CUser::SetPartyExp(int iNpcExp, int iLoyalty, int iPartyLevel, int iMan) { SendExp(iNpcExp, iLoyalty); } -// ġ . (϶ ġ ش) +// 경험치를 보낸다. (레벨업일때 관련 수치를 준다) void CUser::SendExp(int iExp, int iLoyalty, int tType) { int send_index = 0; char buff[256]; @@ -494,12 +494,12 @@ short CUser::GetDamage(int tid, int magicid) { return damage; } - Attack = (float)m_fHitrate; // ݹø - Avoid = (float)pNpc->m_sEvadeRate; // ø - Hit = m_sHitDamage; // Hit - // Ac = (short)(pNpc->m_sDefense) + pNpc->m_sLevel; // Ac 2002.07.06 - Ac = (short)(pNpc->m_sDefense); // Ac - HitB = (int)((Hit * 200) / (Ac + 240)); // ο ݽ B + Attack = (float)m_fHitrate; // 공격민첩 + Avoid = (float)pNpc->m_sEvadeRate; // 방어민첩 + Hit = m_sHitDamage; // 공격자 Hit + // Ac = (short)(pNpc->m_sDefense) + pNpc->m_sLevel; // 방어자 Ac 2002.07.06 + Ac = (short)(pNpc->m_sDefense); // 방어자 Ac + HitB = (int)((Hit * 200) / (Ac + 240)); // 새로운 공격식의 B if (magicid > 0) { // Skill Hit. pTable = m_pMain->m_MagictableArray.GetData(magicid); // Get main magic table. @@ -559,14 +559,14 @@ short CUser::GetDamage(int tid, int magicid) { } } } else { // Normal Hit. - result = GetHitRate(Attack / Avoid); // Ÿݺ ϱ + result = GetHitRate(Attack / Avoid); // 타격비 구하기 } switch (result) { case GREAT_SUCCESS: case SUCCESS: case NORMAL: - if (magicid > 0) { // ų + if (magicid > 0) { // 스킬 공격 damage = (short)Hit; random = myrand(0, damage); // damage = (short)((0.85f * (float)Hit) + 0.3f * (float)random); @@ -575,14 +575,14 @@ short CUser::GetDamage(int tid, int magicid) { } else { damage = (short)((float)(Hit * 0.6f) + 1.0f * (float)random + 0.99); } - } else { //Ϲ + } else { //일반 공격 damage = (short)(HitB); random = myrand(0, damage); damage = (short)((0.85f * (float)HitB) + 0.3f * (float)random); } break; - case FAIL: // 䱸 + case FAIL: // 사장님 요구 damage = 0; break; } @@ -931,8 +931,8 @@ void CUser::SendSystemMsg(TCHAR * pMsg, BYTE type, int nWho) { short sLength = _tcslen(pMsg); SetByte(buff, AG_SYSTEM_MSG, send_index); - SetByte(buff, type, send_index); // ä - SetShort(buff, nWho, send_index); // + SetByte(buff, type, send_index); // 채팅형식 + SetShort(buff, nWho, send_index); // 누구에게 SetShort(buff, m_iUserId, send_index); SetShort(buff, sLength, send_index); SetString(buff, pMsg, sLength, send_index); @@ -1061,7 +1061,7 @@ void CUser::HealAreaCheck(int rx, int rz) { if (pMap == NULL) { return; } - // ڽ region ִ NpcArray ˻Ͽ,, Ÿ Monster ִ Ǵ.. + // 자신의 region에 있는 NpcArray을 먼저 검색하여,, 가까운 거리에 Monster가 있는지를 판단.. if (rx < 0 || rz < 0 || rx > pMap->GetXRegionMax() || rz > pMap->GetZRegionMax()) { TRACE("#### CUser-HealAreaCheck() Fail : [nid=%d, name=%s], nRX=%d, nRZ=%d #####\n", m_iUserId, m_strUserID, rx, rz); @@ -1109,7 +1109,7 @@ void CUser::HealAreaCheck(int rx, int rz) { vEnd.Set(pNpc->m_fCurX, pNpc->m_fCurY, pNpc->m_fCurZ); fDis = pNpc->GetDistance(vStart, vEnd); - if (fDis <= fRadius) { // NPC ݰȿ ... + if (fDis <= fRadius) { // NPC가 반경안에 있을 경우... pNpc->ChangeTarget(1004, this, m_pIocport); } else { continue; diff --git a/src/server/AIServer/User.h b/src/server/AIServer/User.h index 9dc95d41..a9bb758d 100644 --- a/src/server/AIServer/User.h +++ b/src/server/AIServer/User.h @@ -23,24 +23,24 @@ class CUser { UserLogList m_UserLogList; - // ʿ ,,, - // ij ⺻ Ӽ - char m_strUserID[MAX_ID_SIZE + 1]; // ij ̸ - int m_iUserId; // User ȣ - BYTE m_bLive; // ׾? Ҵ? - - float m_curx; // X ǥ - float m_cury; // Y ǥ - float m_curz; // Z ǥ - float m_fWill_x; // X ǥ - float m_fWill_y; // Y ǥ - float m_fWill_z; // Z ǥ - short m_sSpeed; // ǵ - BYTE m_curZone; // - short m_sZoneIndex; // index ȣ.. - - BYTE m_bNation; // Ҽӱ - short m_sLevel; // + // 필요한 정보 변수만 선언,,, + // 캐릭터 기본 속성 + char m_strUserID[MAX_ID_SIZE + 1]; // 캐릭터의 이름 + int m_iUserId; // User의 번호 + BYTE m_bLive; // 죽었니? 살았니? + + float m_curx; // 현재 X 좌표 + float m_cury; // 현재 Y 좌표 + float m_curz; // 현재 Z 좌표 + float m_fWill_x; // 다음 X 좌표 + float m_fWill_y; // 다음 Y 좌표 + float m_fWill_z; // 다음 Z 좌표 + short m_sSpeed; // 유저의 스피드 + BYTE m_curZone; // 현재 존 + short m_sZoneIndex; // 현재 존의 index 번호.. + + BYTE m_bNation; // 소속국가 + short m_sLevel; // 레벨 short m_sHP; // HP short m_sMP; // MP @@ -49,34 +49,34 @@ class CUser { short m_sMaxMP; // MP short m_sMaxSP; // SP - BYTE m_state; // User + BYTE m_state; // User의 상태 - short m_sRegionX; // X ǥ - short m_sRegionZ; // Z ǥ - short m_sOldRegionX; // X ǥ - short m_sOldRegionZ; // Z ǥ + short m_sRegionX; // 현재 영역 X 좌표 + short m_sRegionZ; // 현재 영역 Z 좌표 + short m_sOldRegionX; // 이전 영역 X 좌표 + short m_sOldRegionZ; // 이전 영역 Z 좌표 - BYTE m_bResHp; // ȸ + BYTE m_bResHp; // 회복량 BYTE m_bResMp; BYTE m_bResSta; - BYTE m_byNowParty; // Ƽ̸ 1, δ̸ 2, Ѵ ƴϸ 0 - BYTE m_byPartyTotalMan; // Ƽ ο - short m_sPartyTotalLevel; // Ƽ - short m_sPartyNumber; // Ƽ ȣ + BYTE m_byNowParty; // 파티중이면 1, 부대중이면 2, 둘다 아니면 0 + BYTE m_byPartyTotalMan; // 파티 맺은 총 구성 인원수 + short m_sPartyTotalLevel; // 파티 맺은 사람의 총 레벨 + short m_sPartyNumber; // 파티 번호 short m_sHitDamage; // Hit - float m_fHitrate; // ø - float m_fAvoidrate; // ø - short m_sAC; // - short m_sItemAC; // + float m_fHitrate; // 공격 민첩률 + float m_fAvoidrate; // 방어 민첩률 + short m_sAC; // 방어율 + short m_sItemAC; // 아이템 방어률 - short m_sSurroundNpcNumber[8]; // Npc ٱ~ + short m_sSurroundNpcNumber[8]; // Npc 다굴~ - BYTE m_byIsOP; //  Ǵ.. - long m_lUsed; // .. (1:.. ġ . 0:ص ) + BYTE m_byIsOP; // 운영자인지를 판단.. + long m_lUsed; // 포인터 사용유무.. (1:사용중.. 접근 허락치 않음. 0:사용해도 무방) - BOOL m_bLogOut; // Logout ΰ? + BOOL m_bLogOut; // Logout 중인가? // 2002.7.10 - Yookozuna BYTE m_bMagicTypeLeftHand; // The type of magic item in user's left hand @@ -101,12 +101,12 @@ class CUser { void HealMagic(); void HealAreaCheck(int rx, int rz); - void SendAttackSuccess(int tuid, BYTE result, short sDamage, int nHP = 0, short sAttack_type = 1); // - void SendMagicAttackResult(int tuid, BYTE result, short sDamage, short sHP = 0); // - void SendHP(); // user HP + void SendAttackSuccess(int tuid, BYTE result, short sDamage, int nHP = 0, short sAttack_type = 1); // 공격 성공 + void SendMagicAttackResult(int tuid, BYTE result, short sDamage, short sHP = 0); // 공격 성공 + void SendHP(); // user의 HP void SendExp(int iExp, int iLoyalty, int tType = 1); void SendSystemMsg(TCHAR * pMsg, BYTE type, int nWho); - void SendAll(TCHAR * pBuf, int nLength); // game server Ŷ ... + void SendAll(TCHAR * pBuf, int nLength); // game server로 패킷 전송... BOOL IsOpIDCheck(char * szName); CUser(); diff --git a/src/server/AIServer/global.cpp b/src/server/AIServer/global.cpp index d66dbd3c..78f0ff83 100644 --- a/src/server/AIServer/global.cpp +++ b/src/server/AIServer/global.cpp @@ -154,7 +154,7 @@ int myrand(int min, int max, BOOL bSame) { } /////////////////////////////////////////////////////////////////////////// -// XdY ֻ +// XdY 형식의 주사위 굴리기 // int XdY(int x, int y) { int temp = 0; @@ -169,7 +169,7 @@ int XdY(int x, int y) { } /////////////////////////////////////////////////////////////////////////// -// string ̰ size size ŭ ä Ѵ. +// string의 길이가 size 보다 작으면 size 만큼 공백을 채워서 복사한다. // void SpaceCopy(LPSTR source, CString dest, int size) { strncpy(source, dest, size); @@ -181,7 +181,7 @@ void SpaceCopy(LPSTR source, CString dest, int size) { } /////////////////////////////////////////////////////////////////////////// -// string ̰ size size ŭ ä Ѵ. +// string의 길이가 size 보다 작으면 size 만큼 공백을 채워서 복사한다. // void SpaceCopy(CString & source, CString dest, int size) { source = dest.Left(size); @@ -195,7 +195,7 @@ void SpaceCopy(CString & source, CString dest, int size) { } /////////////////////////////////////////////////////////////////////////// -// DWORD Max äũϸ鼭 Ų. +// DWORD 의 Max 값을 채크하면서 증가시킨다. // void CheckMaxValue(DWORD & dest, DWORD add) { DWORD Diff = _MAX_DWORD - dest; @@ -208,7 +208,7 @@ void CheckMaxValue(DWORD & dest, DWORD add) { } /////////////////////////////////////////////////////////////////////////// -// int Max äũϸ鼭 Ų. +// int 의 Max 값을 채크하면서 증가시킨다. // void CheckMaxValue(int & dest, int add) { int Diff = _MAX_INT - dest; @@ -221,7 +221,7 @@ void CheckMaxValue(int & dest, int add) { } /////////////////////////////////////////////////////////////////////////// -// short Max äũϸ鼭 Ų. +// short 의 Max 값을 채크하면서 증가시킨다. // void CheckMaxValue(short & dest, short add) { short Diff = _MAX_SHORT - dest; diff --git a/src/server/AIServer/res/AIServer.rc b/src/server/AIServer/res/AIServer.rc index 0e52cddc9e2f191f99ed6e7f164cf7c9b80a9aee..43b2aea28aaeed93254ea7e0aba11699aaab6230 100644 GIT binary patch literal 10590 zcmdT~O>Y}T7@k8dmR7}Inn+ePoaXn{d&BvIj;aoP?F*A#6!AsnOcc@HASzxBXX;i9fkj;+S!qXOH zLJ8Et?-I@>@LK?fl*9z)NAQd4ptsalAlJK{cbvorPfAJ=ZD$`65{o#VEeyUj1ZD;r zrzTgxYqw6D9lzLs_5yRRBMtf#{qO>OVG{Nseo=!DEWkqwu#g7qWERIoymb#pkoaaD zFy>*64Ny|S)kW)v#HW&Pm>bsqMqzasz|6xIr+_JsGi_046aqbT&RoKi8dhERp3`gyssd_Y~dUrPV88$4MY*nu7bmBW(+@}iXOwLL|M>I!jwt0addY_4|>re zxSRnUMc`Lk8@w?bE8?SouF04jU`fnB zRakQg_=s^HGt5!GFV+(1J|FVQ0B?pNGo#UyPYYfhkn*quTK{R%Sp~ETq(G>3o0E@9 zalAfh5C2`X>qSFc1dLy=G0;WDoEf( z1XZ8gtVxQ)ae~w;tr{V86xvzaGS}Y1c@JmFI$Ov%}j|6SF#Nn>(-!*0q7{HSR#xP26)u5$D_1V)ii` zKo^_1V_!l2upij#tZe}nt!dlZ80)40D|hW1>}}YguxlYc-t$W6l-i1Q25qW|=km0P zd(t7A4?6GCdTGB+^F`+!)id=giaMJ-4zMaN`|ykxDl z0PZP|yyc?+j5!=UU&VREN|0w)Q?WXizEg38$2i{ZADlT10CNbCvVcpfx-pMgY`M-k zXZdHItl?-t!qfq)he^D@)E7ks*w-$+m3t8Dh%$^U7eE0!AaXYh+S2G6u{K2MP%q;i ze(79jA2l-#Ezw@<9h;zRvS#6zyRQ{KI}DL8d83rCbT}Tvwbalm!TgM*blRt zcQml4;R@A#I08u4rhn@?#m9(3izlBl$Jl%c>#hTy_&BYL5r#fMOPpJ?iaW{CdujrNMZ1Ds#2sGl=lH51oI1P7+2}A z_M$u*o%lhIWcF%cWW7?c?=iCI6P>5j8F}fw5_@z7Jw_~uR+O`LB7I*GF^u+_zFr|u z0zUVSm_742&j9N%_9jPB>CFPN^nb4RV(ewaow8WFp~&00&b!>nZbB+PFAk%u9sYN% z_D}xm3TTpbV|JaB32O@WxjshsRCc?> zx(2=ayB%?m)FZ+WhpqoH^Nm4zvVWs1b?gOA*DP8OU9endK`-~GxjVOwTswzx3zRY% zkqhm9^xfzfhNXNK0m1)zAhxV9yQ`=&Bvb&tk6wTMDllh$UT**S_~G;8;ST$c;-sxp z$L`E7K3;~(W0*JUjy=U5M%KPjNkzHp5Be-1uUoj?Rgdz}{iM4dIxf~a_*${MSL~{nTa_z6h&KS3u=SQrsaAc+JvbR#HBcr?9Ls4ENmz_g~ zVn$&8)%^p_dV@8Fb1?H0^W+pP%4JegOfJINEPc<1Usl)!uv#QE!e$TKjU%}?PU<72 zw_rWwcifC}euv?-*DF7;Mwmq2r^fjGh_n*YRq(8O)o~tArMio*9)ZR9eU`o<)mn6Q z9BlF;y;!-6ma!0QwLu+|Eiqk7|0nzOYYToCSuvm5`a-Q(Iz;M--}R(k)}51nz8%qO zS#?J3OLZC@(w`B=GR7AH^_ZZI1m;1JQ!}8U^$Y4aA`^4(zM^_(%Jz z7lAoz_a*}K;ML)G=22kYI=t3?=jq|gXD<$){QjgL9Q^X`A7LDPdUPE0@iOd}T@bte zBwn)S*Ow2!z4!dLr^n%>7Z#tJD3<j^7R|`J@chkT8ro%YOS6)}|4C;SX+*et0 zeDp7{TPkAWHU4+7Smm;e9( literal 5409 zcmcIo&2QUA7Qgeacx8Y^lCrWW+iUwskt2CviWE4cViyJou0%UTX;L8Rv;p$Z1nBls zv`C6{oqon%Y|-u|dtCHbpv4|~DNt+=i#_ZcQlv;r{^-Ic^ud{V@6DUv`(KY_$g!BzJcP9Qp5c!}CneAxQbS!+LaR~}H4g>7OiSI?#N>j8&Z~$)<_L$sNdb?-~ zW;&KiTus;S!ILLYAG8&#@9vn^J-_xkI!Yhl6`X%>}S22y(p# zG|E)P(v+@FK4)`^Dvxo?@9!&=`N<bf2W<8F1`u>JgYB^aF&v@n6iY9Kv-dxLDGEK)uwhFA@%fi8KM`x$ ztOSVz!=DD264g|f*@{h7NtPvfL+Z5glV>ZPC(nW>|DDhH*>9)+1-aE0>+EZ7Nyd-7 zC2dNKVY(Vxq(^s`i&Eq1<0LqIn89839(3Am`Mj*odLb+4$1P^)u;_# z%{j~+)Ol0dkk)bPH3{+STc$HCayB;!Bi0C$TV)V#7qZJOfggE;|7>nuY>fdm=zzXW zxKYoWXG9t0JI6U&i`)6LQfL_cS6lk?S+0$ z+|!jl8z^iC+V8C%=w-p&?&+zTp$?NC;Jo)n_GGyyP;6nRx*&K1#!UC&$&J zd&(U&3?}kQWL`EmDwH?!SiYs5m@wKm@_^-a{_Om+P!shXsu7(Ugn?FZH1_FQ5Y@MI zX||{5%WK942E0AMlM}@=(MA;u7EgU;cc-&i4Pc5ZyXVwh6L+>j*}qm$a|HRf0ph}v zZU@gIbAavrDfIIc$!v=neaz9kY*~J8qFByUB~UFV%p;$dDtG^&+-tR3Mb_XfJBsBn zS5<6v+m&Z*;@>_z`PWyU!`TNQ!>b>^`1iA?aQ5`%@1K7A^?$xPeesVM-!JFyEb@1* z;wSpRv=ptOf%xkEm%sew*H3@CmIh4;g$@k~SL#q;FjVaA2g+W#hWq#L0~A19u^a87S_Ns{6Vk?P?b>ucs8*$3; zTfWm7&Eh<^JZN@W^_1IDx0bn`mYq*&-Ir1jw2uLy&|b~Kj|0^i5~D?$l`#>MlyYzH8*9>KlK=n! diff --git a/src/server/Aujard/Aujard.rc b/src/server/Aujard/Aujard.rc index eb759b1409b426fe5bdcd9d55325368ab50508d7..88f1655b17b98ac7f4f6d1a1f934cf90df33ac6e 100644 GIT binary patch literal 8822 zcmd6t&u<$=6vyYl$!Gq6#l27wQoCuP<>uP4F?C`SJ86p|Sy7vYKoUo>(}Ki-3;zRu z0!Z|TXeHnX9D3z{;RJlX^E};Md)H2yfUK2wc4ywc_vZb6ll=4dHFwRexqbK0ow$J; z@_Xz?E^;-u>z?pCVCIUG9-rWfQ{OJTPnj)v=ttms?7tCg#dYAN=QiQ8>DsREHry(+HJ;a9 z%ROMG%YDt=VW!2i(G~5*yMj!_S>zh*bW*C1k;*e~|cUgX{y zOG7>-KYSZssAC`I7hQZ{6A!6kA${zm#dVdhzT%2su-Va4DNWSmx zdHY+z>I&ejV2ceXRk+I*!%V;+4_$XltaO38lUSGS)>++TuIK3-v-ce$%pv!PI5F^4 z`$Q4V?y|$%?gl^ON*<%ABw5H#(wteeiTR$69`d3sc6k>*YS0h1ws>PYR%Azk08?;f zf^9Bye~70Sx#Vq%k`WXK{NBy1 zCAZMr5DYuidl8oQ4p-ze)qZZ}ILwt#7N-Yr^|{ZO;x-*4#BJa;M29dM@2YE+XCIAs zXc^~_Y@4SNl-7{(Vw}v+O^ULMmzM%ZA@|sBnm%(MjX4gSM?^(s zbk#Lau?*F;k?%8}BI_aVf~awS;w|Qs*$7=6@TQ(ZeTI60lQHZFT(YJkZ)2*NA|Q|b z7wT)&ov33GJ-zG6__Vr8HHK_z$hxf#c^4n1`DpyDtXK9sbYG5F4;fWmi(5s`HT*<* zv(8(EH|5i;tBDV&QweK%xj3xnd!p^fx}>0k#T(OBQA4_t<$y{qte6aIKG$u!kC2|K z5>=~Bo?A$(fwYou>VG2Y57m=)zfQeV9>><(?tO5pM||M3rM~TY4Yhd^#-xr^2j3g7 zOMgvt*L0ttKlP8I6GL=-PTM4}C1&H!mUYC8YnJ&u(R?*!wLg1S?iGq+JD>hWRiG zSCt*ATj?%jUmVuLxP^{% z8mC{xDgj0E>RzqDFzMUM?xWYbbU`U>+nk@&M$+#b3F?D!|+{eFv z|6AnV_;dUDU(de#>GkNQeJ9Yfe4EU|>T9y)7xtIlm-MDe>x5BN!K9RuJ31fc7FhQ@ zPU+zo4ajEps5VEhbTGXVakf0RwQX$JN)|k$@ z%16qn4Xi27oZ?u!NN2D4-LKAYz@> zm+o|)F0O@1{YlVp7&ln8iggm&GSl=IR)J1JXW>@WZB_i*6fdgRXW3=GRnFJgESsMH zH;%=!>?Aklg~5X3s(8Lcl2{h&IqkU@`%9$G+GqVG^5UoGlKpHf`6uP`zny<7J|D+f zPQc?RxTt@}i%+bzas?X7Q^EEB#*y$&=-* ibL9}blcRBXwo~P_loma+r!{JOj`g9F+xhXY;Qj@SPjg}b literal 4431 zcmcH-%Wm67@XoK;FqZ^jEm3w8yElqlDO*t_!6g;B5I_*pN@hco0!bw?;NR)BKw1fzas)_k(C2ZWauQ)$YNWCSVbrTN_(XJn`3j`Z1>d7k z+&Y^G3~_@M_HG6=iWBBXwWcZfB3Pn(g+CS#l))5yK~2|Iv8UW=UP3$oo0Tt zfCC|M&ew6oqO8Ry7rVi@j-fKKfDt_0Lw^oEV;Lj>&0@r&bdxaTuh(HP_p<=#f`Sp$s&hYxQqVn0gERx>5$yV5h|&vK zo~H)_(QI$55My8~V_ew{-b6JGzHDYOU$>kH=Rix^Z)GnUju!Y~yvmJ1G|f}ouc4H9 z8c}p}2r}^(o}#YAe|xeF(R%Vkpw21O8jX5mQ&aRpqf7J**2ExV@(u2rQB9b>~4@U-9#AUyRH%Yx#qna_lZLM-B16b7c@pc4s+ zuYZ2~gV-p1P{}QqKJB}Xlbcrj@XMP&MTuzUNO~g4kB=qLL6VR2lXXHJE^YM?P4!II z@i-i?0gvMz9!q+kLh&MogNL@FKgDGD)TzX;h^sfqKB1~@>UyEAqx7j`TE&69m{*AK z7JvHt-9Nwm`1bpEAJJD_O4Xx|;t*9jk>oFrq$B>yDb-IYyYLhgTHk}BreaE^#~?0{ z$%kF|E2=*4Re2YO095ZJiY6>cAs_NEnt<}yrr=! zuDPnS1Lw#CT^Z7`LPx0k>Ts!7ZP(Lq-yIhGaunE>VV8v|YeTyn%6oSKHYs2p>BYi1 zwQxb03kIV=2?3&QBkk*^Izl4Nk|0_Qf{>AD3F*jvxJAlW1!DI|?sbp)&~rJEKW#J) znJBu8k*Gqg^rH*IKW8FDGB1jJw|Yt}ex}BXkrk}WF^eQXls@9rkj6zu%h%wOC}T> z@spbZrSvN(9;IR4NkDT5OSuR270gw$%!jsChrE~P@E!F6Ov%v56O~Vy<@CJMlZP(R zuucq2kycZ*`d1@)cAAP*c9mSmc49!bJ7XB$35?}W>O`=4rLDk_SoH=})C#=C?we5c z#}!;YY1^`8${oe3As_q+gTc- + diff --git a/src/server/Aujard/Aujard.vcxproj.user b/src/server/Aujard/Aujard.vcxproj.user index 1cbaf778..bbc55c83 100644 --- a/src/server/Aujard/Aujard.vcxproj.user +++ b/src/server/Aujard/Aujard.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\server diff --git a/src/server/Aujard/AujardDlg.cpp b/src/server/Aujard/AujardDlg.cpp index 4792573d..4262083e 100644 --- a/src/server/Aujard/AujardDlg.cpp +++ b/src/server/Aujard/AujardDlg.cpp @@ -164,8 +164,8 @@ BOOL CAujardDlg::OnInitDialog() { InitializeCriticalSection(&g_LogFileWrite); - m_LoggerRecvQueue.InitailizeMMF(MAX_PKTSIZE, MAX_COUNT, SMQ_LOGGERSEND, FALSE); // Dispatcher Send Queue - m_LoggerSendQueue.InitailizeMMF(MAX_PKTSIZE, MAX_COUNT, SMQ_LOGGERRECV, FALSE); // Dispatcher Read Queue + m_LoggerRecvQueue.InitailizeMMF(MAX_PKTSIZE, MAX_COUNT, SMQ_LOGGERSEND, FALSE); // Dispatcher 의 Send Queue + m_LoggerSendQueue.InitailizeMMF(MAX_PKTSIZE, MAX_COUNT, SMQ_LOGGERRECV, FALSE); // Dispatcher 의 Read Queue if (!InitializeMMF()) { AfxMessageBox("Main Shared Memory Initialize Fail"); @@ -212,7 +212,7 @@ BOOL CAujardDlg::OnInitDialog() { CTime cur = CTime::GetCurrentTime(); CString starttime; - starttime.Format("Aujard Start : %d %d %d %d\r\n", cur.GetMonth(), cur.GetDay(), cur.GetHour(), + starttime.Format("Aujard Start : %d월 %d일 %d시 %d분\r\n", cur.GetMonth(), cur.GetDay(), cur.GetHour(), cur.GetMinute()); m_LogFile.Write(starttime, starttime.GetLength()); @@ -275,7 +275,7 @@ BOOL CAujardDlg::DestroyWindow() { BOOL CAujardDlg::InitializeMMF() { CString logstr; - DWORD filesize = MAX_USER * 4000; // 1 4000 bytes ̳ ҿ + DWORD filesize = MAX_USER * 4000; // 1명당 4000 bytes 이내 소요 m_hMMFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, TRUE, "KNIGHT_DB"); if (m_hMMFile == NULL) { @@ -810,7 +810,7 @@ BOOL CAujardDlg::PreTranslateMessage(MSG * pMsg) { } void CAujardDlg::OnOK() { - if (AfxMessageBox("¥ ?", MB_YESNO) == IDYES) { + if (AfxMessageBox("진짜 끝낼까요?", MB_YESNO) == IDYES) { CDialog::OnOK(); } } @@ -851,7 +851,7 @@ void CAujardDlg::AllSaveRoutine() { memset(logstr, 0x00, 256); CTime cur = CTime::GetCurrentTime(); - TRACE("Dead Time : %d %d %d %d %d\n", cur.GetYear(), cur.GetMonth(), cur.GetDay(), cur.GetHour(), + TRACE("Dead Time : %d년 %d월 %d일 %d시 %d분\n", cur.GetYear(), cur.GetMonth(), cur.GetDay(), cur.GetHour(), cur.GetMinute()); t_count = m_DBAgent.m_UserDataArray.size(); @@ -915,7 +915,7 @@ void CAujardDlg::AllSaveRoutine() { Sleep(100); } if (bsaved) { - msgstr.Format("All Data Saved:%d%d%d%d%d", cur.GetYear(), cur.GetMonth(), cur.GetDay(), cur.GetHour(), + msgstr.Format("All Data Saved:%d년%d월%d일%d시%d분", cur.GetYear(), cur.GetMonth(), cur.GetDay(), cur.GetHour(), cur.GetMinute()); m_OutputList.AddString(msgstr); } @@ -1234,7 +1234,7 @@ void CAujardDlg::ModifyKnightsMember(char * pBuf, BYTE command) { return; } - /* if( remove_flag == 0 && command == KNIGHTS_REMOVE ) { // ߹ÿ 񿡼 óѴ + /* if( remove_flag == 0 && command == KNIGHTS_REMOVE ) { // 없는 유저 추방시에는 디비에서만 처리한다 result = m_DBAgent.UpdateKnights( command, userid, knightindex, remove_flag ); TRACE("ModifyKnights - command=%d, nid=%d, index=%d, result=%d \n", command, uid, knightindex, result); return; @@ -1499,7 +1499,7 @@ void CAujardDlg::BattleEventResult(char * pData) { nLen = GetByte(pData, index); if (nLen > 0 && nLen < MAX_ID_SIZE + 1) { GetString(strMaxUserName, pData, nLen, index); - TRACE("--> BattleEventResult : ̸? %s, len=%d, nation=%d \n", strMaxUserName, + TRACE("--> BattleEventResult : 적국의 대장을 죽인 유저이름은? %s, len=%d, nation=%d \n", strMaxUserName, nResult, nResult); m_DBAgent.UpdateBattleEvent(strMaxUserName, nResult); } @@ -1524,7 +1524,7 @@ void CAujardDlg::CouponEvent(char * pData) { nLen = GetShort(pData, index); GetString(strAccountName, pData, nLen, index); nEventNum = GetDWORD(pData, index); - // 񷯸ӱ 繮 >.< + // 비러머글 대사문 >.< nMessageNum = GetDWORD(pData, index); // nResult = m_DBAgent.CheckCouponEvent(strAccountName); @@ -1533,7 +1533,7 @@ void CAujardDlg::CouponEvent(char * pData) { SetShort(send_buff, nSid, send_index); SetByte(send_buff, nResult, send_index); SetDWORD(send_buff, nEventNum, send_index); - // 񷯸ӱ 繮 >.< + // 비러머글 대사문 >.< SetDWORD(send_buff, nMessageNum, send_index); // do { diff --git a/src/server/Aujard/AujardDlg.h b/src/server/Aujard/AujardDlg.h index 2966e30b..7dc081d8 100644 --- a/src/server/Aujard/AujardDlg.h +++ b/src/server/Aujard/AujardDlg.h @@ -68,9 +68,9 @@ class CAujardDlg : public CDialog { CFile m_LogFile; - int m_iPacketCount; // packet üũ - int m_iSendPacketCount; // packet üũ - int m_iRecvPacketCount; // packet üũ + int m_iPacketCount; // packet의 수를 체크 + int m_iSendPacketCount; // packet의 수를 체크 + int m_iRecvPacketCount; // packet의 수를 체크 int m_iLogFileDay; // Dialog Data diff --git a/src/server/Aujard/DBAgent.cpp b/src/server/Aujard/DBAgent.cpp index 02d2245a..f9eea0d4 100644 --- a/src/server/Aujard/DBAgent.cpp +++ b/src/server/Aujard/DBAgent.cpp @@ -66,7 +66,7 @@ void CDBAgent::ReConnectODBC(CDatabase * m_db, char * strdb, char * strname, cha m_pMain->WriteLogFile(strlog); //m_pMain->m_LogFile.Write(strlog, strlen(strlog)); - // DATABASE ... + // DATABASE 연결... CString strConnect; strConnect.Format(_T("DSN=%s;UID=%s;PWD=%s"), strdb, strname, strpwd); int iCount = 0; @@ -132,12 +132,12 @@ void CDBAgent::MUserInit(int uid) { pUser->m_sBind = -1; pUser->m_iBank = 0; - // ų ʱȭ + // 스킬 초기화 for (int i = 0; i < 9; i++) { pUser->m_bstrSkill[i] = 0; } - for (int i = 0; i < SLOT_MAX + HAVE_MAX; i++) { // 밹 + (14+28=42) + for (int i = 0; i < SLOT_MAX + HAVE_MAX; i++) { // 착용갯수 + 소유갯수(14+28=42) pUser->m_sItemArray[i].nNum = 0; pUser->m_sItemArray[i].sDuration = 0; pUser->m_sItemArray[i].sCount = 0; @@ -263,7 +263,7 @@ BOOL CDBAgent::LoadUserData(char * userid, int uid) { } SQLFreeHandle((SQLSMALLINT)SQL_HANDLE_STMT, hstmt); - // ƴϴ. + // 엠겜 유저가 아니다. /* if(sRet == 0) { memset( logstr, 0x00, 256); sprintf( logstr, "LoadUserData Fail : name=%s, sRet= %d, retval=%d, nation=%d \r\n", userid, sRet, retval, Nation ); @@ -298,7 +298,7 @@ BOOL CDBAgent::LoadUserData(char * userid, int uid) { // m_pMain->m_LogFile.Write(logstr, strlen(logstr)); TRACE(logstr); } - if (pUser->m_bLogout) { // ... + if (pUser->m_bLogout) { // 아직 종료되지 않은 유저... memset(logstr, 0x00, 256); sprintf(logstr, "LoadUserData logout Fail : name=%s, logout= %d \r\n", userid, pUser->m_bLogout); // m_pMain->m_LogFile.Write(logstr, strlen(logstr)); @@ -328,7 +328,7 @@ BOOL CDBAgent::LoadUserData(char * userid, int uid) { pUser->m_bFace = Face; pUser->m_bCity = City; pUser->m_bKnights = Knights; - // ۾ : clan ޾ƿ; Ѵ + // 작업 : clan정보를 받아와야 한다 //pUser->m_sClan = clan; pUser->m_bFame = Fame; pUser->m_sHp = Hp; @@ -362,7 +362,7 @@ BOOL CDBAgent::LoadUserData(char * userid, int uid) { __int64 serial = 0; _ITEM_TABLE * pTable = NULL; - for (int i = 0; i < HAVE_MAX + SLOT_MAX; i++) // 밹 + (14+28=42) + for (int i = 0; i < HAVE_MAX + SLOT_MAX; i++) // 착용갯수 + 소유갯수(14+28=42) { itemid = GetDWORD(byItem, index); duration = GetShort(byItem, index); @@ -499,7 +499,7 @@ int CDBAgent::UpdateUser(const char * userid, int uid, int type) { } index = 0; - for (int i = 0; i < HAVE_MAX + SLOT_MAX; i++) // 밹 + (14+28=42) + for (int i = 0; i < HAVE_MAX + SLOT_MAX; i++) // 착용갯수 + 소유갯수(14+28=42) { if (pUser->m_sItemArray[i].nNum > 0) { if (m_pMain->m_ItemtableArray.GetData(pUser->m_sItemArray[i].nNum) == FALSE) { @@ -513,7 +513,7 @@ int CDBAgent::UpdateUser(const char * userid, int uid, int type) { SetInt64(bySerial, pUser->m_sItemArray[i].nSerialNum, serial_index); } - // ۾ : clan Ʈ + // 작업 : clan정보도 업데이트 wsprintf(szSQL, TEXT("{call UPDATE_USER_DATA ( \'%s\', " "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,?,?,?)}"), @@ -1596,7 +1596,7 @@ void CDBAgent::LoadKnightsAllList(int nation) { count++; - if (count >= 40) { // 40 + if (count >= 40) { // 40개 단위로 보낸다 SetByte(send_buff, KNIGHTS_ALLLIST_REQ, send_index); SetShort(send_buff, -1, send_index); SetByte(send_buff, count, send_index); @@ -1634,7 +1634,7 @@ void CDBAgent::LoadKnightsAllList(int nation) { } } - if (count < 40) { // 40 + if (count < 40) { // 40개를 보내지 못한 경우 SetByte(send_buff, KNIGHTS_ALLLIST_REQ, send_index); SetShort(send_buff, -1, send_index); SetByte(send_buff, count, send_index); diff --git a/src/server/Aujard/Define.h b/src/server/Aujard/Define.h index 24661bcf..b5d25c22 100644 --- a/src/server/Aujard/Define.h +++ b/src/server/Aujard/Define.h @@ -107,24 +107,24 @@ typedef union { //////////////////////////////////////////////////////////////// // Knights Packet sub define //////////////////////////////////////////////////////////////// -#define KNIGHTS_CREATE 0x11 // -#define KNIGHTS_JOIN 0x12 // -#define KNIGHTS_WITHDRAW 0x13 // Ż -#define KNIGHTS_REMOVE 0x14 // -#define KNIGHTS_DESTROY 0x15 // ǰ -#define KNIGHTS_ADMIT 0x16 // 㰡 -#define KNIGHTS_REJECT 0x17 // -#define KNIGHTS_PUNISH 0x18 // ¡ -#define KNIGHTS_CHIEF 0x19 // Ӹ -#define KNIGHTS_VICECHIEF 0x1A // δ Ӹ -#define KNIGHTS_OFFICER 0x1B // 屳Ӹ -#define KNIGHTS_ALLLIST_REQ 0x1C // Ʈ 10 Page û -#define KNIGHTS_MEMBER_REQ 0x1D // û -#define KNIGHTS_CURRENT_REQ 0x1E // Ʈ -#define KNIGHTS_STASH 0x1F // â -#define KNIGHTS_MODIFY_FAME 0x20 // .. ش -#define KNIGHTS_JOIN_REQ 0x21 // ش Կû Ѵ -#define KNIGHTS_LIST_REQ 0x22 // Ʈ û ( index ˻ ) +#define KNIGHTS_CREATE 0x11 // 생성 +#define KNIGHTS_JOIN 0x12 // 가입 +#define KNIGHTS_WITHDRAW 0x13 // 탈퇴 +#define KNIGHTS_REMOVE 0x14 // 멤버 삭제 +#define KNIGHTS_DESTROY 0x15 // 뽀개기 +#define KNIGHTS_ADMIT 0x16 // 멤버 가입 허가 +#define KNIGHTS_REJECT 0x17 // 멤버 가입 거절 +#define KNIGHTS_PUNISH 0x18 // 멤버 징계 +#define KNIGHTS_CHIEF 0x19 // 단장 임명 +#define KNIGHTS_VICECHIEF 0x1A // 부단장 임명 +#define KNIGHTS_OFFICER 0x1B // 장교임명 +#define KNIGHTS_ALLLIST_REQ 0x1C // 리스트를 10개 단위로 Page 요청 +#define KNIGHTS_MEMBER_REQ 0x1D // 모든 멤버 요청 +#define KNIGHTS_CURRENT_REQ 0x1E // 현재 접속 리스트 +#define KNIGHTS_STASH 0x1F // 기사단 창고 +#define KNIGHTS_MODIFY_FAME 0x20 // 멤버의 직위 변경.. 해당 멤버에게 간다 +#define KNIGHTS_JOIN_REQ 0x21 // 해당멤버에게 가입요청을 한다 +#define KNIGHTS_LIST_REQ 0x22 // 기사단 리스트를 요청 ( index 검색 ) //////////////////////////////////////////////////////////////// // Clan Packet sub define @@ -145,124 +145,124 @@ typedef union { #define SEND_REGION 0x02 #define SEND_ALL 0x03 -#define SLOT_MAX 14 // MAX -#define HAVE_MAX 28 // MAX (κ丮â) -#define ITEMCOUNT_MAX 9999 // Ҹ Ѱ谪 -#define WAREHOUSE_MAX 196 // â MAX +#define SLOT_MAX 14 // 착용 아템 MAX +#define HAVE_MAX 28 // 소유 아템 MAX (인벤토리창) +#define ITEMCOUNT_MAX 9999 // 소모 아이템 소유 한계값 +#define WAREHOUSE_MAX 196 // 창고 아이템 MAX ///////////////////////////////////////////////////////////////////////////////// // Structure Define ///////////////////////////////////////////////////////////////////////////////// struct _ITEM_DATA { - int nNum; // item ȣ - short sDuration; // item - short sCount; // item or item ູ Ӽ ش + int nNum; // item 번호 + short sDuration; // item 내구력 + short sCount; // item 갯수 or item 축복 속성에 해당 값 __int64 nSerialNum; // item serial code }; struct _ITEM_TABLE { int m_iNum; // item num char m_strName[50]; // item Name - BYTE m_bKind; // item - BYTE m_bSlot; // ġ - BYTE m_bRace; // - BYTE m_bClass; // Class - short m_sDamage; // ִ Ÿġ - short m_sDelay; // ݽð - short m_sRange; // (ȿŸ) - short m_sWeight; // - short m_sDuration; // - int m_iBuyPrice; // ° - int m_iSellPrice; // Ĵ° - short m_sAc; // - BYTE m_bCountable; // - int m_iEffect1; // Ʈ1 - int m_iEffect2; // Ʈ2 - BYTE m_bReqLevel; // 䱸 - BYTE m_bReqRank; // 䱸 - BYTE m_bReqTitle; // 䱸 - BYTE m_bReqStr; // 䱸 - BYTE m_bReqSta; // 䱸 ü - BYTE m_bReqDex; // 䱸 ø - BYTE m_bReqIntel; // 䱸 - BYTE m_bReqCha; // 䱸 ŷ - BYTE m_bSellingGroup; // ǰ - BYTE m_ItemType; // Ǵ - short m_sHitrate; // Ÿݷ - short m_sEvarate; // ȸ - short m_sDaggerAc; // 1 - short m_sSwordAc; // 2 - short m_sMaceAc; // 3 - short m_sAxeAc; // 4 - short m_sSpearAc; // 5 - short m_sBowAc; // 6 - BYTE m_bFireDamage; // Ӽ - BYTE m_bIceDamage; // ñ Ӽ - BYTE m_bLightningDamage; // Ӽ - BYTE m_bPoisonDamage; // Ӽ - BYTE m_bHPDrain; // HP - BYTE m_bMPDamage; // MP Ÿ - BYTE m_bMPDrain; // MP - BYTE m_bMirrorDamage; // ݻ Ÿ - BYTE m_bDroprate; // - BYTE m_bStrB; // ʽ - BYTE m_bStaB; // ü ʽ - BYTE m_bDexB; // ø ʽ - BYTE m_bIntelB; // ʽ - BYTE m_bChaB; // ŷ ʽ + BYTE m_bKind; // item 종류 + BYTE m_bSlot; // 장착위치 + BYTE m_bRace; // 사용 가능한 종족 + BYTE m_bClass; // 사용 가능한 Class + short m_sDamage; // 최대 타격치 + short m_sDelay; // 공격시간 + short m_sRange; // 범위(유효거리) + short m_sWeight; // 무게 + short m_sDuration; // 내구성 + int m_iBuyPrice; // 유저가 사는가격 + int m_iSellPrice; // 유저가 파는가격 + short m_sAc; // 방어력 + BYTE m_bCountable; // 개수 개념 아이템 + int m_iEffect1; // 매직 이펙트1 + int m_iEffect2; // 매직 이펙트2 + BYTE m_bReqLevel; // 요구 레벨 + BYTE m_bReqRank; // 요구 작위 + BYTE m_bReqTitle; // 요구 지위 + BYTE m_bReqStr; // 요구 힘 + BYTE m_bReqSta; // 요구 체력 + BYTE m_bReqDex; // 요구 민첩 + BYTE m_bReqIntel; // 요구 지능 + BYTE m_bReqCha; // 요구 매력 + BYTE m_bSellingGroup; // 상인 취급 물품 + BYTE m_ItemType; // 매직아이템 또는 레어아이템 + short m_sHitrate; // 타격률 + short m_sEvarate; // 회피율 + short m_sDaggerAc; // 방어력1 + short m_sSwordAc; // 방어력2 + short m_sMaceAc; // 방어력3 + short m_sAxeAc; // 방어력4 + short m_sSpearAc; // 방어력5 + short m_sBowAc; // 방어력6 + BYTE m_bFireDamage; // 불 속성 + BYTE m_bIceDamage; // 냉기 속성 + BYTE m_bLightningDamage; // 전격 속성 + BYTE m_bPoisonDamage; // 독 속성 + BYTE m_bHPDrain; // HP 흡수 + BYTE m_bMPDamage; // MP 타격 + BYTE m_bMPDrain; // MP 흡수 + BYTE m_bMirrorDamage; // 반사 타격 + BYTE m_bDroprate; // 드롭 비율 + BYTE m_bStrB; // 힘 보너스 + BYTE m_bStaB; // 체력 보너스 + BYTE m_bDexB; // 민첩성 보너스 + BYTE m_bIntelB; // 지능 보너스 + BYTE m_bChaB; // 매력 보너스 short m_MaxHpB; // MaxHP add short m_MaxMpB; // MaxMP add - BYTE m_bFireR; // ׷ - BYTE m_bColdR; // ׷ - BYTE m_bLightningR; // ׷ - BYTE m_bMagicR; // Ÿ ׷ - BYTE m_bPoisonR; // ׷ - BYTE m_bCurseR; // ׷ + BYTE m_bFireR; // 불 마법 저항력 + BYTE m_bColdR; // 얼음 마법 저항력 + BYTE m_bLightningR; // 전기 마법 저항력 + BYTE m_bMagicR; // 기타 마법 저항력 + BYTE m_bPoisonR; // 독 마법 저항력 + BYTE m_bCurseR; // 저주 마법 저항력 }; struct _USER_DATA { - char m_id[MAX_ID_SIZE + 1]; // ID - char m_Accountid[MAX_ID_SIZE + 1]; // ID - - BYTE m_bZone; // Zone - float m_curx; // X ǥ - float m_curz; // Z ǥ - float m_cury; // Y ǥ - - BYTE m_bNation; // Ҽӱ - BYTE m_bRace; // - short m_sClass; // - BYTE m_bHairColor; // - BYTE m_bRank; // - BYTE m_bTitle; // - BYTE m_bLevel; // - int m_iExp; // ġ - int m_iLoyalty; // οƼ - BYTE m_bFace; // - BYTE m_bCity; // Ҽӵ - short m_bKnights; // Ҽ - //short m_sClan; // Ҽ Clan - BYTE m_bFame; // + char m_id[MAX_ID_SIZE + 1]; // 유저 ID + char m_Accountid[MAX_ID_SIZE + 1]; // 계정 ID + + BYTE m_bZone; // 현재 Zone + float m_curx; // 현재 X 좌표 + float m_curz; // 현재 Z 좌표 + float m_cury; // 현재 Y 좌표 + + BYTE m_bNation; // 소속국가 + BYTE m_bRace; // 종족 + short m_sClass; // 직업 + BYTE m_bHairColor; // 성별 + BYTE m_bRank; // 작위 + BYTE m_bTitle; // 지위 + BYTE m_bLevel; // 레벨 + int m_iExp; // 경험치 + int m_iLoyalty; // 로열티 + BYTE m_bFace; // 종교 + BYTE m_bCity; // 소속도시 + short m_bKnights; // 소속 기사단 + //short m_sClan; // 소속 Clan + BYTE m_bFame; // 명성 short m_sHp; // HP short m_sMp; // MP short m_sSp; // SP - BYTE m_bStr; // - BYTE m_bSta; // - BYTE m_bDex; // , ȸ - BYTE m_bIntel; // (?), ij - BYTE m_bCha; // , (?) - BYTE m_bAuthority; // - BYTE m_bPoints; // ʽ Ʈ - int m_iGold; // ij (21) + BYTE m_bStr; // 힘 + BYTE m_bSta; // 생명력 + BYTE m_bDex; // 공격, 회피율 + BYTE m_bIntel; // 지혜(?), 캐릭터 마법력 결정 + BYTE m_bCha; // 마법 성공률, 물건 가격 결정(?) + BYTE m_bAuthority; // 유저 권한 + BYTE m_bPoints; // 보너스 포인트 + int m_iGold; // 캐릭이 지닌 돈(21억) short m_sBind; // Saved Bind Point - int m_iBank; // â (21) + int m_iBank; // 창고의 돈(21억) - BYTE m_bstrSkill[9]; // ų + BYTE m_bstrSkill[9]; // 직업별 스킬 _ITEM_DATA m_sItemArray[HAVE_MAX + SLOT_MAX]; // 42*8 bytes - _ITEM_DATA m_sWarehouseArray[WAREHOUSE_MAX]; // â 196*8 bytes + _ITEM_DATA m_sWarehouseArray[WAREHOUSE_MAX]; // 창고 아이템 196*8 bytes - BYTE m_bLogout; // α׾ƿ ÷ - BYTE m_bWarehouse; // â ŷ ߾? - DWORD m_dwTime; // ÷Ÿ... + BYTE m_bLogout; // 로그아웃 플래그 + BYTE m_bWarehouse; // 창고 거래 했었나? + DWORD m_dwTime; // 플레이타임... }; ////////////////////////////////////////////////////////////////// diff --git a/src/server/Aujard/Optex.cpp b/src/server/Aujard/Optex.cpp index e69de29b..8b137891 100644 --- a/src/server/Aujard/Optex.cpp +++ b/src/server/Aujard/Optex.cpp @@ -0,0 +1 @@ + diff --git a/src/server/Aujard/Optex.h b/src/server/Aujard/Optex.h index e69de29b..8b137891 100644 --- a/src/server/Aujard/Optex.h +++ b/src/server/Aujard/Optex.h @@ -0,0 +1 @@ + diff --git a/src/server/Aujard/SharedMem.cpp b/src/server/Aujard/SharedMem.cpp index d52f326b..15aea5fa 100644 --- a/src/server/Aujard/SharedMem.cpp +++ b/src/server/Aujard/SharedMem.cpp @@ -67,7 +67,7 @@ BOOL CSharedMemQueue::InitailizeMMF(DWORD dwOffsetsize, int maxcount, LPCTSTR lp m_bMMFCreate = bCreate; m_pHeader = (_SMQ_HEADER *)m_lpMMFile; - m_lReference = (LONG)(m_lpMMFile + sizeof(_SMQ_HEADER)); // ʱ ġ + m_lReference = (LONG)(m_lpMMFile + sizeof(_SMQ_HEADER)); // 초기 위치 셋팅 if (bCreate) { memset(m_lpMMFile, 0x00, dwfullsize); diff --git a/src/server/Aujard/res/Aujard.rc2 b/src/server/Aujard/res/Aujard.rc2 index 85c0c37f6c82e1a4d9079352bccc11628445a12c..b8f9e74a501ae6b0931e9266854f62b3dfa4491f 100644 GIT binary patch literal 772 zcmd6l$%+C&5Jcl@e?@^u(FXrO)Psr(ZdY+BvB3peJ^1s^yl5IcI4~Y1sjRHrIQQ1zxT{3=AeaMSBhn_{4|kk*55zak6<+tFM?2z(#^uar;< zvgVZ4g{<=f?19m{nFsW6p@E%uCO}Jm?kwbK3fjfbnsxlO_X7{V+u|Za8ZTTEnZGVo=_F(RXsa%=A!ZOvrq diff --git a/src/server/Ebenezer/AIPacket.h b/src/server/Ebenezer/AIPacket.h index 11db9dca..35e8edcd 100644 --- a/src/server/Ebenezer/AIPacket.h +++ b/src/server/Ebenezer/AIPacket.h @@ -1,7 +1,7 @@ #pragma once // --------------------------------------------------------------------- -// AI Server Ӽ Npc õ Ŷ 1~49 +// AI Server와 게임서버간의 Npc에 관련된 패킷은 1번~49번 // --------------------------------------------------------------------- const BYTE AI_SERVER_CONNECT = 1; const BYTE NPC_INFO_ALL = 2; @@ -18,7 +18,7 @@ const BYTE AG_NPC_EVENT_ITEM = 12; const BYTE AG_NPC_HP_REQ = 13; // sungyong tw // --------------------------------------------------------------------- -// AI Server Ӽ User, Npc õ Ŷ 50~100 +// AI Server와 게임서버간의 User, Npc 공통 관련된 패킷은 50번~100번 // --------------------------------------------------------------------- const BYTE AG_SERVER_INFO = 50; // const BYTE AG_ATTACK_REQ = 51; // Attck Packet @@ -30,9 +30,9 @@ const BYTE AG_COMPRESSED_DATA = 56; // Packet Data compressed const BYTE AG_ZONE_CHANGE = 57; // Zone change const BYTE AG_MAGIC_ATTACK_REQ = 58; // Magic Attck Packet const BYTE AG_MAGIC_ATTACK_RESULT = 59; // Magic Attck Packet -const BYTE AG_USER_INFO_ALL = 60; // User +const BYTE AG_USER_INFO_ALL = 60; // User의 모든 정보 전송 const BYTE AG_LONG_MAGIC_ATTACK = 61; // Magic Attck Packet -const BYTE AG_PARTY_INFO_ALL = 62; // Party +const BYTE AG_PARTY_INFO_ALL = 62; // Party의 모든 정보 전송 const BYTE AG_HEAL_MAGIC = 63; // Healing magic const BYTE AG_TIME_WEATHER = 64; // time and whether info const BYTE AG_BATTLE_EVENT = 65; // battle event @@ -46,16 +46,16 @@ const BYTE BATTLE_EVENT_MAX_USER = 4; // battle event result ( user name ) const BYTE BATTLE_EVENT_KILL_USER = 5; // battle event result ( user kill count ) // --------------------------------------------------------------------- -// AI Server Ӽ User õ Ŷ 101 -// --------------------------------------------------------------------- -const BYTE AG_USER_INFO = 101; // User -const BYTE AG_USER_INOUT = 102; // User In,Out -const BYTE AG_USER_MOVE = 103; // User move -const BYTE AG_USER_MOVEEDGE = 104; // User move end -const BYTE AG_USER_SET_HP = 105; // User HP -const BYTE AG_USER_LOG_OUT = 106; // User LogOut -const BYTE AG_USER_REGENE = 107; // User Regene -const BYTE AG_USER_EXP = 108; // User ġ -const BYTE AG_USER_UPDATE = 109; // User Update Info -const BYTE AG_USER_FAIL = 110; // ߸ ó... -const BYTE AG_USER_PARTY = 111; // Ƽó +// AI Server와 게임서버간의 User에 관련된 패킷은 101번 부터 시작 +// --------------------------------------------------------------------- +const BYTE AG_USER_INFO = 101; // User의 정보 +const BYTE AG_USER_INOUT = 102; // User의 In,Out 정보 +const BYTE AG_USER_MOVE = 103; // User의 move 정보 +const BYTE AG_USER_MOVEEDGE = 104; // User의 move end 정보 +const BYTE AG_USER_SET_HP = 105; // User의 HP +const BYTE AG_USER_LOG_OUT = 106; // User의 LogOut +const BYTE AG_USER_REGENE = 107; // User의 Regene +const BYTE AG_USER_EXP = 108; // User의 경험치 +const BYTE AG_USER_UPDATE = 109; // User의 Update Info +const BYTE AG_USER_FAIL = 110; // 잘못된 유저 처리... +const BYTE AG_USER_PARTY = 111; // 파티처리 담당 diff --git a/src/server/Ebenezer/AISocket.cpp b/src/server/Ebenezer/AISocket.cpp index 97bc6063..6c4ebc89 100644 --- a/src/server/Ebenezer/AISocket.cpp +++ b/src/server/Ebenezer/AISocket.cpp @@ -128,13 +128,13 @@ void CAISocket::LoginProcess(char * pBuf) { int index = 0; float fReConnectEndTime = 0.0f; BYTE ver = GetByte(pBuf, index); - BYTE byReConnect = GetByte(pBuf, index); // 0 : ó, 1 : + BYTE byReConnect = GetByte(pBuf, index); // 0 : 처음접속, 1 : 재접속 CString logstr; - if (ver == -1) // zone Ʋ + if (ver == -1) // zone 틀리면 에러 { AfxMessageBox(_T("AI Server Version Fail!!")); - } else // Ʋ + } else // 틀리면 에러 { logstr.Format("AI Server Connect Success!! - %d", ver); m_pMain->m_StatusList.AddString(logstr); @@ -143,7 +143,7 @@ void CAISocket::LoginProcess(char * pBuf) { if (m_pMain->m_sSocketCount == MAX_AI_SOCKET) { m_pMain->m_bServerCheckFlag = TRUE; m_pMain->m_sSocketCount = 0; - TRACE("*** غܰ ****\n"); + TRACE("*** 유저의 정보를 보낼 준비단계 ****\n"); m_pMain->SendAllUserInfo(); } } else if (byReConnect == 1) { @@ -153,21 +153,21 @@ void CAISocket::LoginProcess(char * pBuf) { m_pMain->m_sReSocketCount++; TRACE("**** ReConnect - zone=%d, socket = %d ****\n ", ver, m_pMain->m_sReSocketCount); fReConnectEndTime = TimeGet(); - if (fReConnectEndTime > m_pMain->m_fReConnectStart + 120) { // 2оȿ ƴٸ... - TRACE("**** ReConnect - ܼ ... socket = %d ****\n ", m_pMain->m_sReSocketCount); + if (fReConnectEndTime > m_pMain->m_fReConnectStart + 120) { // 2분안에 모든 소켓이 재접됐다면... + TRACE("**** ReConnect - 단순한 접속... socket = %d ****\n ", m_pMain->m_sReSocketCount); m_pMain->m_sReSocketCount = 0; m_pMain->m_fReConnectStart = 0.0f; } if (m_pMain->m_sReSocketCount == MAX_AI_SOCKET) { fReConnectEndTime = TimeGet(); - if (fReConnectEndTime < m_pMain->m_fReConnectStart + 60) { // 1оȿ ƴٸ... - TRACE("**** ReConnect - ʱȭ Ϸ socket = %d ****\n ", m_pMain->m_sReSocketCount); + if (fReConnectEndTime < m_pMain->m_fReConnectStart + 60) { // 1분안에 모든 소켓이 재접됐다면... + TRACE("**** ReConnect - 모든 소켓 초기화 완료 socket = %d ****\n ", m_pMain->m_sReSocketCount); m_pMain->m_bServerCheckFlag = TRUE; m_pMain->m_sReSocketCount = 0; - TRACE("*** غܰ ****\n"); + TRACE("*** 유저의 정보를 보낼 준비단계 ****\n"); m_pMain->SendAllUserInfo(); - } else { // ϳ ̶... + } else { // 하나의 떨어진 소켓이라면... m_pMain->m_sReSocketCount = 0; m_pMain->m_fReConnectStart = 0.0f; } @@ -184,7 +184,7 @@ void CAISocket::RecvServerInfo(char * pBuf) { int size = m_pMain->m_ZoneArray.size(); if (type == SERVER_INFO_START) { - TRACE(" ޱ մϴ..%d\n", byZone); + TRACE("몬스터의 정보를 받기 시작합니다..%d\n", byZone); } else if (type == SERVER_INFO_END) { short sTotalMonster = 0; sTotalMonster = GetShort(pBuf, index); @@ -193,31 +193,31 @@ void CAISocket::RecvServerInfo(char * pBuf) { m_pMain->m_sZoneCount++; - TRACE(" ޾....%d, total=%d, socketcount=%d\n", byZone, sTotalMonster, + TRACE("몬스터의 정보를 다 받았음....%d, total=%d, socketcount=%d\n", byZone, sTotalMonster, m_pMain->m_sZoneCount); if (m_pMain->m_sZoneCount == size) { if (m_pMain->m_bFirstServerFlag == FALSE) { m_pMain->UserAcceptThread(); - TRACE("+++ ޾, User AcceptThread Start ....%d, socketcount=%d\n", byZone, + TRACE("+++ 몬스터의 모든 정보를 다 받았음, User AcceptThread Start ....%d, socketcount=%d\n", byZone, m_pMain->m_sZoneCount); } m_pMain->m_sZoneCount = 0; m_pMain->m_bFirstServerFlag = TRUE; m_pMain->m_bPointCheckFlag = TRUE; - TRACE(" ޾, User AcceptThread Start ....%d, socketcount=%d\n", byZone, + TRACE("몬스터의 모든 정보를 다 받았음, User AcceptThread Start ....%d, socketcount=%d\n", byZone, m_pMain->m_sZoneCount); - // ⿡ Event Monster ͸ ̸ Ҵ ϵ ~~ + // 여기에서 Event Monster의 포인터를 미리 할당 하도록 하장~~ //InitEventMonster( sTotalMonster ); } } } -// ai server ó ӽ npc ޾ƿ´.. +// ai server에 처음 접속시 npc의 모든 정보를 받아온다.. void CAISocket::RecvNpcInfoAll(char * pBuf) { int index = 0; - BYTE byCount = 0; // - BYTE byType; // 0:ó ʴ , 1: + BYTE byCount = 0; // 마리수 + BYTE byType; // 0:처음에 등장하지 않는 몬스터, 1:등장 short nid; // NPC index short sid; // NPC index short sZone; // Current zone number @@ -227,7 +227,7 @@ void CAISocket::RecvNpcInfoAll(char * pBuf) { int iweapon_1; int iweapon_2; char szName[MAX_ID_SIZE + 1]; // NPC Name - BYTE byGroup; // Ҽ + BYTE byGroup; // 소속 집단 BYTE byLevel; // level float fPosX; // X Position float fPosZ; // Z Position @@ -236,11 +236,11 @@ void CAISocket::RecvNpcInfoAll(char * pBuf) { BYTE tNpcType; // 00 : Monster // 01 : NPC int iSellingGroup; - int nMaxHP; // ִ HP - int nHP; // HP - BYTE byGateOpen; // ϰ + int nMaxHP; // 최대 HP + int nHP; // 현재 HP + BYTE byGateOpen; // 성문일경우 열림과 닫힘 정보 short sHitRate; - BYTE byObjectType; // : 0, Ư : 1 + BYTE byObjectType; // 보통 : 0, 특수 : 1 byCount = GetByte(pBuf, index); @@ -273,7 +273,7 @@ void CAISocket::RecvNpcInfoAll(char * pBuf) { if (nLength < 0 || nLength > MAX_ID_SIZE) { TRACE("#### RecvNpcInfoAll Fail : szName=%s\n", szName); - continue; // ߸ monster ̵ + continue; // 잘못된 monster 아이디 } if (sZoneIndex < 0 || sZoneIndex >= m_pMain->m_ZoneArray.size() || nid < 0 || sPid < 0) { @@ -354,14 +354,14 @@ void CAISocket::RecvNpcInfoAll(char * pBuf) { } if (byType == 0) { - TRACE("Recv --> NpcUserInfoAll : ϸ ȵſ,, uid=%d, sid=%d, name=%s\n", nid, sPid, szName); - continue; // region ... + TRACE("Recv --> NpcUserInfoAll : 등록하면 안돼여,, uid=%d, sid=%d, name=%s\n", nid, sPid, szName); + continue; // region에 등록하지 말기... } C3DMap * pMap = m_pMain->m_ZoneArray[(int)pNpc->m_sZoneIndex]; if (!pMap) { TRACE("Recv --> NpcUserInfoAll : fail,, uid=%d, sid=%d, name=%s\n", nid, sPid, szName); - continue; // region ... + continue; // region에 등록하지 말기... } pMap->RegionNpcAdd(pNpc->m_sRegion_X, pNpc->m_sRegion_Z, pNpc->m_sNid); } @@ -373,13 +373,13 @@ void CAISocket::RecvNpcMoveResult(char * pBuf) { char send_buff[256]; memset(send_buff, 0x00, 256); int index = 0, send_index = 0; - BYTE flag; // 01(INFO_MODIFY) : NPC - // 02(INFO_DELETE) : NPC + BYTE flag; // 01(INFO_MODIFY) : NPC 정보 변경 + // 02(INFO_DELETE) : NPC 정보 삭제 short nid; // NPC index float fPosX; // X Position float fPosZ; // Z Position float fPosY; // Y Position - float fSecForMetor; // Sec metor + float fSecForMetor; // Sec당 metor flag = GetByte(pBuf, index); nid = GetShort(pBuf, index); fPosX = Getfloat(pBuf, index); @@ -392,7 +392,7 @@ void CAISocket::RecvNpcMoveResult(char * pBuf) { return; } - if (pNpc->m_NpcState == NPC_DEAD || pNpc->m_iHP <= 0) { // Npc ȭ ҷ,, û.. + if (pNpc->m_NpcState == NPC_DEAD || pNpc->m_iHP <= 0) { // Npc 상태 동기화 불량,, 재요청.. SetByte(send_buff, AG_NPC_HP_REQ, send_index); SetShort(send_buff, nid, send_index); SetDWORD(send_buff, pNpc->m_iHP, send_index); @@ -441,17 +441,17 @@ void CAISocket::RecvNpcAttack(char * pBuf) { pNpc->m_iHP = 0; } - if (result == 0x04) { // ״° + if (result == 0x04) { // 마법으로 죽는경우 SetByte(pOutBuf, WIZ_DEAD, send_index); SetShort(pOutBuf, tid, send_index); m_pMain->Send_Region(pOutBuf, send_index, pNpc->m_sCurZone, pNpc->m_sRegion_X, pNpc->m_sRegion_Z, NULL, false); } else { SetByte(pOutBuf, WIZ_ATTACK, send_index); - SetByte(pOutBuf, byAttackType, send_index); // :1, :2, Ӹ:3 - //if(result == 0x04) // ״° + SetByte(pOutBuf, byAttackType, send_index); // 직접:1, 마법:2, 지속마법:3 + //if(result == 0x04) // 마법으로 죽는경우 // SetByte( pOutBuf, 0x02, send_index ); - //else // ܼ ״° + //else // 단순공격으로 죽는경우 SetByte(pOutBuf, result, send_index); SetShort(pOutBuf, sid, send_index); SetShort(pOutBuf, tid, send_index); @@ -471,7 +471,7 @@ void CAISocket::RecvNpcAttack(char * pBuf) { switch (((CUser *)(m_pMain->m_Iocport.m_SockArray[sid]))->m_bMagicTypeLeftHand) { // LEFT HAND!!! case ITEM_TYPE_HP_DRAIN: // HP Drain ((CUser *)(m_pMain->m_Iocport.m_SockArray[sid]))->HpChange(temp_damage, 0); - // TRACE("%d : HP : %d , HP : %d", sid, temp_damage, ((CUser*)(m_pMain->m_Iocport.m_SockArray[sid]))->m_pUserData->m_sHp); + // TRACE("%d : 흡수 HP : %d , 현재 HP : %d", sid, temp_damage, ((CUser*)(m_pMain->m_Iocport.m_SockArray[sid]))->m_pUserData->m_sHp); break; case ITEM_TYPE_MP_DRAIN: // MP Drain ((CUser *)(m_pMain->m_Iocport.m_SockArray[sid]))->MSpChange(temp_damage); @@ -486,7 +486,7 @@ void CAISocket::RecvNpcAttack(char * pBuf) { switch (((CUser *)(m_pMain->m_Iocport.m_SockArray[sid]))->m_bMagicTypeRightHand) { // LEFT HAND!!! case ITEM_TYPE_HP_DRAIN: // HP Drain ((CUser *)(m_pMain->m_Iocport.m_SockArray[sid]))->HpChange(temp_damage, 0); - // TRACE("%d : HP : %d , HP : %d", sid, temp_damage, ((CUser*)(m_pMain->m_Iocport.m_SockArray[sid]))->m_pUserData->m_sHp); + // TRACE("%d : 흡수 HP : %d , 현재 HP : %d", sid, temp_damage, ((CUser*)(m_pMain->m_Iocport.m_SockArray[sid]))->m_pUserData->m_sHp); break; case ITEM_TYPE_MP_DRAIN: // MP Drain ((CUser *)(m_pMain->m_Iocport.m_SockArray[sid]))->MSpChange(temp_damage); @@ -501,7 +501,7 @@ void CAISocket::RecvNpcAttack(char * pBuf) { C3DMap * pMap = m_pMain->m_ZoneArray[(int)pNpc->m_sZoneIndex]; pMap->RegionNpcRemove(pNpc->m_sRegion_X, pNpc->m_sRegion_Z, tid); - // TRACE("--- Npc Dead : Npc Region ó.. ,, region_x=%d, y=%d\n", pNpc->m_sRegion_X, pNpc->m_sRegion_Z); + // TRACE("--- Npc Dead : Npc를 Region에서 삭제처리.. ,, region_x=%d, y=%d\n", pNpc->m_sRegion_X, pNpc->m_sRegion_Z); pNpc->m_sRegion_X = 0; pNpc->m_sRegion_Z = 0; pNpc->m_NpcState = NPC_DEAD; @@ -511,7 +511,7 @@ void CAISocket::RecvNpcAttack(char * pBuf) { pEvent->byLife = 0; } } - // 뾾! 븸 ־? --; + // 성용씨! 대만 재미있어요? --; if (pNpc->m_tNpcType == 2) { if (sid >= 0 && sid < MAX_USER) { if (m_pMain->m_Iocport.m_SockArray[sid]) { @@ -574,7 +574,7 @@ void CAISocket::RecvNpcAttack(char * pBuf) { if (pUser->m_bResHpType == USER_DEAD) { return; } - // Դ ٷ Ŷ ... ( , ֱ ؼ) + // 유저에게는 바로 데드 패킷을 날림... (한 번 더 보냄, 유령을 없애기 위해서) pUser->Send(pOutBuf, send_index); pUser->m_bResHpType = USER_DEAD; @@ -588,7 +588,7 @@ void CAISocket::RecvNpcAttack(char * pBuf) { memset(pOutBuf, NULL, 1024); send_index = 0; if (pUser->m_pUserData->m_bFame == - COMMAND_CAPTAIN) { // ֱ ִ ״´ٸ,, Ż + COMMAND_CAPTAIN) { // 지휘권한이 있는 유저가 죽는다면,, 지휘 권한 박탈 pUser->m_pUserData->m_bFame = CHIEF; SetByte(pOutBuf, WIZ_AUTHORITY_CHANGE, send_index); SetByte(pOutBuf, COMMAND_AUTHORITY, send_index); @@ -607,21 +607,21 @@ void CAISocket::RecvNpcAttack(char * pBuf) { } } - if (pNpc->m_tNpcType == NPC_PATROL_GUARD) { // 񺴿 ״ .. + if (pNpc->m_tNpcType == NPC_PATROL_GUARD) { // 경비병에게 죽는 경우라면.. pUser->ExpChange(-pUser->m_iMaxExp / 100); - //TRACE("RecvNpcAttack : ġ 1% id = %s\n", pUser->m_pUserData->m_id); + //TRACE("RecvNpcAttack : 경험치를 1%깍기 id = %s\n", pUser->m_pUserData->m_id); } else { // if (pUser->m_pUserData->m_bZone != pUser->m_pUserData->m_bNation && pUser->m_pUserData->m_bZone < 3) { pUser->ExpChange(-pUser->m_iMaxExp / 100); - //TRACE(" 1% ￴ٴϱ ."); + //TRACE("정말로 1%만 깍였다니까요 ㅠ.ㅠ"); } // else { pUser->ExpChange(-pUser->m_iMaxExp / 20); } - //TRACE("RecvNpcAttack : ġ 5% id = %s\n", pUser->m_pUserData->m_id); + //TRACE("RecvNpcAttack : 경험치를 5%깍기 id = %s\n", pUser->m_pUserData->m_id); } } } else if (tid >= NPC_BAND) // npc attack -> monster @@ -645,7 +645,7 @@ void CAISocket::RecvNpcAttack(char * pBuf) { if (result == 0x02) { // npc dead C3DMap * pMap = m_pMain->m_ZoneArray[(int)pMon->m_sZoneIndex]; pMap->RegionNpcRemove(pMon->m_sRegion_X, pMon->m_sRegion_Z, tid); - // TRACE("--- Npc Dead : Npc Region ó.. ,, region_x=%d, y=%d\n", pMon->m_sRegion_X, pMon->m_sRegion_Z); + // TRACE("--- Npc Dead : Npc를 Region에서 삭제처리.. ,, region_x=%d, y=%d\n", pMon->m_sRegion_X, pMon->m_sRegion_Z); pMon->m_sRegion_X = 0; pMon->m_sRegion_Z = 0; pMon->m_NpcState = NPC_DEAD; @@ -751,34 +751,34 @@ void CAISocket::RecvMagicAttackResult(char * pBuf) { void CAISocket::RecvNpcInfo(char * pBuf) { int index = 0; - BYTE Mode; // 01(INFO_MODIFY) : NPC - // 02(INFO_DELETE) : NPC + BYTE Mode; // 01(INFO_MODIFY) : NPC 정보 변경 + // 02(INFO_DELETE) : NPC 정보 삭제 short nid; // NPC index short sid; // NPC index short sPid; // NPC Picture Number short sSize = 100; // NPC Size - int iWeapon_1; // - int iWeapon_2; // ޼ + int iWeapon_1; // 오른손 무기 + int iWeapon_2; // 왼손 무기 short sZone; // Current zone number short sZoneIndex; // Current zone index char szName[MAX_ID_SIZE + 1]; // NPC Name - BYTE byGroup; // Ҽ + BYTE byGroup; // 소속 집단 BYTE byLevel; // level float fPosX; // X Position float fPosZ; // Z Position float fPosY; // Y Position - float fDir; // - BYTE tState; // NPC + float fDir; // 방향 + BYTE tState; // NPC 상태 // 00 : NPC Dead // 01 : NPC Live BYTE tNpcKind; // 00 : Monster // 01 : NPC int iSellingGroup; - int nMaxHP; // ִ HP - int nHP; // HP + int nMaxHP; // 최대 HP + int nHP; // 현재 HP BYTE byGateOpen; - short sHitRate; // - BYTE byObjectType; // : 0, Ư : 1 + short sHitRate; // 공격 성공률 + BYTE byObjectType; // 보통 : 0, 특수 : 1 Mode = GetByte(pBuf, index); nid = GetShort(pBuf, index); @@ -791,7 +791,7 @@ void CAISocket::RecvNpcInfo(char * pBuf) { sZoneIndex = GetShort(pBuf, index); int nLength = GetVarString(szName, pBuf, sizeof(BYTE), index); if (nLength < 0 || nLength > MAX_ID_SIZE) { - return; // ߸ monster ̵ + return; // 잘못된 monster 아이디 } byGroup = GetByte(pBuf, index); byLevel = GetByte(pBuf, index); @@ -818,7 +818,7 @@ void CAISocket::RecvNpcInfo(char * pBuf) { pNpc->m_NpcState = NPC_DEAD; char strLog[256]; - if (pNpc->m_NpcState == NPC_LIVE) { // ִµ ޴ + if (pNpc->m_NpcState == NPC_LIVE) { // 살아 있는데 또 정보를 받는 경우 memset(strLog, 0x00, 256); CTime t = CTime::GetCurrentTime(); wsprintf(strLog, "## time(%d:%d-%d) npc regen check(%d) : nid=%d, name=%s, x=%d, z=%d, rx=%d, rz=%d ## \r\n", @@ -951,7 +951,7 @@ void CAISocket::RecvUserExp(char * pBuf) { return; } if (sExp < 0 || sLoyalty < 0) { - TRACE("#### AISocket - RecvUserExp : exp=%d, loyalty=%d,, ߸ ġ ´,, !!\n", sExp, sLoyalty); + TRACE("#### AISocket - RecvUserExp : exp=%d, loyalty=%d,, 잘못된 경험치가 온다,, 수정해!!\n", sExp, sLoyalty); return; } pUser->m_pUserData->m_iLoyalty += sLoyalty; @@ -1016,7 +1016,7 @@ void CAISocket::RecvNpcGiveItem(char * pBuf) { C3DMap * pMap = NULL; CUser * pUser = NULL; - sUid = GetShort(pBuf, index); // Item ̵... (̰ ؼ ۾ϼ~) + sUid = GetShort(pBuf, index); // Item을 가져갈 사람의 아이디... (이것을 참조해서 작업하셈~) sNid = GetShort(pBuf, index); sZone = GetShort(pBuf, index); regionx = GetShort(pBuf, index); @@ -1096,8 +1096,8 @@ void CAISocket::RecvUserFail(char * pBuf) { return; } - // ⿡ ӵŸ AI ... - /* if(pUser->m_pUserData->m_sHp > 0 && pUser->m_bResHpType != USER_DEAD) // Ӽ AI Ÿ Ʋ.. + // 여기에서 게임데이타의 정보를 AI서버에 보내보자... + /* if(pUser->m_pUserData->m_sHp > 0 && pUser->m_bResHpType != USER_DEAD) // 게임서버와 AI서버간의 데이타가 틀림.. { SetByte(pOutBuf, AG_USER_FAIL, send_index); SetShort( pOutBuf, nid, send_index ); @@ -1129,18 +1129,18 @@ void CAISocket::RecvCompressedData(char * pBuf) { char pTempBuf[10001]; memset(pTempBuf, 0x00, 10001); DWORD dwCrcValue; - sCompLen = GetShort(pBuf, index); // Ÿ̾... - sOrgLen = GetShort(pBuf, index); // Ÿ̾... - dwCrcValue = GetDWORD(pBuf, index); // CRC ... - sCompCount = GetShort(pBuf, index); // Ÿ ... - // Ÿ ... + sCompLen = GetShort(pBuf, index); // 압축된 데이타길이얻기... + sOrgLen = GetShort(pBuf, index); // 원래데이타길이얻기... + dwCrcValue = GetDWORD(pBuf, index); // CRC값 얻기... + sCompCount = GetShort(pBuf, index); // 압축 데이타 수 얻기... + // 압축 데이타 얻기... memcpy(pTempBuf, pBuf + index, sCompLen); index += sCompLen; CCompressMng cmpMgrDecode; - /// - cmpMgrDecode.PreUncompressWork(pTempBuf, sCompLen, sOrgLen); // Ǯ... + /// 압축 해제 + cmpMgrDecode.PreUncompressWork(pTempBuf, sCompLen, sOrgLen); // 압축 풀기... if (cmpMgrDecode.Extract() == false) { cmpMgrDecode.Initialize(); @@ -1162,10 +1162,10 @@ void CAISocket::RecvCompressedData(char * pBuf) { return; } - // Ǯ Ÿ б + // 압축 풀린 데이타 읽기 Parsing(sOrgLen, cmpMgrDecode.m_pOutputBuffer); - // Ǯ + // 압축 풀기 끝 cmpMgrDecode.Initialize(); } @@ -1267,7 +1267,7 @@ void CAISocket::RecvNpcDead(char * pBuf) { return; } pMap->RegionNpcRemove(pNpc->m_sRegion_X, pNpc->m_sRegion_Z, nid); - //TRACE("--- RecvNpcDead : Npc Region ó.. ,, zone=%d, region_x=%d, y=%d\n", pNpc->m_sZoneIndex, pNpc->m_sRegion_X, pNpc->m_sRegion_Z); + //TRACE("--- RecvNpcDead : Npc를 Region에서 삭제처리.. ,, zone=%d, region_x=%d, y=%d\n", pNpc->m_sZoneIndex, pNpc->m_sRegion_X, pNpc->m_sRegion_Z); SetByte(send_buff, WIZ_DEAD, send_index); SetShort(send_buff, nid, send_index); @@ -1332,11 +1332,11 @@ void CAISocket::RecvBattleEvent(char * pBuf) { return; } if (nResult == KARUS) { - //TRACE("--> RecvBattleEvent : ī罺 Ѿ ־\n"); - m_pMain->m_byKarusOpenFlag = 1; // ī罺 Ѿ ־ + //TRACE("--> RecvBattleEvent : 카루스 땅으로 넘어갈 수 있어\n"); + m_pMain->m_byKarusOpenFlag = 1; // 카루스 땅으로 넘어갈 수 있어 } else if (nResult == ELMORAD) { - //TRACE("--> RecvBattleEvent : Ѿ ־\n"); - m_pMain->m_byElmoradOpenFlag = 1; // Ѿ ־ + //TRACE("--> RecvBattleEvent : 엘모 땅으로 넘어갈 수 있어\n"); + m_pMain->m_byElmoradOpenFlag = 1; // 엘모 땅으로 넘어갈 수 있어 } SetByte(udp_buff, UDP_BATTLE_EVENT_PACKET, udp_index); @@ -1348,9 +1348,9 @@ void CAISocket::RecvBattleEvent(char * pBuf) { return; } if (nResult == KARUS) { - //TRACE("--> RecvBattleEvent : ī罺 ¸Ͽϴ.\n"); + //TRACE("--> RecvBattleEvent : 카루스가 승리하였습니다.\n"); } else if (nResult == ELMORAD) { - //TRACE("--> RecvBattleEvent : 尡 ¸Ͽϴ.\n"); + //TRACE("--> RecvBattleEvent : 엘모라드가 승리하였습니다.\n"); } nLen = GetByte(pBuf, index); @@ -1359,7 +1359,7 @@ void CAISocket::RecvBattleEvent(char * pBuf) { GetString(strMaxUserName, pBuf, nLen, index); if (m_pMain->m_byBattleSave == 0) { memset(send_buff, NULL, 1024); - send_index = 0; // ¸ sql + send_index = 0; // 승리국가를 sql에 저장 SetByte(send_buff, WIZ_BATTLE_EVENT, send_index); SetByte(send_buff, nType, send_index); SetByte(send_buff, nResult, send_index); @@ -1378,11 +1378,11 @@ void CAISocket::RecvBattleEvent(char * pBuf) { m_pMain->m_bVictory = nResult; m_pMain->m_byOldVictory = nResult; - m_pMain->m_byKarusOpenFlag = 0; // ī罺 Ѿ - m_pMain->m_byElmoradOpenFlag = 0; // Ѿ + m_pMain->m_byKarusOpenFlag = 0; // 카루스 땅으로 넘어갈 수 없도록 + m_pMain->m_byElmoradOpenFlag = 0; // 엘모 땅으로 넘어갈 수 없도록 m_pMain->m_byBanishFlag = 1; - SetByte(udp_buff, UDP_BATTLE_EVENT_PACKET, udp_index); // udp ٸ + SetByte(udp_buff, UDP_BATTLE_EVENT_PACKET, udp_index); // udp로 다른서버에 정보 전달 SetByte(udp_buff, nType, udp_index); SetByte(udp_buff, nResult, udp_index); } else if (nType == BATTLE_EVENT_MAX_USER) { @@ -1397,13 +1397,13 @@ void CAISocket::RecvBattleEvent(char * pBuf) { strcpy(strKnightsName, pKnights->m_strName); } } - //TRACE("--> RecvBattleEvent : ̸? %s, len=%d\n", strMaxUserName, nResult); + //TRACE("--> RecvBattleEvent : 적국의 대장을 죽인 유저이름은? %s, len=%d\n", strMaxUserName, nResult); if (nResult == 1) { ::_LoadStringFromResource(IDS_KILL_CAPTAIN, buff); sprintf(chatstr, buff.c_str(), strKnightsName, strMaxUserName); /* if( m_pMain->m_byBattleSave == 0 ) { - memset( send_buff, NULL, 256 ); send_index = 0; // ¸ sql + memset( send_buff, NULL, 256 ); send_index = 0; // 승리국가를 sql에 저장 SetByte( send_buff, WIZ_BATTLE_EVENT, send_index ); SetByte( send_buff, nType, send_index ); SetByte( send_buff, m_pMain->m_bVictory, send_index ); @@ -1439,7 +1439,7 @@ void CAISocket::RecvBattleEvent(char * pBuf) { memset(send_buff, NULL, 1024); send_index = 0; - //sprintf( finalstr, "## : %s ##", chatstr ); + //sprintf( finalstr, "## 공지 : %s ##", chatstr ); ::_LoadStringFromResource(IDP_ANNOUNCEMENT, buff2); sprintf(finalstr, buff2.c_str(), chatstr); SetByte(send_buff, WIZ_CHAT, send_index); @@ -1479,7 +1479,7 @@ void CAISocket::RecvNpcEventItem(char * pBuf) { int nItemNumber = 0, nCount = 0; CUser * pUser = NULL; - sUid = GetShort(pBuf, index); // Item ̵... (̰ ؼ ۾ϼ~) + sUid = GetShort(pBuf, index); // Item을 가져갈 사람의 아이디... (이것을 참조해서 작업하셈~) sNid = GetShort(pBuf, index); nItemNumber = GetDWORD(pBuf, index); nCount = GetDWORD(pBuf, index); diff --git a/src/server/Ebenezer/CircularBuffer.h b/src/server/Ebenezer/CircularBuffer.h index 13a6572f..188fca87 100644 --- a/src/server/Ebenezer/CircularBuffer.h +++ b/src/server/Ebenezer/CircularBuffer.h @@ -11,11 +11,11 @@ class CCircularBuffer { void PutData(char * pData, int len); void GetData(char * pData, int len); - int GetOutData(char * pData); //HeadPos, ȭ + int GetOutData(char * pData); //HeadPos, 변화 void PutData(char & data); char & GetHeadData() { return m_pBuffer[m_iHeadPos]; } //1 Byte Operation; - //false : 絥 ٺ, TRUE: + //false : 모든데이터 다빠짐, TRUE: 정상적으로 진행중 BOOL HeadIncrease(int increasement = 1); void SetEmpty() { m_iHeadPos = 0; @@ -28,10 +28,10 @@ class CCircularBuffer { int GetValidCount(); protected: - //over flow IndexOverFlow + //over flow 먼저 점검한 후 IndexOverFlow 점검 BOOL IsOverFlowCondition(int & len) { return (len >= m_iBufSize - GetValidCount()) ? TRUE : FALSE; } BOOL IsIndexOverFlow(int & len) { return (len + m_iTailPos >= m_iBufSize) ? TRUE : FALSE; } - void BufferResize(); //overflow condition ϶ size ι ø + void BufferResize(); //overflow condition 일때 size를 현재의 두배로 늘림 protected: int m_iBufSize; char * m_pBuffer; diff --git a/src/server/Ebenezer/Define.h b/src/server/Ebenezer/Define.h index 5c8f53ed..11d3907d 100644 --- a/src/server/Ebenezer/Define.h +++ b/src/server/Ebenezer/Define.h @@ -14,27 +14,27 @@ #define MAX_TYPE3_REPEAT 20 #define MAX_TYPE4_BUFF 9 -#define MAX_ITEM_COUNT 9999 // Կ ִ ȭ/ +#define MAX_ITEM_COUNT 9999 // 한 슬롯에 가지는 최대 화살/송편 개수 #define MAX_ID_SIZE 30 #define MAX_PW_SIZE 12 #define MAX_ITEM 28 -#define VIEW_DISTANCE 48 // ðŸ +#define VIEW_DISTANCE 48 // 가시거리 -const BYTE SLOT_MAX = 14; // MAX -const BYTE HAVE_MAX = 28; // MAX (κ丮â) -const BYTE WAREHOUSE_MAX = 196; // â MAX +const BYTE SLOT_MAX = 14; // 착용 아템 MAX +const BYTE HAVE_MAX = 28; // 소유 아템 MAX (인벤토리창) +const BYTE WAREHOUSE_MAX = 196; // 창고 아이템 MAX #define NPC_HAVE_ITEM_LIST 6 -#define ZONEITEM_MAX 2100000000 // ִ ۼ... +#define ZONEITEM_MAX 2100000000 // 존에 떨어지는 최대 아이템수... -#define MAX_CLASS 26 // MAX -#define MAX_LEVEL 60 // ְ... +#define MAX_CLASS 26 // 직업 MAX +#define MAX_LEVEL 60 // 최고렙... #define SERVER_INFO_START 0X01 #define SERVER_INFO_END 0X02 -////////////// Quest Define //////////////////////////// +////////////// Quest 관련 Define //////////////////////////// #define MAX_EVENT 2000 #define MAX_EVENT_SIZE 400 #define MAX_EVENT_NUM 2000 @@ -44,8 +44,8 @@ #define MAX_COUPON_ID_LENGTH 20 #define MAX_CURRENT_EVENT 20 -// ̴°͸ ϴ. -// logic define +// 지금 쓰이는것만 정의 해 놨습니다. +// logic관련 define #define LOGIC_CHECK_UNDER_WEIGHT 0X01 #define LOGIC_CHECK_OVER_WEIGHT 0X02 #define LOGIC_CHECK_SKILL_POINT 0X03 @@ -82,7 +82,7 @@ #define LOGIC_CHECK_DAY 0x12 */ -// define +// 실행관련 define #define EXEC_SAY 0X01 #define EXEC_SELECT_MSG 0X02 #define EXEC_RUN_EVENT 0X03 @@ -109,7 +109,7 @@ #define EXEC_GIVE_NOAH 0x0B */ -// EVENT ȣ :) +// EVENT 시작 번호들 :) #define EVENT_POTION 1 #define EVENT_LOGOS_ELMORAD 1001 #define EVENT_LOGOS_KARUS 2001 @@ -137,25 +137,25 @@ #define NPC_MONSTER 00 #define NPC_GENERAL 01 // #define NPC_BOSS 03 // Unique Mop -#define NPC_PATROL_GUARD 11 // -#define NPC_MERCHANT 21 // -#define NPC_TINKER 22 // -#define NPC_WAREHOUSE 31 // â -#define NPC_CAPTAIN 35 // -#define NPC_OFFICER 36 // NPC -#define NPC_CLERIC 37 // NPC +#define NPC_PATROL_GUARD 11 // 경비병 +#define NPC_MERCHANT 21 // 상인 +#define NPC_TINKER 22 // 대장장이 +#define NPC_WAREHOUSE 31 // 창고지기 +#define NPC_CAPTAIN 35 // 전직 +#define NPC_OFFICER 36 // 기사단 관리 NPC +#define NPC_CLERIC 37 // 대사제 NPC #define NPC_HEALER 40 // Healer #define NPC_WARP 41 // Warp Npc -#define NPC_GATE 50 // NPC -#define NPC_PHOENIX_GATE 51 // ʴ (8->51) -#define NPC_SPECIAL_GATE 52 // ʴ ̸鼭 2и ȴ ϴ -#define NPC_GATE_LEVER 55 // ... (9->55) -#define NPC_ARTIFACT 60 // 輮 (7->60) -#define NPC_DESTORY_ARTIFACT 61 // ıǴ 輮 -#define NPC_MONK_ELMORAD 71 // 񷯸ӱ >.< -#define NPC_MONK_KARUS 72 // 񷯸ӱ >.< -#define NPC_DOMESTIC_ANIMAL 99 // NPC -#define NPC_COUPON 100 // 񷯸ӱ >.< +#define NPC_GATE 50 // 성문형태 NPC +#define NPC_PHOENIX_GATE 51 // 깨지지 않는 문 (8->51) +#define NPC_SPECIAL_GATE 52 // 깨지지 않는 문이면서 2분마다 열렸다 닫혔다 하는 문 +#define NPC_GATE_LEVER 55 // 성문 레버... (9->55) +#define NPC_ARTIFACT 60 // 결계석 (7->60) +#define NPC_DESTORY_ARTIFACT 61 // 파괴되는 결계석 +#define NPC_MONK_ELMORAD 71 // 비러머글 수도승 >.< +#define NPC_MONK_KARUS 72 // 비러머글 수도승 >.< +#define NPC_DOMESTIC_ANIMAL 99 // 가축 NPC +#define NPC_COUPON 100 // 비러머글 복권 >.< ///////////////// NATION /////////////////////////////////// #define UNIFY_NATION 0 @@ -177,7 +177,7 @@ // UserInOut // #define USER_IN 0X01 #define USER_OUT 0X02 -#define USER_REGENE 0X03 // Userinϰ ε ȿ ֱؼ.. и(ӽ, . ȯ) +#define USER_REGENE 0X03 // Userin하고 같은것인데 효과를 주기위해서.. 분리(게임시작, 리젠. 소환시) #define USER_WARP 0X04 #define USER_SUMMON 0X05 #define NPC_IN 0X01 @@ -217,11 +217,11 @@ // ================================================================== // About Map Object // ================================================================== -#define USER_BAND 0 // Map ִ. -#define NPC_BAND 10000 // Map NPC() ִ. -#define INVALID_BAND 30000 // ߸ ID BAND +#define USER_BAND 0 // Map 위에 유저가 있다. +#define NPC_BAND 10000 // Map 위에 NPC(몹포함)가 있다. +#define INVALID_BAND 30000 // 잘못된 ID BAND -#define EVENT_MONSTER 20 // Event monster +#define EVENT_MONSTER 20 // Event monster 총 수 ///////////////// snow event define ////////////////////////////// #define SNOW_EVENT_MONEY 2000 diff --git a/src/server/Ebenezer/EVENT.cpp b/src/server/Ebenezer/EVENT.cpp index c34eb467..4cc08cd2 100644 --- a/src/server/Ebenezer/EVENT.cpp +++ b/src/server/Ebenezer/EVENT.cpp @@ -68,7 +68,7 @@ BOOL EVENT::LoadEvent(int zone) { t_index = 0; - if (buf[t_index] == ';' || buf[t_index] == '/') // ּ ó + if (buf[t_index] == ';' || buf[t_index] == '/') // 주석에 대한 처리 { index = 0; continue; diff --git a/src/server/Ebenezer/EXEC.cpp b/src/server/Ebenezer/EXEC.cpp index cb6aa50b..88928b8a 100644 --- a/src/server/Ebenezer/EXEC.cpp +++ b/src/server/Ebenezer/EXEC.cpp @@ -31,82 +31,82 @@ void EXEC::Parse(char * pBuf) { m_Exec = EXEC_SAY; index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ȣ1 + m_ExecInt[i++] = atoi(temp); // 지문 번호1 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ȣ2 + m_ExecInt[i++] = atoi(temp); // 지문 번호2 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ȣ3 + m_ExecInt[i++] = atoi(temp); // 지문 번호3 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ȣ4 + m_ExecInt[i++] = atoi(temp); // 지문 번호4 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ȣ5 + m_ExecInt[i++] = atoi(temp); // 지문 번호5 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ȣ6 + m_ExecInt[i++] = atoi(temp); // 지문 번호6 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ȣ7 + m_ExecInt[i++] = atoi(temp); // 지문 번호7 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ȣ8 + m_ExecInt[i++] = atoi(temp); // 지문 번호8 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ȣ9 + m_ExecInt[i++] = atoi(temp); // 지문 번호9 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ȣ10 + m_ExecInt[i++] = atoi(temp); // 지문 번호10 } else if (!strcmp(temp, "SELECT_MSG")) { m_Exec = EXEC_SELECT_MSG; index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // + m_ExecInt[i++] = atoi(temp); // 직업 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ȣ + m_ExecInt[i++] = atoi(temp); // 지문 번호 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ù 1 + m_ExecInt[i++] = atoi(temp); // 선택문 1 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ̺Ʈ 1 + m_ExecInt[i++] = atoi(temp); // 이벤트 1 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ù 2 + m_ExecInt[i++] = atoi(temp); // 선택문 2 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ̺Ʈ 2 + m_ExecInt[i++] = atoi(temp); // 이벤트 2 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ù 3 + m_ExecInt[i++] = atoi(temp); // 선택문 3 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ̺Ʈ 3 + m_ExecInt[i++] = atoi(temp); // 이벤트 3 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ù 4 + m_ExecInt[i++] = atoi(temp); // 선택문 4 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ̺Ʈ 4 + m_ExecInt[i++] = atoi(temp); // 이벤트 4 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ù 5 + m_ExecInt[i++] = atoi(temp); // 선택문 5 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ̺Ʈ 5 - // 񷯸ӱ Ʈ >.< + m_ExecInt[i++] = atoi(temp); // 이벤트 5 + // 비러머글 퀘스트 >.< index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ù 6 + m_ExecInt[i++] = atoi(temp); // 선택문 6 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ̺Ʈ 6 + m_ExecInt[i++] = atoi(temp); // 이벤트 6 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ù 7 + m_ExecInt[i++] = atoi(temp); // 선택문 7 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ̺Ʈ 7 + m_ExecInt[i++] = atoi(temp); // 이벤트 7 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ù 8 + m_ExecInt[i++] = atoi(temp); // 선택문 8 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ̺Ʈ 8 + m_ExecInt[i++] = atoi(temp); // 이벤트 8 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ù 9 + m_ExecInt[i++] = atoi(temp); // 선택문 9 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ̺Ʈ 9 + m_ExecInt[i++] = atoi(temp); // 이벤트 9 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ù 10 + m_ExecInt[i++] = atoi(temp); // 선택문 10 index += ParseSpace(temp, pBuf + index); - m_ExecInt[i++] = atoi(temp); // ̺Ʈ 10 + m_ExecInt[i++] = atoi(temp); // 이벤트 10 // } else if (!strcmp(temp, "RUN_EVENT")) { m_Exec = EXEC_RUN_EVENT; @@ -127,7 +127,7 @@ void EXEC::Parse(char * pBuf) { index += ParseSpace(temp, pBuf + index); m_ExecInt[i++] = atoi(temp); // Item count } - // 񷯸ӱ Ʈ >.< + // 비러머글 퀘스트 >.< else if (!strcmp(temp, "OPEN_EDITBOX")) { m_Exec = EXEC_OPEN_EDITBOX; @@ -155,7 +155,7 @@ void EXEC::Parse(char * pBuf) { m_Exec = EXEC_RETURN; } - // Դϴ. Ʒ ߿ ° ؼ . + // 현재 여기까지만 쓰입니다. 아래는 나중에 맞게 수정해서 쓰세여. /* else if( !strcmp( temp, "ROB_NOAH" ) ) diff --git a/src/server/Ebenezer/Ebenezer.rc b/src/server/Ebenezer/Ebenezer.rc index 3acdfdbf4861a792feb41f9acd7341321bbb7c8a..95d5308cb2255144cbbc2cd841fb43541b79ebad 100644 GIT binary patch literal 19518 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 diff --git a/src/server/Ebenezer/Ebenezer.vcxproj.filters b/src/server/Ebenezer/Ebenezer.vcxproj.filters index 886011b5..57a6a4b0 100644 --- a/src/server/Ebenezer/Ebenezer.vcxproj.filters +++ b/src/server/Ebenezer/Ebenezer.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/server/Ebenezer/Ebenezer.vcxproj.user b/src/server/Ebenezer/Ebenezer.vcxproj.user index 5e8a5e38..675e3874 100644 --- a/src/server/Ebenezer/Ebenezer.vcxproj.user +++ b/src/server/Ebenezer/Ebenezer.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\server diff --git a/src/server/Ebenezer/EbenezerDlg.cpp b/src/server/Ebenezer/EbenezerDlg.cpp index 445e8884..682059bc 100644 --- a/src/server/Ebenezer/EbenezerDlg.cpp +++ b/src/server/Ebenezer/EbenezerDlg.cpp @@ -96,25 +96,25 @@ DWORD WINAPI ReadQueueThread(LPVOID lp) { memset(pUser->m_strAccountID, NULL, MAX_ID_SIZE + 1); } SetByte(send_buff, WIZ_LOGIN, send_index); - SetByte(send_buff, result, send_index); // + SetByte(send_buff, result, send_index); // 성공시 국가 정보 pUser->Send(send_buff, send_index); break; case WIZ_SEL_NATION: SetByte(send_buff, WIZ_SEL_NATION, send_index); - SetByte(send_buff, GetByte(pBuf, index), send_index); // + SetByte(send_buff, GetByte(pBuf, index), send_index); // 국가 정보 pUser->Send(send_buff, send_index); break; case WIZ_NEW_CHAR: result = GetByte(pBuf, index); SetByte(send_buff, WIZ_NEW_CHAR, send_index); - SetByte(send_buff, result, send_index); // + SetByte(send_buff, result, send_index); // 성공시 국가 정보 pUser->Send(send_buff, send_index); break; case WIZ_DEL_CHAR: pUser->RecvDeleteChar(pBuf + index); /* result = GetByte( pBuf, index ); SetByte( send_buff, WIZ_DEL_CHAR, send_index ); - SetByte( send_buff, result, send_index ); // + SetByte( send_buff, result, send_index ); // 성공시 국가 정보 SetByte( send_buff, GetByte( pBuf, index ), send_index ); pUser->Send( send_buff, send_index ); */ break; @@ -260,13 +260,13 @@ CEbenezerDlg::CEbenezerDlg(CWnd * pParent /*=NULL*/) } memset(m_AIServerIP, NULL, 20); - m_bPermanentChatMode = FALSE; // 񷯸ӱ --; + m_bPermanentChatMode = FALSE; // 비러머글 남는 공지 --; m_bPermanentChatFlag = FALSE; memset(m_strPermanentChat, NULL, 1024); memset(m_strKarusCaptain, 0x00, MAX_ID_SIZE + 1); memset(m_strElmoradCaptain, 0x00, MAX_ID_SIZE + 1); - m_bSanta = FALSE; // Ÿ!!! >.< + m_bSanta = FALSE; // 갓댐 산타!!! >.< memset(m_szOdbcGameDsn, 0, sizeof(m_szOdbcGameDsn)); memset(m_szOdbcGameUid, 0, sizeof(m_szOdbcGameUid)); @@ -302,9 +302,9 @@ BOOL CEbenezerDlg::OnInitDialog() { SetIcon(m_hIcon, FALSE); // Set small icon // Compress Init - memset(m_CompBuf, NULL, 10240); // ͸ - m_iCompIndex = 0; // - m_CompCount = 0; // + memset(m_CompBuf, NULL, 10240); // 압축할 데이터를 모으는 버퍼 + m_iCompIndex = 0; // 압축할 데이터의 길이 + m_CompCount = 0; // 압축할 데이터의 개수 m_sZoneCount = 0; m_sSocketCount = 0; @@ -500,7 +500,7 @@ BOOL CEbenezerDlg::OnInitDialog() { //CTime cur = CTime::GetCurrentTime(); CString starttime; - starttime.Format("Game Server Start : %d %d %d %d\r\n", cur.GetMonth(), cur.GetDay(), cur.GetHour(), + starttime.Format("Game Server Start : %d월 %d일 %d시 %d분\r\n", cur.GetMonth(), cur.GetDay(), cur.GetHour(), cur.GetMinute()); LogFileWrite((char *)(LPCTSTR)starttime); m_StatusList.AddString(starttime); @@ -803,13 +803,13 @@ BOOL CEbenezerDlg::AISocketConnect(int zone, int flag) { SetByte(pBuf, AI_SERVER_CONNECT, send_index); SetByte(pBuf, zone, send_index); if (flag == 1) { - SetByte(pBuf, 1, send_index); // + SetByte(pBuf, 1, send_index); // 재접속 } else { - SetByte(pBuf, 0, send_index); // ó .. + SetByte(pBuf, 0, send_index); // 처음 접속.. } pAISock->Send(pBuf, send_index); - // ؾ : κ ó..... + // 해야할일 :이 부분 처리..... //SendAllUserInfo(); //m_sSocketCount = zone; m_AISocketArray.PutData(zone, pAISock); @@ -1063,7 +1063,7 @@ BOOL CEbenezerDlg::InitializeMMF() { BOOL bCreate = TRUE; CString logstr; - DWORD filesize = MAX_USER * 4000; // 1 3000 bytes ̳ ҿ + DWORD filesize = MAX_USER * 4000; // 1명당 3000 bytes 이내 소요 m_hMMFile = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, filesize, "KNIGHT_DB"); if (m_hMMFile != NULL && GetLastError() == ERROR_ALREADY_EXISTS) { @@ -1147,7 +1147,7 @@ BOOL CEbenezerDlg::MapFileLoad() { } m_ZoneArray.push_back(pMap); - // ƮƮ о δ. + // 스트립트를 읽어 들인다. LogFileWrite("before script\r\n"); pEvent = new EVENT; @@ -1689,7 +1689,7 @@ void CEbenezerDlg::UpdateGameTime() { m_nMin = 0; UpdateWeather(); SetGameTime(); - // Ÿ!! >.< + // 갓댐 산타!! >.< if (m_bSanta) { FlySanta(); } @@ -1717,7 +1717,7 @@ void CEbenezerDlg::UpdateGameTime() { //SetByte(pSendBuf, AG_CHECK_ALIVE_REQ, send_index); //Send_AIServer(1000, pSendBuf, send_index); - // ð .. + // 시간과 날씨 정보를 보낸다.. ::ZeroMemory(pSendBuf, sizeof(pSendBuf)); send_index = 0; SetByte(pSendBuf, AG_TIME_WEATHER, send_index); @@ -1759,7 +1759,7 @@ void CEbenezerDlg::UpdateWeather() { } m_nAmount = myrand(0, 100); - if (weather == WEATHER_FINE) { // WEATHER_FINE ϶ m_nAmount Ȱ ǥ + if (weather == WEATHER_FINE) { // WEATHER_FINE 일때 m_nAmount 는 안개 정도 표시 if (m_nAmount > 70) { m_nAmount = m_nAmount / 2; } else { @@ -1800,7 +1800,7 @@ void CEbenezerDlg::UserInOutForMe(CUser * pSendUser) { return; } - send_index = 3; // packet command user_count ߿ Ѵ... + send_index = 3; // packet command 와 user_count 를 나중에 셋팅한다... region_x = pSendUser->m_RegionX; region_z = pSendUser->m_RegionZ; // CENTER buff_index = GetRegionUserIn(pMap, region_x, region_z, buff, t_count); @@ -1907,7 +1907,7 @@ void CEbenezerDlg::RegionUserInOutForMe(CUser * pSendUser) { return; } - uid_sendindex = 3; // packet command user_count ߿ Ѵ... + uid_sendindex = 3; // packet command 와 user_count 는 나중에 셋팅한다... region_x = pSendUser->m_RegionX; region_z = pSendUser->m_RegionZ; // CENTER @@ -2049,11 +2049,11 @@ int CEbenezerDlg::GetRegionUserIn(C3DMap * pMap, int region_x, int region_z, cha SetByte(buff, pUser->m_pUserData->m_bFace, buff_index); SetByte(buff, pUser->m_pUserData->m_bHairColor, buff_index); SetByte(buff, pUser->m_bResHpType, buff_index); - // 񷯸ӱ ... + // 비러머글 수능... SetByte(buff, pUser->m_bAbnormalType, buff_index); // SetByte(buff, pUser->m_bNeedParty, buff_index); - // ּó + // 여기두 주석처리 SetByte(buff, pUser->m_pUserData->m_bAuthority, buff_index); // SetDWORD(buff, pUser->m_pUserData->m_sItemArray[BREAST].nNum, buff_index); @@ -2136,7 +2136,7 @@ void CEbenezerDlg::NpcInOutForMe(CUser * pSendUser) { return; } - send_index = 3; // packet command user_count ߿ Ѵ... + send_index = 3; // packet command 와 user_count 를 나중에 셋팅한다... region_x = pSendUser->m_RegionX; region_z = pSendUser->m_RegionZ; // CENTER buff_index = GetRegionNpcIn(pMap, region_x, region_z, buff, t_count); @@ -2191,7 +2191,7 @@ void CEbenezerDlg::NpcInOutForMe(CUser * pSendUser) { int CEbenezerDlg::GetRegionNpcIn(C3DMap * pMap, int region_x, int region_z, char * buff, int & t_count) { if (m_bPointCheckFlag == FALSE) { - return 0; // ϸ ȵ + return 0; // 포인터 참조하면 안됨 } int buff_index = 0, i = 0, j = 0; CNpc * pNpc = NULL; @@ -2282,7 +2282,7 @@ void CEbenezerDlg::RegionNpcInfoForMe(CUser * pSendUser, int nType) { return; } - nid_sendindex = 3; // packet command user_count ߿ Ѵ... + nid_sendindex = 3; // packet command 와 user_count 는 나중에 셋팅한다... char strLog[256]; if (nType == 1) { // test @@ -2376,7 +2376,7 @@ void CEbenezerDlg::RegionNpcInfoForMe(CUser * pSendUser, int nType) { int CEbenezerDlg::GetRegionNpcList(C3DMap * pMap, int region_x, int region_z, char * nid_buff, int & t_count, int nType) { if (m_bPointCheckFlag == FALSE) { - return 0; // ϸ ȵ + return 0; // 포인터 참조하면 안됨 } int buff_index = 0, i = 0; @@ -2414,7 +2414,7 @@ int CEbenezerDlg::GetRegionNpcList(C3DMap * pMap, int region_x, int region_z, ch continue; } pNpc = m_arNpcArray.GetData(nid); - //if( pNpc && (pNpc->m_NpcState == NPC_LIVE ) ) { // ,, + //if( pNpc && (pNpc->m_NpcState == NPC_LIVE ) ) { // 수정할 것,, if (pNpc) { SetShort(nid_buff, pNpc->m_sNid, buff_index); t_count++; @@ -2518,7 +2518,7 @@ BOOL CEbenezerDlg::PreTranslateMessage(MSG * pMsg) { m_sDiscount = 0; return TRUE; } - // 񷯸ӱ --; + // 비러머글 남는 공지 --; if (_strnicmp("/permanent", chatstr, 10) == 0) { m_bPermanentChatMode = TRUE; m_bPermanentChatFlag = TRUE; @@ -2533,11 +2533,11 @@ BOOL CEbenezerDlg::PreTranslateMessage(MSG * pMsg) { m_bPermanentChatMode = FALSE; m_bPermanentChatFlag = FALSE; permanent_off = TRUE; - // return TRUE; //̰ TRUE + // return TRUE; //이것은 고의적으로 TRUE를 뺐었음 } // - // Ÿ!!! >.< + // 갓댐 산타!!! >.< if (_strnicmp("/santa", chatstr, 6) == 0) { m_bSanta = TRUE; // Make Motherfucking Santa Claus FLY!!! return TRUE; @@ -2551,13 +2551,13 @@ BOOL CEbenezerDlg::PreTranslateMessage(MSG * pMsg) { char finalstr[256]; memset(finalstr, NULL, 256); - // sprintf( finalstr, "#### : %s ####", chatstr ); + // sprintf( finalstr, "#### 공지 : %s ####", chatstr ); - // 񷯸ӱ + // 비러머글 남는 공지 if (m_bPermanentChatFlag) { sprintf(finalstr, "- %s -", chatstr); } else { - //sprintf( finalstr, "#### : %s ####", chatstr ); + //sprintf( finalstr, "#### 공지 : %s ####", chatstr ); ::_LoadStringFromResource(IDP_ANNOUNCEMENT, buff2); sprintf(finalstr, buff2.c_str(), chatstr); } @@ -2565,7 +2565,7 @@ BOOL CEbenezerDlg::PreTranslateMessage(MSG * pMsg) { SetByte(buff, WIZ_CHAT, buffindex); // SetByte( buff, PUBLIC_CHAT, buffindex ); - // 񷯸ӱ + // 비러머글 남는 공지 if (permanent_off) { SetByte(buff, END_PERMANENT_CHAT, buffindex); } else if (!m_bPermanentChatFlag) { @@ -2709,7 +2709,7 @@ void CEbenezerDlg::SyncTest(int nType) { C3DMap * pMap = NULL; for (int k = 0; k < m_ZoneArray.size(); k++) { - //if( k != 2 ) continue; // 201 üũ.. + //if( k != 2 ) continue; // 201 존만 체크.. pMap = m_ZoneArray[k]; if (pMap == NULL) { continue; @@ -2825,7 +2825,7 @@ void CEbenezerDlg::SendAllUserInfo() { //Sleep(1); } - // Ƽ Ѵ.... + // 파티에 대한 정보도 보내도록 한다.... _PARTY_GROUP * pParty = NULL; EnterCriticalSection(&g_region_critical); @@ -2838,10 +2838,10 @@ void CEbenezerDlg::SendAllUserInfo() { send_index = 0; ::ZeroMemory(send_buff, sizeof(send_buff)); SetByte(send_buff, AG_PARTY_INFO_ALL, send_index); - SetShort(send_buff, i, send_index); // Ƽ ȣ + SetShort(send_buff, i, send_index); // 파티 번호 //if( i == pParty->wIndex ) for (int j = 0; j < 8; j++) { - SetShort(send_buff, pParty->uid[j], send_index); // ȣ + SetShort(send_buff, pParty->uid[j], send_index); // 유저 번호 //SetShort(send_buff, pParty->sHp[j], send_index ); // HP //SetByte(send_buff, pParty->bLevel[j], send_index ); // Level //SetShort(send_buff, pParty->sClass[j], send_index ); // Class @@ -2902,7 +2902,7 @@ void CEbenezerDlg::DeleteAllNpcList(int flag) { } if (m_bPointCheckFlag == TRUE) { m_bPointCheckFlag = FALSE; - TRACE("*** Point ϸ ȵǿ *** \n"); + TRACE("*** Point 참조 하면 안되여 *** \n"); return; } @@ -2958,7 +2958,7 @@ void CEbenezerDlg::KillUser(const char * strbuff) { CNpc * CEbenezerDlg::GetNpcPtr(int sid, int cur_zone) { if (m_bPointCheckFlag == FALSE) { - return NULL; // ϸ ȵ + return NULL; // 포인터 참조하면 안됨 } CNpc * pNpc = NULL; @@ -3041,15 +3041,15 @@ void CEbenezerDlg::BattleZoneOpenTimer() { CUser * pElmoUser = NULL; /* if( m_byBattleOpen == NO_BATTLE ) { // When Battlezone is closed, open it! - if( nWeek == m_nBattleZoneOpenWeek && nTime == m_nBattleZoneOpenHourStart ) { // , 20ÿ open - TRACE(" ڵ - week=%d, time=%d\n", nWeek, nTime); + if( nWeek == m_nBattleZoneOpenWeek && nTime == m_nBattleZoneOpenHourStart ) { // 수요일, 20시에 전쟁존 open + TRACE("전쟁 자동 시작 - week=%d, time=%d\n", nWeek, nTime); BattleZoneOpen(BATTLEZONE_OPEN); // KickOutZoneUsers(ZONE_FRONTIER); // Kick out users in frontier zone. } } else { // When Battlezone is open, close it! - if( nWeek == (m_nBattleZoneOpenWeek+1) && nTime == m_nBattleZoneOpenHourEnd ) { // , 0ÿ close - TRACE(" ڵ - week=%d, time=%d\n", nWeek, nTime); + if( nWeek == (m_nBattleZoneOpenWeek+1) && nTime == m_nBattleZoneOpenHourEnd ) { // 목요일, 0시에 전쟁존 close + TRACE("전쟁 자동 종료 - week=%d, time=%d\n", nWeek, nTime); m_byBanishFlag = 1; } } */ @@ -3061,17 +3061,17 @@ void CEbenezerDlg::BattleZoneOpenTimer() { if (m_byBanishFlag == 1) { if (m_sBanishDelay == 0) { m_byBattleOpen = NO_BATTLE; - m_byKarusOpenFlag = 0; // ī罺 Ѿ - m_byElmoradOpenFlag = 0; // Ѿ + m_byKarusOpenFlag = 0; // 카루스 땅으로 넘어갈 수 없도록 + m_byElmoradOpenFlag = 0; // 엘모 땅으로 넘어갈 수 없도록 memset(m_strKarusCaptain, 0x00, MAX_ID_SIZE + 1); memset(m_strElmoradCaptain, 0x00, MAX_ID_SIZE + 1); - TRACE(" 0ܰ\n"); + TRACE("전쟁 종료 0단계\n"); if (m_nServerNo == KARUS) { memset(send_buff, 0x00, 128); send_index = 0; SetByte(send_buff, UDP_BATTLE_EVENT_PACKET, send_index); SetByte(send_buff, BATTLE_EVENT_KILL_USER, send_index); - SetByte(send_buff, 1, send_index); // karus + SetByte(send_buff, 1, send_index); // karus의 정보 전송 SetShort(send_buff, m_sKarusDead, send_index); SetShort(send_buff, m_sElmoradDead, send_index); Send_UDP_All(send_buff, send_index); @@ -3081,7 +3081,7 @@ void CEbenezerDlg::BattleZoneOpenTimer() { m_sBanishDelay++; if (m_sBanishDelay == 3) { - if (m_byOldBattleOpen == SNOW_BATTLE) { // ο + if (m_byOldBattleOpen == SNOW_BATTLE) { // 눈싸움 전쟁 if (m_sKarusDead > m_sElmoradDead) { m_bVictory = ELMORAD; loser_nation = KARUS; @@ -3104,14 +3104,14 @@ void CEbenezerDlg::BattleZoneOpenTimer() { Announcement(DECLARE_WINNER, m_bVictory); Announcement(DECLARE_LOSER, loser_nation); } - TRACE(" 1ܰ, m_bVictory=%d\n", m_bVictory); + TRACE("전쟁 종료 1단계, m_bVictory=%d\n", m_bVictory); } else if (m_sBanishDelay == 8) { Announcement(DECLARE_BAN); } else if (m_sBanishDelay == 10) { - TRACE(" 2ܰ - ڱ \n"); + TRACE("전쟁 종료 2단계 - 모든 유저 자기 국가로 가 \n"); BanishLosers(); } else if (m_sBanishDelay == 20) { - TRACE(" 3ܰ - ʱȭ ּ \n"); + TRACE("전쟁 종료 3단계 - 초기화 해주세여 \n"); SetByte(send_buff, AG_BATTLE_EVENT, send_index); SetByte(send_buff, BATTLE_EVENT_OPEN, send_index); SetByte(send_buff, BATTLEZONE_CLOSE, send_index); @@ -3314,7 +3314,7 @@ void CEbenezerDlg::Announcement(BYTE type, int nation, int chat_type) { ::_LoadStringFromResource(IDP_ANNOUNCEMENT, buff2); sprintf(finalstr, buff2.c_str(), chatstr); - //sprintf( finalstr, "## : %s ##", chatstr ); + //sprintf( finalstr, "## 공지 : %s ##", chatstr ); SetByte(send_buff, WIZ_CHAT, send_index); SetByte(send_buff, chat_type, send_index); SetByte(send_buff, 1, send_index); @@ -3405,7 +3405,7 @@ BOOL CEbenezerDlg::LoadAllKnights() { KnightsSet.MoveFirst(); while (!KnightsSet.IsEOF()) { - // sungyong ,, zone server : ī罺 ġǷ ؼ,, + // sungyong ,, zone server : 카루스와 전쟁존을 합치므로 인해서,, /* if( m_nServerNo == KARUS ) { if( KnightsSet.m_IDNum < 15000 ) { CKnights* pKnights = new _KNIGHTS; @@ -3561,7 +3561,7 @@ BOOL CEbenezerDlg::LoadAllKnightsUserData() { KnightsSet.MoveFirst(); while (!KnightsSet.IsEOF()) { - // sungyong ,, zone server : ī罺 ġǷ ؼ,, + // sungyong ,, zone server : 카루스와 전쟁존을 합치므로 인해서,, /* if( m_nServerNo == KARUS ) { if( KnightsSet.m_sIDNum < 15000 ) { strUserName = KnightsSet.m_strUserID; @@ -3605,7 +3605,7 @@ int CEbenezerDlg::GetKnightsAllMembers(int knightsindex, char * temp_buff, int & if (!pUser) { continue; } - if (pUser->m_pUserData->m_bKnights == knightsindex) { // Ҽ Ŭ.. + if (pUser->m_pUserData->m_bKnights == knightsindex) { // 같은 소속의 클랜.. SetShort(temp_buff, strlen(pUser->m_pUserData->m_id), buff_index); SetString(temp_buff, pUser->m_pUserData->m_id, strlen(pUser->m_pUserData->m_id), buff_index); SetByte(temp_buff, pUser->m_pUserData->m_bFame, buff_index); @@ -3624,7 +3624,7 @@ int CEbenezerDlg::GetKnightsAllMembers(int knightsindex, char * temp_buff, int & for (int i = 0; i < MAX_CLAN; i++) { if (pKnights->m_arKnightsUser[i].byUsed == 1) { // pUser = GetUserPtr(pKnights->m_arKnightsUser[i].strUserName, 0x02); - if (pUser) { // ȸ + if (pUser) { // 접속중인 회원 if (pUser->m_pUserData->m_bKnights == knightsindex) { SetShort(temp_buff, strlen(pUser->m_pUserData->m_id), buff_index); SetString(temp_buff, pUser->m_pUserData->m_id, strlen(pUser->m_pUserData->m_id), buff_index); @@ -3633,10 +3633,10 @@ int CEbenezerDlg::GetKnightsAllMembers(int knightsindex, char * temp_buff, int & SetShort(temp_buff, pUser->m_pUserData->m_sClass, buff_index); SetByte(temp_buff, 1, buff_index); count++; - } else { // ٸ Ż ߹ ̹Ƿ ޸𸮿 + } else { // 다른존에서 탈퇴나 추방된 유저이므로 메모리에서 삭제 m_KnightsManager.RemoveKnightsUser(knightsindex, pUser->m_pUserData->m_id); } - } else { // ȸ + } else { // 비접속중인 회원 SetShort(temp_buff, strlen(pKnights->m_arKnightsUser[i].strUserName), buff_index); SetString(temp_buff, pKnights->m_arKnightsUser[i].strUserName, strlen(pKnights->m_arKnightsUser[i].strUserName), buff_index); @@ -3735,14 +3735,14 @@ void CEbenezerDlg::MarketBBSSellDelete(short index) { void CEbenezerDlg::WritePacketLog() { CTime cur = CTime::GetCurrentTime(); CString starttime; - starttime.Format("* Packet Check : send=%d, realsend=%d, recv=%d, time %d:%d\r\n", m_iPacketCount, + starttime.Format("* Packet Check : send=%d, realsend=%d, recv=%d, time %d:%d분\r\n", m_iPacketCount, m_iSendPacketCount, m_iRecvPacketCount, cur.GetHour(), cur.GetMinute()); LogFileWrite((char *)(LPCTSTR)starttime); } int CEbenezerDlg::GetKnightsGrade(int nPoints) { int nGrade = 5; - int nClanPoints = nPoints / 24; // Ŭ = Ŭ ⿩ / 24 + int nClanPoints = nPoints / 24; // 클랜등급 = 클랜원 국가 기여도의 총합 / 24 if (nClanPoints >= 0 && nClanPoints < 2000) { nGrade = 5; @@ -3987,7 +3987,7 @@ BOOL CEbenezerDlg::LoadKnightsRankTable() { //if( nKaursRank == 5 || nFindKarus == 1 ) { if (nKaursRank == 5) { KRankSet.MoveNext(); - continue; // 5 Ŭ + continue; // 5위까지 클랜장이 없으면 대장은 없음 } pUser = GetUserPtr(pKnights->m_strChief, 0x02); //nKaursRank++; @@ -4023,7 +4023,7 @@ BOOL CEbenezerDlg::LoadKnightsRankTable() { //if( nElmoRank == 5 || nFindElmo == 1 ) { if (nElmoRank == 5) { KRankSet.MoveNext(); - continue; // 5 Ŭ + continue; // 5위까지 클랜장이 없으면 대장은 없음 } pUser = GetUserPtr(pKnights->m_strChief, 0x02); //nElmoRank++; @@ -4067,8 +4067,8 @@ BOOL CEbenezerDlg::LoadKnightsRankTable() { sprintf(strElmoCaptainName, buff.c_str(), strElmoCaptain[0], strElmoCaptain[1], strElmoCaptain[2], strElmoCaptain[3], strElmoCaptain[4]); - //sprintf( strKarusCaptainName, "ī罺 ְ %s, %s, %s, %s, %s Դϴ", strKarusCaptain[0], strKarusCaptain[1], strKarusCaptain[2], strKarusCaptain[3], strKarusCaptain[4]); - //sprintf( strElmoCaptainName, " ְ %s, %s, %s, %s, %s Դϴ", strKarusCaptain[0], strKarusCaptain[1], strKarusCaptain[2], strKarusCaptain[3], strKarusCaptain[4]); + //sprintf( strKarusCaptainName, "카루스의 지휘관은 %s, %s, %s, %s, %s 입니다", strKarusCaptain[0], strKarusCaptain[1], strKarusCaptain[2], strKarusCaptain[3], strKarusCaptain[4]); + //sprintf( strElmoCaptainName, "엘모라드의 지휘관은 %s, %s, %s, %s, %s 입니다", strKarusCaptain[0], strKarusCaptain[1], strKarusCaptain[2], strKarusCaptain[3], strKarusCaptain[4]); TRACE("LoadKnightsRankTable Success\n"); SetByte(send_buff, WIZ_CHAT, send_index); @@ -4111,7 +4111,7 @@ void CEbenezerDlg::BattleZoneCurrentUsers() { return; } if (m_nServerNo != pMap->m_nServerNo) { - return; // Ʋ ƴ϶ + return; // 현재의 서버가 배틀존 서버가 아니라면 리턴 } char send_buff[128]; diff --git a/src/server/Ebenezer/EbenezerDlg.h b/src/server/Ebenezer/EbenezerDlg.h index a26cbadb..a7f9f1b9 100644 --- a/src/server/Ebenezer/EbenezerDlg.h +++ b/src/server/Ebenezer/EbenezerDlg.h @@ -166,7 +166,7 @@ class CEbenezerDlg : public CDialog { Magictype4Array m_Magictype4Array; Magictype5Array m_Magictype5Array; Magictype8Array m_Magictype8Array; - CoefficientArray m_CoefficientArray; // Ÿ ̺ + CoefficientArray m_CoefficientArray; // 공식 계산 계수데이타 테이블 LevelUpArray m_LevelUpArray; PartyArray m_PartyArray; KnightsArray m_KnightsArray; @@ -176,16 +176,16 @@ class CEbenezerDlg : public CDialog { CKnightsManager m_KnightsManager; short m_sPartyIndex; - short m_sZoneCount; // AI Server ӽ - short m_sSocketCount; // AI Server ӽ + short m_sZoneCount; // AI Server 재접속시 사용 + short m_sSocketCount; // AI Server 재접속시 사용 // sungyong 2002.05.23 short m_sSendSocket; - BOOL m_bFirstServerFlag; // ó Ӽ 쿡 1, 0 + BOOL m_bFirstServerFlag; // 서버가 처음시작한 후 게임서버가 붙은 경우에는 1, 붙지 않은 경우 0 BOOL m_bServerCheckFlag; - BOOL m_bPointCheckFlag; // AI NPC (TRUE: , FALSE: ) - short m_sReSocketCount; // GameServer ʿ - float m_fReConnectStart; // ó ð - short m_sErrorSocketCount; // ̻ ÿ + BOOL m_bPointCheckFlag; // AI서버와 재접전에 NPC포인터 참조막기 (TRUE:포인터 참조, FALSE:포인터 참조 못함) + short m_sReSocketCount; // GameServer와 재접시 필요 + float m_fReConnectStart; // 처음 소켓이 도착한 시간 + short m_sErrorSocketCount; // 이상소켓 감시용 // ~sungyong 2002.05.23 int m_iPacketCount; // packet check @@ -196,12 +196,12 @@ class CEbenezerDlg : public CDialog { int m_nCastleCapture; // ~Yookozuna 2002.06.12 - BYTE m_byBattleOpen, m_byOldBattleOpen; // 0: ƴ, 1:(), 2:ο + BYTE m_byBattleOpen, m_byOldBattleOpen; // 0:전쟁중이 아님, 1:전쟁중(국가간전쟁), 2:눈싸움전쟁 BYTE m_bVictory, m_byOldVictory; BYTE m_bBanishDelayStart; BYTE m_bKarusFlag, m_bElmoradFlag; BYTE m_byKarusOpenFlag, m_byElmoradOpenFlag, m_byBanishFlag, m_byBattleSave; - short m_sDiscount; // ɷġ Ʈ ʱȭ (0:ξ, 1:(50%) ) + short m_sDiscount; // 능력치와 포인트 초기화 할인 (0:할인없음, 1:할인(50%) ) short m_sKarusDead, m_sElmoradDead, m_sBanishDelay, m_sKarusCount, m_sElmoradCount; int m_nBattleZoneOpenWeek, m_nBattleZoneOpenHourStart, m_nBattleZoneOpenHourEnd; char m_strKarusCaptain[MAX_ID_SIZE + 1]; @@ -223,24 +223,24 @@ class CEbenezerDlg : public CDialog { int m_iSellPrice[MAX_BBS_POST]; float m_fSellStartTime[MAX_BBS_POST]; - // ~Yookozuna 2002.11.26 - 񷯸ӱ --; + // ~Yookozuna 2002.11.26 - 비러머글 남는 공지 --; BOOL m_bPermanentChatMode; BOOL m_bPermanentChatFlag; char m_strPermanentChat[1024]; - // ~Yookozuna 2002.12.11 - Ÿ Ŭν --; + // ~Yookozuna 2002.12.11 - 갓댐 산타 클로스 --; BOOL m_bSanta; - // Ŷ ࿡ ʿ -------------only from ai server + // 패킷 압축에 필요 변수 -------------only from ai server CCompressMng m_CompMng; int m_CompCount; TCHAR m_CompBuf[10240]; int m_iCompIndex; - // ~Ŷ ࿡ ʿ ------------- + // ~패킷 압축에 필요 변수 ------------- // zone server info int m_nServerNo, m_nServerGroupNo; - int m_nServerGroup; // server ȣ(0: , 1:1, 2:2) + int m_nServerGroup; // server의 번호(0:서버군이 없다, 1:서버1군, 2:서버2군) ServerArray m_ServerArray; ServerArray m_ServerGroupArray; CUdpSocket * m_pUdpSocket; diff --git a/src/server/Ebenezer/GameDefine.h b/src/server/Ebenezer/GameDefine.h index e3880499..5b3752b6 100644 --- a/src/server/Ebenezer/GameDefine.h +++ b/src/server/Ebenezer/GameDefine.h @@ -2,32 +2,32 @@ #define __VERSION 1097 -//////////////////// Define //////////////////// -#define KARUWARRRIOR 101 // ī -#define KARUROGUE 102 // īα -#define KARUWIZARD 103 // ī縶 -#define KARUPRIEST 104 // ī -#define BERSERKER 105 // Ŀ -#define GUARDIAN 106 // -#define HUNTER 107 // -#define PENETRATOR 108 // Ʈ -#define SORSERER 109 // Ҽ -#define NECROMANCER 110 // ũθǼ -#define SHAMAN 111 // -#define DARKPRIEST 112 // ũƮ - -#define ELMORWARRRIOR 201 // -#define ELMOROGUE 202 // α -#define ELMOWIZARD 203 // 𸶹 -#define ELMOPRIEST 204 // -#define BLADE 205 // ̵ -#define PROTECTOR 206 // -#define RANGER 207 // -#define ASSASSIN 208 // ؽ -#define MAGE 209 // -#define ENCHANTER 210 // þ -#define CLERIC 211 // Ŭ -#define DRUID 212 // ̵ +//////////////////// 직업별 Define //////////////////// +#define KARUWARRRIOR 101 // 카루전사 +#define KARUROGUE 102 // 카루로그 +#define KARUWIZARD 103 // 카루마법 +#define KARUPRIEST 104 // 카루사제 +#define BERSERKER 105 // 버서커 +#define GUARDIAN 106 // 가디언 +#define HUNTER 107 // 헌터 +#define PENETRATOR 108 // 페너트레이터 +#define SORSERER 109 // 소서러 +#define NECROMANCER 110 // 네크로맨서 +#define SHAMAN 111 // 샤만 +#define DARKPRIEST 112 // 다크프리스트 + +#define ELMORWARRRIOR 201 // 엘모전사 +#define ELMOROGUE 202 // 엘모로그 +#define ELMOWIZARD 203 // 엘모마법 +#define ELMOPRIEST 204 // 엘모사제 +#define BLADE 205 // 블레이드 +#define PROTECTOR 206 // 프로텍터 +#define RANGER 207 // 레인져 +#define ASSASSIN 208 // 어쌔신 +#define MAGE 209 // 메이지 +#define ENCHANTER 210 // 엔첸터 +#define CLERIC 211 // 클레릭 +#define DRUID 212 // 드루이드 ///////////////////////////////////////////////////// ///////////////////////////////////////////////////// @@ -60,11 +60,11 @@ const BYTE FOOT = 13; const BYTE RESERVED = 14; ///////////////////////////////////////////////////// -// Ÿݺ // -#define GREAT_SUCCESS 0X01 // 뼺 -#define SUCCESS 0X02 // -#define NORMAL 0X03 // -#define FAIL 0X04 // +// 타격비별 성공률 // +#define GREAT_SUCCESS 0X01 // 대성공 +#define SUCCESS 0X02 // 성공 +#define NORMAL 0X03 // 보통 +#define FAIL 0X04 // 실패 // Item Move Direction Define #define ITEM_INVEN_SLOT 0x01 @@ -85,18 +85,18 @@ const BYTE RESERVED = 14; #define WEAPON_LONGBOW 8 #define WEAPON_LAUNCHER 10 #define WEAPON_STAFF 11 -#define WEAPON_ARROW 12 // ų -#define WEAPON_JAVELIN 13 // ų -#define WEAPON_WORRIOR_AC 21 // ų -#define WEAPON_LOG_AC 22 // ų -#define WEAPON_WIZARD_AC 23 // ų -#define WEAPON_PRIEST_AC 24 // ų +#define WEAPON_ARROW 12 // 스킬 없음 +#define WEAPON_JAVELIN 13 // 스킬 없음 +#define WEAPON_WORRIOR_AC 21 // 스킬 없음 +#define WEAPON_LOG_AC 22 // 스킬 없음 +#define WEAPON_WIZARD_AC 23 // 스킬 없음 +#define WEAPON_PRIEST_AC 24 // 스킬 없음 //////////////////////////////////////////////////////////// // User Status // -#define USER_STANDING 0X01 // ִ. -#define USER_SITDOWN 0X02 // ɾ ִ. -#define USER_DEAD 0x03 // Ŷ -//#define USER_BLINKING 0x04 // Ƴ!!! +#define USER_STANDING 0X01 // 서 있다. +#define USER_SITDOWN 0X02 // 앉아 있다. +#define USER_DEAD 0x03 // 듀거떠 +//#define USER_BLINKING 0x04 // 방금 살아났어!!! //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// // Magic State @@ -118,10 +118,10 @@ const BYTE RESERVED = 14; //#define TRAINEE 0x02 #define PUNISH 0x01 -#define CHIEF 0x01 // -#define VICECHIEF 0x02 // δ -#define TRAINEE 0x05 // -#define COMMAND_CAPTAIN 100 // ֱ +#define CHIEF 0x01 // 단장 +#define VICECHIEF 0x02 // 부단장 +#define TRAINEE 0x05 // 멤버 +#define COMMAND_CAPTAIN 100 // 지휘권자 //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// @@ -134,8 +134,8 @@ const BYTE RESERVED = 14; #define MAX_KNIGHTS_BANK 200 #define MAX_KNIGHTS_MARK 512 -#define ITEM_GOLD 900000000 // ȣ... -#define ITEM_NO_TRADE 900000001 // ŷ Ұ ۵.... 񷯸ӱ ũ ̹Ʈ >.< +#define ITEM_GOLD 900000000 // 돈 아이템 번호... +#define ITEM_NO_TRADE 900000001 // 거래 불가 아이템들.... 비러머글 크리스마스 이밴트 >.< //////////////////////////////////////////////////////////// // EVENT TYPE DEFINE @@ -261,9 +261,9 @@ struct _ZONE_ITEM { // Bundle unit }; struct _ITEM_DATA { - int nNum; // item ȣ - short sDuration; // item - short sCount; // item or item ູ Ӽ ش + int nNum; // item 번호 + short sDuration; // item 내구력 + short sCount; // item 갯수 or item 축복 속성에 해당 값 __int64 nSerialNum; // item serial code }; @@ -271,113 +271,113 @@ struct _EXCHANGE_ITEM { int itemid; int count; short duration; - BYTE pos; // ȯ  ڸ.. + BYTE pos; // 교환후 들어갈 자리.. __int64 nSerialNum; // item serial code }; struct _ITEM_TABLE { int m_iNum; // item num char m_strName[50]; // item Name - BYTE m_bKind; // item - BYTE m_bSlot; // ġ - BYTE m_bRace; // - BYTE m_bClass; // Class - short m_sDamage; // ִ Ÿġ - short m_sDelay; // ݽð - short m_sRange; // (ȿŸ) - short m_sWeight; // - short m_sDuration; // - int m_iBuyPrice; // ° - int m_iSellPrice; // Ĵ° - short m_sAc; // - BYTE m_bCountable; // - int m_iEffect1; // Ʈ1 - int m_iEffect2; // Ʈ2 - BYTE m_bReqLevel; // 䱸 - BYTE m_bReqRank; // 䱸 - BYTE m_bReqTitle; // 䱸 - BYTE m_bReqStr; // 䱸 - BYTE m_bReqSta; // 䱸 ü - BYTE m_bReqDex; // 䱸 ø - BYTE m_bReqIntel; // 䱸 - BYTE m_bReqCha; // 䱸 ŷ - BYTE m_bSellingGroup; // ǰ - BYTE m_ItemType; // Ǵ - short m_sHitrate; // Ÿݷ - short m_sEvarate; // ȸ - short m_sDaggerAc; // 1 - short m_sSwordAc; // 2 - short m_sMaceAc; // 3 - short m_sAxeAc; // 4 - short m_sSpearAc; // 5 - short m_sBowAc; // 6 - BYTE m_bFireDamage; // Ӽ - BYTE m_bIceDamage; // ñ Ӽ - BYTE m_bLightningDamage; // Ӽ - BYTE m_bPoisonDamage; // Ӽ - BYTE m_bHPDrain; // HP - BYTE m_bMPDamage; // MP Ÿ - BYTE m_bMPDrain; // MP - BYTE m_bMirrorDamage; // ݻ Ÿ - BYTE m_bDroprate; // - BYTE m_bStrB; // ʽ - BYTE m_bStaB; // ü ʽ - BYTE m_bDexB; // ø ʽ - BYTE m_bIntelB; // ʽ - BYTE m_bChaB; // ŷ ʽ + BYTE m_bKind; // item 종류 + BYTE m_bSlot; // 장착위치 + BYTE m_bRace; // 사용 가능한 종족 + BYTE m_bClass; // 사용 가능한 Class + short m_sDamage; // 최대 타격치 + short m_sDelay; // 공격시간 + short m_sRange; // 범위(유효거리) + short m_sWeight; // 무게 + short m_sDuration; // 내구성 + int m_iBuyPrice; // 유저가 사는가격 + int m_iSellPrice; // 유저가 파는가격 + short m_sAc; // 방어력 + BYTE m_bCountable; // 개수 개념 아이템 + int m_iEffect1; // 매직 이펙트1 + int m_iEffect2; // 매직 이펙트2 + BYTE m_bReqLevel; // 요구 레벨 + BYTE m_bReqRank; // 요구 작위 + BYTE m_bReqTitle; // 요구 지위 + BYTE m_bReqStr; // 요구 힘 + BYTE m_bReqSta; // 요구 체력 + BYTE m_bReqDex; // 요구 민첩 + BYTE m_bReqIntel; // 요구 지능 + BYTE m_bReqCha; // 요구 매력 + BYTE m_bSellingGroup; // 상인 취급 물품 + BYTE m_ItemType; // 매직아이템 또는 레어아이템 + short m_sHitrate; // 타격률 + short m_sEvarate; // 회피율 + short m_sDaggerAc; // 방어력1 + short m_sSwordAc; // 방어력2 + short m_sMaceAc; // 방어력3 + short m_sAxeAc; // 방어력4 + short m_sSpearAc; // 방어력5 + short m_sBowAc; // 방어력6 + BYTE m_bFireDamage; // 불 속성 + BYTE m_bIceDamage; // 냉기 속성 + BYTE m_bLightningDamage; // 전격 속성 + BYTE m_bPoisonDamage; // 독 속성 + BYTE m_bHPDrain; // HP 흡수 + BYTE m_bMPDamage; // MP 타격 + BYTE m_bMPDrain; // MP 흡수 + BYTE m_bMirrorDamage; // 반사 타격 + BYTE m_bDroprate; // 드롭 비율 + BYTE m_bStrB; // 힘 보너스 + BYTE m_bStaB; // 체력 보너스 + BYTE m_bDexB; // 민첩성 보너스 + BYTE m_bIntelB; // 지능 보너스 + BYTE m_bChaB; // 매력 보너스 short m_MaxHpB; // MaxHP add short m_MaxMpB; // MaxMP add - BYTE m_bFireR; // ׷ - BYTE m_bColdR; // ׷ - BYTE m_bLightningR; // ׷ - BYTE m_bMagicR; // Ÿ ׷ - BYTE m_bPoisonR; // ׷ - BYTE m_bCurseR; // ׷ + BYTE m_bFireR; // 불 마법 저항력 + BYTE m_bColdR; // 얼음 마법 저항력 + BYTE m_bLightningR; // 전기 마법 저항력 + BYTE m_bMagicR; // 기타 마법 저항력 + BYTE m_bPoisonR; // 독 마법 저항력 + BYTE m_bCurseR; // 저주 마법 저항력 }; struct _USER_DATA { - char m_id[MAX_ID_SIZE + 1]; // ID - char m_Accountid[MAX_ID_SIZE + 1]; // ID - - BYTE m_bZone; // Zone - float m_curx; // X ǥ - float m_curz; // Z ǥ - float m_cury; // Y ǥ - - BYTE m_bNation; // Ҽӱ - BYTE m_bRace; // - short m_sClass; // - BYTE m_bHairColor; // Ӹ - BYTE m_bRank; // - BYTE m_bTitle; // - BYTE m_bLevel; // - int m_iExp; // ġ - int m_iLoyalty; // οƼ - BYTE m_bFace; // 󱼸 - BYTE m_bCity; // Ҽӵ - short m_bKnights; // Ҽ - BYTE m_bFame; // + char m_id[MAX_ID_SIZE + 1]; // 유저 ID + char m_Accountid[MAX_ID_SIZE + 1]; // 계정 ID + + BYTE m_bZone; // 현재 Zone + float m_curx; // 현재 X 좌표 + float m_curz; // 현재 Z 좌표 + float m_cury; // 현재 Y 좌표 + + BYTE m_bNation; // 소속국가 + BYTE m_bRace; // 종족 + short m_sClass; // 직업 + BYTE m_bHairColor; // 머리색깔 + BYTE m_bRank; // 작위 + BYTE m_bTitle; // 지위 + BYTE m_bLevel; // 레벨 + int m_iExp; // 경험치 + int m_iLoyalty; // 로열티 + BYTE m_bFace; // 얼굴모양 + BYTE m_bCity; // 소속도시 + short m_bKnights; // 소속 기사단 + BYTE m_bFame; // 명성 short m_sHp; // HP short m_sMp; // MP short m_sSp; // SP - BYTE m_bStr; // - BYTE m_bSta; // - BYTE m_bDex; // , ȸ - BYTE m_bIntel; // (?), ij - BYTE m_bCha; // , (?) - BYTE m_bAuthority; // - BYTE m_bPoints; // ʽ Ʈ - int m_iGold; // ij (21) + BYTE m_bStr; // 힘 + BYTE m_bSta; // 생명력 + BYTE m_bDex; // 공격, 회피율 + BYTE m_bIntel; // 지혜(?), 캐릭터 마법력 결정 + BYTE m_bCha; // 마법 성공률, 물건 가격 결정(?) + BYTE m_bAuthority; // 유저 권한 + BYTE m_bPoints; // 보너스 포인트 + int m_iGold; // 캐릭이 지닌 돈(21억) short m_sBind; // Saved Bind Point - int m_iBank; // â (21) + int m_iBank; // 창고의 돈(21억) - BYTE m_bstrSkill[9]; // ų + BYTE m_bstrSkill[9]; // 직업별 스킬 _ITEM_DATA m_sItemArray[HAVE_MAX + SLOT_MAX]; // 42*8 bytes - _ITEM_DATA m_sWarehouseArray[WAREHOUSE_MAX]; // â 196*8 bytes + _ITEM_DATA m_sWarehouseArray[WAREHOUSE_MAX]; // 창고 아이템 196*8 bytes - BYTE m_bLogout; // α׾ƿ ÷ - BYTE m_bWarehouse; // â ŷ ߾? - DWORD m_dwTime; // ÷ Ÿ... + BYTE m_bLogout; // 로그아웃 플래그 + BYTE m_bWarehouse; // 창고 거래 했었나? + DWORD m_dwTime; // 플레이 타임... }; struct _LEVELUP { @@ -387,7 +387,7 @@ struct _LEVELUP { struct _PARTY_GROUP { WORD wIndex; - short uid[8]; // ϳ Ƽ 8 ԰ + short uid[8]; // 하나의 파티에 8명까지 가입가능 short sMaxHp[8]; short sHp[8]; BYTE bLevel[8]; @@ -406,31 +406,31 @@ struct _PARTY_GROUP { }; struct _OBJECT_EVENT { - BYTE byLife; // 1:ִ, 0:,, - int sBelong; // Ҽ + BYTE byLife; // 1:살아있다, 0:켁,, 죽음 + int sBelong; // 소속 short - sIndex; // 100 - ī罺 ε Ʈ | 200 ε Ʈ | 1100 - ī罺 1200 - + sIndex; // 100 번대 - 카루스 바인드 포인트 | 200 번대 엘모라드 바인드 포인트 | 1100 번대 - 카루스 성문들 1200 - 엘모라드 성문들 short - sType; // 0 - ε Ʈ, 1 - ¿ , 2 - Ϸ , 3 - , 4 - ߷, 6:öâ, 7- Ȱ - short sControlNpcID; // NPC ID ( Object Index), Type-> 5 : Warp Group ID + sType; // 0 - 바인드 포인트, 1 - 좌우로 열리는 성문, 2 - 상하로 열리는 성문, 3 - 레버, 4 - 깃발레버, 6:철창, 7-깨지는 부활비석 + short sControlNpcID; // 조종할 NPC ID (조종할 Object Index), Type-> 5 : Warp Group ID short sStatus; // status - float fPosX; // ġ + float fPosX; // 위치값 float fPosY; float fPosZ; }; struct _REGENE_EVENT { - int sRegenePoint; // ij Ÿ ȣ - float fRegenePosX; // ij Ÿ ޾Ʒ ǥ X - float fRegenePosY; // ij Ÿ ޾Ʒ ǥ Y - float fRegenePosZ; // ij Ÿ ޾Ʒ ǥ Z - float fRegeneAreaZ; // ij Ÿ Z - float fRegeneAreaX; // ij Ÿ X + int sRegenePoint; // 캐릭터 나타나는 지역 번호 + float fRegenePosX; // 캐릭터 나타나는 지역의 왼아래쪽 구석 좌표 X + float fRegenePosY; // 캐릭터 나타나는 지역의 왼아래쪽 구석 좌표 Y + float fRegenePosZ; // 캐릭터 나타나는 지역의 왼아래쪽 구석 좌표 Z + float fRegeneAreaZ; // 캐릭터 나타나는 지역의 Z 축 길이 + float fRegeneAreaX; // 캐릭터 나타나는 지역의 X 축 길이 }; struct _KNIGHTS_USER { - BYTE byUsed; // : 1, : 0 - char strUserName[MAX_ID_SIZE + 1]; // ij ̸ + BYTE byUsed; // 사용중 : 1, 비사용중 : 0 + char strUserName[MAX_ID_SIZE + 1]; // 캐릭터의 이름 }; struct _MAGIC_TABLE { diff --git a/src/server/Ebenezer/IOCPSocket2.cpp b/src/server/Ebenezer/IOCPSocket2.cpp index 33cb8bc7..30194eef 100644 --- a/src/server/Ebenezer/IOCPSocket2.cpp +++ b/src/server/Ebenezer/IOCPSocket2.cpp @@ -142,7 +142,7 @@ int CIOCPSocket2::Send(char * pBuf, long length, int dwFlag) { m_Sen_val++; m_Sen_val &= 0x00ffffff; - pTIBuf[0] = 0xfc; // ȣ Ȯ + pTIBuf[0] = 0xfc; // 암호가 정확한지 memcpy(pTIBuf + 1, &m_Sen_val, sizeof(WORD) + 1); memcpy(pTIBuf + 4, pBuf, length); jct.JvEncryptionFast(len, pTIBuf, pTOutBuf); @@ -294,17 +294,17 @@ void CIOCPSocket2::ReceivedData(int length) { int len = 0; - if (!strlen(m_pRecvBuff)) { // Ŷ̴ ϳ Ͱ 찡 ߻... + if (!strlen(m_pRecvBuff)) { // 패킷길이는 존재하나 실 데이터가 없는 경우가 발생... return; } - m_pBuffer->PutData(m_pRecvBuff, length); // Data ۿ ִ´ + m_pBuffer->PutData(m_pRecvBuff, length); // 받은 Data를 버퍼에 넣는다 char * pData = NULL; char * pDecData = NULL; while (PullOutCore(pData, len)) { if (pData) { - Parsing(len, pData); // Ľ Լ... + Parsing(len, pData); // 실제 파싱 함수... delete[] pData; pData = NULL; @@ -364,11 +364,11 @@ BOOL CIOCPSocket2::PullOutCore(char *& data, int & length) { // ASSERT(ePos+2 <= len); if (pTmp[ePos] == PACKET_END1 && pTmp[ePos + 1] == PACKET_END2) { - if (m_CryptionFlag) { // ȣȭ + if (m_CryptionFlag) { // 암호화 pBuff = new BYTE[length + 1]; jct.JvDecryptionFast(length, (unsigned char *)pTmp + sPos + 2, pBuff); - if (pBuff[0] != 0xfc) { // Ǭ ϰ ۿ ع + if (pBuff[0] != 0xfc) { // 압축 푼 데이터 오류 일경우 버퍼에서 삭제 해버린다 TRACE("CIOCPSocket2::PutOutCore - Decryption Error... sockid(%d)\n", m_Socket); delete[] pBuff; Close(); @@ -377,7 +377,7 @@ BOOL CIOCPSocket2::PullOutCore(char *& data, int & length) { recv_packet = (WORD)GetShort((char *)pBuff, index); //TRACE("^^^ IOCPSocket2,, PullOutCore ,,, recv_val = %d ^^^\n", recv_packet); - if (m_Rec_val >= recv_packet) { // ,, + if (m_Rec_val >= recv_packet) { // 무시,, if (recv_packet == 0) { m_Rec_val = recv_packet; } else { diff --git a/src/server/Ebenezer/IOCPort.cpp b/src/server/Ebenezer/IOCPort.cpp index 9a59aaed..e00c6239 100644 --- a/src/server/Ebenezer/IOCPort.cpp +++ b/src/server/Ebenezer/IOCPort.cpp @@ -107,7 +107,7 @@ DWORD WINAPI AcceptThread(LPVOID lp) { } // Crytion - //pSocket->SendCryptionKey(); // ȣȭ + //pSocket->SendCryptionKey(); // 암호화 // ~ pSocket->Receive(); @@ -243,7 +243,7 @@ DWORD WINAPI ClientWorkerThread(LPVOID lp) { TRACE("AISocket Closed By 0 Byte Notify\n"); pSocket->CloseProcess(); pIocport->RidIOCPSocket(pSocket->GetSocketID(), pSocket); - // pIocport->PutOldSid( pSocket->GetSocketID() ); // Ŭ̾Ʈ Sid + // pIocport->PutOldSid( pSocket->GetSocketID() ); // 클라이언트 소켓은 Sid 관리하지 않음 LeaveCriticalSection(&g_critical); break; } @@ -413,7 +413,7 @@ void CIOCPort::Init(int serversocksize, int clientsocksize, int workernum) { m_SockArrayInActive[i] = NULL; } - m_ClientSockArray = new CIOCPSocket2 *[clientsocksize]; // ش Ŭ̾Ʈμ ٸ Ϳ ٴ ϼ + m_ClientSockArray = new CIOCPSocket2 *[clientsocksize]; // 해당 서버가 클라이언트로서 다른 컴터에 붙는 소켓수 for (int i = 0; i < clientsocksize; i++) { m_ClientSockArray[i] = NULL; } diff --git a/src/server/Ebenezer/IOCPort.h b/src/server/Ebenezer/IOCPort.h index 498c6e51..b6a2f333 100644 --- a/src/server/Ebenezer/IOCPort.h +++ b/src/server/Ebenezer/IOCPort.h @@ -47,7 +47,7 @@ class CIOCPort { CIOCPSocket2 ** m_SockArray; CIOCPSocket2 ** m_SockArrayInActive; - CIOCPSocket2 ** m_ClientSockArray; // Connect + CIOCPSocket2 ** m_ClientSockArray; // Connect용 소켓 protected: DWORD m_dwNumberOfWorkers; diff --git a/src/server/Ebenezer/Ini.cpp b/src/server/Ebenezer/Ini.cpp index a6c335cd..df11a2b0 100644 --- a/src/server/Ebenezer/Ini.cpp +++ b/src/server/Ebenezer/Ini.cpp @@ -16,7 +16,7 @@ CIni::~CIni() {} int CIni::GetProfileInt(const char * lpAppName, const char * lpKeyName, int nDefault) { if (m_szFileName[0] == '\0') { m_nError = 0X01; - strcpy(m_strError, "File Set ʾҽϴ."); + strcpy(m_strError, "File이 Set되지 않았습니다."); return -1; } @@ -35,7 +35,7 @@ const char * CIni::GetProfileString(const char * lpAppName, const char * lpKeyNa static char retString[200] = ""; if (m_szFileName[0] == '\0') { m_nError = 0X01; - strcpy(m_strError, "File Set ʾҽϴ."); + strcpy(m_strError, "File이 Set되지 않았습니다."); strcpy(retString, ""); return retString; } @@ -73,7 +73,7 @@ int CIni::SetProfileInt(const char * lpAppName, const char * lpKeyName, int nDef int nRet = -1; if (m_szFileName[0] == '\0') { m_nError = 0X01; - strcpy(m_strError, "File Set ʾҽϴ."); + strcpy(m_strError, "File이 Set되지 않았습니다."); return nRet; } @@ -89,7 +89,7 @@ int CIni::SetProfileString(const char * lpAppName, const char * lpKeyName, const int nRet = -1; if (m_szFileName[0] == '\0') { m_nError = 0X01; - strcpy(m_strError, "File Set ʾҽϴ."); + strcpy(m_strError, "File이 Set되지 않았습니다."); return nRet; } diff --git a/src/server/Ebenezer/Knights.cpp b/src/server/Ebenezer/Knights.cpp index f5120f34..fd1d1225 100644 --- a/src/server/Ebenezer/Knights.cpp +++ b/src/server/Ebenezer/Knights.cpp @@ -34,16 +34,16 @@ CKnights::~CKnights() {} void CKnights::InitializeValue() { m_sIndex = 0; - m_byFlag = 0; // 1 : Clan, 2 : + m_byFlag = 0; // 1 : Clan, 2 : 기사단 m_byNation = 0; // nation - m_byGrade = 0; // clan (1 ~ 5) - m_byRanking = 0; // clan (1 ~ 5) + m_byGrade = 0; // clan 등급 (1 ~ 5등급) + m_byRanking = 0; // clan 등급 (1 ~ 5등) m_sMembers = 0; memset(m_strName, 0x00, MAX_ID_SIZE + 1); memset(m_strChief, 0x00, MAX_ID_SIZE + 1); - memset(m_strViceChief_1, 0x00, MAX_ID_SIZE + 1); // δ 1 - memset(m_strViceChief_2, 0x00, MAX_ID_SIZE + 1); // δ 2 (ܿ 屳) - memset(m_strViceChief_3, 0x00, MAX_ID_SIZE + 1); // δ 3 (ܿ ) + memset(m_strViceChief_1, 0x00, MAX_ID_SIZE + 1); // 부단장 1 + memset(m_strViceChief_2, 0x00, MAX_ID_SIZE + 1); // 부단장 2 (기사단에서는 장교) + memset(m_strViceChief_3, 0x00, MAX_ID_SIZE + 1); // 부단장 3 (기사단에서는 사용하지 않음) memset(m_Image, 0x00, MAX_KNIGHTS_MARK); m_nMoney = 0; m_sDomination = 0; diff --git a/src/server/Ebenezer/Knights.h b/src/server/Ebenezer/Knights.h index 5c987c28..915d6f6a 100644 --- a/src/server/Ebenezer/Knights.h +++ b/src/server/Ebenezer/Knights.h @@ -12,22 +12,22 @@ class CEbenezerDlg; class CKnights { public: short m_sIndex; - BYTE m_byFlag; // 1 : Clan, 2 : + BYTE m_byFlag; // 1 : Clan, 2 : 기사단 BYTE m_byNation; // nation - BYTE m_byGrade; // clan (1 ~ 5) - BYTE m_byRanking; // clan (1 ~ 5) + BYTE m_byGrade; // clan 등급 (1 ~ 5등급) + BYTE m_byRanking; // clan 등급 (1 ~ 5등) char m_strName[MAX_ID_SIZE + 1]; short m_sMembers; char m_strChief[MAX_ID_SIZE + 1]; - char m_strViceChief_1[MAX_ID_SIZE + 1]; // δ 1 - char m_strViceChief_2[MAX_ID_SIZE + 1]; // δ 2 (ܿ 屳) - char m_strViceChief_3[MAX_ID_SIZE + 1]; // δ 3 (ܿ ) + char m_strViceChief_1[MAX_ID_SIZE + 1]; // 부단장 1 + char m_strViceChief_2[MAX_ID_SIZE + 1]; // 부단장 2 (기사단에서는 장교) + char m_strViceChief_3[MAX_ID_SIZE + 1]; // 부단장 3 (기사단에서는 사용하지 않음) __int64 m_nMoney; short m_sDomination; int m_nPoints; BYTE m_Image[MAX_KNIGHTS_MARK]; _ITEM_DATA m_StashItem[MAX_KNIGHTS_BANK]; - _KNIGHTS_USER m_arKnightsUser[MAX_CLAN]; // Ŭ + _KNIGHTS_USER m_arKnightsUser[MAX_CLAN]; // 클랜원의 정보 public: CKnights(); diff --git a/src/server/Ebenezer/KnightsManager.cpp b/src/server/Ebenezer/KnightsManager.cpp index 6bed31fa..fea1da05 100644 --- a/src/server/Ebenezer/KnightsManager.cpp +++ b/src/server/Ebenezer/KnightsManager.cpp @@ -103,43 +103,43 @@ void CKnightsManager::CreateKnights(CUser * pUser, char * pBuf) { if (!IsAvailableName(idname)) { goto fail_return; } - if (pUser->m_pUserData->m_bKnights != 0) { // ܿ ԵǾ ֽϴ + if (pUser->m_pUserData->m_bKnights != 0) { // 기사단에 가입되어 있습니다 ret_value = 5; goto fail_return; } - if (m_pMain->m_nServerGroup == 2) { // 1 ֵ... + if (m_pMain->m_nServerGroup == 2) { // 기사단은 서버 1군에서만 만들 수 있도록... ret_value = 8; goto fail_return; } - // üũ + // 요일 체크 week = time.GetDayOfWeek(); /* if(week == 1 || week == 6 || week == 7) {} else { ret_value = 7; goto fail_return; } */ - if (pUser->m_pUserData->m_bLevel < 20) { // 20 Level ̻ ʿ + if (pUser->m_pUserData->m_bLevel < 20) { // 20 Level 이상이 필요 ret_value = 2; goto fail_return; } - /* if( pUser->m_pUserData->m_iLoyalty < 800 ) { // ⿩ 800 ̻ ʿ + /* if( pUser->m_pUserData->m_iLoyalty < 800 ) { // 국가기여도 800 이상이 필요 goto fail_return; } - if( pUser->m_pUserData->m_bstrSkill[ORDER_SKILL] < 10 || pUser->m_pUserData->m_bstrSkill[MANNER_SKILL] < 5 ) { // ֽų 10, ų 5 ̻ ʿ + if( pUser->m_pUserData->m_bstrSkill[ORDER_SKILL] < 10 || pUser->m_pUserData->m_bstrSkill[MANNER_SKILL] < 5 ) { // 지휘스킬 10, 예절스킬 5 이상이 필요 goto fail_return; } - if( pUser->m_pUserData->m_bCha < 120 ) { // ŷ 120 ̻ ʿ + if( pUser->m_pUserData->m_bCha < 120 ) { // 매력 120 이상이 필요 goto fail_return; } */ - if (pUser->m_pUserData->m_iGold < 500000) { // 5000000 ̻ ʿ + if (pUser->m_pUserData->m_iGold < 500000) { // 5000000노아 이상이 필요 ret_value = 4; goto fail_return; } knightindex = GetKnightsIndex(pUser->m_pUserData->m_bNation); //knightindex = 0; - if (knightindex == -1) { // â + if (knightindex == -1) { // 기사단 창설에 실패 ret_value = 6; goto fail_return; } @@ -200,7 +200,7 @@ int CKnightsManager::GetKnightsIndex(int nation) { for (; Iter1 != Iter2; Iter1++) { if (knightindex < ((*Iter1).second)->m_sIndex) { - if (nation == KARUS) { // sungyong,, ī罺 ħ ؼ,,, + if (nation == KARUS) { // sungyong,, 카루스와 전쟁존의 합침으로 인해서,,, if (((*Iter1).second)->m_sIndex >= 15000) { continue; } @@ -220,7 +220,7 @@ int CKnightsManager::GetKnightsIndex(int nation) { } } - if (m_pMain->m_KnightsArray.GetData(knightindex)) { // Ȯ .. + if (m_pMain->m_KnightsArray.GetData(knightindex)) { // 확인 사살.. return -1; } @@ -238,7 +238,7 @@ void CKnightsManager::JoinKnights(CUser * pUser, char * pBuf) { return; } - if (pUser->m_pUserData->m_bZone > 2) { // ó ȵ + if (pUser->m_pUserData->m_bZone > 2) { // 전쟁존에서는 기사단 처리가 안됨 ret_value = 12; goto fail_return; } @@ -254,7 +254,7 @@ void CKnightsManager::JoinKnights(CUser * pUser, char * pBuf) { ret_value = 7; goto fail_return; } - // ο üũ + // 인원 체크 /* if(pKnights->sMembers >= 24) { ret_value = 8; goto fail_return; @@ -280,7 +280,7 @@ void CKnightsManager::JoinKnights(CUser * pUser, char * pBuf) { goto fail_return; } - if (pTUser->m_pUserData->m_bKnights > 0) { // ܿ ԵǾ ֽϴ + if (pTUser->m_pUserData->m_bKnights > 0) { // 기사단에 가입되어 있습니다 ret_value = 5; goto fail_return; } @@ -336,7 +336,7 @@ void CKnightsManager::JoinKnightsReq(CUser * pUser, char * pBuf) { return; } - if (flag == 0x00) { // + if (flag == 0x00) { // 거절 ret_value = 11; SetByte(send_buff, WIZ_KNIGHTS_PROCESS, send_index); SetByte(send_buff, KNIGHTS_JOIN, send_index); @@ -352,7 +352,7 @@ void CKnightsManager::JoinKnightsReq(CUser * pUser, char * pBuf) { ret_value = 7; goto fail_return; } - // ο üũ + // 인원 체크 /* if(pKnights->sMembers >= 24) { ret_value = 8; goto fail_return; @@ -383,27 +383,27 @@ void CKnightsManager::WithdrawKnights(CUser * pUser, char * pBuf) { return; } if (pUser->m_pUserData->m_bKnights < 1 || - pUser->m_pUserData->m_bKnights > 30000) { // ܿ ԵǾ ʽϴ + pUser->m_pUserData->m_bKnights > 30000) { // 기사단에 가입되어 있지 않습니다 ret_value = 10; goto fail_return; } /* pKnights = m_pMain->m_KnightsArray.GetData( pUser->m_pUserData->m_bKnights ); if( !pKnights ) { -// sprintf(errormsg, " ʴ Դϴ."); +// sprintf(errormsg, "존재하지 않는 기사단입니다."); //::_LoadStringFromResource(IDP_KNIGHT_NOT_AVAILABLE, buff); //sprintf(errormsg, buff.c_str()); ret_value = 3; goto fail_return; } */ - if (pUser->m_pUserData->m_bZone > 2) { // ó ȵ + if (pUser->m_pUserData->m_bZone > 2) { // 전쟁존에서는 기사단 처리가 안됨 ret_value = 12; goto fail_return; } - if (pUser->m_pUserData->m_bFame == CHIEF) { // Ż 쿡 Ŭ ı - if (pUser->m_pUserData->m_bZone > 2) { // Ŭ ı + if (pUser->m_pUserData->m_bFame == CHIEF) { // 단장이 탈퇴할 경우에는 클랜 파괴 + if (pUser->m_pUserData->m_bZone > 2) { // 전쟁존에서는 클랜을 파괴할 수 없다 ret_value = 12; goto fail_return; } @@ -474,33 +474,33 @@ void CKnightsManager::ModifyKnightsMember(CUser * pUser, char * pBuf, BYTE comma return; } idlen = GetShort(pBuf, index); - if (idlen > MAX_ID_SIZE || idlen <= 0) { // ߸ ̵ + if (idlen > MAX_ID_SIZE || idlen <= 0) { // 잘못된 아이디 ret_value = 2; goto fail_return; } GetString(userid, pBuf, idlen, index); - if (pUser->m_pUserData->m_bZone > 2) { // ó ȵ + if (pUser->m_pUserData->m_bZone > 2) { // 전쟁존에서는 기사단 처리가 안됨 ret_value = 12; goto fail_return; } - if (_strnicmp(userid, pUser->m_pUserData->m_id, MAX_ID_SIZE) == 0) { // ڽ ϴ + if (_strnicmp(userid, pUser->m_pUserData->m_id, MAX_ID_SIZE) == 0) { // 자신은 할 수 없습니다 ret_value = 9; goto fail_return; } if (command == KNIGHTS_ADMIT || - command == KNIGHTS_REJECT) { // , , 屳 ̻ ֽϴ + command == KNIGHTS_REJECT) { // 기사단, 멤버가입 및 멤버거절, 장교 이상이 할 수 있습니다 if (pUser->m_pUserData->m_bFame < OFFICER) { goto fail_return; } - } else if (command == KNIGHTS_PUNISH) { // ¡, α ̻ ֽϴ + } else if (command == KNIGHTS_PUNISH) { // 징계, 부기사단장 이상이 할 수 있습니다 if (pUser->m_pUserData->m_bFame < VICECHIEF) { goto fail_return; } } else { - if (pUser->m_pUserData->m_bFame != CHIEF) { // ֽϴ + if (pUser->m_pUserData->m_bFame != CHIEF) { // 기사단장 만이 할 수 있습니다 ret_value = 6; goto fail_return; } @@ -508,7 +508,7 @@ void CKnightsManager::ModifyKnightsMember(CUser * pUser, char * pBuf, BYTE comma pTUser = m_pMain->GetUserPtr(userid, 2); if (!pTUser) { - if (command == KNIGHTS_REMOVE) { // ӻ ߹ (100) + if (command == KNIGHTS_REMOVE) { // 게임상에 없는 유저 추방시 (100) remove_flag = 0; SetByte(send_buff, WIZ_KNIGHTS_PROCESS, send_index); SetByte(send_buff, command + 0x10, send_index); @@ -534,9 +534,9 @@ void CKnightsManager::ModifyKnightsMember(CUser * pUser, char * pBuf, BYTE comma goto fail_return; } - // δ 3 ƴ Ǵ (Ŭ ̴,,) - if (command == KNIGHTS_VICECHIEF) { // δ Ӹ - if (pTUser->m_pUserData->m_bFame == VICECHIEF) { // ̹ δ + // 부단장이 3명이 됐는지를 판단 (클랜인 경우이다,,) + if (command == KNIGHTS_VICECHIEF) { // 부단장 임명 + if (pTUser->m_pUserData->m_bFame == VICECHIEF) { // 이미 부단장인 경우 ret_value = 8; goto fail_return; } @@ -557,7 +557,7 @@ void CKnightsManager::ModifyKnightsMember(CUser * pUser, char * pBuf, BYTE comma } */ } - remove_flag = 1; // ӻ ִ ߹ (1) + remove_flag = 1; // 게임상에 있는 유저 추방시 (1) SetByte(send_buff, WIZ_KNIGHTS_PROCESS, send_index); SetByte(send_buff, command + 0x10, send_index); SetShort(send_buff, pUser->GetSocketID(), send_index); @@ -600,7 +600,7 @@ void CKnightsManager::AllKnightsList(CUser * pUser, char * pBuf) { continue; } if (pKnights->m_byFlag != KNIGHTS_TYPE) { - continue; // Ʈ + continue; // 기사단 리스트만 받자 } if (pKnights->m_byNation != pUser->m_pUserData->m_bNation) { continue; @@ -642,12 +642,12 @@ void CKnightsManager::AllKnightsMember(CUser * pUser, char * pBuf) { if (!pUser) { return; } - if (pUser->m_pUserData->m_bKnights <= 0) { // ܿ ԵǾ ʽϴ + if (pUser->m_pUserData->m_bKnights <= 0) { // 기사단에 가입되어 있지 않습니다 ret_value = 2; goto fail_return; } /* if( pUser->m_pUserData->m_bFame < OFFICER ) { -// sprintf(errormsg, "屳 ̻ ֽϴ."); +// sprintf(errormsg, "장교 이상이 할 수 있습니다."); //::_LoadStringFromResource(IDP_MINIMUM_OFFICER, buff); //sprintf(errormsg, buff.c_str()); ret_value = 3; @@ -662,7 +662,7 @@ void CKnightsManager::AllKnightsMember(CUser * pUser, char * pBuf) { goto fail_return; } - // + // 단장 /* if( pUser->m_pUserData->m_bFame == CHIEF ) { SetByte( send_buff, WIZ_KNIGHTS_PROCESS, send_index ); SetByte( send_buff, KNIGHTS_MEMBER_REQ+0x10, send_index ); @@ -673,7 +673,7 @@ void CKnightsManager::AllKnightsMember(CUser * pUser, char * pBuf) { return; } */ - // .. Ӽ ؼ ҷ ( ƴ ) + // 직접.. 게임서버에서 유저정보를 참조해서 불러오는 방식 (단장이 아닌 모든 사람) if (pUser->m_pUserData->m_bFame == CHIEF) { count = m_pMain->GetKnightsAllMembers(pUser->m_pUserData->m_bKnights, temp_buff, temp_index, 1); } else { @@ -720,7 +720,7 @@ void CKnightsManager::CurrentKnightsMember(CUser * pUser, char * pBuf) { memset(errormsg, 0x00, 128); std::string buff; - // sprintf(errormsg, "ܿ Ե ʾҽϴ."); + // sprintf(errormsg, "기사단에 가입되지 않았습니다."); ::_LoadStringFromResource(IDP_KNIGHT_NOT_REGISTERED, buff); sprintf(errormsg, buff.c_str()); @@ -790,7 +790,7 @@ void CKnightsManager::ReceiveKnightsProcess(CUser * pUser, char * pBuf, BYTE com memset(errormsg, 0x00, 128); std::string buff; - // sprintf(errormsg, " DBó Ͽϴ."); + // sprintf(errormsg, "기사단 DB처리에 실패하였습니다."); ::_LoadStringFromResource(IDP_KNIGHT_DB_FAIL, buff); sprintf(errormsg, buff.c_str()); @@ -912,7 +912,7 @@ void CKnightsManager::RecvCreateKnights(CUser * pUser, char * pBuf) { m_pMain->m_KnightsArray.PutData(pKnights->m_sIndex, pKnights); - // Ŭ ߰ + // 클랜정보에 추가 AddKnightsUser(knightsindex, chiefname); //TRACE("RecvCreateKnights - nid=%d, name=%s, index=%d, fame=%d, money=%d\n", pUser->GetSocketID(), pUser->m_pUserData->m_id, knightsindex, pUser->m_pUserData->m_bFame, money); @@ -979,16 +979,16 @@ void CKnightsManager::RecvJoinKnights(CUser * pUser, char * pBuf, BYTE command) if (command == KNIGHTS_JOIN + 0x10) { pUser->m_pUserData->m_bKnights = knightsindex; pUser->m_pUserData->m_bFame = TRAINEE; - sprintf(finalstr, "#### %s ϼ̽ϴ. ####", pUser->m_pUserData->m_id); - // Ŭ ߰ + sprintf(finalstr, "#### %s님이 가입하셨습니다. ####", pUser->m_pUserData->m_id); + // 클랜정보에 추가 AddKnightsUser(knightsindex, pUser->m_pUserData->m_id); - //TRACE("RecvJoinKnights - , nid=%d, name=%s, index=%d, fame=%d\n", pUser->GetSocketID(), pUser->m_pUserData->m_id, pUser->m_pUserData->m_bKnights, pUser->m_pUserData->m_bFame); - } else { // Ż.. + //TRACE("RecvJoinKnights - 가입, nid=%d, name=%s, index=%d, fame=%d\n", pUser->GetSocketID(), pUser->m_pUserData->m_id, pUser->m_pUserData->m_bKnights, pUser->m_pUserData->m_bFame); + } else { // 탈퇴.. pUser->m_pUserData->m_bKnights = 0; pUser->m_pUserData->m_bFame = 0; - // Ŭ ߰ + // 클랜정보에 추가 RemoveKnightsUser(knightsindex, pUser->m_pUserData->m_id); /* if(pKnights) { @@ -999,9 +999,9 @@ void CKnightsManager::RecvJoinKnights(CUser * pUser, char * pBuf, BYTE command) else if( !strcmp( pKnights->strViceChief_3, pUser->m_pUserData->m_id) ) memset( pKnights->strViceChief_3, 0x00, MAX_ID_SIZE+1 ); } */ - sprintf(finalstr, "#### %s Żϼ̽ϴ. ####", pUser->m_pUserData->m_id); + sprintf(finalstr, "#### %s님이 탈퇴하셨습니다. ####", pUser->m_pUserData->m_id); - //TRACE("RecvJoinKnights - Ż, nid=%d, name=%s, index=%d, fame=%d\n", pUser->GetSocketID(), pUser->m_pUserData->m_id, pUser->m_pUserData->m_bKnights, pUser->m_pUserData->m_bFame); + //TRACE("RecvJoinKnights - 탈퇴, nid=%d, name=%s, index=%d, fame=%d\n", pUser->GetSocketID(), pUser->m_pUserData->m_id, pUser->m_pUserData->m_bKnights, pUser->m_pUserData->m_bFame); } //TRACE("RecvJoinKnights - command=%d, nid=%d, name=%s, index=%d, fame=%d\n", command, pUser->GetSocketID(), pUser->m_pUserData->m_id, pUser->m_pUserData->m_bKnights, pUser->m_pUserData->m_bFame); @@ -1075,7 +1075,7 @@ void CKnightsManager::RecvModifyFame(CUser * pUser, char * pBuf, BYTE command) { if (pTUser) { pTUser->m_pUserData->m_bKnights = 0; pTUser->m_pUserData->m_bFame = 0; - sprintf(finalstr, "#### %s ߹Ǽ̽ϴ. ####", pTUser->m_pUserData->m_id); + sprintf(finalstr, "#### %s님이 추방되셨습니다. ####", pTUser->m_pUserData->m_id); RemoveKnightsUser(knightsindex, pTUser->m_pUserData->m_id); } else { @@ -1099,14 +1099,14 @@ void CKnightsManager::RecvModifyFame(CUser * pUser, char * pBuf, BYTE command) { if (pTUser) { pTUser->m_pUserData->m_bFame = CHIEF; ModifyKnightsUser(knightsindex, pTUser->m_pUserData->m_id); - sprintf(finalstr, "#### %s ӸǼ̽ϴ. ####", pTUser->m_pUserData->m_id); + sprintf(finalstr, "#### %s님이 단장으로 임명되셨습니다. ####", pTUser->m_pUserData->m_id); } break; case KNIGHTS_VICECHIEF + 0x10: if (pTUser) { pTUser->m_pUserData->m_bFame = VICECHIEF; ModifyKnightsUser(knightsindex, pTUser->m_pUserData->m_id); - sprintf(finalstr, "#### %s δ ӸǼ̽ϴ. ####", pTUser->m_pUserData->m_id); + sprintf(finalstr, "#### %s님이 부단장으로 임명되셨습니다. ####", pTUser->m_pUserData->m_id); } break; case KNIGHTS_OFFICER + 0x10: @@ -1209,11 +1209,11 @@ void CKnightsManager::RecvDestroyKnights(CUser * pUser, char * pBuf) { flag = pKnights->m_byFlag; - // Ŭ̳ ı ޽ Ÿ ʱȭ + // 클랜이나 기사단이 파괴된 메시지를 보내고 유저 데이타를 초기화 if (flag == CLAN_TYPE) { - sprintf(finalstr, "#### %s Ŭ üǾϴ ####", pKnights->m_strName); + sprintf(finalstr, "#### %s 클랜이 해체되었습니다 ####", pKnights->m_strName); } else if (flag == KNIGHTS_TYPE) { - sprintf(finalstr, "#### %s üǾϴ ####", pKnights->m_strName); + sprintf(finalstr, "#### %s 기사단이 해체되었습니다 ####", pKnights->m_strName); } memset(send_buff, 0x00, 128); diff --git a/src/server/Ebenezer/LOGIC_ELSE.cpp b/src/server/Ebenezer/LOGIC_ELSE.cpp index c4c2af68..d0e78657 100644 --- a/src/server/Ebenezer/LOGIC_ELSE.cpp +++ b/src/server/Ebenezer/LOGIC_ELSE.cpp @@ -84,7 +84,7 @@ void LOGIC_ELSE::Parse_and(char * pBuf) { index += ParseSpace(temp, pBuf + index); m_LogicElseInt[i++] = atoi(temp); // Weight & Empty Slot } - // 񷯸ӱ !!! + // 비러머글 복권!!! else if (!strcmp(temp, "CHECK_EDITBOX")) { m_LogicElse = LOGIC_CHECK_EDITBOX; @@ -97,7 +97,7 @@ void LOGIC_ELSE::Parse_and(char * pBuf) { m_LogicElseInt[i++] = atoi(temp); // Chances of you hitting the jackpot } // - // Դϴ. Ʒ ߿ ° ؼ . + // 현재 여기까지만 쓰입니다. 아래는 나중에 맞게 수정해서 쓰세여. /* if( !strcmp( temp, "CHECK_NATION" ) ) @@ -139,7 +139,7 @@ void LOGIC_ELSE::Parse_and(char * pBuf) { index += ParseSpace( temp, pBuf+index ); m_LogicElseInt[i++] = atoi( temp ); // Gold } */ - ///////////////////////// ⼭ /////////////////////////// + ///////////////////////// 여기서 부턴 내가 한일 /////////////////////////// /* else if( !strcmp( temp, "CHECK_CLASS" ) ) diff --git a/src/server/Ebenezer/MagicProcess.cpp b/src/server/Ebenezer/MagicProcess.cpp index 588cdcca..52c9a2f0 100644 --- a/src/server/Ebenezer/MagicProcess.cpp +++ b/src/server/Ebenezer/MagicProcess.cpp @@ -18,21 +18,21 @@ static char THIS_FILE[] = __FILE__; #define new DEBUG_NEW #endif -#define MORAL_SELF 1 // ڽ.. -#define MORAL_FRIEND_WITHME 2 // 츮() ϳ .. -#define MORAL_FRIEND_EXCEPTME 3 // 츮 ϳ -#define MORAL_PARTY 4 // 츮Ƽ ϳ.. -#define MORAL_NPC 5 // NPC ϳ. -#define MORAL_PARTY_ALL 6 // ȣ Ƽ .. -#define MORAL_ENEMY 7 // ϳ(NPC) -#define MORAL_ALL 8 // ׻ ϴ ϳ. -#define MORAL_AREA_ENEMY 10 // Ե -#define MORAL_AREA_FRIEND 11 // Ե 츮 -#define MORAL_AREA_ALL 12 // Ե -#define MORAL_SELF_AREA 13 // ߽ -// 񷯸ӱ Ŭȯ -#define MORAL_CLAN 14 // Ŭ ɹ Ѹ... -#define MORAL_CLAN_ALL 15 // Ŭ ɹ ... +#define MORAL_SELF 1 // 나 자신.. +#define MORAL_FRIEND_WITHME 2 // 나를 포함한 우리편(국가) 중 하나 .. +#define MORAL_FRIEND_EXCEPTME 3 // 나를 뺀 우리편 중 하나 +#define MORAL_PARTY 4 // 나를 포함한 우리파티 중 하나.. +#define MORAL_NPC 5 // NPC중 하나. +#define MORAL_PARTY_ALL 6 // 나를 호함한 파티 모두.. +#define MORAL_ENEMY 7 // 울편을 제외한 모든 적중 하나(NPC포함) +#define MORAL_ALL 8 // 겜상에 존재하는 모든 것중 하나. +#define MORAL_AREA_ENEMY 10 // 지역에 포함된 적 +#define MORAL_AREA_FRIEND 11 // 지역에 포함된 우리편 +#define MORAL_AREA_ALL 12 // 지역에 포함된 모두 +#define MORAL_SELF_AREA 13 // 나를 중심으로 한 지역 +// 비러머글 클랜소환 +#define MORAL_CLAN 14 // 클랜 맴버 중 한명... +#define MORAL_CLAN_ALL 15 // 나를 포함한 클랜 맴버 다... // #define MORAL_UNDEAD 16 // Undead Monster @@ -87,11 +87,11 @@ void CMagicProcess::MagicPacket(char * pBuf, int len) { data5 = GetShort(pBuf, index); data6 = GetShort(pBuf, index); - // ο ο̶ ͸ ϵ,,, + // 눈싸움전쟁존에서 눈싸움중이라면 공격은 눈을 던지는 것만 가능하도록,,, if (m_pSrcUser) { if (m_pSrcUser->m_pUserData->m_bZone == ZONE_SNOW_BATTLE && m_pMain->m_byBattleOpen == SNOW_BATTLE) { if (magicid != SNOW_EVENT_SKILL) { - return; // ϵ ڵ Ⱦ,,, + return; // 하드 코딩 싫어,,, } } } @@ -212,7 +212,7 @@ void CMagicProcess::MagicPacket(char * pBuf, int len) { } } - // 񷯸ӱ Ŭ ȯ >.< + // 비러머글 클랜 소환 >.< if (sid >= 0 && sid < MAX_USER) { // Make sure the source is a user! if (m_pSrcUser->m_pUserData->m_bZone == ZONE_BATTLE) { // Make sure the zone is a battlezone! if (tid >= 0 && tid < MAX_USER) { // Make sure the target is another player. @@ -433,7 +433,7 @@ void CMagicProcess::MagicPacket(char * pBuf, int len) { } } } else if (command == MAGIC_CASTING) { - goto return_echo; // ٸ ־..... + goto return_echo; // 원래 이한줄만 있었음..... } return; @@ -523,7 +523,7 @@ _MAGIC_TABLE * CMagicProcess::IsAvailable(int magicid, int tid, int sid, BYTE ty moral = pUser->m_pUserData->m_bNation; } else if (tid >= NPC_BAND) { // Target existence check routine for NPC. if (m_pMain->m_bPointCheckFlag == FALSE) { - goto fail_return; // ϸ ȵ + goto fail_return; // 포인터 참조하면 안됨 } pNpc = m_pMain->m_arNpcArray.GetData(tid); if (!pNpc || pNpc->m_NpcState == NPC_DEAD) { @@ -689,7 +689,7 @@ _MAGIC_TABLE * CMagicProcess::IsAvailable(int magicid, int tid, int sid, BYTE ty if (!bFlag) { // If the user cast the spell (and not the NPC)..... - /* ߿ ݵ κ ĥ !!! + /* 나중에 반듯이 이 부분 고칠것 !!! if( type == MAGIC_CASTING ) { if( m_bMagicState == CASTING && pTable->bType1 != 2 ) goto fail_return; if( pTable->bCastTime == 0 ) goto fail_return; @@ -791,7 +791,7 @@ _MAGIC_TABLE * CMagicProcess::IsAvailable(int magicid, int tid, int sid, BYTE ty if (pTable->bType1 == 3 || pTable->bType1 == 4) { // If the PLAYER uses an item to cast a spell. if (sid >= 0 && sid < MAX_USER) { if (pTable->iUseItem != 0) { - // ̰͵ û ϴ Դϴ --; + // 이것두 성래씨 요청에 의해 하는 짓입니다 --; _ITEM_TABLE * pItem = NULL; // This checks if such an item exists. pItem = m_pMain->m_ItemtableArray.GetData(pTable->iUseItem); if (!pItem) { @@ -840,7 +840,7 @@ _MAGIC_TABLE * CMagicProcess::IsAvailable(int magicid, int tid, int sid, BYTE ty if (!pTUser) { goto fail_return; } - // 񷯸ӱ Ȱ --; + // 비러머글 부활 --; if (pType->bType == 3 && pTUser->m_pUserData->m_bLevel <= 5) { type = MAGIC_CASTING; // No resurrections for low level users... goto fail_return; @@ -952,7 +952,7 @@ BYTE CMagicProcess::ExecuteType1(int magicid, int sid, int tid, int data1, int d // sungyong work : loyalty - /* ӽ÷ + /* 전쟁존을 위해 임시로 뺌 // pTUser->ExpChange( -pTUser->m_iMaxExp/100 ); // Reduce target experience. if( m_pSrcUser->m_sPartyIndex == -1 ) // Something regarding loyalty points. m_pSrcUser->LoyaltyChange( (pTUser->m_pUserData->m_bLevel * pTUser->m_pUserData->m_bLevel) ); @@ -967,13 +967,13 @@ BYTE CMagicProcess::ExecuteType1(int magicid, int sid, int tid, int data1, int d m_pSrcUser->GoldChange(tid, 0); - // Ϻ ȣ ڵ!!! + // 기범이의 완벽한 보호 코딩!!! pTUser->InitType3(); // Init Type 3..... pTUser->InitType4(); // Init Type 4..... // if (pTUser->m_pUserData->m_bZone != pTUser->m_pUserData->m_bNation && pTUser->m_pUserData->m_bZone < 3) { pTUser->ExpChange(-pTUser->m_iMaxExp / 100); - //TRACE(" 1% ￴ٴϱ .\r\n"); + //TRACE("정말로 1%만 깍였다니까요 ㅠ.ㅠ\r\n"); } // pTUser->m_sWhoKilledMe = sid; // Who the hell killed me? @@ -1064,7 +1064,7 @@ BYTE CMagicProcess::ExecuteType2(int magicid, int sid, int tid, int data1, int d // sungyong work : loyalty - /* ӽ÷ + /* 전쟁존을 위해 임시로 뺌 // pTUser->ExpChange( -pTUser->m_iMaxExp/100 ); // Reduce target experience. if( m_pSrcUser->m_sPartyIndex == -1 ) // Something regarding loyalty points. m_pSrcUser->LoyaltyChange( (pTUser->m_pUserData->m_bLevel * pTUser->m_pUserData->m_bLevel) ); @@ -1080,13 +1080,13 @@ BYTE CMagicProcess::ExecuteType2(int magicid, int sid, int tid, int data1, int d m_pSrcUser->GoldChange(tid, 0); - // Ϻ ȣ ڵ!!! + // 기범이의 완벽한 보호 코딩!!! pTUser->InitType3(); // Init Type 3..... pTUser->InitType4(); // Init Type 4..... // if (pTUser->m_pUserData->m_bZone != pTUser->m_pUserData->m_bNation && pTUser->m_pUserData->m_bZone < 3) { pTUser->ExpChange(-pTUser->m_iMaxExp / 100); - //TRACE(" 1% ￴ٴϱ .\r\n"); + //TRACE("정말로 1%만 깍였다니까요 ㅠ.ㅠ\r\n"); } // pTUser->m_sWhoKilledMe = sid; // Who the hell killed me? @@ -1226,7 +1226,7 @@ void CMagicProcess::ExecuteType3(int magicid, int sid, int tid, int data1, int d damage = pType->sFirstDamage; } - // ο ο̶ ͸ ϵ,,, + // 눈싸움전쟁존에서 눈싸움중이라면 공격은 눈을 던지는 것만 가능하도록,,, if (m_pSrcUser) { if (m_pSrcUser->m_pUserData->m_bZone == ZONE_SNOW_BATTLE && m_pMain->m_byBattleOpen == SNOW_BATTLE) { damage = -10; @@ -1248,7 +1248,7 @@ void CMagicProcess::ExecuteType3(int magicid, int sid, int tid, int data1, int d if (pTUser->m_pUserData->m_bZone != pTUser->m_pUserData->m_bNation && pTUser->m_pUserData->m_bZone < 3) { pTUser->ExpChange(-pTUser->m_iMaxExp / 100); - //TRACE(" 1% ￴ٴϱ .\r\n"); + //TRACE("정말로 1%만 깍였다니까요 ㅠ.ㅠ\r\n"); } else { // pTUser->ExpChange(-pTUser->m_iMaxExp / 20); @@ -1258,10 +1258,10 @@ void CMagicProcess::ExecuteType3(int magicid, int sid, int tid, int data1, int d } if (!bFlag) { // Killed by another player. - // ο ο̶ ͸ ϵ,,, + // 눈싸움전쟁존에서 눈싸움중이라면 공격은 눈을 던지는 것만 가능하도록,,, if (m_pSrcUser->m_pUserData->m_bZone == ZONE_SNOW_BATTLE && m_pMain->m_byBattleOpen == SNOW_BATTLE) { - m_pSrcUser->GoldGain(SNOW_EVENT_MONEY); // 10000Ƹ ִ κ,,,,, + m_pSrcUser->GoldGain(SNOW_EVENT_MONEY); // 10000노아를 주는 부분,,,,, wsprintf(strLogData, "%s -> %s userdead", m_pSrcUser->m_pUserData->m_id, pTUser->m_pUserData->m_id); @@ -1289,7 +1289,7 @@ void CMagicProcess::ExecuteType3(int magicid, int sid, int tid, int data1, int d } } - // Ϻ ȣ ڵ!!! + // 기범이의 완벽한 보호 코딩!!! pTUser->InitType3(); // Init Type 3..... pTUser->InitType4(); // Init Type 4..... @@ -1298,7 +1298,7 @@ void CMagicProcess::ExecuteType3(int magicid, int sid, int tid, int data1, int d if (pTUser->m_pUserData->m_bZone != pTUser->m_pUserData->m_bNation && pTUser->m_pUserData->m_bZone < 3) { pTUser->ExpChange(-pTUser->m_iMaxExp / 100); - //TRACE(" 1% ￴ٴϱ .\r\n"); + //TRACE("정말로 1%만 깍였다니까요 ㅠ.ㅠ\r\n"); } // pTUser->m_sWhoKilledMe = sid; // Who the hell killed me? @@ -1327,7 +1327,7 @@ void CMagicProcess::ExecuteType3(int magicid, int sid, int tid, int data1, int d if (pTUser->m_pUserData->m_bZone != pTUser->m_pUserData->m_bNation && pTUser->m_pUserData->m_bZone < 3) { pTUser->ExpChange(-pTUser->m_iMaxExp / 100); - //TRACE(" 1% ￴ٴϱ .\r\n"); + //TRACE("정말로 1%만 깍였다니까요 ㅠ.ㅠ\r\n"); } else { // pTUser->ExpChange(-pTUser->m_iMaxExp / 20); @@ -1346,7 +1346,7 @@ void CMagicProcess::ExecuteType3(int magicid, int sid, int tid, int data1, int d m_pSrcUser->GoldChange(casted_member[j], 0); } - // Ϻ ȣ ڵ !!! + // 기범이의 완벽한 보호 코딩 !!! pTUser->InitType3(); // Init Type 3..... pTUser->InitType4(); // Init Type 4..... @@ -1355,7 +1355,7 @@ void CMagicProcess::ExecuteType3(int magicid, int sid, int tid, int data1, int d if (pTUser->m_pUserData->m_bZone != pTUser->m_pUserData->m_bNation && pTUser->m_pUserData->m_bZone < 3) { pTUser->ExpChange(-pTUser->m_iMaxExp / 100); - //TRACE(" 1% ￴ٴϱ .\r\n"); + //TRACE("정말로 1%만 깍였다니까요 ㅠ.ㅠ\r\n"); } // pTUser->m_sWhoKilledMe = sid; // Who the hell killed me? @@ -1366,7 +1366,7 @@ void CMagicProcess::ExecuteType3(int magicid, int sid, int tid, int data1, int d } } - if (pTUser->m_bResHpType != USER_DEAD) { // ⵵ ȣ ڵ ߽... + if (pTUser->m_bResHpType != USER_DEAD) { // 여기도 보호 코딩 했슴... if (pType->sTimeDamage < 0) { duration_damage = GetMagicDamage(sid, casted_member[j], pType->sTimeDamage, pType->bAttribute); } else { @@ -1612,7 +1612,7 @@ void CMagicProcess::ExecuteType4(int magicid, int sid, int tid, int data1, int d } if (tid != -1 && pMagic->bType1 == 4) { - // 񷯸ӱ >.< + // 비러머글 하피 >.< if (sid >= 0 && sid < MAX_USER) { // m_pSrcUser->MSpChange(-(pMagic->sMsp)); @@ -1647,7 +1647,7 @@ void CMagicProcess::ExecuteType4(int magicid, int sid, int tid, int data1, int d } // end of Send Party Packet.....// // - pTUser->Send2AI_UserUpdateInfo(); // AI Server م Ÿ .... + pTUser->Send2AI_UserUpdateInfo(); // AI Server에 바끤 데이타 전송.... if (pMagic->bType2 == 0 || pMagic->bType2 == 4) { SetByte(send_buff, WIZ_MAGIC_PROCESS, send_index); @@ -1878,7 +1878,7 @@ void CMagicProcess::ExecuteType5(int magicid, int sid, int tid, int data1, int d pTUser->SetSlotItemValue(); pTUser->SetUserAbility(); - pTUser->Send2AI_UserUpdateInfo(); // AI Server م Ÿ .... + pTUser->Send2AI_UserUpdateInfo(); // AI Server에 바끤 데이타 전송.... /* Send Party Packet..... if (m_sPartyIndex != -1) { @@ -1950,7 +1950,7 @@ void CMagicProcess::ExecuteType5(int magicid, int sid, int tid, int data1, int d pTUser->SetSlotItemValue(); pTUser->SetUserAbility(); - pTUser->Send2AI_UserUpdateInfo(); // AI Server م Ÿ .... + pTUser->Send2AI_UserUpdateInfo(); // AI Server에 바끤 데이타 전송.... buff_test = 0; for (int i = 0; i < MAX_TYPE4_BUFF; i++) { @@ -2102,7 +2102,7 @@ void CMagicProcess::ExecuteType8(int magicid, int sid, int tid, int data1, int d continue; } - // 񷯸ӱ 븸 >.< + // 비러머글 대만 써비스 >.< _HOME_INFO * pHomeInfo = NULL; pHomeInfo = m_pMain->m_HomeArray.GetData(pTUser->m_pUserData->m_bNation); if (!pHomeInfo) { @@ -2179,12 +2179,12 @@ void CMagicProcess::ExecuteType8(int magicid, int sid, int tid, int data1, int d pTUser->Warp(send_buff); } } - // 񷯸ӱ 븸 >.< - else if (pTUser->m_pUserData->m_bZone == ZONE_BATTLE) { // --; + // 비러머글 대만 써비스 >.< + else if (pTUser->m_pUserData->m_bZone == ZONE_BATTLE) { // 전쟁존 --; SetShort(send_buff, (WORD)pHomeInfo->BattleZoneX * 10 + x, send_index); SetShort(send_buff, (WORD)pHomeInfo->BattleZoneZ * 10 + z, send_index); pTUser->Warp(send_buff); - } else if (pTUser->m_pUserData->m_bZone == ZONE_FRONTIER) { // ô --; + } else if (pTUser->m_pUserData->m_bZone == ZONE_FRONTIER) { // 개척존 --; SetShort(send_buff, (WORD)pHomeInfo->FreeZoneX * 10 + x, send_index); SetShort(send_buff, (WORD)pHomeInfo->FreeZoneZ * 10 + z, send_index); pTUser->Warp(send_buff); @@ -2486,7 +2486,7 @@ short CMagicProcess::GetMagicDamage(int sid, int tid, int total_hit, int attribu // } - damage = damage / 3; // û + damage = damage / 3; // 성래씨 요청 return damage; } @@ -2636,7 +2636,7 @@ BOOL CMagicProcess::UserRegionCheck(int sid, int tid, int magicid, int radius, s break; */ - // 񷯸ӱ Ƽ ȯ >.< + // 비러머글 전쟁존 파티 소환 >.< if (pTUser->m_sPartyIndex == -1) { if (sid == tid) { return TRUE; @@ -2677,7 +2677,7 @@ BOOL CMagicProcess::UserRegionCheck(int sid, int tid, int magicid, int radius, s goto final_test; } break; - // 񷯸ӱ Ŭ ȯ!!! + // 비러머글 클랜 소환!!! case MORAL_CLAN_ALL: if (pTUser->m_pUserData->m_bKnights == -1) { if (sid == tid) { @@ -2867,7 +2867,7 @@ void CMagicProcess::Type4Cancel(int magicid, short tid) { pTUser->m_bType4Buff[buff_type - 1] = 0; pTUser->SetSlotItemValue(); pTUser->SetUserAbility(); - pTUser->Send2AI_UserUpdateInfo(); // AI Server م Ÿ .... + pTUser->Send2AI_UserUpdateInfo(); // AI Server에 바끤 데이타 전송.... /* Send Party Packet..... if (m_sPartyIndex != -1) { diff --git a/src/server/Ebenezer/MagicTable.h b/src/server/Ebenezer/MagicTable.h index 7fe3343a..b19ed290 100644 --- a/src/server/Ebenezer/MagicTable.h +++ b/src/server/Ebenezer/MagicTable.h @@ -10,32 +10,32 @@ class CMagicTable { virtual ~CMagicTable(); public: - short m_sNum; // ȣ - char m_strName[30]; // ̸ - BYTE m_bMoral; // - BYTE m_bClass; // Ŭ - BYTE m_bLevel; // + short m_sNum; // 매직 번호 + char m_strName[30]; // 매직 이름 + BYTE m_bMoral; // 성향 + BYTE m_bClass; // 사용 클래스 + BYTE m_bLevel; // 레벨 제한 BYTE - m_bEffect; // ȿ(0:fire, 1:ice, 2:lightning, 3:magic, 4:disease, 5:poison, 6:light, 7:heal, 8:dagger, 9:sword, 10:mace, 11:spear, 12:polearm) - short m_sMp; // Ҹ - short m_sHp; // Ҹ - short m_sSt; // Ҹ - int m_iNItem; // ʿ () - short m_sDistant; // ðŸ - short m_sContime; // ӽð() - short m_sRepeat; // ð() - BYTE m_bExpect; // - BYTE m_bTarget; // Ÿ(0:Ÿ, 1:ڽ ݰ, 2:Ÿٰ ݰ, 3: ݰ, 4:Ʈ) - BYTE m_bRange; // ݰ + m_bEffect; // 효과(0:fire, 1:ice, 2:lightning, 3:magic, 4:disease, 5:poison, 6:light, 7:heal, 8:dagger, 9:sword, 10:mace, 11:spear, 12:polearm) + short m_sMp; // 소모량 + short m_sHp; // 소모량 + short m_sSt; // 소모량 + int m_iNItem; // 필요 아이템(사용시) + short m_sDistant; // 가시거리 + short m_sContime; // 지속시간(초) + short m_sRepeat; // 재사용 가능 시간(초) + BYTE m_bExpect; // 성공률 + BYTE m_bTarget; // 타겟(0:타겟, 1:자신의 반경, 2:타겟과 반경, 3:지점과 반경, 4:오브젝트) + BYTE m_bRange; // 반경 BYTE - m_bType; // Ÿ(0:, 1:ɷġȭ, 2:Ʈ̻, 3:׷Ⱥȯ, 4:ij Ʈ, 5:̵/ȯ, 6:ȣ, 7:ĵ, 8: Ÿ) - BYTE m_bRate1; // 1(Ҽ 1ڸ, 10 ؾ Ѵ.) - BYTE m_bVar1; // 뺯1 - BYTE m_bLimit1; // ų ġ1 - BYTE m_bRate2; // 2(Ҽ 1ڸ, 10 ؾ Ѵ.) - BYTE m_bVar2; // 뺯2 - BYTE m_bLimit2; // ų ġ2 - BYTE m_bRate3; // 3(Ҽ 1ڸ, 10 ؾ Ѵ.) - BYTE m_bVar3; // 뺯3 - BYTE m_bLimit3; // ų ġ3 + m_bType; // 타입(0:공격, 1:능력치변화, 2:콘트롤이상, 3:그래픽변환, 4:캐릭터 컨트롤, 5:순간이동/소환, 6:보호막, 7:캔슬매직, 8:전투 스타일) + BYTE m_bRate1; // 적용률1(소숫점 1자리, 즉 계산시 10으로 나누어 계산해야 한다.) + BYTE m_bVar1; // 적용변수1 + BYTE m_bLimit1; // 스킬 제한치1 + BYTE m_bRate2; // 적용률2(소숫점 1자리, 즉 계산시 10으로 나누어 계산해야 한다.) + BYTE m_bVar2; // 적용변수2 + BYTE m_bLimit2; // 스킬 제한치2 + BYTE m_bRate3; // 적용률3(소숫점 1자리, 즉 계산시 10으로 나누어 계산해야 한다.) + BYTE m_bVar3; // 적용변수3 + BYTE m_bLimit3; // 스킬 제한치3 }; diff --git a/src/server/Ebenezer/Map.cpp b/src/server/Ebenezer/Map.cpp index fd3bae53..88efe5b1 100644 --- a/src/server/Ebenezer/Map.cpp +++ b/src/server/Ebenezer/Map.cpp @@ -114,7 +114,7 @@ BOOL C3DMap::LoadMap(HANDLE hFile) { LogFileWrite("amp tile\r\n"); LoadMapTile(hFile); LogFileWrite("regene\r\n"); - LoadRegeneEvent(hFile); // ̰ ߽߰ + LoadRegeneEvent(hFile); // 이건 내가 추가했슴 LogFileWrite("warplist\r\n"); LoadWarpList(hFile); @@ -142,7 +142,7 @@ void C3DMap::LoadObjectEvent(HANDLE hFile) { for (int i = 0; i < iEventObjectCount; i++) { pEvent = new _OBJECT_EVENT; - ReadFile(hFile, &(pEvent->sBelong), 4, &dwNum, NULL); // Ҽ : 0 -> Ҽ + ReadFile(hFile, &(pEvent->sBelong), 4, &dwNum, NULL); // 소속 : 0 -> 무소속 ReadFile(hFile, &(pEvent->sIndex), 2, &dwNum, NULL); // Event Index ReadFile(hFile, &(pEvent->sType), 2, &dwNum, NULL); // 0 : bind point, 1,2 : gate, 3 : lever, 4 : flag lever, 5 : Warp point @@ -162,7 +162,7 @@ void C3DMap::LoadObjectEvent(HANDLE hFile) { pEvent = NULL; } - // TRACE (" û : %d , %d , %d , %d , %d \r\n", pEvent->sBelong, pEvent->sIndex, pEvent->sType, pEvent->sControlNpcID, pEvent->sStatus); + // TRACE ("성래 요청 : %d , %d , %d , %d , %d \r\n", pEvent->sBelong, pEvent->sIndex, pEvent->sType, pEvent->sControlNpcID, pEvent->sStatus); } } @@ -191,11 +191,11 @@ void C3DMap::LoadRegeneEvent(HANDLE hFile) { pEvent = new _REGENE_EVENT; pEvent->sRegenePoint = i; - ReadFile(hFile, &(pEvent->fRegenePosX), 4, &dwNum, NULL); // ij Ÿ ޾Ʒ ǥ X - ReadFile(hFile, &(pEvent->fRegenePosY), 4, &dwNum, NULL); // ij Ÿ ޾Ʒ ǥ Y - ReadFile(hFile, &(pEvent->fRegenePosZ), 4, &dwNum, NULL); // ij Ÿ ޾Ʒ ǥ Z - ReadFile(hFile, &(pEvent->fRegeneAreaZ), 4, &dwNum, NULL); // ij Ÿ Z - ReadFile(hFile, &(pEvent->fRegeneAreaX), 4, &dwNum, NULL); // ij Ÿ X + ReadFile(hFile, &(pEvent->fRegenePosX), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 왼아래쪽 구석 좌표 X + ReadFile(hFile, &(pEvent->fRegenePosY), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 왼아래쪽 구석 좌표 Y + ReadFile(hFile, &(pEvent->fRegenePosZ), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 왼아래쪽 구석 좌표 Z + ReadFile(hFile, &(pEvent->fRegeneAreaZ), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 Z 축 길이 + ReadFile(hFile, &(pEvent->fRegeneAreaX), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 X 축 길이 if (pEvent->sRegenePoint < 0) { continue; @@ -239,7 +239,7 @@ void C3DMap::LoadWarpList(HANDLE hFile) { void C3DMap::LoadTerrain(HANDLE hFile) { DWORD dwRWC; - ReadFile(hFile, &m_nMapSize, sizeof(int), &dwRWC, NULL); // μ ΰ? + ReadFile(hFile, &m_nMapSize, sizeof(int), &dwRWC, NULL); // 가로세로 정보가 몇개씩인가? ReadFile(hFile, &m_fUnitDist, sizeof(float), &dwRWC, NULL); m_fHeight = new float *[m_nMapSize]; @@ -250,7 +250,7 @@ void C3DMap::LoadTerrain(HANDLE hFile) { int x, z; for (z = 0; z < m_nMapSize; z++) { for (x = 0; x < m_nMapSize; x++) { - ReadFile(hFile, &(m_fHeight[x][z]), sizeof(float), &dwRWC, NULL); // ̰ о + ReadFile(hFile, &(m_fHeight[x][z]), sizeof(float), &dwRWC, NULL); // 높이값 읽어오기 } } } @@ -259,7 +259,7 @@ float C3DMap::GetHeight(float x, float y, float z) { int iX, iZ; iX = (int)(x / m_fUnitDist); iZ = (int)(z / m_fUnitDist); - //_ASSERT( iX, iZ ִ üũϱ); + //_ASSERT( iX, iZ가 범위내에 있는 값인지 체크하기); float fYTerrain; float h1, h2, h3; @@ -280,9 +280,9 @@ float C3DMap::GetHeight(float x, float y, float z) { //if (dX == 1.0f) return h2; - float h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - float h32 = h3 + (h2 - h3) * dX; // h3 h2 ̰ - fYTerrain = h32 + (h12 - h32) * ((dZ) / (1.0f - dX)); // ã ϴ ̰ + float h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + float h32 = h3 + (h2 - h3) * dX; // h3과 h2사이의 높이값 + fYTerrain = h32 + (h12 - h32) * ((dZ) / (1.0f - dX)); // 찾고자 하는 높이값 } else { h1 = m_fHeight[iX][iZ + 1]; h2 = m_fHeight[iX + 1][iZ]; @@ -292,9 +292,9 @@ float C3DMap::GetHeight(float x, float y, float z) { return h1; } - float h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - float h13 = h1 + (h3 - h1) * dX; // h1 h3 ̰ - fYTerrain = h13 + (h12 - h13) * ((1.0f - dZ) / (dX)); // ã ϴ ̰ + float h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + float h13 = h1 + (h3 - h1) * dX; // h1과 h3사이의 높이값 + fYTerrain = h13 + (h12 - h13) * ((1.0f - dZ) / (dX)); // 찾고자 하는 높이값 } } else { if (dZ > dX) { @@ -304,9 +304,9 @@ float C3DMap::GetHeight(float x, float y, float z) { //if (dX == 1.0f) return h2; - float h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - float h32 = h3 + (h2 - h3) * dX; // h3 h2 ̰ - fYTerrain = h12 + (h32 - h12) * ((1.0f - dZ) / (1.0f - dX)); // ã ϴ ̰ + float h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + float h32 = h3 + (h2 - h3) * dX; // h3과 h2사이의 높이값 + fYTerrain = h12 + (h32 - h12) * ((1.0f - dZ) / (1.0f - dX)); // 찾고자 하는 높이값 } else { h1 = m_fHeight[iX][iZ]; h2 = m_fHeight[iX + 1][iZ]; @@ -316,14 +316,14 @@ float C3DMap::GetHeight(float x, float y, float z) { return h1; } - float h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - float h13 = h1 + (h3 - h1) * dX; // h1 h3 ̰ - fYTerrain = h12 + (h13 - h12) * ((dZ) / (dX)); // ã ϴ ̰ + float h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + float h13 = h1 + (h3 - h1) * dX; // h1과 h3사이의 높이값 + fYTerrain = h12 + (h13 - h12) * ((dZ) / (dX)); // 찾고자 하는 높이값 } } __Vector3 vPos(x, y, z); - float fHeight = m_N3ShapeMgr.GetHeightNearstPos(vPos); // ̰ ش.. + float fHeight = m_N3ShapeMgr.GetHeightNearstPos(vPos); // 가장 가까운 높이값을 돌려준다.. if (-FLT_MAX != fHeight && fHeight > fYTerrain) { return fHeight; } else { diff --git a/src/server/Ebenezer/N3BASE/My_3DStruct.h b/src/server/Ebenezer/N3BASE/My_3DStruct.h index c3b927eb..5d931f5e 100644 --- a/src/server/Ebenezer/N3BASE/My_3DStruct.h +++ b/src/server/Ebenezer/N3BASE/My_3DStruct.h @@ -466,10 +466,10 @@ inline __Matrix44 __Matrix44::operator*(const D3DXMATRIX & mtx) { mtxTmp._43 = _41 * mtx._13 + _42 * mtx._23 + _43 * mtx._33 + _44 * mtx._43; mtxTmp._44 = _41 * mtx._14 + _42 * mtx._24 + _43 * mtx._34 + _44 * mtx._44; - // ȭ ڵ.. - // dino .. Ʒ ڵ 4° Ͽ Ȯ Ѵ. - // 4° (0, 0, 0, 1) matrix projection matrix - // (0, 0, 1, 0) matrix Ƿ ̻ ʷѴ. + // 최적화 된 코드.. + // dino 막음.. 아래 코드는 4번째 행들의 계산을 생략하여서 부정확한 계산을 한다. + // 보통 4번째 행이 (0, 0, 0, 1)인 matrix를 쓰지만 projection matrix의 경우 + // (0, 0, 1, 0)인 matrix를 쓰므로 이상한 결과를 초래한다. // mtxTmp._11 = _11 * mtx._11 + _12 * mtx._21 + _13 * mtx._31; // mtxTmp._12 = _11 * mtx._12 + _12 * mtx._22 + _13 * mtx._32; // mtxTmp._13 = _11 * mtx._13 + _12 * mtx._23 + _13 * mtx._33; @@ -518,9 +518,9 @@ inline void __Matrix44::operator*=(const D3DXMATRIX & mtx) { _43 = mtxTmp._41 * mtx._13 + mtxTmp._42 * mtx._23 + mtxTmp._43 * mtx._33 + mtxTmp._44 * mtx._43; _44 = mtxTmp._41 * mtx._14 + mtxTmp._42 * mtx._24 + mtxTmp._43 * mtx._34 + mtxTmp._44 * mtx._44; - // dino .. Ʒ ڵ 4° Ͽ Ȯ Ѵ. - // 4° (0, 0, 0, 1) matrix projection matrix - // (0, 0, 1, 0) matrix Ƿ ̻ ʷѴ. + // dino 막음.. 아래 코드는 4번째 행들의 계산을 생략하여서 부정확한 계산을 한다. + // 보통 4번째 행이 (0, 0, 0, 1)인 matrix를 쓰지만 projection matrix의 경우 + // (0, 0, 1, 0)인 matrix를 쓰므로 이상한 결과를 초래한다. // _11 = mtxTmp._11 * mtx._11 + mtxTmp._12 * mtx._21 + mtxTmp._13 * mtx._31; // _12 = mtxTmp._11 * mtx._12 + mtxTmp._12 * mtx._22 + mtxTmp._13 * mtx._32; // _13 = mtxTmp._11 * mtx._13 + mtxTmp._12 * mtx._23 + mtxTmp._13 * mtx._33; @@ -677,21 +677,21 @@ const DWORD FVF_XYZNORMALCOLORT1 = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | const DWORD RF_NOTHING = 0x0; const DWORD RF_ALPHABLENDING = 0x1; // Alpha blending -const DWORD RF_NOTUSEFOG = 0x2; // Ȱ -const DWORD RF_DOUBLESIDED = 0x4; // - D3DCULL_NONE -const DWORD RF_BOARD_Y = 0x8; // Y ؼ.. ī޶ . -const DWORD RF_POINTSAMPLING = 0x10; // MipMap .. PointSampling Ѵ.. -const DWORD RF_WINDY = 0x20; // ٶ .. ٶ CN3Base::s_vWindFactor Ѵ.. +const DWORD RF_NOTUSEFOG = 0x2; // 안개 무시 +const DWORD RF_DOUBLESIDED = 0x4; // 양면 - D3DCULL_NONE +const DWORD RF_BOARD_Y = 0x8; // Y 축으로 해서.. 카메라를 본다. +const DWORD RF_POINTSAMPLING = 0x10; // MipMap 에서.. PointSampling 으로 한다.. +const DWORD RF_WINDY = 0x20; // 바람에 날린다.. 바람의 값은 CN3Base::s_vWindFactor 를 참조 한다.. const DWORD RF_NOTUSELIGHT = 0x40; // Light Off -const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse ϰ Alpha blending -const DWORD RF_NOTZWRITE = 0x100; // ZBuffer Ⱦ. +const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse 값을 갖고 투명하게 Alpha blending +const DWORD RF_NOTZWRITE = 0x100; // ZBuffer 에 안쓴다. struct __Material : public _D3DMATERIAL9 { public: DWORD dwColorOp, dwColorArg1, dwColorArg2; - BOOL nRenderFlags; // 1-AlphaBlending | 2-Ȱ | 4-Double Side | 8- ?? - DWORD dwSrcBlend; // ҽ - DWORD dwDestBlend; // Ʈ + BOOL nRenderFlags; // 1-AlphaBlending | 2-안개랑 관계없음 | 4-Double Side | 8- ?? + DWORD dwSrcBlend; // 소스 블렌딩 방법 + DWORD dwDestBlend; // 데스트 블렌딩 방법 public: void Init(const _D3DCOLORVALUE & diffuseColor) { @@ -711,7 +711,7 @@ struct __Material : public _D3DMATERIAL9 { dwDestBlend = D3DBLEND_INVSRCALPHA; } - void Init() // ⺻ .. + void Init() // 기본 흰색으로 만든다.. { D3DCOLORVALUE crDiffuse = {1.0f, 1.0f, 1.0f, 1.0f}; this->Init(crDiffuse); @@ -878,7 +878,7 @@ struct __VertexT2 : public __VertexT1 { struct __VertexTransformed : public __Vector3 { public: float rhw; - D3DCOLOR color; // ʿ .. + D3DCOLOR color; // 필요 없다.. float tu, tv; public: @@ -1203,7 +1203,7 @@ struct __VertexXyzNormalColor : public __Vector3 { } }; -const int MAX_MIPMAP_COUNT = 10; // 1024 * 1024 ܰ +const int MAX_MIPMAP_COUNT = 10; // 1024 * 1024 단계까지 생성 const DWORD OBJ_UNKNOWN = 0; const DWORD OBJ_BASE = 0x1; @@ -1324,7 +1324,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir static __Vector3 Vertices[36]; int nFace = 0; - // z + // z 축 음의 면 nFace = 0; Vertices[nFace + 0].Set(vMin.x, vMax.y, vMin.z); Vertices[nFace + 1].Set(vMax.x, vMax.y, vMin.z); @@ -1333,7 +1333,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMin.x, vMin.y, vMin.z); - // x + // x 축 양의 면 nFace = 6; Vertices[nFace + 0].Set(vMax.x, vMax.y, vMin.z); Vertices[nFace + 1].Set(vMax.x, vMax.y, vMax.z); @@ -1342,7 +1342,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMax.x, vMin.y, vMin.z); - // z + // z 축 양의 면 nFace = 12; Vertices[nFace + 0].Set(vMax.x, vMax.y, vMax.z); Vertices[nFace + 1].Set(vMin.x, vMax.y, vMax.z); @@ -1351,7 +1351,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMax.x, vMin.y, vMax.z); - // x + // x 축 음의 면 nFace = 18; Vertices[nFace + 0].Set(vMin.x, vMax.y, vMax.z); Vertices[nFace + 1].Set(vMin.x, vMax.y, vMin.z); @@ -1360,7 +1360,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMin.x, vMin.y, vMax.z); - // y + // y 축 양의 면 nFace = 24; Vertices[nFace + 0].Set(vMin.x, vMax.y, vMax.z); Vertices[nFace + 1].Set(vMax.x, vMax.y, vMax.z); @@ -1369,7 +1369,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMin.x, vMax.y, vMin.z); - // y + // y 축 음의 면 nFace = 30; Vertices[nFace + 0].Set(vMin.x, vMin.y, vMin.z); Vertices[nFace + 1].Set(vMax.x, vMin.y, vMin.z); @@ -1378,7 +1378,7 @@ inline bool _CheckCollisionByBox(const __Vector3 & vOrig, const __Vector3 & vDir Vertices[nFace + 4] = Vertices[nFace + 2]; Vertices[nFace + 5].Set(vMin.x, vMin.y, vMax.z); - // 鿡 ؼ 浹 ˻.. + // 각 면에 대해서 충돌 검사.. for (int i = 0; i < 12; i++) { if (true == ::_IntersectTriangle(vOrig, vDir, Vertices[i * 3 + 0], Vertices[i * 3 + 1], Vertices[i * 3 + 2])) { return true; @@ -1401,7 +1401,7 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, __Vector3 pVec; float fDet; - // By : Ecli666 ( On 2001-09-12 10:39:01 ) + // By : Ecli666 ( On 2001-09-12 오전 10:39:01 ) pVec.Cross(vEdge1, vEdge2); fDet = pVec.Dot(vDir); @@ -1409,13 +1409,13 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, return FALSE; } - // ~(By Ecli666 On 2001-09-12 10:39:01 ) + // ~(By Ecli666 On 2001-09-12 오전 10:39:01 ) pVec.Cross(vDir, vEdge2); // If determinant is near zero, ray lies in plane of triangle fDet = vEdge1.Dot(pVec); - if (fDet < 0.0001f) { // 0 ﰢ ϴ. + if (fDet < 0.0001f) { // 거의 0에 가까우면 삼각형 평면과 지나가는 선이 평행하다. return FALSE; } @@ -1445,17 +1445,17 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, fU *= fInvDet; fV *= fInvDet; - // t Ŭ ָ ִ. - // t*dir + orig ϸ ִ. - // u v ǹ̴ ϱ? - // : v0 (0,0), v1(1,0), v2(0,1) <ȣ (U, V)ǥ> ̷ Ÿ + // t가 클수록 멀리 직선과 평면과 만나는 점이 멀다. + // t*dir + orig 를 구하면 만나는 점을 구할 수 있다. + // u와 v의 의미는 무엇일까? + // 추측 : v0 (0,0), v1(1,0), v2(0,1) <괄호안은 (U, V)좌표> 이런식으로 어느 점에 가깝나 나타낸 것 같음 // if (pVCol) { - (*pVCol) = vOrig + (vDir * fT); // .. + (*pVCol) = vOrig + (vDir * fT); // 접점을 계산.. } - // *t < 0 ̸ ... + // *t < 0 이면 뒤쪽... if (fT < 0.0f) { return FALSE; } @@ -1473,7 +1473,7 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, vEdge1 = v1 - v0; vEdge2 = v2 - v0; - // By : Ecli666 ( On 2001-09-12 10:39:01 ) + // By : Ecli666 ( On 2001-09-12 오전 10:39:01 ) pVec.Cross(vEdge1, vEdge2); fDet = pVec.Dot(vDir); @@ -1481,13 +1481,13 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, return FALSE; } - // ~(By Ecli666 On 2001-09-12 10:39:01 ) + // ~(By Ecli666 On 2001-09-12 오전 10:39:01 ) pVec.Cross(vDir, vEdge2); // If determinant is near zero, ray lies in plane of triangle fDet = vEdge1.Dot(pVec); - if (fDet < 0.0001f) { // 0 ﰢ ϴ. + if (fDet < 0.0001f) { // 거의 0에 가까우면 삼각형 평면과 지나가는 선이 평행하다. return FALSE; } @@ -1512,7 +1512,7 @@ inline bool _IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, // Calculate t, scale parameters, ray intersects triangle fT = D3DXVec3Dot(&vEdge2, &qVec) / fDet; - // *t < 0 ̸ ... + // *t < 0 이면 뒤쪽... if (fT < 0.0f) { return FALSE; } @@ -1562,7 +1562,7 @@ inline void _Convert2D_To_3DCoordinate(int ixScreen, int iyScreen, const __Matri inline float _Yaw2D(float fDirX, float fDirZ) { //////////////////////////////// - // ϰ.. -> ȸ ϴ ƾ̴.. + // 방향을 구하고.. -> 회전할 값을 구하는 루틴이다.. if (fDirX >= 0.0f) // ^^ { if (fDirZ >= 0.0f) { @@ -1577,7 +1577,7 @@ inline float _Yaw2D(float fDirX, float fDirZ) { return (D3DXToRadian(180.0f) + (float)(asin(-fDirX))); } } - // ϰ.. + // 방향을 구하고.. //////////////////////////////// } @@ -1596,7 +1596,7 @@ inline short int _IsKeyDowned(int iVirtualKey) { return (GetAsyncKeyState(iVirtualKey) & 0x00ff); } -//macro.. -> Template ٲ.. +//macro.. -> Template 로 바꿨다.. template const T T_Max(const T a, const T b) { return ((a > b) ? b : a); } diff --git a/src/server/Ebenezer/N3BASE/N3ShapeMgr.cpp b/src/server/Ebenezer/N3BASE/N3ShapeMgr.cpp index 9b9789e3..3f2811f5 100644 --- a/src/server/Ebenezer/N3BASE/N3ShapeMgr.cpp +++ b/src/server/Ebenezer/N3BASE/N3ShapeMgr.cpp @@ -73,7 +73,7 @@ void CN3ShapeMgr::Release() { #endif // end of #ifndef _3DSERVER #ifdef _N3TOOL - m_CollisionExtras.clear(); // ߰ 浹üũ + m_CollisionExtras.clear(); // 추가로 넣을 충돌체크 데이터 #endif // end of #ifedef _N3TOOL } @@ -99,7 +99,7 @@ bool CN3ShapeMgr::Load(HANDLE hFile) { } #ifdef _N3GAME - CUILoading * pUILoading = CGameProcedure::s_pUILoading; // ε.. + CUILoading * pUILoading = CGameProcedure::s_pUILoading; // 로딩바.. #endif // end of #ifndef _N3GAME char szBuff[128]; @@ -117,34 +117,34 @@ bool CN3ShapeMgr::Load(HANDLE hFile) { for (int i = 0; i < iSC; i++) { ReadFile(hFile, &dwType, 4, &dwRWC, NULL); // Shape Type if (dwType & OBJ_SHAPE_EXTRA) { - pShape = new CN3ShapeExtra(); // Ȯ Object .. + pShape = new CN3ShapeExtra(); // 성문등 확장된 Object 로 쓸경우.. } else { pShape = new CN3Shape(); } m_Shapes.push_back(pShape); - // pShape->m_iEventID; ε Ʈ 100~, 200~ 1100~, 1200~ 2100~, 2200~ - // pShape->m_iEventType; 0-εƮ 1-(¿쿭) 2-(Ͽ) 3-(ϴ) - // pShape->m_iNPC_ID; Object ID + // pShape->m_iEventID; 바인드 포인트 100~, 200~ 성문 1100~, 1200~ 레버 2100~, 2200~ + // pShape->m_iEventType; 0-바인드포인트 1-성문(좌우열림) 2-성문(상하열림) 3-레버(상하당김) + // pShape->m_iNPC_ID; 조종할 Object ID // pShape->m_iNPC_Status; toggle 0, 1 pShape->Load(hFile); - if (pShape->m_iEventID) // ID ִ Ʈ ... NPC ִ.. + if (pShape->m_iEventID) // ID 가 있는 오브젝트 ... NPC 로 쓸수 있다.. { m_ShapesHaveID.push_back(pShape); - pShape->MakeCollisionMeshByParts(); // ״... 浹 ޽ø ... + pShape->MakeCollisionMeshByParts(); // 현재 모습 그대로... 충돌 메시를 만든다... TRACE(" Load OBject Event : ID(%d) Type(%d) CtrlID(%d) Status(%d)\n", pShape->m_iEventID, pShape->m_iEventType, pShape->m_iNPC_ID, pShape->m_iNPC_Status); } #ifdef _N3GAME - // ڵ... .. + // 강제 코딩... 각종 성문 열기.. // if(dwType & OBJ_SHAPE_EXTRA) // { - // CN3ShapeExtra* pSE = (CN3ShapeExtra*)pShape; // Ȯ Object .. - // pSE->RotateTo(0, __Vector3(0,1,0), 80, 1, true); // ٷ . - // pSE->RotateTo(1, __Vector3(0,1,0), -80, 1, true); // ٷ . + // CN3ShapeExtra* pSE = (CN3ShapeExtra*)pShape; // 성문등 확장된 Object 로 쓸경우.. + // pSE->RotateTo(0, __Vector3(0,1,0), 80, 1, true); // 바로 열기. + // pSE->RotateTo(1, __Vector3(0,1,0), -80, 1, true); // 바로 열기. // } if (!(i % 64)) { @@ -167,7 +167,7 @@ bool CN3ShapeMgr::LoadCollisionData(HANDLE hFile) { ReadFile(hFile, &m_fMapLength, 4, &dwRWC, NULL); // Shape Count this->Create(m_fMapWidth, m_fMapLength); - // 浹 üũ б.. + // 충돌 체크 폴리곤 데이터 읽기.. ReadFile(hFile, &m_nCollisionFaceCount, 4, &dwRWC, NULL); delete[] m_pvCollisions; m_pvCollisions = NULL; @@ -176,7 +176,7 @@ bool CN3ShapeMgr::LoadCollisionData(HANDLE hFile) { ReadFile(hFile, m_pvCollisions, sizeof(__Vector3) * m_nCollisionFaceCount * 3, &dwRWC, NULL); } - // Cell Data . + // Cell Data 쓰기. BOOL bExist = FALSE; int z = 0; for (float fZ = 0.0f; fZ < m_fMapLength; fZ += CELL_MAIN_SIZE, z++) { @@ -185,7 +185,7 @@ bool CN3ShapeMgr::LoadCollisionData(HANDLE hFile) { delete m_pCells[x][z]; m_pCells[x][z] = NULL; - ReadFile(hFile, &bExist, 4, &dwRWC, NULL); // Ͱ ִ .. + ReadFile(hFile, &bExist, 4, &dwRWC, NULL); // 데이터가 있는 셀인지 쓰고.. if (FALSE == bExist) { continue; } @@ -214,12 +214,12 @@ bool CN3ShapeMgr::Save(HANDLE hFile) { dwType = m_Shapes[i]->Type(); if (m_Shapes[i]->m_iEventID || m_Shapes[i]->m_iEventType || m_Shapes[i]->m_iNPC_ID || m_Shapes[i]->m_iNPC_Status) { - dwType |= OBJ_SHAPE_EXTRA; // NPC ID .. Ȯ Shape ... + dwType |= OBJ_SHAPE_EXTRA; // NPC ID 가 있으면.. 확장 Shape 로 ... } WriteFile(hFile, &dwType, 4, &dwRWC, NULL); // Shape Type - m_Shapes[i]->CollisionMeshSet(""); // 浹 ޽ô ش.. - m_Shapes[i]->ClimbMeshSet(""); // 浹 ޽ô ش.. + m_Shapes[i]->CollisionMeshSet(""); // 충돌 메시는 지워준다.. + m_Shapes[i]->ClimbMeshSet(""); // 충돌 메시는 지워준다.. m_Shapes[i]->Save(hFile); } #endif // end of #ifndef _3DSERVER @@ -231,16 +231,16 @@ bool CN3ShapeMgr::Save(HANDLE hFile) { bool CN3ShapeMgr::SaveCollisionData(HANDLE hFile) { DWORD dwRWC; - WriteFile(hFile, &m_fMapWidth, 4, &dwRWC, NULL); // ʺ - WriteFile(hFile, &m_fMapLength, 4, &dwRWC, NULL); // + WriteFile(hFile, &m_fMapWidth, 4, &dwRWC, NULL); // 맵 실제 미터 단위 너비 + WriteFile(hFile, &m_fMapLength, 4, &dwRWC, NULL); // 맵 실제 미터 단위 길이 - // 浹 üũ .. + // 충돌 체크 폴리곤 데이터 쓰기.. WriteFile(hFile, &m_nCollisionFaceCount, 4, &dwRWC, NULL); if (m_nCollisionFaceCount > 0) { WriteFile(hFile, m_pvCollisions, sizeof(__Vector3) * m_nCollisionFaceCount * 3, &dwRWC, NULL); } - // Cell Data . + // Cell Data 쓰기. int z = 0; for (float fZ = 0.0f; fZ < m_fMapLength; fZ += CELL_MAIN_SIZE, z++) { int x = 0; @@ -249,7 +249,7 @@ bool CN3ShapeMgr::SaveCollisionData(HANDLE hFile) { if (m_pCells[x][z]) { bExist = TRUE; } - WriteFile(hFile, &bExist, 4, &dwRWC, NULL); // Ͱ ִ .. + WriteFile(hFile, &bExist, 4, &dwRWC, NULL); // 데이터가 있는 셀인지 쓰고.. if (NULL == m_pCells[x][z]) { continue; @@ -263,7 +263,7 @@ bool CN3ShapeMgr::SaveCollisionData(HANDLE hFile) { } #endif // end of _N3TOOL -bool CN3ShapeMgr::Create(float fMapWidth, float fMapLength) // ʺ ̸ ִ´.. +bool CN3ShapeMgr::Create(float fMapWidth, float fMapLength) // 맵의 너비와 높이를 미터 단위로 넣는다.. { if (fMapWidth <= 0.0f || fMapWidth > MAX_CELL_MAIN * CELL_MAIN_SIZE || fMapLength <= 0.0f || fMapLength > MAX_CELL_MAIN * CELL_MAIN_SIZE) { @@ -279,7 +279,7 @@ bool CN3ShapeMgr::SaveCollisionData(HANDLE hFile) { #ifdef _N3TOOL void CN3ShapeMgr::GenerateCollisionData() { int nFC = 0, iSC = m_Shapes.size(); - for (int i = 0; i < iSC; i++) // Shape ִ 浹 ޽ ŭ . + for (int i = 0; i < iSC; i++) // Shape 에 있는 충돌 메시 만큼 생성. { CN3VMesh * pVM = m_Shapes[i]->CollisionMesh(); if (NULL == pVM) { @@ -294,7 +294,7 @@ void CN3ShapeMgr::GenerateCollisionData() { } } - nFC += m_CollisionExtras.size() / 3; // ߰ 浹 .. + nFC += m_CollisionExtras.size() / 3; // 추가 충돌 데이터.. if (nFC <= 0) { return; @@ -303,11 +303,11 @@ void CN3ShapeMgr::GenerateCollisionData() { m_nCollisionFaceCount = nFC; delete[] m_pvCollisions; m_pvCollisions = NULL; - m_pvCollisions = new __Vector3[nFC * 3]; // 浹 + m_pvCollisions = new __Vector3[nFC * 3]; // 충돌 폴리곤 생성 memset(m_pvCollisions, 0, sizeof(__Vector3) * nFC * 3); int nCPC = 0; // Collision Polygon Count - for (int i = 0; i < iSC; i++) // Shape ִ 浹 ޽ ŭ .. + for (int i = 0; i < iSC; i++) // Shape 에 있는 충돌 메시 만큼 데이터 복사.. { CN3VMesh * pVMesh = m_Shapes[i]->CollisionMesh(); if (NULL == pVMesh) { @@ -318,17 +318,17 @@ void CN3ShapeMgr::GenerateCollisionData() { if (nIC > 0) { WORD * pwIs = pVMesh->Indices(); for (int j = 0; j < nIC; j++) { - m_pvCollisions[nCPC++] = pVSrc[pwIs[j]] * m_Shapes[i]->m_Matrix; // ġ̴. + m_pvCollisions[nCPC++] = pVSrc[pwIs[j]] * m_Shapes[i]->m_Matrix; // 월드 위치이다. } } else { int nVC = pVMesh->VertexCount(); for (int j = 0; j < nVC; j++) { - m_pvCollisions[nCPC++] = pVSrc[j] * m_Shapes[i]->m_Matrix; // ġ̴. + m_pvCollisions[nCPC++] = pVSrc[j] * m_Shapes[i]->m_Matrix; // 월드 위치이다. } } } - // ߰ 浹 ֱ.. + // 추가 충돌 데이터 넣기.. it_Vector3 it = m_CollisionExtras.begin(), itEnd = m_CollisionExtras.end(); for (; it != itEnd; it++) { m_pvCollisions[nCPC++] = *it; @@ -336,14 +336,14 @@ void CN3ShapeMgr::GenerateCollisionData() { if (nCPC != (nFC * 3)) { #ifdef _N3GAME - CLogWriter::Write("CN3ShapeMgr::GenerateCollisionData - 浹 üũ ٸϴ. (%s)", + CLogWriter::Write("CN3ShapeMgr::GenerateCollisionData - 충돌 체크 폴리곤의 점갯수와 면 갯수가 다릅니다. (%s)", m_szFileName.c_str()); #endif this->Release(); return; } - // ִ Ȥ ԵǾ ִ Ǵؼ ε Ѵ. + // 각 선분이 셀에 걸쳐 있는지 혹은 포함되어 있는지 등등 판단해서 인덱스 생성을 한다. int xSMax = (int)(m_fMapWidth / CELL_SUB_SIZE); int zSMax = (int)(m_fMapLength / CELL_SUB_SIZE); for (int i = 0; i < nFC; i++) { @@ -356,9 +356,9 @@ void CN3ShapeMgr::GenerateCollisionData() { vEdge[2][0] = m_pvCollisions[i * 3 + 2]; vEdge[2][1] = m_pvCollisions[i * 3]; - for (int j = 0; j < 3; j++) // ִ ޽ ŭ ... + for (int j = 0; j < 3; j++) // 걸쳐 있는 메시 만큼 생성... { - // ϰ.. + // 범위를 정하고.. int xx1 = 0, xx2 = 0, zz1 = 0, zz2 = 0; if (vEdge[j][0].x < vEdge[j][1].x) { @@ -403,7 +403,7 @@ void CN3ShapeMgr::GenerateCollisionData() { zz2 = zSMax - 1; } - for (int z = zz1; z <= zz2; z++) // ŭ ó.. + for (int z = zz1; z <= zz2; z++) // 범위만큼 처리.. { float fZMin = (float)(z * CELL_SUB_SIZE); float fZMax = (float)((z + 1) * CELL_SUB_SIZE); @@ -440,24 +440,24 @@ void CN3ShapeMgr::GenerateCollisionData() { bool bWriteID = false; if (dwOC0 & dwOC1) { - bWriteID = false; // ܺο ִ. + bWriteID = false; // 두 끝점이 같은 변의 외부에 있다. } else if (dwOC0 == 0 && dwOC1 == 0) { - bWriteID = true; // 簢 ο + bWriteID = true; // 선분이 사각형 내부에 있음 } else if ((dwOC0 == 0 && dwOC1 != 0) || (dwOC0 != 0 && dwOC1 == 0)) { - bWriteID = true; // ο ܺο . - } else if ((dwOC0 & dwOC1) == 0) // L ܺο Ǵ ٽ ؾ Ѵ. + bWriteID = true; // 선분 한점은 셀의 내부에 한점은 외부에 있음. + } else if ((dwOC0 & dwOC1) == 0) // 두 꿑점 모두 셀 외부에 있지만 판단을 다시 해야 한다. { float fXCross = vEdge[j][0].x + (fZMax - vEdge[j][0].z) * (vEdge[j][1].x - vEdge[j][0].x) / - (vEdge[j][1].z - vEdge[j][0].z); // ϰ.. + (vEdge[j][1].z - vEdge[j][0].z); // 위의 변과의 교차점을 계산하고.. if (fXCross < fXMin) { - bWriteID = false; // ܰ ִ. + bWriteID = false; // 완전히 외곽에 있다. } else { - bWriteID = true; // óִ. + bWriteID = true; // 걸처있다. } } - if (false == bWriteID) // ɸ ٸ... Ƽ 浹 üũѴ. + if (false == bWriteID) // 만약 걸린게 없다면... 위에서 직선을 쏘아서 충돌인지 체크한다. { __Vector3 vPos, vDir; vDir.Set(0, -1.0f, 0); @@ -467,19 +467,19 @@ void CN3ShapeMgr::GenerateCollisionData() { for (float fX = xx3; fX <= xx4 && false == bWriteID; fX += 0.25f) { vPos.Set(fX, 10000.0f, fZ); if (::_IntersectTriangle(vPos, vDir, m_pvCollisions[i * 3], m_pvCollisions[i * 3 + 1], - m_pvCollisions[i * 3 + 2])) // 浹 üũ.. + m_pvCollisions[i * 3 + 2])) // 폴리곤 충돌 체크.. { - bWriteID = true; // 浹 ε .. + bWriteID = true; // 충돌 폴리곤 인덱스를 쓰게 만든다.. } } } } if (false == bWriteID) { - continue; // 浹 .. + continue; // 충돌 폴리곤 쓸일 없소.. } - // 浹 Ѵ.. + // 충돌 정보를 써야 한다.. int nX = x / CELL_MAIN_DEVIDE; int nZ = z / CELL_MAIN_DEVIDE; if (nX < 0 || nX >= MAX_CELL_MAIN || nZ < 0 && nZ >= MAX_CELL_MAIN) { @@ -497,7 +497,7 @@ void CN3ShapeMgr::GenerateCollisionData() { int nCCPC = pSubCell->nCCPolyCount; // Collision Check Polygon Count bool bOverlapped = false; - for (int k = 0; k < nCCPC; k++) // ߺ Ǵ üũ + for (int k = 0; k < nCCPC; k++) // 중복 되는지 체크 { if (i * 3 == pSubCell->pdwCCVertIndices[k * 3]) { bOverlapped = true; @@ -506,38 +506,38 @@ void CN3ShapeMgr::GenerateCollisionData() { } if (true == bOverlapped) { - continue; // ģ ִ üũ + continue; // 겹친게 있는지 체크 } - // ߺȰ .. - if (0 == nCCPC) // ÷ Ǿ.. + // 중복된게 없으면.. + if (0 == nCCPC) // 첨 생성 되었으면.. { pSubCell->pdwCCVertIndices = new DWORD[768]; memset(pSubCell->pdwCCVertIndices, 0, 768 * 4); } - // else // ̹ .. + // else // 이미 있으면.. // { // DWORD* pwBack = pSubCell->pdwCCVertIndices; // pSubCell->pdwCCVertIndices = new DWORD[(nCCPC+1)*3]; - // memcpy(pSubCell->pdwCCVertIndices, pwBack, nCCPC * 3 * 4); // ϳ ̰ ε̹Ƿ.. + // memcpy(pSubCell->pdwCCVertIndices, pwBack, nCCPC * 3 * 4); // 점세개가 하나의 폴리곤이고 워드 인덱스이므로.. // delete [] pwBack; // } if (nCCPC >= 256) { #ifdef _N3GAME CLogWriter::Write( - "CN3ShapeMgr::GenerateCollisionData - 浹 üũ ʹ ϴ. (%s)", + "CN3ShapeMgr::GenerateCollisionData - 충돌 체크 폴리곤 수가 너무 많습니다. (%s)", m_szFileName.c_str()); #endif continue; } - pSubCell->pdwCCVertIndices[nCCPC * 3 + 0] = i * 3 + 0; // ε .. - pSubCell->pdwCCVertIndices[nCCPC * 3 + 1] = i * 3 + 1; // ε .. - pSubCell->pdwCCVertIndices[nCCPC * 3 + 2] = i * 3 + 2; // ε .. - pSubCell->nCCPolyCount++; // Collision Check Polygon Count ø. + pSubCell->pdwCCVertIndices[nCCPC * 3 + 0] = i * 3 + 0; // 인덱스 저장.. + pSubCell->pdwCCVertIndices[nCCPC * 3 + 1] = i * 3 + 1; // 인덱스 저장.. + pSubCell->pdwCCVertIndices[nCCPC * 3 + 2] = i * 3 + 2; // 인덱스 저장.. + pSubCell->nCCPolyCount++; // Collision Check Polygon Count 를 늘린다. } // end of for(int x = xx1; x <= xx2; x++) - } // end of for(int z = zz1; z <= zz2; z++) // ŭ ó.. - } // end of for(int j = 0; j < 3; j++) // ִ ޽ ŭ ... + } // end of for(int z = zz1; z <= zz2; z++) // 범위만큼 처리.. + } // end of for(int j = 0; j < 3; j++) // 걸쳐 있는 메시 만큼 생성... } } #endif // end of _N3TOOL @@ -557,9 +557,9 @@ int CN3ShapeMgr::Add(CN3Shape * pShape) { return -1; } - pShape->SaveToFile(); // Ϸ ϰ.. + pShape->SaveToFile(); // 파일로 저장하고.. CN3Shape * pShapeAdd = new CN3Shape(); - if (false == pShapeAdd->LoadFromFile(pShape->FileName())) // + if (false == pShapeAdd->LoadFromFile(pShape->FileName())) // 이 파일을 열은 다음 { delete pShapeAdd; return -1; @@ -570,10 +570,10 @@ int CN3ShapeMgr::Add(CN3Shape * pShape) { } int iSC = m_pCells[nX][nZ]->nShapeCount; - if (0 == iSC) // ÷ Ǿ.. + if (0 == iSC) // 첨 생성 되었으면.. { m_pCells[nX][nZ]->pwShapeIndices = new WORD[iSC + 1]; - } else // ̹ .. + } else // 이미 있으면.. { WORD * pwBack = m_pCells[nX][nZ]->pwShapeIndices; m_pCells[nX][nZ]->pwShapeIndices = new WORD[iSC + 1]; @@ -581,10 +581,10 @@ int CN3ShapeMgr::Add(CN3Shape * pShape) { delete[] pwBack; } - m_pCells[nX][nZ]->pwShapeIndices[iSC] = m_Shapes.size(); // ε .. + m_pCells[nX][nZ]->pwShapeIndices[iSC] = m_Shapes.size(); // 인덱스 저장.. - m_Shapes.push_back(pShapeAdd); // ߰ Ѵ.. - m_pCells[nX][nZ]->nShapeCount++; // Shape Count ø. + m_Shapes.push_back(pShapeAdd); // 추가 한다.. + m_pCells[nX][nZ]->nShapeCount++; // Shape Count 를 늘린다. return m_Shapes.size() - 1; } @@ -593,9 +593,9 @@ int CN3ShapeMgr::Add(CN3Shape * pShape) { #ifdef _N3TOOL bool CN3ShapeMgr::AddCollisionTriangle(const __Vector3 & v1, const __Vector3 & v2, const __Vector3 & v3) { int count = m_CollisionExtras.size(); - m_CollisionExtras.push_back(v1); // ߰ 浹üũ - m_CollisionExtras.push_back(v2); // ߰ 浹üũ - m_CollisionExtras.push_back(v3); // ߰ 浹üũ + m_CollisionExtras.push_back(v1); // 추가로 넣을 충돌체크 데이터 + m_CollisionExtras.push_back(v2); // 추가로 넣을 충돌체크 데이터 + m_CollisionExtras.push_back(v3); // 추가로 넣을 충돌체크 데이터 if ((count + 3) == m_CollisionExtras.size()) { return true; @@ -649,7 +649,7 @@ void CN3ShapeMgr::Tick() { __CellMain * pCellCur = NULL; m_ShapesToRender.clear(); - // Ʈ .. + // 렌더링 리스트 비우고.. for (int zM = zMainS; zM < zMainE; zM++) { for (int xM = xMainS; xM < xMainE; xM++) { @@ -690,21 +690,21 @@ void CN3ShapeMgr::Render() { } #endif // end of #ifndef _3DSERVER -bool CN3ShapeMgr::CheckCollision(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol, // 浹 - __Vector3 * pvNormal, // 浹Ѹ - __Vector3 * pVec) // 浹 __Vector3[3] +bool CN3ShapeMgr::CheckCollision(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol, // 충돌 지점 + __Vector3 * pvNormal, // 충돌한면의 법선벡터 + __Vector3 * pVec) // 충돌한 면 의 폴리곤 __Vector3[3] { if (fSpeedPerSec <= 0) { - return false; // ̴ ӵ ų ݴ ̸ Ѿ.. + return false; // 움직이는 속도가 없거나 반대로 움직이면 넘어간다.. } static __CellSub * ppCells[128]; - __Vector3 vPosNext = vPos + (vDir * fSpeedPerSec); // ġ - int nSubCellCount = this->SubCellPathThru(vPos, vPosNext, ppCells); // ϴ 꼿 ´.. + __Vector3 vPosNext = vPos + (vDir * fSpeedPerSec); // 다음 위치 + int nSubCellCount = this->SubCellPathThru(vPos, vPosNext, ppCells); // 통과하는 서브셀을 가져온다.. if (nSubCellCount <= 0 || nSubCellCount > 128) { - return false; // . + return false; // 없음 말자. } __Vector3 vColTmp(0, 0, 0); @@ -728,10 +728,10 @@ void CN3ShapeMgr::Render() { } if (false == ::_IntersectTriangle(vPosNext, vDir, m_pvCollisions[nIndex0], m_pvCollisions[nIndex1], m_pvCollisions[nIndex2])) { - fDistTmp = (vPos - vColTmp).Magnitude(); // Ÿ 纸.. + fDistTmp = (vPos - vColTmp).Magnitude(); // 거리를 재보고.. if (fDistTmp < fDistClosest) { fDistClosest = fDistTmp; - // 浹̴.. + // 충돌이다.. if (pvCol) { *pvCol = vColTmp; } @@ -755,11 +755,11 @@ void CN3ShapeMgr::Render() { } #ifndef _3DSERVER else { - it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // ̴°͸ ؼ... + it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... int iSC = m_ShapesToRender.size(); if (iSC > 0) { - // Ÿ .. + // 거리순으로 정렬.. CN3Shape * pShape = NULL; std::vector Shapes; for (int i = 0; it != itEnd; it++, i++) { @@ -768,7 +768,7 @@ void CN3ShapeMgr::Render() { continue; } if ((pShape->Pos() - vPos).Magnitude() > pShape->Radius() * 2) { - continue; // ָ Ÿ .. + continue; // 멀리 떨어진거면 지나간다.. } Shapes.push_back(pShape); @@ -780,7 +780,7 @@ void CN3ShapeMgr::Render() { iSC = Shapes.size(); if (iSC > 1) { - qsort(&(Shapes[0]), iSC, 4, SortByCameraDistance); // ī޶ Ÿ ϰ.. + qsort(&(Shapes[0]), iSC, 4, SortByCameraDistance); // 카메라 거리에 따라 정렬하고.. } CN3VMesh * pVMesh = NULL; @@ -811,9 +811,9 @@ bool CN3ShapeMgr::CheckCollisionCamera(__Vector3 & vEyeResult, const __Vector3 & return false; } - float fDelta = (vEyeResult - vCol).Magnitude(); // 浹 óٺ Ÿ 纸.. + float fDelta = (vEyeResult - vCol).Magnitude(); // 충돌점과 처다보는 거리를 재보고.. if (fDelta < fNP * 2.0f) { - return false; // ʹ ư.. + return false; // 너무 가까이 붙으면 돌아간다.. } vEyeResult -= vDir * fDelta; @@ -894,10 +894,10 @@ CN3Shape * CN3ShapeMgr::Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __ ::_Convert2D_To_3DCoordinate(iXScreen, iYScreen, s_CameraData.mtxView, s_CameraData.mtxProjection, s_CameraData.vp, vPos, vDir); - it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // ̴°͸ ؼ... + it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... int iSC = m_ShapesToRender.size(); - // Ÿ .. + // 거리순으로 정렬.. std::vector Shapes(iSC, NULL); for (int i = 0; it != itEnd; it++, i++) { Shapes[i] = *it; @@ -906,7 +906,7 @@ CN3Shape * CN3ShapeMgr::Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __ for (int i = 0; i < iSC; i++) { if (bMustHaveEvent && Shapes[i]->m_iEventID <= 0) { - continue; // ̺Ʈ ־ Ѵٸ... + continue; // 이벤트가 있어야 한다면... } if (Shapes[i]->CheckCollisionPrecisely(vPos, vDir, pvPick) >= 0) { return Shapes[i]; @@ -941,7 +941,7 @@ int CN3ShapeMgr::SortByCameraDistance(const void * pArg1, const void * pArg2) { float fDist2 = (CN3Base::s_CameraData.vEye - pShape2->Pos()).Magnitude(); if (fDist1 < fDist2) { - return 1; // true; + return 1; // 가까우면 true; } else if (fDist1 > fDist2) { return -1; } else { @@ -951,13 +951,13 @@ int CN3ShapeMgr::SortByCameraDistance(const void * pArg1, const void * pArg2) { #endif // end of #ifndef _3DSERVER int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, - __CellSub ** ppSubCells) // ̿ ģ ش.. + __CellSub ** ppSubCells) // 벡터 사이에 걸친 셀포인터 돌려준다.. { if (NULL == ppSubCells) { return 0; } - // ϰ.. + // 범위를 정하고.. int xx1 = 0, xx2 = 0, zz1 = 0, zz2 = 0; if (vFrom.x < vAt.x) { @@ -979,7 +979,7 @@ int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, bool bPathThru; float fZMin, fZMax, fXMin, fXMax; int nSubCellCount = 0; - for (int z = zz1; z <= zz2; z++) // ŭ ó.. + for (int z = zz1; z <= zz2; z++) // 범위만큼 처리.. { fZMin = (float)(z * CELL_SUB_SIZE); fZMax = (float)((z + 1) * CELL_SUB_SIZE); @@ -1016,19 +1016,19 @@ int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, bPathThru = false; if (dwOC0 & dwOC1) { - bPathThru = false; // ܺο ִ. + bPathThru = false; // 두 끝점이 같은 변의 외부에 있다. } else if (dwOC0 == 0 && dwOC1 == 0) { - bPathThru = true; // 簢 ο + bPathThru = true; // 선분이 사각형 내부에 있음 } else if ((dwOC0 == 0 && dwOC1 != 0) || (dwOC0 != 0 && dwOC1 == 0)) { - bPathThru = true; // ο ܺο . - } else if ((dwOC0 & dwOC1) == 0) // L ܺο Ǵ ٽ ؾ Ѵ. + bPathThru = true; // 선분 한점은 셀의 내부에 한점은 외부에 있음. + } else if ((dwOC0 & dwOC1) == 0) // 두 꿑점 모두 셀 외부에 있지만 판단을 다시 해야 한다. { float fXCross = vFrom.x + (fZMax - vFrom.z) * (vAt.x - vFrom.x) / - (vAt.z - vFrom.z); // ϰ.. + (vAt.z - vFrom.z); // 위의 변과의 교차점을 계산하고.. if (fXCross < fXMin) { - bPathThru = false; // ܰ ִ. + bPathThru = false; // 완전히 외곽에 있다. } else { - bPathThru = true; // óִ. + bPathThru = true; // 걸처있다. } } @@ -1036,14 +1036,14 @@ int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, continue; } - // 浹 Ѵ.. + // 충돌 정보를 써야 한다.. int nX = x / CELL_MAIN_DEVIDE; int nZ = z / CELL_MAIN_DEVIDE; if (nX < 0 || nX >= MAX_CELL_MAIN || nZ < 0 && nZ >= MAX_CELL_MAIN) { - continue; // μٱ . + continue; // 메인셀바깥에 있음 지나간다. } if (NULL == m_pCells[nX][nZ]) { - continue; // μ ̸ .. + continue; // 메인셀이 널이면 지나간다.. } int nXSub = x % CELL_MAIN_DEVIDE; @@ -1052,41 +1052,41 @@ int CN3ShapeMgr::SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, ppSubCells[nSubCellCount] = &(m_pCells[nX][nZ]->SubCells[nXSub][nZSub]); nSubCellCount++; } // end of for(int x = xx1; x <= xx2; x++) - } // end of for(int z = zz1; z <= zz2; z++) // ŭ ó.. + } // end of for(int z = zz1; z <= zz2; z++) // 범위만큼 처리.. - return nSubCellCount; // ģ ֱ.. + return nSubCellCount; // 걸친 셀 포인터 돌려주기.. } float CN3ShapeMgr::GetHeightNearstPos( - const __Vector3 & vPos, __Vector3 * pvNormal) // ̰ ش. -FLT_MAX ش. + const __Vector3 & vPos, __Vector3 * pvNormal) // 가장 가까운 높이값을 돌려준다. 없으면 -FLT_MAX 을 돌려준다. { - __CellSub * pCell = this->SubCell(vPos.x, vPos.z); // 꼿 ´.. + __CellSub * pCell = this->SubCell(vPos.x, vPos.z); // 서브셀을 가져온다.. if (NULL == pCell || pCell->nCCPolyCount <= 0) { - return -FLT_MAX; // . + return -FLT_MAX; // 없음 말자. } __Vector3 vPosV = vPos; - vPosV.y = 5000.0f; // ⿡ ġ ϰ.. - __Vector3 vDir(0, -1, 0); // - __Vector3 vColTmp(0, 0, 0); // 浹 ġ.. + vPosV.y = 5000.0f; // 꼭대기에 위치를 하고.. + __Vector3 vDir(0, -1, 0); // 수직 방향 벡터 + __Vector3 vColTmp(0, 0, 0); // 최종적으로 가장 가까운 충돌 위치.. int nIndex0, nIndex1, nIndex2; float fT, fU, fV; - float fNearst = FLT_MAX, fMinTmp = 0, fHeight = -FLT_MAX; // ϴ ּҰ ū .. + float fNearst = FLT_MAX, fMinTmp = 0, fHeight = -FLT_MAX; // 일단 최소값을 큰값으로 잡고.. for (int i = 0; i < pCell->nCCPolyCount; i++) { nIndex0 = pCell->pdwCCVertIndices[i * 3]; nIndex1 = pCell->pdwCCVertIndices[i * 3 + 1]; nIndex2 = pCell->pdwCCVertIndices[i * 3 + 2]; - // 浹 .. + // 충돌된 점이 있으면.. if (true == ::_IntersectTriangle(vPosV, vDir, m_pvCollisions[nIndex0], m_pvCollisions[nIndex1], m_pvCollisions[nIndex2], fT, fU, fV, &vColTmp)) { fMinTmp = (vColTmp - vPos).Magnitude(); - if (fMinTmp < fNearst) // 浹 ġ ã ڵ.. + if (fMinTmp < fNearst) // 가장 가까운 충돌 위치를 찾기 위한 코드.. { fNearst = fMinTmp; - fHeight = vColTmp.y; // ̰. + fHeight = vColTmp.y; // 높이값. if (pvNormal) { pvNormal->Cross(m_pvCollisions[nIndex1] - m_pvCollisions[nIndex0], @@ -1101,16 +1101,16 @@ float CN3ShapeMgr::GetHeightNearstPos( } float CN3ShapeMgr::GetHeight(float fX, float fZ, - __Vector3 * pvNormal) // ش.. -FLT_MAX ش. + __Vector3 * pvNormal) // 가장 높은 곳을 돌려준다.. 없으면 -FLT_MAX값을 돌려준다. { - __CellSub * pCell = this->SubCell(fX, fZ); // 꼿 ´.. + __CellSub * pCell = this->SubCell(fX, fZ); // 서브셀을 가져온다.. if (NULL == pCell || pCell->nCCPolyCount <= 0) { - return -FLT_MAX; // . + return -FLT_MAX; // 없음 말자. } - __Vector3 vPosV(fX, 5000.0f, fZ); // ⿡ ġ ϰ.. - __Vector3 vDir(0, -1, 0); // - __Vector3 vColTmp(0, 0, 0); // 浹 ġ.. + __Vector3 vPosV(fX, 5000.0f, fZ); // 꼭대기에 위치를 하고.. + __Vector3 vDir(0, -1, 0); // 수직 방향 벡터 + __Vector3 vColTmp(0, 0, 0); // 최종적으로 가장 가까운 충돌 위치.. int nIndex0, nIndex1, nIndex2; float fT, fU, fV; @@ -1122,7 +1122,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, nIndex1 = pCell->pdwCCVertIndices[i * 3 + 1]; nIndex2 = pCell->pdwCCVertIndices[i * 3 + 2]; - // 浹 .. + // 충돌된 점이 있으면.. if (true == ::_IntersectTriangle(vPosV, vDir, m_pvCollisions[nIndex0], m_pvCollisions[nIndex1], m_pvCollisions[nIndex2], fT, fU, fV, &vColTmp)) { if (vColTmp.y > fMaxTmp) { @@ -1139,7 +1139,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, return fMaxTmp; } -void CN3ShapeMgr::SubCell(const __Vector3 & vPos, __CellSub ** ppSubCell) // ش ġ ͸ ش. +void CN3ShapeMgr::SubCell(const __Vector3 & vPos, __CellSub ** ppSubCell) // 해당 위치의 셀 포인터를 돌려준다. { int x = (int)(vPos.x / CELL_MAIN_SIZE); int z = (int)(vPos.z / CELL_MAIN_SIZE); @@ -1192,7 +1192,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, break; } - if ((x != 0) && (xx == 0)) // x , z . + if ((x != 0) && (xx == 0)) // x 감소, z 증가. { if ((z != (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) { if (m_pCells[x - 1][z + 1] != NULL) { @@ -1208,7 +1208,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, break; } - if ((z != (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) // x , z . + if ((z != (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) // x 감소, z 증가. { if ((x != 0) && (xx == 0)) { if (m_pCells[x - 1][z + 1] != NULL) { @@ -1232,7 +1232,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, break; case 3: - if ((z == (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) // z . + if ((z == (MAX_CELL_MAIN - 1)) && (zz == (CELL_MAIN_DEVIDE - 1))) // z 증가. { ppSubCell[i] = NULL; break; @@ -1255,7 +1255,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, break; case 4: - if ((x == (MAX_CELL_MAIN - 1)) && (xx == (CELL_MAIN_DEVIDE - 1))) // x , z . + if ((x == (MAX_CELL_MAIN - 1)) && (xx == (CELL_MAIN_DEVIDE - 1))) // x 증가, z 증가. { ppSubCell[i] = NULL; break; @@ -1303,7 +1303,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, } break; - case 5: // x . + case 5: // x 증가. if ((x == (MAX_CELL_MAIN - 1)) && (xx == (CELL_MAIN_DEVIDE - 1))) { ppSubCell[i] = NULL; break; @@ -1325,7 +1325,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, } break; - case 6: // x . z . + case 6: // x 증가. z 감소. if ((x == (MAX_CELL_MAIN - 1)) && (xx == (CELL_MAIN_DEVIDE - 1))) { ppSubCell[i] = NULL; break; @@ -1373,7 +1373,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, } break; - case 7: // z . + case 7: // z 감소. if ((z == 0) && (zz == 0)) { ppSubCell[i] = NULL; break; @@ -1395,7 +1395,7 @@ float CN3ShapeMgr::GetHeight(float fX, float fZ, } break; - case 8: // x , z . + case 8: // x 감소, z 감소. if ((x == 0) && (xx == 0)) { ppSubCell[i] = NULL; break; diff --git a/src/server/Ebenezer/N3BASE/N3ShapeMgr.h b/src/server/Ebenezer/N3BASE/N3ShapeMgr.h index 41190c03..5e6c6562 100644 --- a/src/server/Ebenezer/N3BASE/N3ShapeMgr.h +++ b/src/server/Ebenezer/N3BASE/N3ShapeMgr.h @@ -12,11 +12,11 @@ #include "N3BaseFileAccess.h" #endif // end of #ifndef _3DSERVER -const int CELL_MAIN_DEVIDE = 4; // μ 4 X 4 꼿 .. -const int CELL_SUB_SIZE = 4; // 4 Meter 꼿 ̴.. -const int CELL_MAIN_SIZE = CELL_MAIN_DEVIDE * CELL_SUB_SIZE; // μ ũ 꼿 X 꼿 ũ̴. -const int MAX_CELL_MAIN = 4096 / CELL_MAIN_SIZE; // μ ִ ũ / μũ ̴. -const int MAX_CELL_SUB = MAX_CELL_MAIN * CELL_MAIN_DEVIDE; // 꼿 ִ μ * μ ̴. +const int CELL_MAIN_DEVIDE = 4; // 메인셀은 4 X 4 의 서브셀로 나뉜다.. +const int CELL_SUB_SIZE = 4; // 4 Meter 가 서브셀의 사이즈이다.. +const int CELL_MAIN_SIZE = CELL_MAIN_DEVIDE * CELL_SUB_SIZE; // 메인셀 크기는 서브셀갯수 X 서브셀 크기이다. +const int MAX_CELL_MAIN = 4096 / CELL_MAIN_SIZE; // 메인셀의 최대 갯수는 지형크기 / 메인셀크기 이다. +const int MAX_CELL_SUB = MAX_CELL_MAIN * CELL_MAIN_DEVIDE; // 서브셀 최대 갯수는 메인셀 * 메인셀나눔수 이다. #ifdef _3DSERVER class CN3ShapeMgr @@ -29,10 +29,10 @@ class CN3ShapeMgr : public CN3BaseFileAccess #endif // end of #ifndef _3DSERVER { public: - struct __CellSub // + struct __CellSub // 하위 셀 데이터 { int nCCPolyCount; // Collision Check Polygon Count - DWORD * pdwCCVertIndices; // Collision Check Polygon Vertex Indices - wCCPolyCount * 3 ŭ ȴ. + DWORD * pdwCCVertIndices; // Collision Check Polygon Vertex Indices - wCCPolyCount * 3 만큼 생성된다. void Load(HANDLE hFile) { DWORD dwRWC = 0; @@ -65,7 +65,7 @@ class CN3ShapeMgr : public CN3BaseFileAccess ~__CellSub() { delete[] pdwCCVertIndices; } }; - struct __CellMain // ⺻ + struct __CellMain // 기본 셀 데이터 { int nShapeCount; // Shape Count; WORD * pwShapeIndices; // Shape Indices @@ -114,27 +114,27 @@ class CN3ShapeMgr : public CN3BaseFileAccess protected: #ifndef _3DSERVER - std::vector m_Shapes; // Ʈ ... 迭 ξ ȿ̱ ̴. - std::list m_ShapesToRender; // Tick ȣϸ ͸ ߸.. - std::list m_ShapesHaveID; // ID ־ NPC ɼ ִ Shapes.... + std::vector m_Shapes; // 리스트로 안 만든 이유는... 배열이 훨씬 효율적이기 때문이다. + std::list m_ShapesToRender; // Tick 을 호출하면 렌더링할 것만 추린다.. + std::list m_ShapesHaveID; // ID 를 갖고 있어 NPC 가 될수 있는 Shapes.... #endif // end of #ifndef _3DSERVER - float m_fMapWidth; // ʺ.. - float m_fMapLength; // .. + float m_fMapWidth; // 맵 너비.. 미터 단위 + float m_fMapLength; // 맵 길이.. 미터 단위 int m_nCollisionFaceCount; __CellMain * m_pCells[MAX_CELL_MAIN][MAX_CELL_MAIN]; #ifdef _N3TOOL - std::list<__Vector3> m_CollisionExtras; // ߰ 浹üũ + std::list<__Vector3> m_CollisionExtras; // 추가로 넣을 충돌체크 데이터 #endif // end of #ifedef _N3TOOL public: #ifndef _3DSERVER - CN3Shape * ShapeGetByID(int iID); // ID Ʈ... NPC ִ Ʈ ˻ؼ ش.. - CN3Shape * Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __Vector3 * pvPick = NULL); // ġ ش.. + CN3Shape * ShapeGetByID(int iID); // 고유 ID 를 가진 오브젝트... NPC 로 쓸수 있는 오브젝트를 검색해서 돌려준다.. + CN3Shape * Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __Vector3 * pvPick = NULL); // 위치를 돌려준다.. #endif // end of #ifndef _3DSERVER void SubCell(const __Vector3 & vPos, __CellSub ** ppSubCell); - __CellSub * SubCell(float fX, float fZ) // ش ġ ͸ ش. + __CellSub * SubCell(float fX, float fZ) // 해당 위치의 셀 포인터를 돌려준다. { int x = (int)(fX / CELL_MAIN_SIZE); int z = (int)(fZ / CELL_MAIN_SIZE); @@ -150,17 +150,17 @@ class CN3ShapeMgr : public CN3BaseFileAccess return &(m_pCells[x][z]->SubCells[xx][zz]); } float GetHeightNearstPos(const __Vector3 & vPos, - __Vector3 * pvNormal = NULL); // ش. -FLT_MAX ش. + __Vector3 * pvNormal = NULL); // 가장 가까운 높이을 돌려준다. 없으면 -FLT_MAX 을 돌려준다. float GetHeight(float fX, float fZ, - __Vector3 * pvNormal = NULL); // ش. -FLT_MAX ش. + __Vector3 * pvNormal = NULL); // 현재 지점에서 제일 높은 값을 돌려준다. 없으면 -FLT_MAX 을 돌려준다. int SubCellPathThru(const __Vector3 & vFrom, const __Vector3 & vAt, - __CellSub ** ppSubCells); // ̿ ģ ش.. - float Width() { return m_fMapWidth; } // ʺ. ̴. - float Height() { return m_fMapWidth; } // ʺ. ̴. + __CellSub ** ppSubCells); // 벡터 사이에 걸친 셀포인터 돌려준다.. + float Width() { return m_fMapWidth; } // 맵의 너비. 단위는 미터이다. + float Height() { return m_fMapWidth; } // 맵의 너비. 단위는 미터이다. #ifndef _3DSERVER void ReleaseShapes(); - void RenderCollision(__Vector3 & vPos); // ġ ִ 浹 ޽ø ׷ش.. ... + void RenderCollision(__Vector3 & vPos); // 넣은 위치에 있는 충돌 메시를 그려준다.. 디버깅용... void Tick(); void Render(); bool Load(HANDLE hFile); @@ -168,18 +168,18 @@ class CN3ShapeMgr : public CN3BaseFileAccess static int SortByCameraDistance(const void * pArg1, const void * pArg2); #endif // end of #ifndef _3DSERVER - bool CheckCollision(const __Vector3 & vPos, // 浹 ġ - const __Vector3 & vDir, // - float fSpeedPerSec, // ʴ ̴ ӵ - __Vector3 * pvCol = NULL, // 浹 - __Vector3 * pvNormal = NULL, // 浹Ѹ - __Vector3 * pVec = NULL); // 浹 __Vector3[3] + bool CheckCollision(const __Vector3 & vPos, // 충돌 위치 + const __Vector3 & vDir, // 방향 벡터 + float fSpeedPerSec, // 초당 움직이는 속도 + __Vector3 * pvCol = NULL, // 충돌 지점 + __Vector3 * pvNormal = NULL, // 충돌한면의 법선벡터 + __Vector3 * pVec = NULL); // 충돌한 면 의 폴리곤 __Vector3[3] - bool Create(float fMapWidth, float fMapLength); // ʺ ̸ ִ´.. + bool Create(float fMapWidth, float fMapLength); // 맵의 너비와 높이를 미터 단위로 넣는다.. bool LoadCollisionData(HANDLE hFile); #ifdef _N3TOOL - void MakeMoveTable(short ** pMoveArray); // shape ִ Ÿ 1, Ÿ 0 ̺ . + void MakeMoveTable(short ** pMoveArray); //지형에서 shape가 있는 타일은 1, 없는 타일은 0으로 셋팅한 테이블을 만든다. int Add(CN3Shape * pShape); bool AddCollisionTriangle(const __Vector3 & v1, const __Vector3 & v2, const __Vector3 & v3); void GenerateCollisionData(); diff --git a/src/server/Ebenezer/Npc.cpp b/src/server/Ebenezer/Npc.cpp index 02bb6385..8c8a95d8 100644 --- a/src/server/Ebenezer/Npc.cpp +++ b/src/server/Ebenezer/Npc.cpp @@ -28,9 +28,9 @@ CNpc::~CNpc() {} void CNpc::Initialize() { m_pMain = (CEbenezerDlg *)AfxGetApp()->GetMainWnd(); - m_sNid = -1; // NPC ()Ϸùȣ + m_sNid = -1; // NPC (서버상의)일련번호 m_sSid = 0; - m_sZoneIndex = -1; // Current Zone Index(迭) + m_sZoneIndex = -1; // Current Zone Index(배열) m_sCurZone = -1; // Current Zone number m_fCurX = 0; // Current X Pos; m_fCurY = 0; // Current Y Pos; @@ -39,14 +39,14 @@ void CNpc::Initialize() { m_sSize = 100; // MONSTER(NPC) Size memset(m_strName, 0, MAX_ID_SIZE + 1); ; // MONSTER(NPC) Name - m_iMaxHP = 0; // ִ HP - m_iHP = 0; // HP - //m_byState = 0; // (NPC) ̻ + m_iMaxHP = 0; // 최대 HP + m_iHP = 0; // 현재 HP + //m_byState = 0; // 몬스터 (NPC) 상태이상 m_tNpcType = 0; // NPC Type // 0 : Normal Monster // 1 : NPC - // 2 : Ա,ⱸ NPC - // 3 : + // 2 : 각 입구,출구 NPC + // 3 : 경비병 m_byGroup = 0; m_byLevel = 0; m_iSellingGroup = 0; @@ -54,7 +54,7 @@ void CNpc::Initialize() { m_sRegion_X = 0; // region x position m_sRegion_Z = 0; // region z position - m_fDir = 0.0f; // npc ,, + m_fDir = 0.0f; // npc의 방향,, m_iWeapon_1 = 0; m_iWeapon_2 = 0; m_NpcState = NPC_LIVE; @@ -153,8 +153,8 @@ void CNpc::RegisterRegion() { pMap->RegionNpcAdd(m_sRegion_X, m_sRegion_Z, m_sNid); RemoveRegion(old_region_x - m_sRegion_X, - old_region_z - m_sRegion_Z); // delete npc ݴ... - InsertRegion(m_sRegion_X - old_region_x, m_sRegion_Z - old_region_z); // add npc ... + old_region_z - m_sRegion_Z); // delete npc 는 계산 방향이 진행방향의 반대... + InsertRegion(m_sRegion_X - old_region_x, m_sRegion_Z - old_region_z); // add npc 는 계산 방향이 진행방향... } } @@ -190,15 +190,15 @@ void CNpc::RemoveRegion(int del_x, int del_z) { SetDWORD( buff, (int)m_byGateOpen, send_index ); SetByte( buff, m_byObjectType, send_index ); */ - if (del_x != 0) { // x ̵Ǿ... + if (del_x != 0) { // x 축으로 이동되었을때... m_pMain->Send_UnitRegion(buff, send_index, m_sZoneIndex, m_sRegion_X + del_x * 2, m_sRegion_Z + del_z - 1); m_pMain->Send_UnitRegion(buff, send_index, m_sZoneIndex, m_sRegion_X + del_x * 2, m_sRegion_Z + del_z); m_pMain->Send_UnitRegion(buff, send_index, m_sZoneIndex, m_sRegion_X + del_x * 2, m_sRegion_Z + del_z + 1); // TRACE("Remove : (%d %d), (%d %d), (%d %d)\n", m_sRegion_X+del_x*2, m_sRegion_Z+del_z-1, m_sRegion_X+del_x*2, m_sRegion_Z+del_z, m_sRegion_X+del_x*2, m_sRegion_Z+del_z+1 ); } - if (del_z != 0) { // z ̵Ǿ... + if (del_z != 0) { // z 축으로 이동되었을때... m_pMain->Send_UnitRegion(buff, send_index, m_sZoneIndex, m_sRegion_X + del_x, m_sRegion_Z + del_z * 2); - if (del_x < 0) { // x, z Ѵ ̵Ǿ ġ κ ѹ .. + if (del_x < 0) { // x, z 축 둘다 이동되었을때 겹치는 부분 한번만 보낸다.. m_pMain->Send_UnitRegion(buff, send_index, m_sZoneIndex, m_sRegion_X + del_x + 1, m_sRegion_Z + del_z * 2); } else if (del_x > 0) { m_pMain->Send_UnitRegion(buff, send_index, m_sZoneIndex, m_sRegion_X + del_x - 1, m_sRegion_Z + del_z * 2); @@ -241,16 +241,16 @@ void CNpc::InsertRegion(int del_x, int del_z) { SetDWORD(buff, (int)m_byGateOpen, send_index); SetByte(buff, m_byObjectType, send_index); - if (del_x != 0) { // x ̵Ǿ... + if (del_x != 0) { // x 축으로 이동되었을때... m_pMain->Send_UnitRegion(buff, send_index, m_sZoneIndex, m_sRegion_X + del_x, m_sRegion_Z - 1); m_pMain->Send_UnitRegion(buff, send_index, m_sZoneIndex, m_sRegion_X + del_x, m_sRegion_Z); m_pMain->Send_UnitRegion(buff, send_index, m_sZoneIndex, m_sRegion_X + del_x, m_sRegion_Z + 1); // TRACE("Insert : (%d %d), (%d %d), (%d %d)\n", m_sRegion_X+del_x, m_sRegion_Z-1, m_sRegion_X+del_x, m_sRegion_Z, m_sRegion_X+del_x, m_sRegion_Z+1 ); } - if (del_z != 0) { // z ̵Ǿ... + if (del_z != 0) { // z 축으로 이동되었을때... m_pMain->Send_UnitRegion(buff, send_index, m_sZoneIndex, m_sRegion_X, m_sRegion_Z + del_z); - if (del_x < 0) { // x, z Ѵ ̵Ǿ ġ κ ѹ .. + if (del_x < 0) { // x, z 축 둘다 이동되었을때 겹치는 부분 한번만 보낸다.. m_pMain->Send_UnitRegion(buff, send_index, m_sZoneIndex, m_sRegion_X + 1, m_sRegion_Z + del_z); } else if (del_x > 0) { m_pMain->Send_UnitRegion(buff, send_index, m_sZoneIndex, m_sRegion_X - 1, m_sRegion_Z + del_z); @@ -265,7 +265,7 @@ void CNpc::InsertRegion(int del_x, int del_z) { int CNpc::GetRegionNpcList(int region_x, int region_z, char * buff, int & t_count) { if (m_pMain->m_bPointCheckFlag == FALSE) { - return 0; // ϸ ȵ + return 0; // 포인터 참조하면 안됨 } int buff_index = 0, i = 0, j = 0; diff --git a/src/server/Ebenezer/Npc.h b/src/server/Ebenezer/Npc.h index 7ff97e8d..eaabb073 100644 --- a/src/server/Ebenezer/Npc.h +++ b/src/server/Ebenezer/Npc.h @@ -12,38 +12,38 @@ class CNpc { public: CEbenezerDlg * m_pMain; - short m_sNid; // NPC ()Ϸùȣ - short m_sSid; // NPC ̺ ȣ + short m_sNid; // NPC (서버상의)일련번호 + short m_sSid; // NPC 테이블 참조번호 short m_sCurZone; // Current Zone; - short m_sZoneIndex; // NPC ϰ ִ ε + short m_sZoneIndex; // NPC 가 존재하고 있는 존의 인덱스 float m_fCurX; // Current X Pos; float m_fCurY; // Current Y Pos; float m_fCurZ; // Current Z Pos; - float m_fDir; // NPC ִ + float m_fDir; // NPC가 보고 있는 방향 short m_sPid; // MONSTER(NPC) Picture ID short m_sSize; // MONSTER(NPC) Size int m_iWeapon_1; int m_iWeapon_2; TCHAR m_strName[MAX_ID_SIZE]; // MONSTER(NPC) Name - int m_iMaxHP; // ִ HP - int m_iHP; // HP - BYTE m_byState; // (NPC) - BYTE m_byGroup; // Ҽ - BYTE m_byLevel; // + int m_iMaxHP; // 최대 HP + int m_iHP; // 현재 HP + BYTE m_byState; // 몬스터 (NPC) 상태 + BYTE m_byGroup; // 소속 집단 + BYTE m_byLevel; // 레벨 BYTE m_tNpcType; // NPC Type // 0 : Normal Monster // 1 : NPC - // 2 : Ա,ⱸ NPC - // 3 : + // 2 : 각 입구,출구 NPC + // 3 : 경비병 int m_iSellingGroup; // ItemGroup // DWORD m_dwStepDelay; short m_sRegion_X; // region x position short m_sRegion_Z; // region z position - BYTE m_NpcState; // NPC - Ҵ, ׾, ִ ... + BYTE m_NpcState; // NPC의 상태 - 살았다, 죽었다, 서있다 등등... BYTE m_byGateOpen; // Gate Npc Status -> 1 : open 0 : close - short m_sHitRate; // - BYTE m_byObjectType; // 0, objectŸ(, ) 1 + short m_sHitRate; // 공격 성공률 + BYTE m_byObjectType; // 보통은 0, object타입(성문, 레버)은 1 short m_byEvent; // This is for the quest. diff --git a/src/server/Ebenezer/PacketDefine.h b/src/server/Ebenezer/PacketDefine.h index 36ba21a3..a1165dbb 100644 --- a/src/server/Ebenezer/PacketDefine.h +++ b/src/server/Ebenezer/PacketDefine.h @@ -86,7 +86,7 @@ #define WIZ_MARKET_BBS 0x50 // For the market bulletin board service... #define WIZ_KICKOUT 0x51 // Account ID forbid duplicate connection #define WIZ_CLIENT_EVENT 0x52 // Client Event (for quest) -#define I_DONT_KNOW 0x53 // Ŭ̾Ʈ ڷ ֵ. +#define I_DONT_KNOW 0x53 // 클라이언트에서 무슨 에코로 쓰고 있데요. #define WIZ_WEIGHT_CHANGE 0x54 // Notify change of weight #define WIZ_SELECT_MSG 0x55 // Select Event Message... #define WIZ_NPC_SAY 0x56 // Select Event Message... @@ -164,24 +164,24 @@ //////////////////////////////////////////////////////////////// // Knights Packet sub define //////////////////////////////////////////////////////////////// -#define KNIGHTS_CREATE 0x01 // -#define KNIGHTS_JOIN 0x02 // -#define KNIGHTS_WITHDRAW 0x03 // Ż -#define KNIGHTS_REMOVE 0x04 // -#define KNIGHTS_DESTROY 0x05 // ǰ -#define KNIGHTS_ADMIT 0x06 // 㰡 -#define KNIGHTS_REJECT 0x07 // -#define KNIGHTS_PUNISH 0x08 // ¡ -#define KNIGHTS_CHIEF 0x09 // Ӹ -#define KNIGHTS_VICECHIEF 0x0A // δ Ӹ -#define KNIGHTS_OFFICER 0x0B // 屳Ӹ -#define KNIGHTS_ALLLIST_REQ 0x0C // Ʈ 10 Page û -#define KNIGHTS_MEMBER_REQ 0x0D // û -#define KNIGHTS_CURRENT_REQ 0x0E // Ʈ -#define KNIGHTS_STASH 0x0F // â -#define KNIGHTS_MODIFY_FAME 0x10 // .. ش -#define KNIGHTS_JOIN_REQ 0x11 // ش Կû Ѵ -#define KNIGHTS_LIST_REQ 0x12 // Ʈ û ( index ˻ ) +#define KNIGHTS_CREATE 0x01 // 생성 +#define KNIGHTS_JOIN 0x02 // 가입 +#define KNIGHTS_WITHDRAW 0x03 // 탈퇴 +#define KNIGHTS_REMOVE 0x04 // 멤버 삭제 +#define KNIGHTS_DESTROY 0x05 // 뽀개기 +#define KNIGHTS_ADMIT 0x06 // 멤버 가입 허가 +#define KNIGHTS_REJECT 0x07 // 멤버 가입 거절 +#define KNIGHTS_PUNISH 0x08 // 멤버 징계 +#define KNIGHTS_CHIEF 0x09 // 단장 임명 +#define KNIGHTS_VICECHIEF 0x0A // 부단장 임명 +#define KNIGHTS_OFFICER 0x0B // 장교임명 +#define KNIGHTS_ALLLIST_REQ 0x0C // 리스트를 10개 단위로 Page 요청 +#define KNIGHTS_MEMBER_REQ 0x0D // 모든 멤버 요청 +#define KNIGHTS_CURRENT_REQ 0x0E // 현재 접속 리스트 +#define KNIGHTS_STASH 0x0F // 기사단 창고 +#define KNIGHTS_MODIFY_FAME 0x10 // 멤버의 직위 변경.. 해당 멤버에게 간다 +#define KNIGHTS_JOIN_REQ 0x11 // 해당멤버에게 가입요청을 한다 +#define KNIGHTS_LIST_REQ 0x12 // 기사단 리스트를 요청 ( index 검색 ) //////////////////////////////////////////////////////////////// // Operator Autority Packet define diff --git a/src/server/Ebenezer/SharedMem.cpp b/src/server/Ebenezer/SharedMem.cpp index 172a14dc..56de60c1 100644 --- a/src/server/Ebenezer/SharedMem.cpp +++ b/src/server/Ebenezer/SharedMem.cpp @@ -67,7 +67,7 @@ BOOL CSharedMemQueue::InitailizeMMF(DWORD dwOffsetsize, int maxcount, LPCTSTR lp m_bMMFCreate = bCreate; m_pHeader = (_SMQ_HEADER *)m_lpMMFile; - m_lReference = (LONG)(m_lpMMFile + sizeof(_SMQ_HEADER)); // ʱ ġ + m_lReference = (LONG)(m_lpMMFile + sizeof(_SMQ_HEADER)); // 초기 위치 셋팅 if (bCreate) { memset(m_lpMMFile, 0x00, dwfullsize); diff --git a/src/server/Ebenezer/UdpSocket.cpp b/src/server/Ebenezer/UdpSocket.cpp index d9937cff..96bdd9af 100644 --- a/src/server/Ebenezer/UdpSocket.cpp +++ b/src/server/Ebenezer/UdpSocket.cpp @@ -32,7 +32,7 @@ DWORD WINAPI RecvUDPThread(LPVOID lp) { getpeername(pUdp->m_hUDPSocket, (SOCKADDR *)&pUdp->m_ReplyAddress, &addrlen); TRACE("recvfrom() error : %d IP : %s\n", err, inet_ntoa(pUdp->m_ReplyAddress.sin_addr)); - // ƾ... + // 재전송 루틴... Sleep(10); continue; @@ -249,11 +249,11 @@ void CUdpSocket::RecvBattleEvent(char * pBuf) { return; } if (nResult == KARUS) { - //TRACE("--> UDP RecvBattleEvent : ī罺 Ѿ ־\n"); - m_pMain->m_byKarusOpenFlag = 1; // ī罺 Ѿ ־ + //TRACE("--> UDP RecvBattleEvent : 카루스 땅으로 넘어갈 수 있어\n"); + m_pMain->m_byKarusOpenFlag = 1; // 카루스 땅으로 넘어갈 수 있어 } else if (nResult == ELMORAD) { - //TRACE("--> UDP RecvBattleEvent : Ѿ ־\n"); - m_pMain->m_byElmoradOpenFlag = 1; // Ѿ ־ + //TRACE("--> UDP RecvBattleEvent : 엘모 땅으로 넘어갈 수 있어\n"); + m_pMain->m_byElmoradOpenFlag = 1; // 엘모 땅으로 넘어갈 수 있어 } } else if (nType == BATTLE_EVENT_RESULT) { if (m_pMain->m_byBattleOpen == NO_BATTLE) { @@ -261,22 +261,22 @@ void CUdpSocket::RecvBattleEvent(char * pBuf) { return; } if (nResult == KARUS) { - //TRACE("--> UDP RecvBattleEvent : ī罺 ¸Ͽϴ.\n"); + //TRACE("--> UDP RecvBattleEvent : 카루스가 승리하였습니다.\n"); } else if (nResult == ELMORAD) { - //TRACE("--> UDP RecvBattleEvent : 尡 ¸Ͽϴ.\n"); + //TRACE("--> UDP RecvBattleEvent : 엘모라드가 승리하였습니다.\n"); } m_pMain->m_bVictory = nResult; m_pMain->m_byOldVictory = nResult; - m_pMain->m_byKarusOpenFlag = 0; // ī罺 Ѿ - m_pMain->m_byElmoradOpenFlag = 0; // Ѿ + m_pMain->m_byKarusOpenFlag = 0; // 카루스 땅으로 넘어갈 수 없도록 + m_pMain->m_byElmoradOpenFlag = 0; // 엘모 땅으로 넘어갈 수 없도록 m_pMain->m_byBanishFlag = 1; } else if (nType == BATTLE_EVENT_MAX_USER) { nLen = GetByte(pBuf, index); if (nLen > 0 && nLen < MAX_ID_SIZE + 1) { GetString(strMaxUserName, pBuf, nLen, index); - //TRACE("--> UDP RecvBattleEvent : ̸? %s, len=%d\n", strMaxUserName, nResult); + //TRACE("--> UDP RecvBattleEvent : 적국의 대장을 죽인 유저이름은? %s, len=%d\n", strMaxUserName, nResult); if (nResult == 1) { ::_LoadStringFromResource(IDS_KILL_CAPTAIN, buff); sprintf(chatstr, buff.c_str(), strMaxUserName); @@ -296,7 +296,7 @@ void CUdpSocket::RecvBattleEvent(char * pBuf) { ::_LoadStringFromResource(IDS_KILL_ELMO_GUARD2, buff); sprintf(chatstr, buff.c_str(), strMaxUserName); } - sprintf(finalstr, "## : %s ##", chatstr); + sprintf(finalstr, "## 공지 : %s ##", chatstr); SetByte(send_buff, WIZ_CHAT, send_index); SetByte(send_buff, WAR_SYSTEM_CHAT, send_index); SetByte(send_buff, 1, send_index); @@ -322,11 +322,11 @@ void CUdpSocket::RecvBattleEvent(char * pBuf) { m_pMain->m_sKarusDead = m_pMain->m_sKarusDead + nKillKarus; m_pMain->m_sElmoradDead = m_pMain->m_sElmoradDead + nElmoKill; - //TRACE("--> UDP RecvBattleEvent type = 1 : μ : karus=%d->%d, elmo=%d->%d\n", nKillKarus, m_pMain->m_sKarusDead, nElmoKill, m_pMain->m_sElmoradDead); + //TRACE("--> UDP RecvBattleEvent type = 1 : 적국 유저 죽인수 : karus=%d->%d, elmo=%d->%d\n", nKillKarus, m_pMain->m_sKarusDead, nElmoKill, m_pMain->m_sElmoradDead); SetByte(send_buff, UDP_BATTLE_EVENT_PACKET, send_index); SetByte(send_buff, BATTLE_EVENT_KILL_USER, send_index); - SetByte(send_buff, 2, send_index); // karus + SetByte(send_buff, 2, send_index); // karus의 정보 전송 SetShort(send_buff, m_pMain->m_sKarusDead, send_index); SetShort(send_buff, m_pMain->m_sElmoradDead, send_index); m_pMain->Send_UDP_All(send_buff, send_index); @@ -334,7 +334,7 @@ void CUdpSocket::RecvBattleEvent(char * pBuf) { nKillKarus = GetShort(pBuf, index); nElmoKill = GetShort(pBuf, index); - //TRACE("--> UDP RecvBattleEvent type = 2 : μ : karus=%d->%d, elmo=%d->%d\n", m_pMain->m_sKarusDead, nKillKarus, m_pMain->m_sElmoradDead, nElmoKill); + //TRACE("--> UDP RecvBattleEvent type = 2 : 적국 유저 죽인수 : karus=%d->%d, elmo=%d->%d\n", m_pMain->m_sKarusDead, nKillKarus, m_pMain->m_sElmoradDead, nElmoKill); m_pMain->m_sKarusDead = nKillKarus; m_pMain->m_sElmoradDead = nElmoKill; @@ -411,7 +411,7 @@ void CUdpSocket::RecvCreateKnights(char * pBuf) { m_pMain->m_KnightsArray.PutData(pKnights->m_sIndex, pKnights); - // Ŭ ߰ + // 클랜정보에 추가 m_pMain->m_KnightsManager.AddKnightsUser(knightsindex, chiefname); //TRACE("UDP - RecvCreateKnights - knname=%s, name=%s, index=%d\n", knightsname, chiefname, knightsindex); @@ -434,15 +434,15 @@ void CUdpSocket::RecvJoinKnights(char * pBuf, BYTE command) { pKnights = m_pMain->m_KnightsArray.GetData(knightsindex); if (command == KNIGHTS_JOIN) { - sprintf(finalstr, "#### %s ϼ̽ϴ. ####", charid); - // Ŭ ߰ + sprintf(finalstr, "#### %s님이 가입하셨습니다. ####", charid); + // 클랜정보에 추가 m_pMain->m_KnightsManager.AddKnightsUser(knightsindex, charid); - TRACE("UDP - RecvJoinKnights - , name=%s, index=%d\n", charid, knightsindex); - } else { // Ż.. - // Ŭ ߰ + TRACE("UDP - RecvJoinKnights - 가입, name=%s, index=%d\n", charid, knightsindex); + } else { // 탈퇴.. + // 클랜정보에 추가 m_pMain->m_KnightsManager.RemoveKnightsUser(knightsindex, charid); - sprintf(finalstr, "#### %s Żϼ̽ϴ. ####", charid); - TRACE("UDP - RecvJoinKnights - Ż, name=%s, index=%d\n", charid, knightsindex); + sprintf(finalstr, "#### %s님이 탈퇴하셨습니다. ####", charid); + TRACE("UDP - RecvJoinKnights - 탈퇴, name=%s, index=%d\n", charid, knightsindex); } //TRACE("UDP - RecvJoinKnights - command=%d, name=%s, index=%d\n", command, charid, knightsindex); @@ -481,7 +481,7 @@ void CUdpSocket::RecvModifyFame(char * pBuf, BYTE command) { if (pTUser) { pTUser->m_pUserData->m_bKnights = 0; pTUser->m_pUserData->m_bFame = 0; - sprintf(finalstr, "#### %s ߹Ǽ̽ϴ. ####", pTUser->m_pUserData->m_id); + sprintf(finalstr, "#### %s님이 추방되셨습니다. ####", pTUser->m_pUserData->m_id); m_pMain->m_KnightsManager.RemoveKnightsUser(knightsindex, pTUser->m_pUserData->m_id); } else { m_pMain->m_KnightsManager.RemoveKnightsUser(knightsindex, userid); @@ -503,14 +503,14 @@ void CUdpSocket::RecvModifyFame(char * pBuf, BYTE command) { if (pTUser) { pTUser->m_pUserData->m_bFame = CHIEF; m_pMain->m_KnightsManager.ModifyKnightsUser(knightsindex, pTUser->m_pUserData->m_id); - sprintf(finalstr, "#### %s ӸǼ̽ϴ. ####", pTUser->m_pUserData->m_id); + sprintf(finalstr, "#### %s님이 단장으로 임명되셨습니다. ####", pTUser->m_pUserData->m_id); } break; case KNIGHTS_VICECHIEF + 0x10: if (pTUser) { pTUser->m_pUserData->m_bFame = VICECHIEF; m_pMain->m_KnightsManager.ModifyKnightsUser(knightsindex, pTUser->m_pUserData->m_id); - sprintf(finalstr, "#### %s δ ӸǼ̽ϴ. ####", pTUser->m_pUserData->m_id); + sprintf(finalstr, "#### %s님이 부단장으로 임명되셨습니다. ####", pTUser->m_pUserData->m_id); } break; case KNIGHTS_OFFICER + 0x10: @@ -588,11 +588,11 @@ void CUdpSocket::RecvDestroyKnights(char * pBuf) { flag = pKnights->m_byFlag; - // Ŭ̳ ı ޽ Ÿ ʱȭ + // 클랜이나 기사단이 파괴된 메시지를 보내고 유저 데이타를 초기화 if (flag == CLAN_TYPE) { - sprintf(finalstr, "#### %s Ŭ üǾϴ ####", pKnights->m_strName); + sprintf(finalstr, "#### %s 클랜이 해체되었습니다 ####", pKnights->m_strName); } else if (flag == KNIGHTS_TYPE) { - sprintf(finalstr, "#### %s üǾϴ ####", pKnights->m_strName); + sprintf(finalstr, "#### %s 기사단이 해체되었습니다 ####", pKnights->m_strName); } memset(send_buff, 0x00, 128); diff --git a/src/server/Ebenezer/User.cpp b/src/server/Ebenezer/User.cpp index 472ac14b..9fc43a83 100644 --- a/src/server/Ebenezer/User.cpp +++ b/src/server/Ebenezer/User.cpp @@ -139,7 +139,7 @@ void CUser::Initialize() { memset(m_strAccountID, NULL, MAX_ID_SIZE + 1); /* - m_iSelMsgEvent[0] = -1; // ̹Ʈ ʱȭ ^^; + m_iSelMsgEvent[0] = -1; // 이밴트 관련 초기화 ^^; m_iSelMsgEvent[1] = -1; m_iSelMsgEvent[2] = -1; m_iSelMsgEvent[3] = -1; @@ -228,7 +228,7 @@ void CUser::CloseProcess() { ExchangeCancel(); } - /* ε ۵ϱ . + /* 부디 잘 작동하길 ㅠ.ㅠ if (!m_bZoneChangeFlag) { if (m_pUserData->m_bZone == ZONE_BATTLE || (m_pUserData->m_bZone != m_pUserData->m_bNation && m_pUserData->m_bZone < 3) ) { _HOME_INFO* pHomeInfo = NULL; // Send user back home in case it was the battlezone. @@ -246,7 +246,7 @@ void CUser::CloseProcess() { m_pUserData->m_curz = pHomeInfo->ElmoZoneZ + myrand(0, pHomeInfo->ElmoZoneLZ); } } - TRACE(" Ǿž. !!!\r\n"); + TRACE("본국으로 잘 저장되었을거야. 걱정마!!!\r\n"); } */ @@ -465,7 +465,7 @@ void CUser::Parsing(int len, char * pData) { case WIZ_ZONE_CONCURRENT: ZoneConCurrentUsers(pData + index); break; - case WIZ_VIRTUAL_SERVER: // οüũ ش ٴ ޾Ҵ + case WIZ_VIRTUAL_SERVER: // 인원체크가 끝나고 해당 서버로 가도 좋다는 허락을 받았다 ServerChangeOk(pData + index); break; case WIZ_PARTY_BBS: @@ -597,7 +597,7 @@ void CUser::LoginProcess(char * pBuf) { fail_return: send_index = 0; SetByte(send_buff, WIZ_LOGIN, send_index); - SetByte(send_buff, 0xFF, send_index); // ... FF + SetByte(send_buff, 0xFF, send_index); // 성공시 국가 정보... FF 실패 Send(send_buff, send_index); } @@ -721,7 +721,7 @@ void CUser::DelCharToAgent(char * pBuf) { // ~sungyong tw GetString(socno, pBuf, soclen, index); - // ij ȵǰ, Ŭ Ż ǵ,, + // 단장은 캐릭 삭제가 안되게, 먼저 클랜을 탈퇴 후 삭제가 되도록,, if (m_pUserData->m_bKnights > 0 && m_pUserData->m_bFame == CHIEF) { goto fail_return; } @@ -823,7 +823,7 @@ void CUser::SelCharToAgent(char * pBuf) { pUser->Close(); goto fail_return; } - strcpy(m_strAccountID, accountid); // ̵ α ν Ƿ... + strcpy(m_strAccountID, accountid); // 존이동 한 경우는 로그인 프로시져가 없으므로... } pUser = m_pMain->GetUserPtr(userid, 0x02); @@ -832,7 +832,7 @@ void CUser::SelCharToAgent(char * pBuf) { goto fail_return; } - // ,, ⼭ ,,, + // 음냥,, 여기서 존을 비교,,, if (zone <= 0) { TRACE("### SelCharToAgent zone Fail : zone=%d\n", zone); goto fail_return; @@ -962,7 +962,7 @@ void CUser::SelectCharacter(char * pBuf) { return; } - // ƴѻ¿ ->Ϲݴ + // 전쟁중이 아닌상태에서는 대장유저가->일반단장으로 if (m_pMain->m_byBattleOpen == NO_BATTLE && m_pUserData->m_bFame == COMMAND_CAPTAIN) { m_pUserData->m_bFame = CHIEF; } @@ -1001,16 +1001,16 @@ void CUser::SelectCharacter(char * pBuf) { SetByte(send_buff, m_pMain->m_byOldVictory, send_index); Send(send_buff, send_index); - SetDetailData(); // ... + SetDetailData(); // 디비에 없는 데이터 셋팅... //TRACE("SelectCharacter 111 - id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); - // sungyong ,, zone server : ī罺 ġǷ ؼ,, - // ϶ ... + // sungyong ,, zone server : 카루스와 전쟁존을 합치므로 인해서,, + // 전쟁존일때 ... if (m_pUserData->m_bZone > 2) { - // Ʈ ִ ˻ؼ - // ߰Ѵ(ٸ ܿ Ե ) - if (m_pUserData->m_bKnights == -1) { // ߹ + // 나의 기사단 리스트에서 내가 기사단 정보에 있는지를 검색해서 만약 없으면 + // 추가한다(다른존에서 기사단에 가입된 경우) + if (m_pUserData->m_bKnights == -1) { // 추방된 유저 m_pUserData->m_bKnights = 0; m_pUserData->m_bFame = 0; //TRACE("SelectCharacter - id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); @@ -1031,7 +1031,7 @@ void CUser::SelectCharacter(char * pBuf) { if (pKnights) { m_pMain->m_KnightsManager.SetKnightsUser(m_pUserData->m_bKnights, m_pUserData->m_id); } else { - //TRACE("SelectCharacter - Ʈ û,, id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); + //TRACE("SelectCharacter - 기사단 리스트 요청,, id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); memset(send_buff, 0x00, 256); send_index = 0; SetByte(send_buff, WIZ_KNIGHTS_PROCESS, send_index); @@ -1046,15 +1046,15 @@ void CUser::SelectCharacter(char * pBuf) { pKnights = m_pMain->m_KnightsArray.GetData(m_pUserData->m_bKnights); if (pKnights) { - //TRACE("SelectCharacter - Ʈ ߰,, id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); + //TRACE("SelectCharacter - 기사단 리스트 추가,, id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); m_pMain->m_KnightsManager.SetKnightsUser(m_pUserData->m_bKnights, m_pUserData->m_id); } } } } else { - // Ʈ ִ ˻ؼ - // ߰Ѵ(ٸ ܿ Ե ) - if (m_pUserData->m_bKnights == -1) { // ߹ + // 나의 기사단 리스트에서 내가 기사단 정보에 있는지를 검색해서 만약 없으면 + // 추가한다(다른존에서 기사단에 가입된 경우) + if (m_pUserData->m_bKnights == -1) { // 추방된 유저 m_pUserData->m_bKnights = 0; m_pUserData->m_bFame = 0; //TRACE("SelectCharacter - id=%s, knights=%d, fame=%d\n", m_pUserData->m_id, m_pUserData->m_bKnights, m_pUserData->m_bFame); @@ -1063,7 +1063,7 @@ void CUser::SelectCharacter(char * pBuf) { pKnights = m_pMain->m_KnightsArray.GetData(m_pUserData->m_bKnights); if (pKnights) { m_pMain->m_KnightsManager.SetKnightsUser(m_pUserData->m_bKnights, m_pUserData->m_id); - } else { // ıǾ .. + } else { // 기사단이 파괴되어 있음으로.. m_pUserData->m_bKnights = 0; m_pUserData->m_bFame = 0; } @@ -1190,11 +1190,11 @@ void CUser::LogOut() { pUser = m_pMain->GetUserPtr(m_pUserData->m_Accountid, 0x01); if (pUser && (pUser->m_Sid != m_Sid)) { - TRACE("%s : %s Logout: Sid ٸ ...\n", m_pUserData->m_Accountid, m_pUserData->m_id); + TRACE("%s : %s Logout: Sid 가 다른 경우...\n", m_pUserData->m_Accountid, m_pUserData->m_id); return; } else { if (strlen(m_pUserData->m_id) == 0) { - return; // ̹ .. + return; // 이미 유저가 빠진 경우.. } SetByte(send_buf, WIZ_LOGOUT, send_index); @@ -1282,7 +1282,7 @@ void CUser::MoveProcess(char * pBuf) { // real_y = m_pMain->m_ZoneArray[m_iZoneIndex]->GetHeight( real_x, real_y, real_z ); - // if( speed > 60 ) { // client ̼ġ ũ ... + // if( speed > 60 ) { // client 에서 이수치보다 크게 보낼때가 많음... // if( m_bSpeedAmount == 100 ) // speed = 0; // } @@ -1296,15 +1296,15 @@ void CUser::MoveProcess(char * pBuf) { } if (speed != 0) { - m_pUserData->m_curx = m_fWill_x; // ִ ǥ ǥ ... + m_pUserData->m_curx = m_fWill_x; // 가지고 있던 다음좌표를 현재좌표로 셋팅... m_pUserData->m_curz = m_fWill_z; m_pUserData->m_cury = m_fWill_y; - m_fWill_x = will_x / 10.0f; // ǥ .... + m_fWill_x = will_x / 10.0f; // 다음좌표를 기억.... m_fWill_z = will_z / 10.0f; m_fWill_y = will_y / 10.0f; } else { - m_pUserData->m_curx = m_fWill_x = will_x / 10.0f; // ǥ == ǥ... + m_pUserData->m_curx = m_fWill_x = will_x / 10.0f; // 다음좌표 == 현재 좌표... m_pUserData->m_curz = m_fWill_z = will_z / 10.0f; m_pUserData->m_cury = m_fWill_y = will_y / 10.0f; } @@ -1366,7 +1366,7 @@ void CUser::UserInOut(BYTE Type) { if (Type == USER_OUT) { m_pMain->Send_Region(buff, send_index, (int)m_pUserData->m_bZone, m_RegionX, m_RegionZ, this); - // AI Server .. + // AI Server쪽으로 정보 전송.. send_index = 0; memset(buff, 0x00, 256); SetByte(buff, AG_USER_INOUT, send_index); @@ -1412,7 +1412,7 @@ void CUser::UserInOut(BYTE Type) { SetByte(buff, m_pUserData->m_bFace, send_index); SetByte(buff, m_pUserData->m_bHairColor, send_index); SetByte(buff, m_bResHpType, send_index); - // 񷯸ӱ ... + // 비러머글 수능... SetByte(buff, m_bAbnormalType, send_index); // SetByte(buff, m_bNeedParty, send_index); @@ -1437,8 +1437,8 @@ void CUser::UserInOut(BYTE Type) { // TRACE("USERINOUT - %d, %s\n", m_Sid, m_pUserData->m_id); m_pMain->Send_Region(buff, send_index, (int)m_pUserData->m_bZone, m_RegionX, m_RegionZ, this); - // AI Server .. - // ̰ ʵǵ ʹ ̿ . + // AI Server쪽으로 정보 전송.. + // 이거 않되도 너무 미워하지 마세요 ㅜ.ㅜ if (m_bAbnormalType != ABNORMAL_BLINKING) { send_index = 0; memset(buff, 0x00, 256); @@ -1489,7 +1489,7 @@ void CUser::Attack(char * pBuf) { result = GetByte(pBuf, index); // sid = GetShort( pBuf, index ); tid = GetShort(pBuf, index); - // 񷯸ӱ ŷ --; + // 비러머글 해킹툴 유저 --; delaytime = GetShort(pBuf, index); distance = GetShort(pBuf, index); // @@ -1512,7 +1512,7 @@ void CUser::Attack(char * pBuf) { m_pUserData->m_sHp); return; } - // 񷯸ӱ ŷ --; + // 비러머글 해킹툴 유저 --; pTable = m_pMain->m_ItemtableArray.GetData( m_pUserData->m_sItemArray[RIGHTHAND].nNum); // This checks if such an item exists. if (!pTable && m_pUserData->m_sItemArray[RIGHTHAND].nNum != 0) { @@ -1542,7 +1542,7 @@ void CUser::Attack(char * pBuf) { pTUser->m_pUserData->m_bNation == m_pUserData->m_bNation) { result = 0x00; } else { - // 񷯸ӱ ŷ --; + // 비러머글 해킹툴 유저 --; if (pTable) { // Check if the user is holding a weapon!!! No null pointers allowed!!! // TRACE("Distance : %f , Table Distance : %f \r\n", distance, pTable->m_sRange / 10.0f); // if ( distance > (pTable->m_sRange / 10.0f)) { @@ -1553,7 +1553,7 @@ void CUser::Attack(char * pBuf) { // damage = GetDamage(tid, 0); - // ο ο̶ ͸ ϵ,,, + // 눈싸움전쟁존에서 눈싸움중이라면 공격은 눈을 던지는 것만 가능하도록,,, if (m_pUserData->m_bZone == ZONE_SNOW_BATTLE && m_pMain->m_byBattleOpen == SNOW_BATTLE) { damage = 0; } @@ -1578,14 +1578,14 @@ void CUser::Attack(char * pBuf) { GoldChange(tid, 0); - // Ϻ ȣ ڵ!!! + // 기범이의 완벽한 보호 코딩!!! pTUser->InitType3(); // Init Type 3..... pTUser->InitType4(); // Init Type 4..... memset(buff, 0x00, 256); send_index = 0; if (pTUser->m_pUserData->m_bFame == - COMMAND_CAPTAIN) { // ֱ ִ ״´ٸ,, Ż + COMMAND_CAPTAIN) { // 지휘권한이 있는 유저가 죽는다면,, 지휘 권한 박탈 pTUser->m_pUserData->m_bFame = CHIEF; SetByte(buff, WIZ_AUTHORITY_CHANGE, send_index); SetByte(buff, COMMAND_AUTHORITY, send_index); @@ -1608,7 +1608,7 @@ void CUser::Attack(char * pBuf) { if (pTUser->m_pUserData->m_bZone != pTUser->m_pUserData->m_bNation && pTUser->m_pUserData->m_bZone < 3) { pTUser->ExpChange(-pTUser->m_iMaxExp / 100); - //TRACE(" 1% ￴ٴϱ .\r\n"); + //TRACE("정말로 1%만 깍였다니까요 ㅠ.ㅠ\r\n"); } // } @@ -1617,11 +1617,11 @@ void CUser::Attack(char * pBuf) { } } else if (tid >= NPC_BAND) { // NPC if (m_pMain->m_bPointCheckFlag == FALSE) { - return; // ϸ ȵ + return; // 포인터 참조하면 안됨 } pNpc = m_pMain->m_arNpcArray.GetData(tid); - if (pNpc && pNpc->m_NpcState != NPC_DEAD && pNpc->m_iHP > 0) { // Npc üũ.. - // 񷯸ӱ ŷ --; + if (pNpc && pNpc->m_NpcState != NPC_DEAD && pNpc->m_iHP > 0) { // Npc 상태 체크.. + // 비러머글 해킹툴 유저 --; if (pTable) { // Check if the user is holding a weapon!!! No null pointers allowed!!! // TRACE("Distance : %f , Table Distance : %f \r\n", distance, pTable->m_sRange / 10.0f); // if ( distance > (pTable->m_sRange / 10.0f)) { @@ -1639,8 +1639,8 @@ void CUser::Attack(char * pBuf) { // SetShort( buff, sid, send_index ); SetShort(buff, m_Sid, send_index); SetShort(buff, tid, send_index); - SetShort(buff, m_sTotalHit * m_bAttackAmount / 100, send_index); // ǥ - SetShort(buff, m_sTotalAc + m_sACAmount, send_index); // ǥ + SetShort(buff, m_sTotalHit * m_bAttackAmount / 100, send_index); // 표시 + SetShort(buff, m_sTotalAc + m_sACAmount, send_index); // 표시 Setfloat(buff, m_sTotalHitrate, send_index); Setfloat(buff, m_sTotalEvasionrate, send_index); SetShort(buff, m_sItemAc, send_index); @@ -1648,7 +1648,7 @@ void CUser::Attack(char * pBuf) { SetByte(buff, m_bMagicTypeRightHand, send_index); SetShort(buff, m_sMagicAmountLeftHand, send_index); SetShort(buff, m_sMagicAmountRightHand, send_index); - m_pMain->Send_AIServer(m_pUserData->m_bZone, buff, send_index); // AI Server .. + m_pMain->Send_AIServer(m_pUserData->m_bZone, buff, send_index); // AI Server쪽으로 정보 전송.. return; } } @@ -1666,7 +1666,7 @@ void CUser::Attack(char * pBuf) { if (tid < NPC_BAND) { if (result == 0x02) { if (pTUser) { - // Դ ٷ Ŷ ... ( , ֱ ؼ) + // 유저에게는 바로 데드 패킷을 날림... (한 번 더 보냄, 유령을 없애기 위해서) pTUser->Send(buff, send_index); memset(buff, 0x00, 256); wsprintf(buff, "*** User Attack Dead, id=%s, result=%d, type=%d, HP=%d", pTUser->m_pUserData->m_id, @@ -1800,7 +1800,7 @@ void CUser::SendMyInfo() { SetByte(send_buff, m_sItemCham, send_index); SetShort(send_buff, m_sTotalHit, send_index); SetShort(send_buff, m_sTotalAc, send_index); - // SetShort( send_buff, m_sBodyAc+m_sItemAc, send_index ); <- ̷ غþ? --; + // SetShort( send_buff, m_sBodyAc+m_sItemAc, send_index ); <- 누가 이렇게 해봤어? --; SetByte(send_buff, m_bFireR, send_index); SetByte(send_buff, m_bColdR, send_index); SetByte(send_buff, m_bLightningR, send_index); @@ -1808,7 +1808,7 @@ void CUser::SendMyInfo() { SetByte(send_buff, m_bDiseaseR, send_index); SetByte(send_buff, m_bPoisonR, send_index); SetInt64(send_buff, m_pUserData->m_iGold, send_index); - // ̰ ߿ ּ --; + // 이거 나중에 꼭 주석해 --; SetByte(send_buff, m_pUserData->m_bAuthority, send_index); // for (int i = 0; i < 9; i++) { @@ -1829,7 +1829,7 @@ void CUser::SendMyInfo() { Send(send_buff, send_index); - // AI Server .. + // AI Server쪽으로 정보 전송.. int ai_send_index = 0; char ai_send_buff[256]; memset(ai_send_buff, NULL, 256); @@ -1844,8 +1844,8 @@ void CUser::SendMyInfo() { SetByte(ai_send_buff, m_pUserData->m_bLevel, ai_send_index); SetShort(ai_send_buff, m_pUserData->m_sHp, ai_send_index); SetShort(ai_send_buff, m_pUserData->m_sMp, ai_send_index); - SetShort(ai_send_buff, m_sTotalHit * m_bAttackAmount / 100, ai_send_index); // ǥ - SetShort(ai_send_buff, m_sTotalAc + m_sACAmount, ai_send_index); // ǥ + SetShort(ai_send_buff, m_sTotalHit * m_bAttackAmount / 100, ai_send_index); // 표시 + SetShort(ai_send_buff, m_sTotalAc + m_sACAmount, ai_send_index); // 표시 Setfloat(ai_send_buff, m_sTotalHitrate, ai_send_index); Setfloat(ai_send_buff, m_sTotalEvasionrate, ai_send_index); @@ -1891,7 +1891,7 @@ void CUser::Chat(char * pBuf) { if (m_pUserData->m_bAuthority != 0) { return; } - //sprintf( finalstr, "#### : %s ####", chatstr ); + //sprintf( finalstr, "#### 공지 : %s ####", chatstr ); ::_LoadStringFromResource(IDP_ANNOUNCEMENT, buff); sprintf(finalstr, buff.c_str(), chatstr); } else { @@ -1915,7 +1915,7 @@ void CUser::Chat(char * pBuf) { break; } if (m_sPrivateChatUser == m_Sid) { - break; // ̰ ߰ :P + break; // 이건 내가 추가했지롱 :P } pUser = (CUser *)m_pMain->m_Iocport.m_SockArray[m_sPrivateChatUser]; if (!pUser || (pUser->GetState() != STATE_GAMESTART)) { @@ -1944,7 +1944,7 @@ void CUser::Chat(char * pBuf) { m_pMain->Send_All(send_buff, send_index); break; case COMMAND_CHAT: - if (m_pUserData->m_bFame == COMMAND_CAPTAIN) { // ֱڸ ä ǵ + if (m_pUserData->m_bFame == COMMAND_CAPTAIN) { // 지휘권자만 채팅이 되도록 m_pMain->Send_CommandChat(send_buff, send_index, m_pUserData->m_bNation, this); } break; @@ -1973,7 +1973,7 @@ void CUser::SetMaxHp(int iFlag) { (0.1 * m_pUserData->m_bLevel * temp_sta) + (temp_sta / 5)) + m_sMaxHPAmount + m_sItemMaxHp); if (iFlag == 1) { - m_pUserData->m_sHp = m_iMaxHp + 20; // hp ָ ڵ hpchange()Լ ,, Ǽ^^* + m_pUserData->m_sHp = m_iMaxHp + 20; // 조금 더 hp를 주면 자동으로 hpchange()함수가 실행됨,, 꽁수^^* } else if (iFlag == 2) { m_iMaxHp = 100; } @@ -2006,7 +2006,7 @@ void CUser::SetMaxMp() { m_iMaxMp = (short)((p_TableCoefficient->MP * m_pUserData->m_bLevel * m_pUserData->m_bLevel * temp_intel) + (0.1f * m_pUserData->m_bLevel * 2 * temp_intel) + (temp_intel / 5)); m_iMaxMp += m_sItemMaxMp; - m_iMaxMp += 20; // û + m_iMaxMp += 20; // 성래씨 요청 } else if (p_TableCoefficient->SP != 0) { m_iMaxMp = (short)((p_TableCoefficient->SP * m_pUserData->m_bLevel * m_pUserData->m_bLevel * temp_sta) + (0.1f * m_pUserData->m_bLevel * temp_sta) + (temp_sta / 5)); @@ -2019,9 +2019,9 @@ void CUser::SetMaxMp() { } } -void CUser::Regene(char * pBuf, int magicid) // ʹ ̶ ߿ ݵ ؾ Լ.... +void CUser::Regene(char * pBuf, int magicid) // 너무 개판이라 나중에 반드시 수정해야 할 함수.... { - // Corpse(); // Get rid of the corpse ~ ĥ ڳ ٺ!!! + // Corpse(); // Get rid of the corpse ~ 또 사고칠뻔 했자나 이 바보야!!! InitType3(); InitType4(); @@ -2065,7 +2065,7 @@ void CUser::SetMaxMp() { return; } - UserInOut(USER_OUT); // ٹۿ --; + UserInOut(USER_OUT); // 원래는 이 한줄밖에 없었음 --; float x = 0.0f, z = 0.0f; x = (float)(myrand(0, 400) / 100.0f); @@ -2099,14 +2099,14 @@ void CUser::SetMaxMp() { */ x = pHomeInfo->BattleZoneX + myrand(0, pHomeInfo->BattleZoneLX); z = pHomeInfo->BattleZoneZ + myrand(0, pHomeInfo->BattleZoneLZ); - // 񷯸ӱ ô ٲپġ >.< + // 비러머글 개척존 바꾸어치기 >.< if (m_pUserData->m_bZone == ZONE_SNOW_BATTLE) { x = pHomeInfo->FreeZoneX + myrand(0, pHomeInfo->FreeZoneLX); z = pHomeInfo->FreeZoneZ + myrand(0, pHomeInfo->FreeZoneLZ); } // } - // 񷯸ӱ >.< + // 비러머글 뉴존 >.< else if (m_pUserData->m_bZone > 10 && m_pUserData->m_bZone < 20) { x = 527 + myrand(0, 10); z = 543 + myrand(0, 10); @@ -2126,7 +2126,7 @@ void CUser::SetMaxMp() { m_pUserData->m_curx = x; m_pUserData->m_curz = z; - } else { // Ŀ Warp ľ Ұ ... + } else { // 추후에 Warp 랑 합쳐야 할것 같음... if (m_pUserData->m_bNation == KARUS) { x = pHomeInfo->KarusZoneX + myrand(0, pHomeInfo->KarusZoneLX); z = pHomeInfo->KarusZoneZ + myrand(0, pHomeInfo->KarusZoneLZ); @@ -2176,14 +2176,14 @@ void CUser::SetMaxMp() { m_bRegeneType = REGENE_NORMAL; } - // 񷯸ӱ Ŭ ȯ!!! + // 비러머글 클랜 소환!!! m_fLastRegeneTime = TimeGet(); // m_sWhoKilledMe = -1; m_iLostExp = 0; // if (m_bAbnormalType != ABNORMAL_BLINKING) { - // AI_server regene ... + // AI_server로 regene정보 전송... memset(send_buff, NULL, 1024); send_index = 0; SetByte(send_buff, AG_USER_REGENE, send_index); @@ -2193,12 +2193,12 @@ void CUser::SetMaxMp() { } // memset(send_buff, NULL, 1024); - send_index = 0; // send_index ??? --; + send_index = 0; // 이 send_index는 왜 없었을까??? --; wsprintf(send_buff, "<------ User Regene ,, nid=%d, name=%s, type=%d ******", m_Sid, m_pUserData->m_id, m_bResHpType); //TimeTrace(send_buff); memset(send_buff, NULL, 1024); - send_index = 0; // ̰ Ȯλ ߰߾!!!! + send_index = 0; // 이거 확인사살로 추가했어요!!!! m_RegionX = (int)(m_pUserData->m_curx / VIEW_DISTANCE); m_RegionZ = (int)(m_pUserData->m_curz / VIEW_DISTANCE); @@ -2275,7 +2275,7 @@ void CUser::ZoneChange(int zone, float x, float z) { if (m_pMain->m_byBattleOpen == NATION_BATTLE) { // Battle zone open if (m_pUserData->m_bZone == BATTLE_ZONE) { - if (pMap->m_bType == 1 && m_pUserData->m_bNation != zone) { // Ѿ .. + if (pMap->m_bType == 1 && m_pUserData->m_bNation != zone) { // 상대방 국가로 못넘어 가게.. if (m_pUserData->m_bNation == KARUS && !m_pMain->m_byElmoradOpenFlag) { TRACE("#### ZoneChange Fail ,,, id=%s, nation=%d, flag=%d\n", m_pUserData->m_id, m_pUserData->m_bNation, m_pMain->m_byElmoradOpenFlag); @@ -2286,13 +2286,13 @@ void CUser::ZoneChange(int zone, float x, float z) { return; } } - } else if (pMap->m_bType == 1 && m_pUserData->m_bNation != zone) { // Ѿ .. + } else if (pMap->m_bType == 1 && m_pUserData->m_bNation != zone) { // 상대방 국가로 못넘어 가게.. return; } // else if (pMap->m_bType == 2 && zone == ZONE_FRONTIER) { // You can't go to frontier zone when Battlezone is open. - // 񷯸ӱ .... + // 비러머글 마을 도착 공지.... int temp_index = 0; char temp_buff[128]; memset(temp_buff, NULL, 128); @@ -2306,7 +2306,7 @@ void CUser::ZoneChange(int zone, float x, float z) { } // } else if (m_pMain->m_byBattleOpen == SNOW_BATTLE) { // Snow Battle zone open - if (pMap->m_bType == 1 && m_pUserData->m_bNation != zone) { // Ѿ .. + if (pMap->m_bType == 1 && m_pUserData->m_bNation != zone) { // 상대방 국가로 못넘어 가게.. return; } else if (pMap->m_bType == 2 && (zone == ZONE_FRONTIER || @@ -2315,7 +2315,7 @@ void CUser::ZoneChange(int zone, float x, float z) { } } else { // Battle zone close if (pMap->m_bType == 1 && m_pUserData->m_bNation != zone && - (zone < 10 || zone > 20)) { // Ѿ .. + (zone < 10 || zone > 20)) { // 상대방 국가로 못넘어 가게.. return; } } @@ -2339,7 +2339,7 @@ void CUser::ZoneChange(int zone, float x, float z) { SetMaxHp(); } - PartyRemove(m_Sid); // Ƽ Żǵ ó + PartyRemove(m_Sid); // 파티에서 탈퇴되도록 처리 //TRACE("ZoneChange ,,, id=%s, nation=%d, zone=%d, x=%.2f, z=%.2f\n", m_pUserData->m_id, m_pUserData->m_bNation, zone, x, z); @@ -2366,7 +2366,7 @@ void CUser::ZoneChange(int zone, float x, float z) { SetShort(send_buff, strlen(pInfo->strServerIP), send_index); SetString(send_buff, pInfo->strServerIP, strlen(pInfo->strServerIP), send_index); SetShort(send_buff, pInfo->sPort, send_index); - SetByte(send_buff, 0x02, send_index); // ߰ ٲ ... + SetByte(send_buff, 0x02, send_index); // 중간에 서버가 바뀌는 경우... SetByte(send_buff, m_pUserData->m_bZone, send_index); SetByte(send_buff, m_pMain->m_byOldVictory, send_index); Send(send_buff, send_index); @@ -2385,7 +2385,7 @@ void CUser::ZoneChange(int zone, float x, float z) { SetShort(send_buff, (short)m_pUserData->m_cury * 10, send_index); SetByte(send_buff, m_pMain->m_byOldVictory, send_index); Send(send_buff, send_index); - // 񷯸ӱ ̵ >.< + // 비러머글 순간이동 >.< if (!m_bZoneChangeSameZone) { m_sWhoKilledMe = -1; m_iLostExp = 0; @@ -2501,7 +2501,7 @@ void CUser::SetDetailData() { m_iZoneIndex = m_pMain->GetZoneIndex(m_pUserData->m_bZone); - if (m_iZoneIndex == -1) { // .... + if (m_iZoneIndex == -1) { // 이 서버에 없는 존.... Close(); } @@ -2536,12 +2536,12 @@ void CUser::RegisterRegion() { if (m_State == STATE_GAMESTART) { RemoveRegion(old_region_x - m_RegionX, - old_region_z - m_RegionZ); // delete user ݴ... - InsertRegion(m_RegionX - old_region_x, m_RegionZ - old_region_z); // add user ... + old_region_z - m_RegionZ); // delete user 는 계산 방향이 진행방향의 반대... + InsertRegion(m_RegionX - old_region_x, m_RegionZ - old_region_z); // add user 는 계산 방향이 진행방향... m_pMain->RegionNpcInfoForMe(this); m_pMain->RegionUserInOutForMe(this); } - // TRACE("User Region ,, region_x=%d, y=%d\n", m_RegionX, m_RegionZ); + // TRACE("User를 Region에 등록,, region_x=%d, y=%d\n", m_RegionX, m_RegionZ); } } @@ -2604,7 +2604,7 @@ void CUser::RemoveRegion(int del_x, int del_z) { SetByte( buff, m_pUserData->m_bFace, send_index ); SetByte( buff, m_pUserData->m_bHairColor, send_index ); SetByte( buff, m_bResHpType, send_index ); -// 񷯸ӱ ... +// 비러머글 수능... SetByte( buff, m_bAbnormalType, send_index ); // SetByte( buff, m_bNeedParty, send_index ); @@ -2627,15 +2627,15 @@ void CUser::RemoveRegion(int del_x, int del_z) { SetShort( buff, m_pUserData->m_sItemArray[LEFTHAND].sDuration, send_index ); */ ////// - if (del_x != 0) { // x ̵Ǿ... + if (del_x != 0) { // x 축으로 이동되었을때... m_pMain->Send_UnitRegion(buff, send_index, m_iZoneIndex, m_RegionX + del_x * 2, m_RegionZ + del_z - 1); m_pMain->Send_UnitRegion(buff, send_index, m_iZoneIndex, m_RegionX + del_x * 2, m_RegionZ + del_z); m_pMain->Send_UnitRegion(buff, send_index, m_iZoneIndex, m_RegionX + del_x * 2, m_RegionZ + del_z + 1); // TRACE("Remove : (%d %d), (%d %d), (%d %d)\n", m_RegionX+del_x*2, m_RegionZ+del_z-1, m_RegionX+del_x*2, m_RegionZ+del_z, m_RegionX+del_x*2, m_RegionZ+del_z+1 ); } - if (del_z != 0) { // z ̵Ǿ... + if (del_z != 0) { // z 축으로 이동되었을때... m_pMain->Send_UnitRegion(buff, send_index, m_iZoneIndex, m_RegionX + del_x, m_RegionZ + del_z * 2); - if (del_x < 0) { // x, z Ѵ ̵Ǿ ġ κ ѹ .. + if (del_x < 0) { // x, z 축 둘다 이동되었을때 겹치는 부분 한번만 보낸다.. m_pMain->Send_UnitRegion(buff, send_index, m_iZoneIndex, m_RegionX + del_x + 1, m_RegionZ + del_z * 2); } else if (del_x > 0) { m_pMain->Send_UnitRegion(buff, send_index, m_iZoneIndex, m_RegionX + del_x - 1, m_RegionZ + del_z * 2); @@ -2700,11 +2700,11 @@ void CUser::InsertRegion(int del_x, int del_z) { SetByte(buff, m_pUserData->m_bFace, send_index); SetByte(buff, m_pUserData->m_bHairColor, send_index); SetByte(buff, m_bResHpType, send_index); - // 񷯸ӱ ... + // 비러머글 수능... SetByte(buff, m_bAbnormalType, send_index); // SetByte(buff, m_bNeedParty, send_index); - // ̰͵ ߿ ּ --; + // 이것도 나중에 주석 해 --; SetByte(buff, m_pUserData->m_bAuthority, send_index); // SetDWORD(buff, m_pUserData->m_sItemArray[BREAST].nNum, send_index); @@ -2724,17 +2724,17 @@ void CUser::InsertRegion(int del_x, int del_z) { SetDWORD(buff, m_pUserData->m_sItemArray[LEFTHAND].nNum, send_index); SetShort(buff, m_pUserData->m_sItemArray[LEFTHAND].sDuration, send_index); - if (del_x != 0) { // x ̵Ǿ... + if (del_x != 0) { // x 축으로 이동되었을때... m_pMain->Send_UnitRegion(buff, send_index, m_iZoneIndex, m_RegionX + del_x, m_RegionZ - 1); m_pMain->Send_UnitRegion(buff, send_index, m_iZoneIndex, m_RegionX + del_x, m_RegionZ); m_pMain->Send_UnitRegion(buff, send_index, m_iZoneIndex, m_RegionX + del_x, m_RegionZ + 1); // TRACE("Insert : (%d %d), (%d %d), (%d %d)\n", m_RegionX+del_x, m_RegionZ-1, m_RegionX+del_x, m_RegionZ, m_RegionX+del_x, m_RegionZ+1 ); } - if (del_z != 0) { // z ̵Ǿ... + if (del_z != 0) { // z 축으로 이동되었을때... m_pMain->Send_UnitRegion(buff, send_index, m_iZoneIndex, m_RegionX, m_RegionZ + del_z); - if (del_x < 0) { // x, z Ѵ ̵Ǿ ġ κ ѹ .. + if (del_x < 0) { // x, z 축 둘다 이동되었을때 겹치는 부분 한번만 보낸다.. m_pMain->Send_UnitRegion(buff, send_index, m_iZoneIndex, m_RegionX + 1, m_RegionZ + del_z); } else if (del_x > 0) { m_pMain->Send_UnitRegion(buff, send_index, m_iZoneIndex, m_RegionX - 1, m_RegionZ + del_z); @@ -2753,7 +2753,7 @@ void CUser::RequestUserIn(char * pBuf) { char buff[40960]; memset(buff, NULL, 40960); - buff_index = 3; // packet command user_count ߿ Ѵ... + buff_index = 3; // packet command 와 user_count 는 나중에 셋팅한다... user_count = GetShort(pBuf, index); for (int i = 0; i < user_count; i++) { uid = GetShort(pBuf, index); @@ -2801,11 +2801,11 @@ void CUser::RequestUserIn(char * pBuf) { SetByte(buff, pUser->m_pUserData->m_bFace, buff_index); SetByte(buff, pUser->m_pUserData->m_bHairColor, buff_index); SetByte(buff, pUser->m_bResHpType, buff_index); - // 񷯸ӱ ... + // 비러머글 수능... SetByte(buff, pUser->m_bAbnormalType, buff_index); // SetByte(buff, pUser->m_bNeedParty, buff_index); - // ּó + // 여기두 주석처리 SetByte(buff, pUser->m_pUserData->m_bAuthority, buff_index); // SetDWORD(buff, pUser->m_pUserData->m_sItemArray[BREAST].nNum, buff_index); @@ -2841,7 +2841,7 @@ void CUser::RequestUserIn(char * pBuf) { void CUser::RequestNpcIn(char * pBuf) { if (m_pMain->m_bPointCheckFlag == FALSE) { - return; // ϸ ȵ + return; // 포인터 참조하면 안됨 } int index = 0, nid = -1, npc_count = 0, buff_index = 0, t_count = 0; @@ -2849,7 +2849,7 @@ void CUser::RequestNpcIn(char * pBuf) { char buff[20480]; memset(buff, NULL, 20480); - buff_index = 3; // packet command user_count ߿ Ѵ... + buff_index = 3; // packet command 와 user_count 는 나중에 셋팅한다... npc_count = GetShort(pBuf, index); for (int i = 0; i < npc_count; i++) { nid = GetShort(pBuf, index); @@ -2860,7 +2860,7 @@ void CUser::RequestNpcIn(char * pBuf) { break; } pNpc = m_pMain->m_arNpcArray.GetData(nid); - //if( pNpc && (pNpc->m_NpcState == NPC_LIVE ) ) { // ,, + //if( pNpc && (pNpc->m_NpcState == NPC_LIVE ) ) { // 음냥,, if (pNpc) { SetShort(buff, pNpc->m_sNid, buff_index); SetShort(buff, pNpc->m_sPid, buff_index); @@ -3012,7 +3012,7 @@ BYTE CUser::GetHitRate(float rate) { return result; } -void CUser::SetSlotItemValue() // (Ÿݷ, ȸ, ) Ѵ. +void CUser::SetSlotItemValue() // 착용한 아이템의 값(타격률, 회피율, 데미지)을 구한다. { _ITEM_TABLE * pTable = NULL; int item_hit = 0, item_ac = 0; @@ -3068,7 +3068,7 @@ BYTE CUser::GetHitRate(float rate) { } if (i == LEFTHAND) { if ((m_pUserData->m_sClass == BERSERKER || m_pUserData->m_sClass == BLADE)) { - // m_sItemHit += item_hit * (double)( m_pUserData->m_bstrSkill[PRO_SKILL1] / 60.0 ); // û ^^; + // m_sItemHit += item_hit * (double)( m_pUserData->m_bstrSkill[PRO_SKILL1] / 60.0 ); // 성래씨 요청 ^^; m_sItemHit += item_hit * 0.5f; } } @@ -3232,8 +3232,8 @@ short CUser::GetDamage(short tid, int magicid) { return -1; } - temp_ac = pTUser->m_sTotalAc + pTUser->m_sACAmount; // ǥ - temp_hit_B = (int)((m_sTotalHit * m_bAttackAmount * 200 / 100) / (temp_ac + 240)); // ǥ + temp_ac = pTUser->m_sTotalAc + pTUser->m_sACAmount; // 표시 + temp_hit_B = (int)((m_sTotalHit * m_bAttackAmount * 200 / 100) / (temp_ac + 240)); // 표시 if (magicid > 0) { // Skill/Arrow hit. pTable = m_pMain->m_MagictableArray.GetData(magicid); // Get main magic table. @@ -3277,13 +3277,13 @@ short CUser::GetDamage(short tid, int magicid) { } if (pType2->bHitType == 1 /* || pType2->bHitType == 2 */) { - temp_hit = m_sTotalHit * m_bAttackAmount * (pType2->sAddDamage / 100.0f) / 100; // ǥ + temp_hit = m_sTotalHit * m_bAttackAmount * (pType2->sAddDamage / 100.0f) / 100; // 표시 } else { temp_hit = temp_hit_B * (pType2->sAddDamage / 100.0f); } } } else { // Normal Hit. - temp_hit = m_sTotalHit * m_bAttackAmount / 100; // ǥ + temp_hit = m_sTotalHit * m_bAttackAmount / 100; // 표시 result = GetHitRate(m_sTotalHitrate / pTUser->m_sTotalEvasionrate); } @@ -3313,8 +3313,8 @@ short CUser::GetDamage(short tid, int magicid) { damage = GetMagicDamage(damage, tid); // 2. Magical item damage.... damage = GetACDamage(damage, tid); // 3. Additional AC calculation.... - // damage = damage / 2; // ߰ û!!!! - damage = damage / 3; // ߰ û!!!! + // damage = damage / 2; // 성래씨 추가 요청!!!! + damage = damage / 3; // 성래씨 추가 요청!!!! return damage; } @@ -3718,7 +3718,7 @@ void CUser::HpChange(int amount, int type, bool attack) // type : Received From m_pMain->Send_PartyMember(m_sPartyIndex, buff, send_index); } - if (m_pUserData->m_sHp == 0 && attack == false) { // ؼ ״° Dead Packet + if (m_pUserData->m_sHp == 0 && attack == false) { // 직접 가격해서 죽는경우는 Dead Packet 없음 Dead(); } } @@ -3764,8 +3764,8 @@ void CUser::Send2AI_UserUpdateInfo() { SetByte(send_buf, m_pUserData->m_bLevel, send_index); SetShort(send_buf, m_pUserData->m_sHp, send_index); SetShort(send_buf, m_pUserData->m_sMp, send_index); - SetShort(send_buf, m_sTotalHit * m_bAttackAmount / 100, send_index); // ǥ - SetShort(send_buf, m_sTotalAc + m_sACAmount, send_index); // ǥ + SetShort(send_buf, m_sTotalHit * m_bAttackAmount / 100, send_index); // 표시 + SetShort(send_buf, m_sTotalAc + m_sACAmount, send_index); // 표시 Setfloat(send_buf, m_sTotalHitrate, send_index); Setfloat(send_buf, m_sTotalEvasionrate, send_index); @@ -3793,7 +3793,7 @@ void CUser::SetUserAbility() { if (m_pUserData->m_sItemArray[RIGHTHAND].nNum != 0) { pItem = m_pMain->m_ItemtableArray.GetData(m_pUserData->m_sItemArray[RIGHTHAND].nNum); if (pItem) { - switch (pItem->m_bKind / 10) { // Ÿ.... + switch (pItem->m_bKind / 10) { // 무기 타입.... case WEAPON_DAGGER: hitcoefficient = p_TableCoefficient->ShortSword; break; @@ -3837,9 +3837,9 @@ void CUser::SetUserAbility() { } if (m_pUserData->m_sItemArray[LEFTHAND].nNum != 0 && hitcoefficient == 0.0f) { pItem = - m_pMain->m_ItemtableArray.GetData(m_pUserData->m_sItemArray[LEFTHAND].nNum); // ޼ : Ȱ + m_pMain->m_ItemtableArray.GetData(m_pUserData->m_sItemArray[LEFTHAND].nNum); // 왼손 무기 : 활 적용을 위해 if (pItem) { - switch (pItem->m_bKind / 10) { // Ÿ.... + switch (pItem->m_bKind / 10) { // 무기 타입.... case WEAPON_BOW: case WEAPON_LONGBOW: case WEAPON_LAUNCHER: @@ -3861,8 +3861,8 @@ void CUser::SetUserAbility() { m_sBodyAc = m_pUserData->m_bLevel; m_sMaxWeight = (m_pUserData->m_bStr + m_sItemStr) * 50; /* - ü ݷ = 0.005 * Ȱ ݷ * (Dex + 40) + * Ȱ ݷ * ȭݷ * * Dex - ݷ = 0.005 * ݷ * (Str + 40) + * Ȱ ݷ * ȭݷ * * Dex + 궁수 공격력 = 0.005 * 활 공격력 * (Dex + 40) + 직업계수 * 활 공격력 * 화살공격력 * 레벨 * Dex + 전사 공격력 = 0.005 * 무기 공격력 * (Str + 40) + 직업계수 * 활 공격력 * 화살공격력 * 레벨 * Dex */ if (bHaveBow) { // m_sTotalHit = (short)((((0.005 * pItem->m_sDamage * temp_dex) + ( hitcoefficient * pItem->m_sDamage * m_pUserData->m_bLevel * temp_dex )) + 3) * (m_bAttackAmount/100)); @@ -3883,7 +3883,7 @@ void CUser::SetUserAbility() { // m_sTotalAc = (short)(((p_TableCoefficient->AC * (m_sBodyAc+m_sItemAc) * temp_str )) + m_sACAmount ); // m_sTotalAc = (short)(((p_TableCoefficient->AC * (m_sBodyAc + m_sItemAc + m_sACAmount) * temp_str ))); - // Ż AC = ̺ ڿǼƮ * ( + AC + ̺ 4 AC) + // 토탈 AC = 테이블 코에피션트 * (레벨 + 아이템 AC + 테이블 4의 AC) // m_sTotalAc = (short)(p_TableCoefficient->AC * (m_sBodyAc + m_sItemAc + m_sACAmount)); m_sTotalAc = (short)(p_TableCoefficient->AC * (m_sBodyAc + m_sItemAc)); m_sTotalHitrate = ((1 + p_TableCoefficient->Hitrate * m_pUserData->m_bLevel * temp_dex) * m_sItemHitrate / 100) * @@ -3956,13 +3956,13 @@ void CUser::ItemMove(char * pBuf) { pTable->m_bSlot == 0x01 || (pTable->m_bSlot == 0x00 && destpos == - RIGHTHAND)) { // (Ǵ վ ְ Ϸ ġ ) ε ٸտ μվ üũ + RIGHTHAND)) { // 오른손전용 무기(또는 양손쓸수 있고 장착하려는 위치가 오른손) 인데 다른손에 두손쓰는 경우 체크 if (m_pUserData->m_sItemArray[LEFTHAND].nNum != 0) { _ITEM_TABLE * pTable2 = m_pMain->m_ItemtableArray.GetData(m_pUserData->m_sItemArray[LEFTHAND].nNum); if (pTable2) { if (pTable2->m_bSlot == 0x04) { m_pUserData->m_sItemArray[RIGHTHAND].nNum = - m_pUserData->m_sItemArray[SLOT_MAX + srcpos].nNum; // տ ֱ.. + m_pUserData->m_sItemArray[SLOT_MAX + srcpos].nNum; // 오른손에 넣구.. m_pUserData->m_sItemArray[RIGHTHAND].sDuration = m_pUserData->m_sItemArray[SLOT_MAX + srcpos].sDuration; m_pUserData->m_sItemArray[RIGHTHAND].sCount = @@ -3973,7 +3973,7 @@ void CUser::ItemMove(char * pBuf) { m_pUserData->m_sItemArray[RIGHTHAND].nSerialNum = m_pMain->GenerateItemSerial(); } m_pUserData->m_sItemArray[SLOT_MAX + srcpos].nNum = - m_pUserData->m_sItemArray[LEFTHAND].nNum; // ޼չ⸦ κ ־ش. + m_pUserData->m_sItemArray[LEFTHAND].nNum; // 왼손무기를 인벤으로 넣어준다. m_pUserData->m_sItemArray[SLOT_MAX + srcpos].sDuration = m_pUserData->m_sItemArray[LEFTHAND].sDuration; m_pUserData->m_sItemArray[SLOT_MAX + srcpos].sCount = @@ -3983,7 +3983,7 @@ void CUser::ItemMove(char * pBuf) { if (m_pUserData->m_sItemArray[SLOT_MAX + srcpos].nSerialNum == 0) { m_pUserData->m_sItemArray[SLOT_MAX + srcpos].nSerialNum = m_pMain->GenerateItemSerial(); } - m_pUserData->m_sItemArray[LEFTHAND].nNum = 0; // ޼ ְ ... + m_pUserData->m_sItemArray[LEFTHAND].nNum = 0; // 왼손은 비어있게 되지... m_pUserData->m_sItemArray[LEFTHAND].sDuration = 0; m_pUserData->m_sItemArray[LEFTHAND].sCount = 0; m_pUserData->m_sItemArray[LEFTHAND].nSerialNum = 0; @@ -4035,7 +4035,7 @@ void CUser::ItemMove(char * pBuf) { pTable->m_bSlot == 0x02 || (pTable->m_bSlot == 0x00 && destpos == - LEFTHAND)) { // ޼ (Ǵ վ ְ Ϸ ġ ޼) ε ٸտ μվ üũ + LEFTHAND)) { // 왼손전용 무기(또는 양손쓸수 있고 장착하려는 위치가 왼손) 인데 다른손에 두손쓰는 경우 체크 if (m_pUserData->m_sItemArray[RIGHTHAND].nNum != 0) { _ITEM_TABLE * pTable2 = m_pMain->m_ItemtableArray.GetData(m_pUserData->m_sItemArray[RIGHTHAND].nNum); if (pTable2) { @@ -4051,7 +4051,7 @@ void CUser::ItemMove(char * pBuf) { m_pUserData->m_sItemArray[LEFTHAND].nSerialNum = m_pMain->GenerateItemSerial(); } m_pUserData->m_sItemArray[SLOT_MAX + srcpos].nNum = - m_pUserData->m_sItemArray[RIGHTHAND].nNum; // չ⸦ κ ־ش. + m_pUserData->m_sItemArray[RIGHTHAND].nNum; // 오른손무기를 인벤으로 넣어준다. m_pUserData->m_sItemArray[SLOT_MAX + srcpos].sDuration = m_pUserData->m_sItemArray[RIGHTHAND].sDuration; m_pUserData->m_sItemArray[SLOT_MAX + srcpos].sCount = @@ -4109,7 +4109,7 @@ void CUser::ItemMove(char * pBuf) { m_pUserData->m_sItemArray[destpos].nSerialNum = m_pMain->GenerateItemSerial(); } } - } else if (pTable->m_bSlot == 0x03) { // μ ϰ + } else if (pTable->m_bSlot == 0x03) { // 두손 사용하고 오른손 무기 if (m_pUserData->m_sItemArray[LEFTHAND].nNum != 0 && m_pUserData->m_sItemArray[RIGHTHAND].nNum != 0) { goto fail_return; } else if (m_pUserData->m_sItemArray[LEFTHAND].nNum != 0) { @@ -4153,7 +4153,7 @@ void CUser::ItemMove(char * pBuf) { m_pUserData->m_sItemArray[destpos].nSerialNum = m_pMain->GenerateItemSerial(); } } - } else if (pTable->m_bSlot == 0x04) { // μ ϰ ޼ + } else if (pTable->m_bSlot == 0x04) { // 두손 사용하고 왼손 무기 if (m_pUserData->m_sItemArray[LEFTHAND].nNum != 0 && m_pUserData->m_sItemArray[RIGHTHAND].nNum != 0) { goto fail_return; } else if (m_pUserData->m_sItemArray[RIGHTHAND].nNum != 0) { @@ -4328,7 +4328,7 @@ void CUser::ItemMove(char * pBuf) { break; } - if (dir != ITEM_INVEN_INVEN) { // ٲ 쿡 .. + if (dir != ITEM_INVEN_INVEN) { // 장착이 바뀌는 경우에만 계산.. SetSlotItemValue(); SetUserAbility(); } @@ -4360,7 +4360,7 @@ void CUser::ItemMove(char * pBuf) { BYTE m_bChaAmount; */ - // 񷯸ӱ >.< + // 비러머글 사자의 힘 >.< SetByte(send_buff, WIZ_ITEM_MOVE, send_index); SetByte(send_buff, 0x01, send_index); SetShort(send_buff, m_sTotalHit, send_index); @@ -4368,11 +4368,11 @@ void CUser::ItemMove(char * pBuf) { SetShort(send_buff, m_sMaxWeight, send_index); SetShort(send_buff, m_iMaxHp, send_index); SetShort(send_buff, m_iMaxMp, send_index); - SetByte(send_buff, m_sItemStr + m_bStrAmount, send_index); // 񷯸ӱ >.< - SetByte(send_buff, m_sItemSta + m_bStaAmount, send_index); // 񷯸ӱ >.< - SetByte(send_buff, m_sItemDex + m_bDexAmount, send_index); // 񷯸ӱ >.< - SetByte(send_buff, m_sItemIntel + m_bIntelAmount, send_index); // 񷯸ӱ >.< - SetByte(send_buff, m_sItemCham + m_bChaAmount, send_index); // 񷯸ӱ >.< + SetByte(send_buff, m_sItemStr + m_bStrAmount, send_index); // 비러머글 사자의 힘 >.< + SetByte(send_buff, m_sItemSta + m_bStaAmount, send_index); // 비러머글 사자의 힘 >.< + SetByte(send_buff, m_sItemDex + m_bDexAmount, send_index); // 비러머글 사자의 힘 >.< + SetByte(send_buff, m_sItemIntel + m_bIntelAmount, send_index); // 비러머글 사자의 힘 >.< + SetByte(send_buff, m_sItemCham + m_bChaAmount, send_index); // 비러머글 사자의 힘 >.< SetByte(send_buff, m_bFireR, send_index); SetByte(send_buff, m_bColdR, send_index); SetByte(send_buff, m_bLightningR, send_index); @@ -4386,14 +4386,14 @@ void CUser::ItemMove(char * pBuf) { if ((dir == ITEM_INVEN_SLOT) && (destpos == HEAD || destpos == BREAST || destpos == SHOULDER || destpos == LEFTHAND || destpos == RIGHTHAND || destpos == LEG || destpos == GLOVE || destpos == FOOT)) { - UserLookChange(destpos, itemid, m_pUserData->m_sItemArray[destpos].sDuration); // + UserLookChange(destpos, itemid, m_pUserData->m_sItemArray[destpos].sDuration); // 장착 } if ((dir == ITEM_SLOT_INVEN) && (srcpos == HEAD || srcpos == BREAST || srcpos == SHOULDER || srcpos == LEFTHAND || srcpos == RIGHTHAND || srcpos == LEG || srcpos == GLOVE || srcpos == FOOT)) { - UserLookChange(srcpos, 0, 0); // + UserLookChange(srcpos, 0, 0); // 해제 } - // AI Server م Ÿ .... + // AI Server에 바끤 데이타 전송.... Send2AI_UserUpdateInfo(); return; @@ -4485,7 +4485,7 @@ BOOL CUser::IsValidSlotPos(_ITEM_TABLE * pTable, int destpos) { void CUser::NpcEvent(char * pBuf) { if (m_pMain->m_bPointCheckFlag == FALSE) { - return; // ϸ ȵ + return; // 포인터 참조하면 안됨 } int index = 0, send_index = 0, nid = 0, i = 0, temp_index = 0; @@ -4538,7 +4538,7 @@ void CUser::NpcEvent(char * pBuf) { case NPC_WARP: break; - case NPC_CLERIC: // 񷯸ӱ Ʈ NPC >.<.... + case NPC_CLERIC: // 비러머글 퀘스트 관련 NPC들 >.<.... case NPC_COUPON: case NPC_MONK_KARUS: case NPC_MONK_ELMORAD: @@ -4556,7 +4556,7 @@ void CUser::ItemTrade(char * pBuf) { memset(send_buf, NULL, 128); BYTE type, pos, destpos, result; - // ŷ ȵǰ... + // 상거래 안되게... if (m_bResHpType == USER_DEAD || m_pUserData->m_sHp == 0) { TRACE("### ItemTrade Fail : name=%s(%d), m_bResHpType=%d, hp=%d, x=%d, z=%d ###\n", m_pUserData->m_id, m_Sid, m_bResHpType, m_pUserData->m_sHp, (int)m_pUserData->m_curx, (int)m_pUserData->m_curz); @@ -4576,7 +4576,7 @@ void CUser::ItemTrade(char * pBuf) { } else { count = GetShort(pBuf, index); } - // 񷯸ӱ ũ ̹Ʈ >.< + // 비러머글 크리스마스 이밴트 >.< if (itemid >= ITEM_NO_TRADE) { goto fail_return; } @@ -4678,7 +4678,7 @@ void CUser::ItemTrade(char * pBuf) { // m_pUserData->m_sItemArray[SLOT_MAX + pos].nNum = itemid; m_pUserData->m_sItemArray[SLOT_MAX + pos].sDuration = pTable->m_sDuration; - if (pTable->m_bCountable && count > 0) { // count ִ + if (pTable->m_bCountable && count > 0) { // count 개념이 있는 아이템 m_pUserData->m_sItemArray[SLOT_MAX + pos].sCount += count; m_pUserData->m_iGold -= (pTable->m_iBuyPrice * count); } else { @@ -4746,7 +4746,7 @@ void CUser::SendTargetHP(BYTE echo, int tid, int damage) { } if (tid >= NPC_BAND) { if (m_pMain->m_bPointCheckFlag == FALSE) { - return; // ϸ ȵ + return; // 포인터 참조하면 안됨 } pNpc = m_pMain->m_arNpcArray.GetData(tid); if (!pNpc) { @@ -4821,12 +4821,12 @@ BOOL CUser::IsValidName(char * name) { "^", "&", "*", "(", ")", "-", "+", "=", "|", "\\", "<", ">", ",", ".", "?", "/", "{", "[", "}", "]", "\"", - "\'", " ", "", "", "Ʈ", "", "Knight", - "Noahsystem", "Wizgate", "Mgame", "ƽý", "Ʈ", ""}; + "\'", " ", " ", "운영자", "나이트", "도우미", "Knight", + "Noahsystem", "Wizgate", "Mgame", "노아시스템", "위즈게이트", "엠게임"}; // taiwan version /* char* szInvalids[] = { "~", "`", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "+", "=", "|", "\\", "<", ">", ",", - ".", "?", "/", "{", "[", "}", "]", "\"", "\'", " ", "" }; */ + ".", "?", "/", "{", "[", "}", "]", "\"", "\'", " ", " " }; */ BOOL bInvalidStr = FALSE; @@ -5098,8 +5098,8 @@ void CUser::StateChange(char * pBuf) { // else { // Just plain echo :) SetByte(send_buff, buff, send_index); - // N3_SP_STATE_CHANGE_ACTION = 0x04, // 1 - λ, 11 - - // N3_SP_STATE_CHANGE_VISIBLE = 0x05 }; // 0 ~ 255 + // N3_SP_STATE_CHANGE_ACTION = 0x04, // 1 - 인사, 11 - 도발 + // N3_SP_STATE_CHANGE_VISIBLE = 0x05 }; // 투명 0 ~ 255 } m_pMain->Send_Region(send_buff, send_index, m_pUserData->m_bZone, m_RegionX, m_RegionZ); @@ -5268,7 +5268,7 @@ void CUser::PartyProcess(char * pBuf) { result = GetByte(pBuf, index); if (result) { PartyInsert(); - } else { // + } else { // 거절한 경우 PartyCancel(); } break; @@ -5294,7 +5294,7 @@ void CUser::PartyProcess(char * pBuf) { } } -void CUser::PartyCancel() // ´... ãƼ ˷ִ Լ +void CUser::PartyCancel() // 거절한 사람한테 온다... 리더를 찾아서 알려주는 함수 { int send_index = 0, leader_id = -1, count = 0; CUser * pUser = NULL; @@ -5306,7 +5306,7 @@ void CUser::PartyProcess(char * pBuf) { return; } pParty = m_pMain->m_PartyArray.GetData(m_sPartyIndex); - if (!pParty) { // ̻ + if (!pParty) { // 이상한 경우 m_sPartyIndex = -1; return; } @@ -5322,14 +5322,14 @@ void CUser::PartyProcess(char * pBuf) { return; } - for (int i = 0; i < 8; i++) { // Ƽ ѰŸ..Ƽ ǰ... + for (int i = 0; i < 8; i++) { // 파티 생성시 취소한거면..파티를 뽀개야쥐... if (pParty->uid[i] >= 0) { count++; } } if (count == 1) { - pUser->PartyDelete(); // ȥ̸ Ƽ + pUser->PartyDelete(); // 리더 혼자이면 파티 깨짐 } SetByte(send_buff, WIZ_PARTY, send_index); @@ -5338,7 +5338,7 @@ void CUser::PartyProcess(char * pBuf) { pUser->Send(send_buff, send_index); } -void CUser::PartyRequest(int memberid, BOOL bCreate) // Ŷ °Ŵ.. +void CUser::PartyRequest(int memberid, BOOL bCreate) //리더에게 패킷이 온거다.. { int index = 0, send_index = 0, result = -1; CUser * pUser = NULL; @@ -5354,7 +5354,7 @@ void CUser::PartyProcess(char * pBuf) { goto fail_return; } if (pUser->m_sPartyIndex != -1) { - goto fail_return; //̹ Ƽ ԵǾ ȵ¡... + goto fail_return; //이미 파티 가입되어 있으면 안되징... } if (m_pUserData->m_bNation != pUser->m_pUserData->m_bNation) { @@ -5370,7 +5370,7 @@ void CUser::PartyProcess(char * pBuf) { goto fail_return; } - if (!bCreate) { // Ƽ ߰ϴ + if (!bCreate) { // 기존의 파티에 추가하는 경우 pParty = m_pMain->m_PartyArray.GetData(m_sPartyIndex); if (!pParty) { goto fail_return; @@ -5382,13 +5382,13 @@ void CUser::PartyProcess(char * pBuf) { } } if (i == 8) { - goto fail_return; // Ƽ ο Full + goto fail_return; // 파티 인원 Full } } if (bCreate) { if (m_sPartyIndex != -1) { - goto fail_return; // () ̹ Ƽ ԵǾ ȵ¡... + goto fail_return; // (생성자)리더가 이미 파티 가입되어 있으면 안되징... } m_sPartyIndex = m_pMain->m_sPartyIndex++; if (m_pMain->m_sPartyIndex == 32767) { @@ -5426,9 +5426,9 @@ void CUser::PartyProcess(char * pBuf) { pUser->m_sPartyIndex = m_sPartyIndex; - /* Ƽ BBS ߰... + /* 파티 BBS를 위해 추가... if (pUser->m_bNeedParty == 2 && pUser->m_sPartyIndex != -1) { - pUser->m_bNeedParty = 1; // ̻ Ƽ ʿ ʾ ^^; + pUser->m_bNeedParty = 1; // 난 더 이상 파티가 필요하지 않아 ^^; memset( send_buff, 0x00, 256 ); send_index = 0; SetByte(send_buff, 2, send_index); SetByte(send_buff, pUser->m_bNeedParty, send_index); @@ -5436,7 +5436,7 @@ void CUser::PartyProcess(char * pBuf) { } if (m_bNeedParty == 2 && m_sPartyIndex != -1) { - m_bNeedParty = 1; // ̻ Ƽ ʿ ʾ ^^; + m_bNeedParty = 1; // 난 더 이상 파티가 필요하지 않아 ^^; memset( send_buff, 0x00, 256 ); send_index = 0; SetByte(send_buff, 2, send_index); SetByte(send_buff, m_bNeedParty, send_index); @@ -5448,7 +5448,7 @@ void CUser::PartyProcess(char * pBuf) { SetByte(send_buff, WIZ_PARTY, send_index); SetByte(send_buff, PARTY_PERMIT, send_index); SetShort(send_buff, m_Sid, send_index); - // Ÿ ʵȵڳ ~ + // 원거리가 않된데자나 씨~ SetShort(send_buff, strlen(m_pUserData->m_id), send_index); // Create packet. SetString(send_buff, m_pUserData->m_id, strlen(m_pUserData->m_id), send_index); // @@ -5462,7 +5462,7 @@ void CUser::PartyProcess(char * pBuf) { Send(send_buff, send_index); } -void CUser::PartyInsert() // ߰ ȴ. Ŷ ° ƴ +void CUser::PartyInsert() // 본인이 추가 된다. 리더에게 패킷이 가는것이 아님 { int send_index = 0; CUser * pUser = NULL; @@ -5474,7 +5474,7 @@ void CUser::PartyProcess(char * pBuf) { } pParty = m_pMain->m_PartyArray.GetData(m_sPartyIndex); - if (!pParty) { // ̻ + if (!pParty) { // 이상한 경우 m_sPartyIndex = -1; return; } @@ -5504,12 +5504,12 @@ void CUser::PartyProcess(char * pBuf) { SetShort(send_buff, pParty->sClass[i], send_index); SetShort(send_buff, pUser->m_iMaxMp, send_index); SetShort(send_buff, pUser->m_pUserData->m_sMp, send_index); - Send(send_buff, send_index); // ߰ ο ް.. + Send(send_buff, send_index); // 추가된 사람에게 기존 인원 다 받게함.. } int i; for (i = 0; i < 8; i++) { - if (pParty->uid[i] == -1) { // Party Structure ߰ + if (pParty->uid[i] == -1) { // Party Structure 에 추가 pParty->uid[i] = m_Sid; pParty->sMaxHp[i] = m_iMaxHp; pParty->sHp[i] = m_pUserData->m_sHp; @@ -5519,32 +5519,32 @@ void CUser::PartyProcess(char * pBuf) { } } - // Ƽ BBS ߰... !!! + // 파티 BBS를 위해 추가... 대장판!!! pUser = (CUser *)m_pMain->m_Iocport.m_SockArray[pParty->uid[0]]; if (!pUser) { return; } - if (pUser->m_bNeedParty == 2 && pUser->m_sPartyIndex != -1) { // ̰ Ƽ ... - pUser->m_bNeedParty = 1; // ̻ Ƽ ʿ ʾ ^^; + if (pUser->m_bNeedParty == 2 && pUser->m_sPartyIndex != -1) { // 이건 파티장 것... + pUser->m_bNeedParty = 1; // 난 더 이상 파티가 필요하지 않아 ^^; memset(send_buff, 0x00, 256); send_index = 0; SetByte(send_buff, 2, send_index); SetByte(send_buff, pUser->m_bNeedParty, send_index); pUser->StateChange(send_buff); } - // ߰ ................ + // 추가 끝................ - // Ƽ BBS ߰... ̵!!! - if (m_bNeedParty == 2 && m_sPartyIndex != -1) { // ̰ ߰ ... - m_bNeedParty = 1; // ̻ Ƽ ʿ ʾ ^^; + // 파티 BBS를 위해 추가... 쫄따구판!!! + if (m_bNeedParty == 2 && m_sPartyIndex != -1) { // 이건 실제로 추가된 사람 것... + m_bNeedParty = 1; // 난 더 이상 파티가 필요하지 않아 ^^; memset(send_buff, 0x00, 256); send_index = 0; SetByte(send_buff, 2, send_index); SetByte(send_buff, m_bNeedParty, send_index); StateChange(send_buff); } - // ߰ ................ + // 추가 끝................ memset(send_buff, 0x00, 256); send_index = 0; @@ -5559,7 +5559,7 @@ void CUser::PartyProcess(char * pBuf) { SetShort(send_buff, m_pUserData->m_sClass, send_index); SetShort(send_buff, m_iMaxMp, send_index); SetShort(send_buff, m_pUserData->m_sMp, send_index); - m_pMain->Send_PartyMember(m_sPartyIndex, send_buff, send_index); // ߰ ο εij.. + m_pMain->Send_PartyMember(m_sPartyIndex, send_buff, send_index); // 추가된 인원을 브로드캐스팅.. // AI Server BYTE byIndex = i; @@ -5587,23 +5587,23 @@ void CUser::PartyRemove(int memberid) { if (memberid < 0 || memberid >= MAX_USER) { return; } - pUser = (CUser *)m_pMain->m_Iocport.m_SockArray[memberid]; // ŵ ... + pUser = (CUser *)m_pMain->m_Iocport.m_SockArray[memberid]; // 제거될 사람... if (!pUser) { return; } pParty = m_pMain->m_PartyArray.GetData(m_sPartyIndex); - if (!pParty) { // ̻ + if (!pParty) { // 이상한 경우 pUser->m_sPartyIndex = -1; m_sPartyIndex = -1; return; } - if (memberid != m_Sid) { // ڱڽ Ż ƴѰ + if (memberid != m_Sid) { // 자기자신 탈퇴가 아닌경우 if (pParty->uid[0] != m_Sid) { - return; // Ҽ .. + return; // 리더만 멤버 삭제 할수 있음.. } } else { - if (pParty->uid[0] == memberid) { // Żϸ Ƽ + if (pParty->uid[0] == memberid) { // 리더가 탈퇴하면 파티 깨짐 PartyDelete(); return; } @@ -5617,7 +5617,7 @@ void CUser::PartyRemove(int memberid) { count++; } } - if (count == 1) { // ȥ Ƽ + if (count == 1) { // 리더 혼자 남은 경우 파티 깨짐 PartyDelete(); return; } @@ -5628,9 +5628,9 @@ void CUser::PartyRemove(int memberid) { SetByte(send_buff, PARTY_REMOVE, send_index); SetShort(send_buff, memberid, send_index); m_pMain->Send_PartyMember(m_sPartyIndex, send_buff, - send_index); // ο εij..ŵ ׵ Ŷ . + send_index); // 삭제된 인원을 브로드캐스팅..제거될 사람한테두 패킷이 간다. - for (int i = 0; i < 8; i++) { // Ƽ ȿ Ƽ Ʈ . + for (int i = 0; i < 8; i++) { // 파티가 유효한 경우 에는 파티 리스트에서 뺀다. if (pParty->uid[i] != -1) { if (pParty->uid[i] == memberid) { pParty->uid[i] = -1; @@ -5679,7 +5679,7 @@ void CUser::PartyDelete() { memset(send_buff, 0x00, 256); SetByte(send_buff, WIZ_PARTY, send_index); SetByte(send_buff, PARTY_DELETE, send_index); - m_pMain->Send_PartyMember(pParty->wIndex, send_buff, send_index); // ο εij.. + m_pMain->Send_PartyMember(pParty->wIndex, send_buff, send_index); // 삭제된 인원을 브로드캐스팅.. // AI Server send_index = 0; @@ -5730,7 +5730,7 @@ void CUser::ExchangeReq(char * pBuf) { goto fail_return; } - // ȯ ȵǰ..... + // 교환 안되게..... if (m_bResHpType == USER_DEAD || m_pUserData->m_sHp == 0) { TRACE("### ExchangeProcess Fail : name=%s(%d), m_bResHpType=%d, hp=%d, x=%d, z=%d ###\n", m_pUserData->m_id, m_Sid, m_bResHpType, m_pUserData->m_sHp, (int)m_pUserData->m_curx, (int)m_pUserData->m_curz); @@ -5781,7 +5781,7 @@ void CUser::ExchangeAgree(char * pBuf) { m_sExchangeUser = -1; return; } - if (result == 0x00) { // + if (result == 0x00) { // 거절 m_sExchangeUser = -1; pUser->m_sExchangeUser = -1; } else { @@ -5852,7 +5852,7 @@ void CUser::ExchangeAdd(char * pBuf) { if (m_MirrorItem[pos].sCount < count) { goto add_fail; } - if (pTable->m_bCountable) { // ߺ + if (pTable->m_bCountable) { // 중복허용 아이템 for (Iter = m_ExchangeItemList.begin(); Iter != m_ExchangeItemList.end(); Iter++) { if ((*Iter)->itemid == itemid) { (*Iter)->count += count; @@ -5886,7 +5886,7 @@ void CUser::ExchangeAdd(char * pBuf) { goto add_fail; } - if (bAdd) { // Gold ߺǸ ߰ ʴ´.. + if (bAdd) { // Gold 가 중복되면 추가하지 않는댜.. pItem = new _EXCHANGE_ITEM; pItem->itemid = itemid; pItem->duration = duration; @@ -5939,19 +5939,19 @@ void CUser::ExchangeDecide() { SetByte(buff, WIZ_EXCHANGE, send_index); SetByte(buff, EXCHANGE_OTHERDECIDE, send_index); pUser->Send(buff, send_index); - } else { // Ѵ + } else { // 둘다 승인한 경우 list<_EXCHANGE_ITEM *>::iterator Iter; - if (!ExecuteExchange() || !pUser->ExecuteExchange()) { // ȯ + if (!ExecuteExchange() || !pUser->ExecuteExchange()) { // 교환 실패 for (Iter = m_ExchangeItemList.begin(); Iter != m_ExchangeItemList.end(); Iter++) { if ((*Iter)->itemid == ITEM_GOLD) { - m_pUserData->m_iGold += (*Iter)->count; // + m_pUserData->m_iGold += (*Iter)->count; // 돈만 백업 break; } } for (Iter = pUser->m_ExchangeItemList.begin(); Iter != pUser->m_ExchangeItemList.end(); Iter++) { if ((*Iter)->itemid == ITEM_GOLD) { - pUser->m_pUserData->m_iGold += (*Iter)->count; // + pUser->m_pUserData->m_iGold += (*Iter)->count; // 돈만 백업 break; } } @@ -5959,7 +5959,7 @@ void CUser::ExchangeDecide() { bSuccess = FALSE; } if (bSuccess) { - getmoney = ExchangeDone(); // ȯ... + getmoney = ExchangeDone(); // 실제 데이터 교환... putmoney = pUser->ExchangeDone(); if (getmoney > 0) { ItemLogToAgent(m_pUserData->m_id, pUser->m_pUserData->m_id, ITEM_EXCHANGE_GET, 0, ITEM_GOLD, getmoney, @@ -5976,7 +5976,7 @@ void CUser::ExchangeDecide() { SetInt64(buff, m_pUserData->m_iGold, send_index); SetShort(buff, pUser->m_ExchangeItemList.size(), send_index); for (Iter = pUser->m_ExchangeItemList.begin(); Iter != pUser->m_ExchangeItemList.end(); Iter++) { - SetByte(buff, (*Iter)->pos, send_index); //  κ丮 ġ + SetByte(buff, (*Iter)->pos, send_index); // 새로 들어갈 인벤토리 위치 SetDWORD(buff, (*Iter)->itemid, send_index); SetShort(buff, (*Iter)->count, send_index); SetShort(buff, (*Iter)->duration, send_index); @@ -5984,7 +5984,7 @@ void CUser::ExchangeDecide() { ItemLogToAgent(m_pUserData->m_id, pUser->m_pUserData->m_id, ITEM_EXCHANGE_GET, (*Iter)->nSerialNum, (*Iter)->itemid, (*Iter)->count, (*Iter)->duration); } - Send(buff, send_index); // ... + Send(buff, send_index); // 나한테 보내고... memset(buff, 0x00, 256); send_index = 0; @@ -5994,7 +5994,7 @@ void CUser::ExchangeDecide() { SetInt64(buff, pUser->m_pUserData->m_iGold, send_index); SetShort(buff, m_ExchangeItemList.size(), send_index); for (Iter = m_ExchangeItemList.begin(); Iter != m_ExchangeItemList.end(); Iter++) { - SetByte(buff, (*Iter)->pos, send_index); //  κ丮 ġ + SetByte(buff, (*Iter)->pos, send_index); // 새로 들어갈 인벤토리 위치 SetDWORD(buff, (*Iter)->itemid, send_index); SetShort(buff, (*Iter)->count, send_index); SetShort(buff, (*Iter)->duration, send_index); @@ -6002,7 +6002,7 @@ void CUser::ExchangeDecide() { ItemLogToAgent(m_pUserData->m_id, pUser->m_pUserData->m_id, ITEM_EXCHANGE_PUT, (*Iter)->nSerialNum, (*Iter)->itemid, (*Iter)->count, (*Iter)->duration); } - pUser->Send(buff, send_index); // 浵 ش. + pUser->Send(buff, send_index); // 상대방도 보내준다. SendItemWeight(); pUser->SendItemWeight(); @@ -6036,7 +6036,7 @@ void CUser::ExchangeCancel() { list<_EXCHANGE_ITEM *>::iterator Iter; for (Iter = m_ExchangeItemList.begin(); Iter != m_ExchangeItemList.end(); Iter++) { if ((*Iter)->itemid == ITEM_GOLD) { - m_pUserData->m_iGold += (*Iter)->count; // + m_pUserData->m_iGold += (*Iter)->count; // 돈만 백업 break; } } @@ -6063,14 +6063,14 @@ void CUser::InitExchange(BOOL bStart) { } m_ExchangeItemList.clear(); - if (bStart) { // ȯ ۽ + if (bStart) { // 교환 시작시 백업 for (int i = 0; i < HAVE_MAX; i++) { m_MirrorItem[i].nNum = m_pUserData->m_sItemArray[SLOT_MAX + i].nNum; m_MirrorItem[i].sDuration = m_pUserData->m_sItemArray[SLOT_MAX + i].sDuration; m_MirrorItem[i].sCount = m_pUserData->m_sItemArray[SLOT_MAX + i].sCount; m_MirrorItem[i].nSerialNum = m_pUserData->m_sItemArray[SLOT_MAX + i].nSerialNum; } - } else { // ȯ Ŭ + } else { // 교환 종료시 클리어 m_sExchangeUser = -1; m_bExchangeOK = 0x00; for (int i = 0; i < HAVE_MAX; i++) { @@ -6099,7 +6099,7 @@ BOOL CUser::ExecuteExchange() { list<_EXCHANGE_ITEM *>::iterator Iter; int iCount = pUser->m_ExchangeItemList.size(); for (Iter = pUser->m_ExchangeItemList.begin(); Iter != pUser->m_ExchangeItemList.end(); Iter++) { - // 񷯸ӱ ũ ̹Ʈ >.< + // 비러머글 크리스마스 이밴트 >.< if ((*Iter)->itemid >= ITEM_NO_TRADE) { return FALSE; } else if ((*Iter)->itemid == ITEM_GOLD) { @@ -6112,33 +6112,33 @@ BOOL CUser::ExecuteExchange() { continue; } for (i = 0; i < HAVE_MAX; i++) { - if (m_MirrorItem[i].nNum == 0 && pTable->m_bCountable == 0) { // ʵǴ !!! + if (m_MirrorItem[i].nNum == 0 && pTable->m_bCountable == 0) { // 증복허용 않되는 아이템!!! m_MirrorItem[i].nNum = (*Iter)->itemid; m_MirrorItem[i].sDuration = (*Iter)->duration; m_MirrorItem[i].sCount = (*Iter)->count; m_MirrorItem[i].nSerialNum = (*Iter)->nSerialNum; - (*Iter)->pos = i; // Ŷ ... + (*Iter)->pos = i; // 패킷용 데이터... weight += pTable->m_sWeight; break; - } else if (m_MirrorItem[i].nNum == (*Iter)->itemid && pTable->m_bCountable == 1) { // !!! + } else if (m_MirrorItem[i].nNum == (*Iter)->itemid && pTable->m_bCountable == 1) { // 증복허용 아이템!!! m_MirrorItem[i].sCount += (*Iter)->count; if (m_MirrorItem[i].sCount > MAX_ITEM_COUNT) { m_MirrorItem[i].sCount = MAX_ITEM_COUNT; } weight += (pTable->m_sWeight * (*Iter)->count); - (*Iter)->pos = i; // Ŷ ... + (*Iter)->pos = i; // 패킷용 데이터... break; } } if (i == HAVE_MAX && - pTable->m_bCountable == 1) { // ߺ ε ߰ + pTable->m_bCountable == 1) { // 중복 허용 아이템인데 기존에 가지고 있지 않은 경우 빈곳에 추가 for (i = 0; i < HAVE_MAX; i++) { if (m_MirrorItem[i].nNum == 0) { m_MirrorItem[i].nNum = (*Iter)->itemid; m_MirrorItem[i].sDuration = (*Iter)->duration; m_MirrorItem[i].sCount = (*Iter)->count; - (*Iter)->pos = i; // Ŷ ... + (*Iter)->pos = i; // 패킷용 데이터... weight += (pTable->m_sWeight * (*Iter)->count); break; } @@ -6146,7 +6146,7 @@ BOOL CUser::ExecuteExchange() { } if (Iter != pUser->m_ExchangeItemList.end() && i == HAVE_MAX) { - return FALSE; // κ丮 ... + return FALSE; // 인벤토리 공간 부족... } } } @@ -6184,9 +6184,9 @@ int CUser::ExchangeDone() { } if (money > 0) { - m_pUserData->m_iGold += money; // . + m_pUserData->m_iGold += money; // 상대방이 준 돈. } - for (int i = 0; i < HAVE_MAX; i++) { // .. + for (int i = 0; i < HAVE_MAX; i++) { // 성공시 리스토어.. m_pUserData->m_sItemArray[SLOT_MAX + i].nNum = m_MirrorItem[i].nNum; m_pUserData->m_sItemArray[SLOT_MAX + i].sDuration = m_MirrorItem[i].sDuration; m_pUserData->m_sItemArray[SLOT_MAX + i].sCount = m_MirrorItem[i].sCount; @@ -6275,16 +6275,16 @@ void CUser::ClassChange(char * pBuf) { type = GetByte(pBuf, index); - if (type == CLASS_CHANGE_REQ) { // û + if (type == CLASS_CHANGE_REQ) { // 전직요청 ClassChangeReq(); return; - } else if (type == ALL_POINT_CHANGE) { // Ʈ ʱȭ + } else if (type == ALL_POINT_CHANGE) { // 포인트 초기화 AllPointChange(); return; - } else if (type == ALL_SKILLPT_CHANGE) { // ų ʱȭ + } else if (type == ALL_SKILLPT_CHANGE) { // 스킬 초기화 AllSkillPointChange(); return; - } else if (type == CHANGE_MONEY_REQ) { // Ʈ & ų ʱȭ Ŷ + } else if (type == CHANGE_MONEY_REQ) { // 포인트 & 스킬 초기화에 돈이 얼마인지를 묻는 서브 패킷 sub_type = GetByte(pBuf, index); money = pow((m_pUserData->m_bLevel * 2), 3.4); @@ -6297,9 +6297,9 @@ void CUser::ClassChange(char * pBuf) { money = money * 1.5; } - if (sub_type == 1) { // ɷġ Ʈ + if (sub_type == 1) { // 능력치 포인트 if (m_pMain->m_sDiscount == 1 && - m_pMain->m_byOldVictory == m_pUserData->m_bNation) { // ν̰ ¸̶ + m_pMain->m_byOldVictory == m_pUserData->m_bNation) { // 할인시점이고 승리국이라면 old_money = money; money = money * 0.5; //TRACE("^^ ClassChange - point Discount ,, money=%d->%d\n", old_money, money); @@ -6314,10 +6314,10 @@ void CUser::ClassChange(char * pBuf) { SetByte(send_buff, CHANGE_MONEY_REQ, send_index); SetDWORD(send_buff, money, send_index); Send(send_buff, send_index); - } else if (sub_type == 2) { // skill Ʈ - money = money * 1.5; // ų ѹ + } else if (sub_type == 2) { // skill 포인트 + money = money * 1.5; // 스킬은 한번 더 if (m_pMain->m_sDiscount == 1 && - m_pMain->m_byOldVictory == m_pUserData->m_bNation) { // ν̰ ¸̶ + m_pMain->m_byOldVictory == m_pUserData->m_bNation) { // 할인시점이고 승리국이라면 old_money = money; money = money * 0.5; //TRACE("^^ ClassChange - skillpoint Discount ,, money=%d->%d\n", old_money, money); @@ -6465,7 +6465,7 @@ void CUser::ChatTargetSelect(char * pBuf) { Send(send_buff, send_index); } -// AI server User ... +// AI server에 User정보를 전부 전송... void CUser::SendUserInfo(char * temp_send, int & index) { SetShort(temp_send, m_Sid, index); SetShort(temp_send, strlen(m_pUserData->m_id), index); @@ -6476,8 +6476,8 @@ void CUser::SendUserInfo(char * temp_send, int & index) { SetByte(temp_send, m_pUserData->m_bLevel, index); SetShort(temp_send, m_pUserData->m_sHp, index); SetShort(temp_send, m_pUserData->m_sMp, index); - SetShort(temp_send, m_sTotalHit * m_bAttackAmount / 100, index); // ǥ - SetShort(temp_send, m_sTotalAc + m_sACAmount, index); // ǥ + SetShort(temp_send, m_sTotalHit * m_bAttackAmount / 100, index); // 표시 + SetShort(temp_send, m_sTotalAc + m_sACAmount, index); // 표시 Setfloat(temp_send, m_sTotalHitrate, index); Setfloat(temp_send, m_sTotalEvasionrate, index); SetShort(temp_send, m_sPartyIndex, index); @@ -6677,7 +6677,7 @@ void CUser::Dead() { m_bResHpType = USER_DEAD; - Send(send_buff, send_index); // Դ ٷ Ŷ ... ( , ֱ ؼ) + Send(send_buff, send_index); // 유저에게는 바로 데드 패킷을 날림... (한 번 더 보냄, 유령을 없애기 위해서) memset(send_buff, NULL, 1024); wsprintf(send_buff, "----> User Dead ,, nid=%d, name=%s, type=%d, x=%d, z=%d ******", m_Sid, m_pUserData->m_id, @@ -6686,7 +6686,7 @@ void CUser::Dead() { memset(send_buff, NULL, 1024); send_index = 0; - if (m_pUserData->m_bFame == COMMAND_CAPTAIN) { // ֱ ִ ״´ٸ,, Ż + if (m_pUserData->m_bFame == COMMAND_CAPTAIN) { // 지휘권한이 있는 유저가 죽는다면,, 지휘 권한 박탈 m_pUserData->m_bFame = CHIEF; SetByte(send_buff, WIZ_AUTHORITY_CHANGE, send_index); SetByte(send_buff, COMMAND_AUTHORITY, send_index); @@ -6716,7 +6716,7 @@ void CUser::Dead() { send_index = 0; ::_LoadStringFromResource(IDP_ANNOUNCEMENT, buff2); sprintf(finalstr, buff2.c_str(), chatstr); - //sprintf( finalstr, "## : %s ##", chatstr ); + //sprintf( finalstr, "## 공지 : %s ##", chatstr ); SetByte(send_buff, WIZ_CHAT, send_index); SetByte(send_buff, WAR_SYSTEM_CHAT, send_index); SetByte(send_buff, 1, send_index); @@ -6810,7 +6810,7 @@ void CUser::ItemWoreOut(int type, int damage) { if (m_pUserData->m_sItemArray[RIGHTHAND].nNum != 0) { pTable = m_pMain->m_ItemtableArray.GetData(m_pUserData->m_sItemArray[RIGHTHAND].nNum); if (pTable) { - if (pTable->m_bSlot == 2) { // ? + if (pTable->m_bSlot == 2) { // 방패? if (m_pUserData->m_sItemArray[RIGHTHAND].sDuration != 0) { m_pUserData->m_sItemArray[RIGHTHAND].sDuration -= worerate; ItemDurationChange(RIGHTHAND, pTable->m_sDuration, @@ -6822,7 +6822,7 @@ void CUser::ItemWoreOut(int type, int damage) { if (m_pUserData->m_sItemArray[LEFTHAND].nNum != 0) { pTable = m_pMain->m_ItemtableArray.GetData(m_pUserData->m_sItemArray[LEFTHAND].nNum); if (pTable) { - if (pTable->m_bSlot == 2) { // ? + if (pTable->m_bSlot == 2) { // 방패? if (m_pUserData->m_sItemArray[LEFTHAND].sDuration != 0) { m_pUserData->m_sItemArray[LEFTHAND].sDuration -= worerate; ItemDurationChange(LEFTHAND, pTable->m_sDuration, m_pUserData->m_sItemArray[LEFTHAND].sDuration, @@ -6859,7 +6859,7 @@ void CUser::ItemDurationChange(int slot, int maxvalue, int curvalue, int amount) memset(send_buff, 0x00, 128); send_index = 0; - SetByte(send_buff, WIZ_ITEM_MOVE, send_index); // durability 濡 ġ ... + SetByte(send_buff, WIZ_ITEM_MOVE, send_index); // durability 변경에 따른 수치 재조정... SetByte(send_buff, 0x01, send_index); SetShort(send_buff, m_sTotalHit, send_index); SetShort(send_buff, m_sTotalAc, send_index); @@ -6949,11 +6949,11 @@ void CUser::HPTimeChange(float currenttime) { } /* - ߿ ĥͿ ؼ ⿡ α ߽ϴ : + 나중에 또 고칠것에 대비해서 여기에 두기로 했습니다 : - HP(MP) ɸ ð A = ( - 1) + 30 - HP(MP) ɸ Ƚ B = A/5 - ѹ HP(MP) = Max HP / B + HP(MP)가 모두 차는 데 걸리는 시간 A = (레벨 - 1) + 30 + HP(MP)가 모두 차는 데 걸리는 횟수 B = A/5 + 한번에 차는 HP(MP)의 양 = Max HP / B */ } @@ -6986,7 +6986,7 @@ void CUser::HPTimeChangeType3(float currenttime) { // if (m_pUserData->m_bZone != m_pUserData->m_bNation && m_pUserData->m_bZone < 3) { ExpChange(-m_iMaxExp / 100); - //TRACE(" 1% ￴ٴϱ .\r\n"); + //TRACE("정말로 1%만 깍였다니까요 ㅠ.ㅠ\r\n"); } else { // ExpChange(-m_iMaxExp / 20); // Reduce target experience. @@ -7004,7 +7004,7 @@ void CUser::HPTimeChangeType3(float currenttime) { pUser->GoldChange(m_Sid, 0); } } - // Ϻ ȣ ڵ!!! + // 기범이의 완벽한 보호 코딩!!! InitType3(); // Init Type 3..... InitType4(); // Init Type 4..... @@ -7013,7 +7013,7 @@ void CUser::HPTimeChangeType3(float currenttime) { // if (m_pUserData->m_bZone != m_pUserData->m_bNation && m_pUserData->m_bZone < 3) { ExpChange(-m_iMaxExp / 100); - //TRACE(" 1% ￴ٴϱ .\r\n"); + //TRACE("정말로 1%만 깍였다니까요 ㅠ.ㅠ\r\n"); } // } @@ -7268,7 +7268,7 @@ void CUser::Type4Duration(float currenttime) { SetSlotItemValue(); SetUserAbility(); - Send2AI_UserUpdateInfo(); // AI Server م Ÿ .... + Send2AI_UserUpdateInfo(); // AI Server에 바끤 데이타 전송.... /* Send Party Packet..... if (m_sPartyIndex != -1) { @@ -7578,7 +7578,7 @@ void CUser::SpeedHackTime(char * pBuf) { */ } -// server ¸ üũ.. +// server의 상태를 체크.. void CUser::ServerStatusCheck() { int send_index = 0; char send_buff[256]; @@ -7657,7 +7657,7 @@ void CUser::WarehouseProcess(char * pBuf) { BYTE command = 0; command = GetByte(pBuf, index); - // â ȵǰ... + // 창고 안되게... if (m_bResHpType == USER_DEAD || m_pUserData->m_sHp == 0) { TRACE("### WarehouseProcess Fail : name=%s(%d), m_bResHpType=%d, hp=%d, x=%d, z=%d ###\n", m_pUserData->m_id, m_Sid, m_bResHpType, m_pUserData->m_sHp, (int)m_pUserData->m_curx, (int)m_pUserData->m_curz); @@ -7901,7 +7901,7 @@ void CUser::InitType4() { m_bMagicRAmount = 0; m_bDiseaseRAmount = 0; m_bPoisonRAmount = 0; - // 񷯸ӱ + // 비러머글 수능 m_bAbnormalType = 1; // m_sDuration1 = 0; @@ -7930,7 +7930,7 @@ void CUser::InitType4() { m_bType4Flag = FALSE; } -int CUser::GetEmptySlot(int itemid, int bCountable) // item մ ãƾߵ... +int CUser::GetEmptySlot(int itemid, int bCountable) // item 먹을때 비어잇는 슬롯을 찾아야되... { int pos = 255, i = 0; @@ -8015,7 +8015,7 @@ void CUser::Home() { x = pHomeInfo->BattleZoneX + myrand(0, pHomeInfo->BattleZoneLX); z = pHomeInfo->BattleZoneZ + myrand(0, pHomeInfo->BattleZoneLZ); - // 񷯸ӱ ô ٲġ --; + // 비러머글 개척지대 바꿔치기 --; if (m_pUserData->m_bZone == ZONE_SNOW_BATTLE) { x = pHomeInfo->FreeZoneX + myrand(0, pHomeInfo->FreeZoneLX); z = pHomeInfo->FreeZoneZ + myrand(0, pHomeInfo->FreeZoneLZ); @@ -8039,7 +8039,7 @@ void CUser::Home() { return; } } - // 񷯸ӱ >.< + // 비러머글 뉴존 >.< else if (m_pUserData->m_bZone > 10 && m_pUserData->m_bZone < 20) { x = 527 + myrand(0, 10); z = 543 + myrand(0, 10); @@ -8090,14 +8090,14 @@ CUser * CUser::GetItemRoutingUser(int itemid, short itemcount) { if (select_user >= 0 && select_user < MAX_USER) { pUser = (CUser *)m_pMain->m_Iocport.m_SockArray[select_user]; if (pUser) { - // ̰ ʵǵ ʹ ̿ . + // 이거 않되도 저를 너무 미워하지 마세요 ㅠ.ㅠ if (pTable->m_bCountable) { // Check weight of countable item. if ((pTable->m_sWeight * count + pUser->m_sItemWeight) <= pUser->m_sMaxWeight) { pParty->bItemRouting++; if (pParty->bItemRouting > 6) { pParty->bItemRouting = 0; } - return pUser; // , ͸ Ѵ :) + return pUser; // 즉, 유저의 포인터를 리턴한다 :) } } else { // Check weight of non-countable item. if ((pTable->m_sWeight + pUser->m_sItemWeight) <= pUser->m_sMaxWeight) { @@ -8105,7 +8105,7 @@ CUser * CUser::GetItemRoutingUser(int itemid, short itemcount) { if (pParty->bItemRouting > 6) { pParty->bItemRouting = 0; } - return pUser; // , ͸ Ѵ :) + return pUser; // 즉, 유저의 포인터를 리턴한다 :) } } // @@ -8114,7 +8114,7 @@ CUser * CUser::GetItemRoutingUser(int itemid, short itemcount) { pParty->bItemRouting++; if( pParty->bItemRouting > 6 ) pParty->bItemRouting = 0; - return pUser; // , ͸ Ѵ :) + return pUser; // 즉, 유저의 포인터를 리턴한다 :) */ } } @@ -8197,9 +8197,9 @@ void CUser::ClassChangeReq() { } void CUser::AllSkillPointChange() { - // .. ,, ϸ.. ... + // 돈을 먼저 깍고.. 만약,, 돈이 부족하면.. 에러... int index = 0, send_index = 0, skill_point = 0, money = 0, i = 0, j = 0, temp_value = 0, old_money = 0; - BYTE type = 0x00; // 0: , 1:, 2:ʱȭ ų .. + BYTE type = 0x00; // 0:돈이 부족, 1:성공, 2:초기화할 스킬이 없을때.. char send_buff[128]; memset(send_buff, NULL, 128); @@ -8213,10 +8213,10 @@ void CUser::AllSkillPointChange() { temp_value = temp_value * 1.5; } - // ų ѹ + // 스킬은 한번 더 temp_value = temp_value * 1.5; - if (m_pMain->m_sDiscount == 1 && m_pMain->m_byOldVictory == m_pUserData->m_bNation) { // ν̰ ¸̶ + if (m_pMain->m_sDiscount == 1 && m_pMain->m_byOldVictory == m_pUserData->m_bNation) { // 할인시점이고 승리국이라면 old_money = temp_value; temp_value = temp_value * 0.5; //TRACE("^^ AllSkillPointChange - Discount ,, money=%d->%d\n", old_money, temp_value); @@ -8247,7 +8247,7 @@ void CUser::AllSkillPointChange() { goto fail_return; } - // : 뽺ų 255 Ѵ Ȳ ߻ Ȯ .. + // 문제될 소지가 많음 : 가용스킬이 255을 넘는 상황이 발생할 확율이 높음.. //m_pUserData->m_bstrSkill[0] += skill_point; m_pUserData->m_bstrSkill[0] = (m_pUserData->m_bLevel - 9) * 2; for (j = 1; j < 9; j++) { @@ -8274,7 +8274,7 @@ void CUser::AllSkillPointChange() { } void CUser::AllPointChange() { - // .. ,, ϸ.. ... + // 돈을 먼저 깍고.. 만약,, 돈이 부족하면.. 에러... int index = 0, send_index = 0, total_point = 0, money = 0, classcode = 0, temp_money = 0, old_money = 0; double dwMoney = 0; BYTE type = 0x00; @@ -8296,7 +8296,7 @@ void CUser::AllPointChange() { temp_money = temp_money * 1.5; } - if (m_pMain->m_sDiscount == 1 && m_pMain->m_byOldVictory == m_pUserData->m_bNation) { // ν̰ ¸̶ + if (m_pMain->m_sDiscount == 1 && m_pMain->m_byOldVictory == m_pUserData->m_bNation) { // 할인시점이고 승리국이라면 temp_money = temp_money * 0.5; //TRACE("^^ AllPointChange - Discount ,, money=%d->%d\n", old_money, temp_money); } @@ -8310,7 +8310,7 @@ void CUser::AllPointChange() { goto fail_return; } - // ϳ ó + // 장착아이템이 하나라도 있으면 에러처리 for (i = 0; i < SLOT_MAX; i++) { if (m_pUserData->m_sItemArray[i].nNum) { type = 0x04; @@ -8581,7 +8581,7 @@ void CUser::SelectWarpList(char * pBuf) { char send_buff[128]; memset(send_buff, 0x00, 128); - // 񷯸ӱ ̵ >.< + // 비러머글 순간이동 >.< BYTE type = 2; // warpid = GetShort(pBuf, index); @@ -8620,7 +8620,7 @@ void CUser::SelectWarpList(char * pBuf) { rz = -rz; } - // 񷯸ӱ ̵ >.< + // 비러머글 순간이동 >.< /* SetByte( send_buff, WIZ_WARP_LIST, send_index ); SetByte( send_buff, type, send_index ); @@ -8675,7 +8675,7 @@ void CUser::ServerChangeOk(char * pBuf) { _WARP_INFO * pWarp = NULL; C3DMap * pMap = NULL; float rx = 0.0f, rz = 0.0f; - /* 񷯸ӱ ̵ >.< + /* 비러머글 순간이동 >.< int send_index = 0; char send_buff[128]; memset(send_buff, 0x00, 128); BYTE type = 2 ; @@ -8704,7 +8704,7 @@ void CUser::ServerChangeOk(char * pBuf) { rz = -rz; } - /* 񷯸ӱ ̵ >.< + /* 비러머글 순간이동 >.< SetByte( send_buff, WIZ_WARP_LIST, send_index ); SetByte( send_buff, type, send_index ); SetByte( send_buff, 1, send_index ); @@ -8716,14 +8716,14 @@ void CUser::ServerChangeOk(char * pBuf) { BOOL CUser::GetWarpList(int warp_group) { _WARP_INFO * pWarp = NULL; C3DMap * pMap = NULL; - int warpid = 0, send_index = 0; // īƮ ߿ ŷ... + int warpid = 0, send_index = 0; // 헤더와 카운트를 나중에 패킹... int zoneindex = -1, temp_index = 0, count = 0; char buff[8192]; memset(buff, 0x00, 8192); char send_buff[8192]; memset(send_buff, 0x00, 8192); - // 񷯸ӱ ̸ ǥ >.< - BYTE type = 1; // 1̸ Ϲ, 2̸ ߴ ߴ ^^; + // 비러머글 마을 이름 표시 >.< + BYTE type = 1; // 1이면 일반, 2이면 워프 성공했는지 않했는지 ^^; // if (m_iZoneIndex < 0 || m_iZoneIndex >= m_pMain->m_ZoneArray.size()) { return FALSE; @@ -8769,7 +8769,7 @@ BOOL CUser::GetWarpList(int warp_group) { } SetByte(send_buff, WIZ_WARP_LIST, temp_index); - // 񷯸ӱ ̸ ǥ >.< + // 비러머글 마을 이름 표시 >.< SetByte(send_buff, type, temp_index); // SetShort(send_buff, count, temp_index); @@ -8820,7 +8820,7 @@ BOOL CUser::BindObjectEvent(short objectindex, short nid) { BOOL CUser::GateObjectEvent(short objectindex, short nid) { if (m_pMain->m_bPointCheckFlag == FALSE) { - return FALSE; // ϸ ȵ + return FALSE; // 포인터 참조하면 안됨 } int send_index = 0, result = 0; @@ -8867,7 +8867,7 @@ BOOL CUser::GateObjectEvent(short objectindex, short nid) { BOOL CUser::GateLeverObjectEvent(short objectindex, short nid) { if (m_pMain->m_bPointCheckFlag == FALSE) { - return FALSE; // ϸ ȵ + return FALSE; // 포인터 참조하면 안됨 } int send_index = 0, result = 0; @@ -8949,7 +8949,7 @@ BOOL CUser::GateLeverObjectEvent(short objectindex, short nid) { BOOL CUser::FlagObjectEvent(short objectindex, short nid) { if (m_pMain->m_bPointCheckFlag == FALSE) { - return FALSE; // ϸ ȵ + return FALSE; // 포인터 참조하면 안됨 } int send_index = 0, result = 0; @@ -9089,7 +9089,7 @@ void CUser::ObjectEvent(char * pBuf) { goto fail_return; } break; - case 1: // Gate Object : ġ : 2002.12.23 + case 1: // Gate Object : 사용치 않음 : 2002.12.23 case 2: //if (!GateObjectEvent(objectindex, nid)) goto fail_return; break; @@ -10067,7 +10067,7 @@ void CUser::BlinkTimeCheck(float currenttime) { //TRACE("?? BlinkTimeCheck : name=%s(%d), type=%d ??\n", m_pUserData->m_id, m_Sid, m_bAbnormalType); // - // AI_server regene ... + // AI_server로 regene정보 전송... memset(send_buff, NULL, 256); send_index = 0; SetByte(send_buff, AG_USER_REGENE, send_index); @@ -10155,11 +10155,11 @@ void CUser::KickOut(char * pBuf) { m_pMain->m_LoggerSendQueue.PutData(send_buff, send_index); } } -// ⼭ ־ ϸ鼭 ֽ Ʈ κ.... +// 여기서 부터 정애씨가 고생하면서 해주신 퀘스트 부분.... void CUser::ClientEvent(char * pBuf) // The main function for the quest procedures!!! { // (actually, this only takes care of the first event :( ) if (m_pMain->m_bPointCheckFlag == FALSE) { - return; // ϸ ȵ // + return; // 포인터 참조하면 안됨 // } int index = 0; @@ -10176,9 +10176,9 @@ void CUser::ClientEvent(char * pBuf) // The main function for the quest procedur return; // Better to check than not to check ;) } - m_sEventNid = nid; // ̰ ߿ ߰ ſ.... + m_sEventNid = nid; // 이건 나중에 내가 추가한 거였슴.... - // if( pNpc->m_byEvent < 0 ) return; // ̰ ϴ ּ ó !! // + // if( pNpc->m_byEvent < 0 ) return; // 이거 일단 주석 처리 절대 빼지마!! // pEvent = m_pMain->m_Event.GetData(m_pUserData->m_bZone); // if (!pEvent) { @@ -10276,7 +10276,7 @@ BOOL CUser::CheckEventLogic(EVENT_DATA * pEventData) // This part reads all the bExact = TRUE; } break; - // 񷯸ӱ >.< + // 비러머글 복권 >.< case LOGIC_CHECK_EDITBOX: if (!CheckEditBox()) { bExact = TRUE; @@ -10289,7 +10289,7 @@ BOOL CUser::CheckEventLogic(EVENT_DATA * pEventData) // This part reads all the } break; // - // 񷯸ӱ >.< + // 비러머글 엑셀 >.< case LOGIC_CHECK_LEVEL: if (m_pUserData->m_bLevel >= pLE->m_LogicElseInt[0] && m_pUserData->m_bLevel <= pLE->m_LogicElseInt[1]) { bExact = TRUE; @@ -10389,11 +10389,11 @@ BOOL CUser::CheckEventLogic(EVENT_DATA * pEventData) // This part reads all the return FALSE; } - if (!pLE->m_bAnd) { // OR bExact TRUE̸ ü TRUE̴ + if (!pLE->m_bAnd) { // OR 조건일 경우 bExact가 TRUE이면 전체가 TRUE이다 if (bExact) { return TRUE; } - } else { // AND bExact FALSE̸ ü FALSE̴ + } else { // AND 조건일 경우 bExact가 FALSE이면 전체가 FALSE이다 if (!bExact) { return FALSE; } @@ -10450,7 +10450,7 @@ BOOL CUser::RunNpcEvent(CNpc * pNpc, EXEC * pExec) // This part executes all the return FALSE; } break; - // 񷯸ӱ >.< + // 비러머글 복권 >.< case EXEC_OPEN_EDITBOX: OpenEditBox(pExec->m_ExecInt[1], pExec->m_ExecInt[2]); break; @@ -10463,7 +10463,7 @@ BOOL CUser::RunNpcEvent(CNpc * pNpc, EXEC * pExec) // This part executes all the LogCoupon(pExec->m_ExecInt[0], pExec->m_ExecInt[1]); break; // - // 񷯸ӱ >.< + // 비러머글 엑셀 >.< case EXEC_SAVE_COM_EVENT: SaveComEvent(pExec->m_ExecInt[0]); break; @@ -10592,7 +10592,7 @@ BOOL CUser::RunEvent(EVENT_DATA * pEventData) { return FALSE; } break; - // 񷯸ӱ >.< + // 비러머글 복권 >.< case EXEC_OPEN_EDITBOX: OpenEditBox(pExec->m_ExecInt[1], pExec->m_ExecInt[2]); break; @@ -10605,7 +10605,7 @@ BOOL CUser::RunEvent(EVENT_DATA * pEventData) { LogCoupon(pExec->m_ExecInt[0], pExec->m_ExecInt[1]); break; // - // 񷯸ӱ >.< + // 비러머글 엑셀 >.< case EXEC_SAVE_COM_EVENT: SaveComEvent(pExec->m_ExecInt[0]); break; @@ -10679,9 +10679,9 @@ BOOL CUser::RunEvent(EVENT_DATA * pEventData) { return TRUE; } -// ־ ϸ鼭 ֽ Ʈ κ +// 정애씨가 고생하면서 해주신 퀘스트 부분 끝 void CUser::TestPacket(char * pBuf) { - // npc Ʈ ûϴ ,,,,, + // npc의 리스트를 재 요청하는 군,,,,, m_pMain->RegionNpcInfoForMe(this, 1); m_pMain->SyncTest(2); } @@ -10905,7 +10905,7 @@ BOOL CUser::GiveItem(int itemid, short count) { return FALSE; } } - /* ̰ ʿ ּ .... + /* 이건 필요할 때 주석 빼도록.... if (pTable->m_bCountable) { // Check weight of countable item. if (((pTable->m_sWeight * count) + m_sItemWeight) > m_sMaxWeight) { return FALSE; @@ -10983,7 +10983,7 @@ void CUser::RecvSelectMsg(char * pBuf) // Receive menu reply from client. selnum = GetByte(pBuf, index); // if( selnum < 0 || selnum > 4 ) - if (selnum < 0 || selnum > MAX_MESSAGE_EVENT) { // 񷯸ӱ Ʈ >.< + if (selnum < 0 || selnum > MAX_MESSAGE_EVENT) { // 비러머글 퀘스트 >.< goto fail_return; } @@ -11018,7 +11018,7 @@ void CUser::RecvSelectMsg(char * pBuf) // Receive menu reply from client. m_iSelMsgEvent[4] = -1; */ - // 񷯸ӱ Ʈ >.< + // 비러머글 퀘스트 >.< for (int i = 0; i < MAX_MESSAGE_EVENT; i++) { m_iSelMsgEvent[i] = -1; } @@ -11053,13 +11053,13 @@ void CUser::SelectMsg(EXEC * pExec) { SetByte(send_buf, WIZ_SELECT_MSG, send_index); SetShort(send_buf, m_sEventNid, send_index); - // SetByte( send_buf, (BYTE)pExec->m_ExecInt[0], send_index ); // NPC - SetDWORD(send_buf, pExec->m_ExecInt[1], send_index); // ȣ + // SetByte( send_buf, (BYTE)pExec->m_ExecInt[0], send_index ); // NPC 직업 + SetDWORD(send_buf, pExec->m_ExecInt[1], send_index); // 지문 번호 chat = 2; // for( i=0; i<4; i++ ) - for (i = 0; i < MAX_MESSAGE_EVENT; i++) { // 񷯸ӱ Ʈ >.< + for (i = 0; i < MAX_MESSAGE_EVENT; i++) { // 비러머글 퀘스트 >.< SetDWORD(send_buf, pExec->m_ExecInt[chat], send_index); chat += 2; } @@ -11074,7 +11074,7 @@ void CUser::SelectMsg(EXEC * pExec) { m_iSelMsgEvent[4] = pExec->m_ExecInt[11]; */ - // 񷯸ӱ Ʈ >.< + // 비러머글 퀘스트 >.< for (int j = 0; j < MAX_MESSAGE_EVENT; j++) { m_iSelMsgEvent[j] = pExec->m_ExecInt[(2 * j) + 3]; } @@ -11158,7 +11158,7 @@ BOOL CUser::JobGroupCheck(short jobgroupid) { return FALSE; } -void CUser::TrapProcess() // ...뾾 ̿!!! . +void CUser::TrapProcess() // 잉...성용씨 미워!!! 흑흑흑 ㅠ.ㅠ { float currenttime = 0.0f; currenttime = TimeGet(); @@ -11197,7 +11197,7 @@ void CUser::KickOutZoneUser(BOOL home) { if (home) { // ZoneChange( pMap->m_nZoneNumber, pMap->m_fInitX, pMap->m_fInitZ ); - // 񷯸ӱ + // 비러머글 버퍼 int random = myrand(0, 9000); if (random >= 0 && random < 3000) { yourmama = 0; @@ -11298,9 +11298,9 @@ BOOL CUser::CheckEditBox() { } void CUser::OpenEditBox(int message, int event) { - //if( !CheckCouponUsed() ) return; // ̰ ʿ . + //if( !CheckCouponUsed() ) return; // 이것은 기술지원 필요함 ㅠ.ㅠ - // ̰ ʿ . + // 이것은 기술지원 필요함 ㅠ.ㅠ int send_index = 0, retvalue = 0; char send_buff[256]; memset(send_buff, NULL, 256); @@ -11311,7 +11311,7 @@ void CUser::OpenEditBox(int message, int event) { SetShort(send_buff, strlen(m_strAccountID), send_index); SetString(send_buff, m_strAccountID, strlen(m_strAccountID), send_index); SetDWORD(send_buff, event, send_index); - // 񷯸ӱ 繮 >.< + // 비러머글 대사문 >.< SetDWORD(send_buff, message, send_index); // retvalue = m_pMain->m_LoggerSendQueue.PutData(send_buff, send_index); @@ -11372,7 +11372,7 @@ void CUser::RecvEditBox(char * pBuf) { selevent = m_iEditBoxEvent; - pEvent = m_pMain->m_Event.GetData(m_pUserData->m_bZone); // ⼭ ߿ --; + pEvent = m_pMain->m_Event.GetData(m_pUserData->m_bZone); // 여기서 부터 중요함 --; if (!pEvent) { goto fail_return; } @@ -11398,13 +11398,13 @@ void CUser::RecvEditBox(char * pBuf) { } BOOL CUser::CheckCouponUsed() { - // ̰ ʿ . + // 이것은 기술지원 필요함 ㅠ.ㅠ return TRUE; } void CUser::LogCoupon(int itemid, int count) { - // ȣ : m_iEditboxEvent - // ̰ ʿ . + // 참고로 쿠폰 번호는 : m_iEditboxEvent + // 이것은 기술지원 필요함 ㅠ.ㅠ int send_index = 0, retvalue = 0; char send_buff[256]; memset(send_buff, NULL, 256); @@ -11435,7 +11435,7 @@ void CUser::CouponEvent(char * pBuf) { int index = 0, nEventNum = 0, nItemCount = 0, nResult = 0, nMessageNum = 0; nResult = GetByte(pBuf, index); nEventNum = GetDWORD(pBuf, index); - // 񷯸ӱ >.< + // 비러머글 대사 >.< nMessageNum = GetDWORD(pBuf, index); // @@ -11443,13 +11443,13 @@ void CUser::CouponEvent(char * pBuf) { return; } - // ˾Ƽ + // 알아서 사용 int send_index = 0; char send_buf[128]; memset(send_buf, NULL, 128); m_iEditBoxEvent = nEventNum; // What will the next event be when an answer is given? SetByte(send_buf, WIZ_EDIT_BOX, send_index); - // 񷯸ӱ >.< + // 비러머글 대사 >.< SetDWORD(send_buf, nMessageNum, send_index); // Send(send_buf, send_index); @@ -11533,7 +11533,7 @@ void CUser::RecvDeleteChar(char * pBuf) { memset(send_buff, 0x00, 128); send_index = 0; SetByte(send_buff, WIZ_DEL_CHAR, send_index); - SetByte(send_buff, nResult, send_index); // + SetByte(send_buff, nResult, send_index); // 성공시 국가 정보 SetByte(send_buff, char_index, send_index); Send(send_buff, send_index); diff --git a/src/server/Ebenezer/User.h b/src/server/Ebenezer/User.h index e1213e6e..8641c32c 100644 --- a/src/server/Ebenezer/User.h +++ b/src/server/Ebenezer/User.h @@ -18,7 +18,7 @@ #include typedef std::list<_EXCHANGE_ITEM *> ItemList; -typedef list UserEventList; // ̹Ʈ Ͽ ^^; +typedef list UserEventList; // 이밴트를 위하여 ^^; #define BANISH_DELAY_TIME 30 @@ -29,41 +29,41 @@ class CUser : public CIOCPSocket2 { char m_strAccountID [MAX_ID_SIZE + - 1]; // Login -> Select Char ѽθ º. ̿ܿ _USER_DATA ȿִ ...agent ȭ ... - - short m_RegionX; // X ǥ - short m_RegionZ; // Z ǥ - - int m_iMaxExp; // DZ ʿ Exp - short m_sMaxWeight; // ִ ִ - BYTE m_sSpeed; // ǵ - - short m_sBodyAc; // Ǹ - - short m_sTotalHit; // Ÿݰݷ - short m_sTotalAc; // - float m_sTotalHitrate; // ݼ ø - float m_sTotalEvasionrate; // ø - - short m_sItemMaxHp; // ִ HP Bonus - short m_sItemMaxMp; // ִ MP Bonus - short m_sItemWeight; // ѹ - short m_sItemHit; // Ÿġ - short m_sItemAc; // ѹ - short m_sItemStr; // ʽ - short m_sItemSta; // ü ʽ - short m_sItemDex; // ѹø ʽ - short m_sItemIntel; // ʽ - short m_sItemCham; // Ѹŷºʽ - short m_sItemHitrate; // Ÿ - short m_sItemEvasionrate; // ȸ - - BYTE m_bFireR; // ׷ - BYTE m_bColdR; // ׷ - BYTE m_bLightningR; // ׷ - BYTE m_bMagicR; // Ÿ ׷ - BYTE m_bDiseaseR; // ׷ - BYTE m_bPoisonR; // ׷ + 1]; // Login -> Select Char 까지 한시적으로만 쓰는변수. 이외에는 _USER_DATA 안에있는 변수를 쓴다...agent 와의 데이터 동기화를 위해... + + short m_RegionX; // 현재 영역 X 좌표 + short m_RegionZ; // 현재 영역 Z 좌표 + + int m_iMaxExp; // 다음 레벨이 되기 위해 필요한 Exp량 + short m_sMaxWeight; // 들 수 있는 최대 무게 + BYTE m_sSpeed; // 스피드 + + short m_sBodyAc; // 맨몸 방어력 + + short m_sTotalHit; // 총 타격공격력 + short m_sTotalAc; // 총 방어력 + float m_sTotalHitrate; // 총 공격성공 민첩성 + float m_sTotalEvasionrate; // 총 방어 민첩성 + + short m_sItemMaxHp; // 아이템 총 최대 HP Bonus + short m_sItemMaxMp; // 아이템 총 최대 MP Bonus + short m_sItemWeight; // 아이템 총무게 + short m_sItemHit; // 아이템 총타격치 + short m_sItemAc; // 아이템 총방어력 + short m_sItemStr; // 아이템 총힘 보너스 + short m_sItemSta; // 아이템 총체력 보너스 + short m_sItemDex; // 아이템 총민첩성 보너스 + short m_sItemIntel; // 아이템 총지능 보너스 + short m_sItemCham; // 아이템 총매력보너스 + short m_sItemHitrate; // 아이템 총타격율 + short m_sItemEvasionrate; // 아이템 총회피율 + + BYTE m_bFireR; // 불 마법 저항력 + BYTE m_bColdR; // 얼음 마법 저항력 + BYTE m_bLightningR; // 전기 마법 저항력 + BYTE m_bMagicR; // 기타 마법 저항력 + BYTE m_bDiseaseR; // 저주 마법 저항력 + BYTE m_bPoisonR; // 독 마법 저항력 BYTE m_bMagicTypeLeftHand; // The type of magic item in user's left hand BYTE m_bMagicTypeRightHand; // The type of magic item in user's right hand @@ -86,16 +86,16 @@ class CUser : public CIOCPSocket2 { float m_fWill_z; float m_fWill_y; - BYTE m_bResHpType; // HP ȸŸ - BYTE m_bWarp; // ̵... - BYTE m_bNeedParty; // Ƽ....ؿ + BYTE m_bResHpType; // HP 회복타입 + BYTE m_bWarp; // 존이동중... + BYTE m_bNeedParty; // 파티....구해요 short m_sPartyIndex; - short m_sExchangeUser; // ȯ + short m_sExchangeUser; // 교환중인 유저 BYTE m_bExchangeOK; ItemList m_ExchangeItemList; - _ITEM_DATA m_MirrorItem[HAVE_MAX]; // ȯ Ʈ . + _ITEM_DATA m_MirrorItem[HAVE_MAX]; // 교환시 백업 아이템 리스트를 쓴다. short m_sPrivateChatUser; @@ -178,7 +178,7 @@ class CUser : public CIOCPSocket2 { float m_fLastTrapAreaTime; // The last moment you were in the trap area. - BOOL m_bZoneChangeFlag; // 뾾 ̿!! + BOOL m_bZoneChangeFlag; // 성용씨 미워!! BYTE m_bRegeneType; // Did you die and go home or did you type '/town'? @@ -186,16 +186,16 @@ class CUser : public CIOCPSocket2 { BOOL m_bZoneChangeSameZone; // Did the server change when you warped? - // ̹Ʈ .... ־ ̰ ī 򲲿 ^^; - // int m_iSelMsgEvent[5]; // ޼ڽ ̺Ʈ - int m_iSelMsgEvent[MAX_MESSAGE_EVENT]; // ޼ڽ ̺Ʈ - short m_sEventNid; // ̺Ʈ NPC ȣ - UserEventList m_arUserEvent; // ̺Ʈ Ʈ + // 이밴트용 관련.... 정애씨 이거 보면 코카스 쏠께요 ^^; + // int m_iSelMsgEvent[5]; // 실행중인 선택 메세지박스 이벤트 + int m_iSelMsgEvent[MAX_MESSAGE_EVENT]; // 실행중인 선택 메세지박스 이벤트 + short m_sEventNid; // 마지막으로 선택한 이벤트 NPC 번호 + UserEventList m_arUserEvent; // 실행한 이벤트 리스트 char m_strCouponId[MAX_COUPON_ID_LENGTH]; // What was the number of the coupon? int m_iEditBoxEvent; - short m_sEvent[MAX_CURRENT_EVENT]; // ̹ ̹Ʈ Ʈ :) + short m_sEvent[MAX_CURRENT_EVENT]; // 이미 실행된 이밴트 리스트들 :) public: void RecvDeleteChar(char * pBuf); @@ -356,7 +356,7 @@ class CUser : public CIOCPSocket2 { void SendTimeStatus(); void Regene(char * pBuf, int magicid = 0); void SetMaxMp(); - void SetMaxHp(int iFlag = 0); // 0:default, 1:hp maxhpŭ äֱ + void SetMaxHp(int iFlag = 0); // 0:default, 1:hp를 maxhp만큼 채워주기 void ExpChange(int iExp); void Chat(char * pBuf); void LogOut(); diff --git a/src/server/Ebenezer/map/1.evt b/src/server/Ebenezer/map/1.evt index 57e5d7d3..c1569ed6 100644 --- a/src/server/Ebenezer/map/1.evt +++ b/src/server/Ebenezer/map/1.evt @@ -1,5 +1,5 @@ -EVENT 1 ; NPC ó ȣ ִ ̺Ʈ ѹ -E RUN_EVENT 2 ; +EVENT 1 ; NPC가 처음 호출해 주는 이벤트 넘버 +E RUN_EVENT 2 ; 사제 물약 제조 END EVENT 2 @@ -87,10 +87,10 @@ EVENT 16 A CHECK_SKILL_POINT 5 40 90 A CHECK_EXIST_ITEM 389010000 10 A CHECK_EXIST_ITEM 379002000 10 -E ROB_ITEM 389010000 10 ;10Ű -E ROB_ITEM 379002000 10 ;10Ű +E ROB_ITEM 389010000 10 ;10키로 +E ROB_ITEM 379002000 10 ;10키로 E SAY -1 -1 2 -1 -1 -1 -1 -1 -1 -1 -E GIVE_ITEM 389012000 10 ;30Ű +E GIVE_ITEM 389012000 10 ;30키로 E RETURN END @@ -104,10 +104,10 @@ EVENT 18 A CHECK_SKILL_POINT 5 50 90 A CHECK_EXIST_ITEM 389010000 10 A CHECK_EXIST_ITEM 379003000 10 -E ROB_ITEM 389010000 10 ;10Ű -E ROB_ITEM 379003000 10 ;10Ű +E ROB_ITEM 389010000 10 ;10키로 +E ROB_ITEM 379003000 10 ;10키로 E SAY -1 -1 2 -1 -1 -1 -1 -1 -1 -1 -E GIVE_ITEM 389013000 10 ;30Ű +E GIVE_ITEM 389013000 10 ;30키로 E RETURN END @@ -121,10 +121,10 @@ EVENT 20 A CHECK_SKILL_POINT 5 60 90 A CHECK_EXIST_ITEM 389010000 10 A CHECK_EXIST_ITEM 379004000 10 -E ROB_ITEM 389010000 10 ;10Ű -E ROB_ITEM 379004000 10 ;10Ű +E ROB_ITEM 389010000 10 ;10키로 +E ROB_ITEM 379004000 10 ;10키로 E SAY -1 -1 2 -1 -1 -1 -1 -1 -1 -1 -E GIVE_ITEM 389014000 10 ;30Ű +E GIVE_ITEM 389014000 10 ;30키로 E RETURN END @@ -138,14 +138,14 @@ EVENT 22 A CHECK_SKILL_POINT 5 70 90 A CHECK_EXIST_ITEM 389010000 10 A CHECK_EXIST_ITEM 379005000 10 -E ROB_ITEM 389010000 10 ;10Ű -E ROB_ITEM 379005000 10 ;10Ű +E ROB_ITEM 389010000 10 ;10키로 +E ROB_ITEM 379005000 10 ;10키로 E SAY -1 -1 2 -1 -1 -1 -1 -1 -1 -1 -E GIVE_ITEM 389015000 10 ;30Ű +E GIVE_ITEM 389015000 10 ;30키로 E RETURN END -EVENT 3001; ̺Ʈ NPC Ŭϸ ʷ ȣϴ ̺Ʈ ȣ +EVENT 3001; 이벤트 NPC를 클릭하면 최초로 호출하는 이벤트 번호 E OPEN_EDITBOX 22101 3001 3002 END @@ -155,7 +155,7 @@ E RUN_EVENT 3004 END EVENT 3003 -A CHECK_EDITBOX -1; +A CHECK_EDITBOX -1; 실패한 경우 E SAY -1 -1 3002 -1 -1 -1 -1 -1 -1 -1 E RETURN END @@ -170,13 +170,13 @@ END EVENT 3005 E GIVE_NOAH 10000 -E LOG_COUPON_ITEM 900000000 10000; ̰ !! +E LOG_COUPON_ITEM 900000000 10000; 이거 고쳐!! E SAY -1 -1 3003 -1 -1 -1 -1 -1 -1 -1 END -EVENT 3006; +EVENT 3006; 전사인 경우 A CHECK_CLASS 1 -A RAND 50; 5% Ȯ +A RAND 50; 5%의 확률로 A CHECK_WEIGHT 120110163 1 E GIVE_ITEM 120110163 1 E LOG_COUPON_ITEM 120110163 1 @@ -184,9 +184,9 @@ E SAY -1 -1 3004 -1 -1 -1 -1 -1 -1 -1 E RETURN END -EVENT 3007; α +EVENT 3007; 로그인 경우 A CHECK_CLASS 2 -A RAND 50; 5% Ȯ +A RAND 50; 5%의 확률로 A CHECK_WEIGHT 160100163 1 E GIVE_ITEM 160100163 1 E LOG_COUPON_ITEM 160100163 1 @@ -194,9 +194,9 @@ E SAY -1 -1 3005 -1 -1 -1 -1 -1 -1 -1 E RETURN END -EVENT 3008; +EVENT 3008; 마법사인 경우 A CHECK_CLASS 3 -A RAND 50; 5% Ȯ +A RAND 50; 5%의 확률로 A CHECK_WEIGHT 180110163 1 E GIVE_ITEM 180110163 1 E LOG_COUPON_ITEM 180110163 1 @@ -204,9 +204,9 @@ E SAY -1 -1 3006 -1 -1 -1 -1 -1 -1 -1 E RETURN END -EVENT 3009; +EVENT 3009; 사제인 경우 A CHECK_CLASS 4 -A RAND 50; 5% Ȯ +A RAND 50; 5%의 확률로 A CHECK_WEIGHT 190210163 1 E GIVE_ITEM 190210163 1 E LOG_COUPON_ITEM 190210163 1 diff --git a/src/server/Ebenezer/map/1_.evt b/src/server/Ebenezer/map/1_.evt index 7591a307..bdb34fb3 100644 --- a/src/server/Ebenezer/map/1_.evt +++ b/src/server/Ebenezer/map/1_.evt @@ -1,39 +1,39 @@ QUEST 1 -A CHECK_NATION 1 ;ī罺 -A CHECK_LV 20 30 ; 20 30 -A NOEXIST_ITEM 263031000 ;κ긦 -E SELECT_MSG 22100 1 2 2 3 3 4 4 -1 -1 -1 -1 ; Ŭ 1 縦 ְ Ŭ ִ 2 3 ޴ . 2 ޽ Ŭϸ 2 Ʈ , 3 3̡ +A CHECK_NATION 1 ;카루스에 속한 유저 +A CHECK_LV 20 30 ;레벨 20에서 30사이 +A NOEXIST_ITEM 263031000 ;로브를 가지고 있지 않을 때 +E SELECT_MSG 22100 1 2 2 3 3 4 4 -1 -1 -1 -1 ;방어구 주인을 클릭했을 때 1번 대사를 보여주고 클릭할 수 있는 2번과 3번 메뉴를 출력. 2번 메시지를 클릭하면 2번 퀘스트가 실행, 3번은 3번이… END QUEST 2 -E SELECT_MSG 22100 2 5 5 6 6 -1 -1 -1 -1 -1 -1 ; 2 縦 ϰ 5 ޴ 7 ޴ ش +E SELECT_MSG 22100 2 5 5 6 6 -1 -1 -1 -1 -1 -1 ;방어구 주인이 2번 대사를 말하고 5번 메뉴와 7번 메뉴를 보여준다 END QUEST 5 A NOQUEST_END 6 -E GIVE_QUEST 6 ; 6 Ʈ ޾Ҵٴ -E SAY 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 ;3 縦 Ѵ +E GIVE_QUEST 6 ;유저가 6번 퀘스트를 받았다는 것을 기록 +E SAY 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 ;3번 대사를 말한다 END QUEST 6 -E SAY 4 -1 -1 -1 -1 -1 -1 -1 -1 -1 ;4 縦 Ѵ +E SAY 4 -1 -1 -1 -1 -1 -1 -1 -1 -1 ;4번 대사를 말한다 END QUEST 7 -A CHECK_QUEST_LOG 6 ; 6 Ʈ ޾Ҵ üũ -A EXIT_ITEM 391010000 4 ;Ʈ Ϸ üũ -A EXIT_ITEM 110110000 2 ;Ʈ Ϸ üũ -A CHECK_NOAH 1500 ;Ʈ Ϸ üũ +A CHECK_QUEST_LOG 6 ;유저가 6번 퀘스트를 받았는지 체크 +A EXIT_ITEM 391010000 4 ;퀘스트 완료 아이템 체크 +A EXIT_ITEM 110110000 2 ;퀘스트 완료 아이템 체크 +A CHECK_NOAH 1500 ;퀘스트 완료 노아 체크 E SAY 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -E ROB_ITEM 391010000 4 ;Ʈ -E ROB_ITEM 110110000 2 ;Ʈ -E ROB_NOAH 1500 ;1500 -E RUN_QUEST 8 ;8 Ʈ +E ROB_ITEM 391010000 4 ;퀘스트 아이템 수거 +E ROB_ITEM 110110000 2 ;퀘스트 아이템 수거 +E ROB_NOAH 1500 ;1500 노아 수거 +E RUN_QUEST 8 ;8번 퀘스트 강제 실행 END QUEST 8 -A CHECK_RACE 3 ;Ŭ Ʒ Ǵ -E GIVE_ITEM 263031000 ;Ʈ ش +A CHECK_RACE 3 ;링클 투아렉 여부 판단 +E GIVE_ITEM 263031000 ;퀘스트 아이템 준다 E DONE_QUEST 6 E SAVE_QUEST 6 END \ No newline at end of file diff --git a/src/server/Ebenezer/map/2.evt b/src/server/Ebenezer/map/2.evt index 41cccb23..aedcbc59 100644 --- a/src/server/Ebenezer/map/2.evt +++ b/src/server/Ebenezer/map/2.evt @@ -1,5 +1,5 @@ -EVENT 1 ; NPC ó ȣ ִ ̺Ʈ ѹ -E RUN_EVENT 2 ; +EVENT 1 ; NPC가 처음 호출해 주는 이벤트 넘버 +E RUN_EVENT 2 ; 사제 물약 제조 END EVENT 2 @@ -87,10 +87,10 @@ EVENT 16 A CHECK_SKILL_POINT 5 40 90 A CHECK_EXIST_ITEM 389010000 10 A CHECK_EXIST_ITEM 379002000 10 -E ROB_ITEM 389010000 10 ;10Ű -E ROB_ITEM 379002000 10 ;10Ű +E ROB_ITEM 389010000 10 ;10키로 +E ROB_ITEM 379002000 10 ;10키로 E SAY -1 -1 2 -1 -1 -1 -1 -1 -1 -1 -E GIVE_ITEM 389012000 10 ;30Ű +E GIVE_ITEM 389012000 10 ;30키로 E RETURN END @@ -104,10 +104,10 @@ EVENT 18 A CHECK_SKILL_POINT 5 50 90 A CHECK_EXIST_ITEM 389010000 10 A CHECK_EXIST_ITEM 379003000 10 -E ROB_ITEM 389010000 10 ;10Ű -E ROB_ITEM 379003000 10 ;10Ű +E ROB_ITEM 389010000 10 ;10키로 +E ROB_ITEM 379003000 10 ;10키로 E SAY -1 -1 2 -1 -1 -1 -1 -1 -1 -1 -E GIVE_ITEM 389013000 10 ;30Ű +E GIVE_ITEM 389013000 10 ;30키로 E RETURN END @@ -121,10 +121,10 @@ EVENT 20 A CHECK_SKILL_POINT 5 60 90 A CHECK_EXIST_ITEM 389010000 10 A CHECK_EXIST_ITEM 379004000 10 -E ROB_ITEM 389010000 10 ;10Ű -E ROB_ITEM 379004000 10 ;10Ű +E ROB_ITEM 389010000 10 ;10키로 +E ROB_ITEM 379004000 10 ;10키로 E SAY -1 -1 2 -1 -1 -1 -1 -1 -1 -1 -E GIVE_ITEM 389014000 10 ;30Ű +E GIVE_ITEM 389014000 10 ;30키로 E RETURN END @@ -138,14 +138,14 @@ EVENT 22 A CHECK_SKILL_POINT 5 70 90 A CHECK_EXIST_ITEM 389010000 10 A CHECK_EXIST_ITEM 379005000 10 -E ROB_ITEM 389010000 10 ;10Ű -E ROB_ITEM 379005000 10 ;10Ű +E ROB_ITEM 389010000 10 ;10키로 +E ROB_ITEM 379005000 10 ;10키로 E SAY -1 -1 2 -1 -1 -1 -1 -1 -1 -1 -E GIVE_ITEM 389015000 10 ;30Ű +E GIVE_ITEM 389015000 10 ;30키로 E RETURN END -EVENT 3001; ̺Ʈ NPC Ŭϸ ʷ ȣϴ ̺Ʈ ȣ +EVENT 3001; 이벤트 NPC를 클릭하면 최초로 호출하는 이벤트 번호 E OPEN_EDITBOX 22101 3001 3002 END @@ -155,7 +155,7 @@ E RUN_EVENT 3004 END EVENT 3003 -A CHECK_EDITBOX -1; +A CHECK_EDITBOX -1; 실패한 경우 E SAY -1 -1 3002 -1 -1 -1 -1 -1 -1 -1 E RETURN END @@ -170,13 +170,13 @@ END EVENT 3005 E GIVE_NOAH 10000 -E LOG_COUPON_ITEM 900000000 10000; ̰ !! +E LOG_COUPON_ITEM 900000000 10000; 이거 고쳐!! E SAY -1 -1 3003 -1 -1 -1 -1 -1 -1 -1 END -EVENT 3006; +EVENT 3006; 전사인 경우 A CHECK_CLASS 1 -A RAND 50; 5% Ȯ +A RAND 50; 5%의 확률로 A CHECK_WEIGHT 120110163 1 E GIVE_ITEM 120110163 1 E LOG_COUPON_ITEM 120110163 1 @@ -184,9 +184,9 @@ E SAY -1 -1 3004 -1 -1 -1 -1 -1 -1 -1 E RETURN END -EVENT 3007; α +EVENT 3007; 로그인 경우 A CHECK_CLASS 2 -A RAND 50; 5% Ȯ +A RAND 50; 5%의 확률로 A CHECK_WEIGHT 160100163 1 E GIVE_ITEM 160100163 1 E LOG_COUPON_ITEM 160100163 1 @@ -194,9 +194,9 @@ E SAY -1 -1 3005 -1 -1 -1 -1 -1 -1 -1 E RETURN END -EVENT 3008; +EVENT 3008; 마법사인 경우 A CHECK_CLASS 3 -A RAND 50; 5% Ȯ +A RAND 50; 5%의 확률로 A CHECK_WEIGHT 180110163 1 E GIVE_ITEM 180110163 1 E LOG_COUPON_ITEM 180110163 1 @@ -204,9 +204,9 @@ E SAY -1 -1 3006 -1 -1 -1 -1 -1 -1 -1 E RETURN END -EVENT 3009; +EVENT 3009; 사제인 경우 A CHECK_CLASS 4 -A RAND 50; 5% Ȯ +A RAND 50; 5%의 확률로 A CHECK_WEIGHT 190210163 1 E GIVE_ITEM 190210163 1 E LOG_COUPON_ITEM 190210163 1 diff --git a/src/server/Ebenezer/map/2_.evt b/src/server/Ebenezer/map/2_.evt index 04e97851..94922b6b 100644 --- a/src/server/Ebenezer/map/2_.evt +++ b/src/server/Ebenezer/map/2_.evt @@ -1,41 +1,41 @@ QUEST 1 -A CHECK_NATION 2 ;忡 -A CHECK_LV 20 30 ; 20 30 -A NOEXIST_ITEM 263121000 ;κ긦 -A NOEXIST_ITEM 263131000 ;κ긦 -E SELECT_MSG 12100 1 2 2 3 3 4 4 -1 -1 -1 -1 ; Ŭ 1 縦 ְ Ŭ ִ 2 3 ޴ . 2 ޽ Ŭϸ 2 Ʈ , 3 3̡ +A CHECK_NATION 2 ;엘모라드에 속한 유저 +A CHECK_LV 20 30 ;레벨 20에서 30사이 +A NOEXIST_ITEM 263121000 ;로브를 가지고 있지 않을 때 +A NOEXIST_ITEM 263131000 ;로브를 가지고 있지 않을 때 +E SELECT_MSG 12100 1 2 2 3 3 4 4 -1 -1 -1 -1 ;방어구 주인을 클릭했을 때 1번 대사를 보여주고 클릭할 수 있는 2번과 3번 메뉴를 출력. 2번 메시지를 클릭하면 2번 퀘스트가 실행, 3번은 3번이… END QUEST 2 -E SELECT_MSG 12100 2 5 5 6 6 -1 -1 -1 -1 -1 -1 ; 2 縦 ϰ 5 ޴ 7 ޴ ش +E SELECT_MSG 12100 2 5 5 6 6 -1 -1 -1 -1 -1 -1 ;방어구 주인이 2번 대사를 말하고 5번 메뉴와 7번 메뉴를 보여준다 END QUEST 5 A NOQUEST_END 5 -E GIVE_QUEST 5; 5 Ʈ ޾Ҵٴ -E SAY 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 ;3 縦 Ѵ +E GIVE_QUEST 5; 유저가 5번 퀘스트를 받았다는 것을 기록 +E SAY 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 ;3번 대사를 말한다 END QUEST 6 -E SAY 4 -1 -1 -1 -1 -1 -1 -1 -1 -1 ;4 縦 Ѵ +E SAY 4 -1 -1 -1 -1 -1 -1 -1 -1 -1 ;4번 대사를 말한다 END QUEST 7 -A CHECK_QUEST_LOG 5 ; 5 Ʈ ޾Ҵ üũ -A EXIT_ITEM 391010000 4 ;Ʈ Ϸ üũ -A EXIT_ITEM 110110000 2 ;Ʈ Ϸ üũ -A CHECK_NOAH 1500 ;Ʈ Ϸ üũ +A CHECK_QUEST_LOG 5 ;유저가 5번 퀘스트를 받았는지 체크 +A EXIT_ITEM 391010000 4 ;퀘스트 완료 아이템 체크 +A EXIT_ITEM 110110000 2 ;퀘스트 완료 아이템 체크 +A CHECK_NOAH 1500 ;퀘스트 완료 노아 체크 E SAY 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -E ROB_ITEM 391010000 4 ;Ʈ -E ROB_ITEM 110110000 2 ;Ʈ -E ROB_NOAH 1500 ;1500 -E RUN_QUEST 8 ;8 Ʈ -E RUN_QUEST 9 ;9 Ʈ +E ROB_ITEM 391010000 4 ;퀘스트 아이템 수거 +E ROB_ITEM 110110000 2 ;퀘스트 아이템 수거 +E ROB_NOAH 1500 ;1500 노아 수거 +E RUN_QUEST 8 ;8번 퀘스트 강제 실행 +E RUN_QUEST 9 ;9번 퀘스트 강제 실행 END QUEST 8 -A CHECK_RACE 12 ; Ǵ -E GIVE_ITEM 263121000 ;Ʈ ش +A CHECK_RACE 12 ;남자 여부 판단 +E GIVE_ITEM 263121000 ;퀘스트 아이템 준다 E DONE_QUEST 5 E SAVE_QUEST 5 E RETURN diff --git a/src/server/Ebenezer/res/Ebenezer.rc2 b/src/server/Ebenezer/res/Ebenezer.rc2 index 9d6ff0e8521170a4b2dbfb4c25b0eddd47bd6b56..73b3f1523f4b880276c335bdc7de25e3c80faa90 100644 GIT binary patch literal 776 zcmd6ly9&ZU5JhimzGA^rG~gfjDnvBmtFRGGRt#u_sD(eTo(T~P1ubQm-Pw8N-pt%@ zp+W^{D5sv<=m=e+6E)C|nndboF0Yf0x?shH?KD)1o#VC0R%h}S_)cW4wdd7Q4RK0{ zTfI|;WqBT7T3B{l_n6mS*Ah>_T_v(5&vQDpG}crz&DB+3kye}|z87f#-Y)qSDm=Xm zQBK8Ky8?})KBc$EXXxHhthFiQ8xZ`?%rJU583)5?fATv{<7S!vDbIaq!772%fmvqd XL~TB=+1U&~Z^o{egJ*|K{+;gwtDt9p literal 387 zcmb`Du?oU45Qb;-6bBuP3HS!J%}~Tvs&;UZws)a{*g%pFeS4!I2s-wb<2d*}{$B_t z1jxOtws1*qD!(`F8;=Fpu5aH2H TF{oMI=?K5d7|9Xmd~NR&Qmtiz diff --git a/src/server/ItemManager/DBAgent.cpp b/src/server/ItemManager/DBAgent.cpp index 85472348..7376a54d 100644 --- a/src/server/ItemManager/DBAgent.cpp +++ b/src/server/ItemManager/DBAgent.cpp @@ -43,11 +43,11 @@ void CDBAgent::ReConnectODBC(CDatabase * m_db, char * strdb, char * strname, cha char strlog[256]; memset(strlog, 0x00, 256); CTime t = CTime::GetCurrentTime(); - sprintf(strlog, "Try ReConnectODBC... %d %d %d %d\r\n", t.GetMonth(), t.GetDay(), t.GetHour(), + sprintf(strlog, "Try ReConnectODBC... %d월 %d일 %d시 %d분\r\n", t.GetMonth(), t.GetDay(), t.GetHour(), t.GetMinute()); m_pMain->m_ItemLogFile.Write(strlog, strlen(strlog)); - // DATABASE ... + // DATABASE 연결... CString strConnect; strConnect.Format(_T("DSN=%s;UID=%s;PWD=%s"), strdb, strname, strpwd); int iCount = 0; diff --git a/src/server/ItemManager/Define.h b/src/server/ItemManager/Define.h index bde639d8..8ff661a5 100644 --- a/src/server/ItemManager/Define.h +++ b/src/server/ItemManager/Define.h @@ -88,10 +88,10 @@ typedef union { #define WIZ_ITEM_LOG 0x19 // Send To Agent for Writing Log #define WIZ_DATASAVE 0x37 // User GameData DB Save Request -#define SLOT_MAX 14 // MAX -#define HAVE_MAX 28 // MAX (κ丮â) -#define ITEMCOUNT_MAX 9999 // Ҹ Ѱ谪 -#define WAREHOUSE_MAX 196 // â MAX +#define SLOT_MAX 14 // 착용 아템 MAX +#define HAVE_MAX 28 // 소유 아템 MAX (인벤토리창) +#define ITEMCOUNT_MAX 9999 // 소모 아이템 소유 한계값 +#define WAREHOUSE_MAX 196 // 창고 아이템 MAX ///////////////////////////////////////////////////////////////////////////////// // Structure Define ///////////////////////////////////////////////////////////////////////////////// diff --git a/src/server/ItemManager/ItemManager.rc b/src/server/ItemManager/ItemManager.rc index 30a9014158f18d952dd3d1aff5a981d56c667157..d80c8ce6a05befdab9713a8fcfe40c5431d7a684 100644 GIT binary patch literal 9926 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 G-t1p98w3pi diff --git a/src/server/ItemManager/ItemManager.vcxproj.filters b/src/server/ItemManager/ItemManager.vcxproj.filters index b38cac84..cbc12b9b 100644 --- a/src/server/ItemManager/ItemManager.vcxproj.filters +++ b/src/server/ItemManager/ItemManager.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/server/ItemManager/ItemManager.vcxproj.user b/src/server/ItemManager/ItemManager.vcxproj.user index 1cbaf778..bbc55c83 100644 --- a/src/server/ItemManager/ItemManager.vcxproj.user +++ b/src/server/ItemManager/ItemManager.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\server diff --git a/src/server/ItemManager/ItemManagerDlg.cpp b/src/server/ItemManager/ItemManagerDlg.cpp index 2c9ed232..94029296 100644 --- a/src/server/ItemManager/ItemManagerDlg.cpp +++ b/src/server/ItemManager/ItemManagerDlg.cpp @@ -107,7 +107,7 @@ BOOL CItemManagerDlg::OnInitDialog() { m_nItemLogFileDay = time.GetDay(); m_nExpLogFileDay = time.GetDay(); - m_LoggerRecvQueue.InitailizeMMF(MAX_PKTSIZE, MAX_COUNT, SMQ_ITEMLOGGER, FALSE); // Dispatcher Send Queue + m_LoggerRecvQueue.InitailizeMMF(MAX_PKTSIZE, MAX_COUNT, SMQ_ITEMLOGGER, FALSE); // Dispatcher 의 Send Queue /* CString inipath; inipath.Format( "%s\\ItemDB.ini", GetProgPath() ); @@ -315,7 +315,7 @@ void CItemManagerDlg::ExpLogWrite(char * pBuf) { void CItemManagerDlg::OnExitBtn() { // TODO: Add your control notification handler code here - if (AfxMessageBox("¥ ?", MB_YESNO) == IDYES) { + if (AfxMessageBox("진짜 끝낼까요?", MB_YESNO) == IDYES) { CDialog::OnOK(); } } diff --git a/src/server/ItemManager/SharedMem.cpp b/src/server/ItemManager/SharedMem.cpp index d52f326b..15aea5fa 100644 --- a/src/server/ItemManager/SharedMem.cpp +++ b/src/server/ItemManager/SharedMem.cpp @@ -67,7 +67,7 @@ BOOL CSharedMemQueue::InitailizeMMF(DWORD dwOffsetsize, int maxcount, LPCTSTR lp m_bMMFCreate = bCreate; m_pHeader = (_SMQ_HEADER *)m_lpMMFile; - m_lReference = (LONG)(m_lpMMFile + sizeof(_SMQ_HEADER)); // ʱ ġ + m_lReference = (LONG)(m_lpMMFile + sizeof(_SMQ_HEADER)); // 초기 위치 셋팅 if (bCreate) { memset(m_lpMMFile, 0x00, dwfullsize); diff --git a/src/server/ItemManager/res/ItemManager.rc2 b/src/server/ItemManager/res/ItemManager.rc2 index 60dac12423dae3f3e516914de84769b913b8df8d..236c9fffaf3c8170889c8d00705e39bdb7a89cfa 100644 GIT binary patch literal 782 zcmd6l%L>9k3`OtOe#L-G(Sm)rCK=o|K9U1zk$WOeVRR-rLOm z7AjPLhjQv`uC9hyq!HfZG*t_a)u!IW3wfP%)P*Q5V+TGbF34JCqcgZAxf7_hcAR20 zFsF>V^*bGi4Cl$^Wn{bEo^smhTCob)>r^)2JgbA(L^GH!)PeC>E7lR;8*2dH4)_`! zp1X`uLC0C!l8vK3=Wb8V*uAq@E2-)U41QN;96g#$gK@O~`JJa}Gvt5T^HoHs%FwiD amWOJhHlNq*Y=)m-#6G&<|84$zZd1_N1|g0k^5+W@F2fFg%uFl$6HmXKDc zL7p$&H7}c6S@+GU$k{GI=d6P;kq1o%A?^=ixX1gx{*|!=XGI!>_+heW+;Co1NTuL0 U%rU50-|0|&l`)}1&iU5fC!7~%TmS$7 diff --git a/src/server/LoginServer/CentralDir.cpp b/src/server/LoginServer/CentralDir.cpp index 6d53a129..725b2fb7 100644 --- a/src/server/LoginServer/CentralDir.cpp +++ b/src/server/LoginServer/CentralDir.cpp @@ -155,7 +155,7 @@ void CCentralDir::ReadHeaders() { for (int i = 0; i < m_uEntriesNumber; i++) { CFileHeader * pHeader = new CFileHeader; - m_headers.Add(pHeader); // bezporednio nastpuje w razie wyjtku + m_headers.Add(pHeader); // bezpośrednio następuje w razie wyjątku if (!pHeader->Read(m_pStorage)) { ThrowError(ZIP_BADZIPFILE); diff --git a/src/server/LoginServer/CircularBuffer.h b/src/server/LoginServer/CircularBuffer.h index 801b387c..f2428364 100644 --- a/src/server/LoginServer/CircularBuffer.h +++ b/src/server/LoginServer/CircularBuffer.h @@ -11,11 +11,11 @@ class CCircularBuffer { void PutData(char * pData, int len); void GetData(char * pData, int len); - int GetOutData(char * pData); //HeadPos, ȭ + int GetOutData(char * pData); //HeadPos, 변화 void PutData(char & data); char & GetHeadData() { return m_pBuffer[m_iHeadPos]; } //1 Byte Operation; - //false : 絥 ٺ, TRUE: + //false : 모든데이터 다빠짐, TRUE: 정상적으로 진행중 BOOL HeadIncrease(int increasement = 1); void SetEmpty() { m_iHeadPos = 0; @@ -28,10 +28,10 @@ class CCircularBuffer { int GetValidCount(); protected: - //over flow IndexOverFlow + //over flow 먼저 점검한 후 IndexOverFlow 점검 BOOL IsOverFlowCondition(int & len) { return (len >= m_iBufSize - GetValidCount()) ? TRUE : FALSE; } BOOL IsIndexOverFlow(int & len) { return (len + m_iTailPos >= m_iBufSize) ? TRUE : FALSE; } - void BufferResize(); //overflow condition ϶ size ι ø + void BufferResize(); //overflow condition 일때 size를 현재의 두배로 늘림 protected: int m_iBufSize; char * m_pBuffer; diff --git a/src/server/LoginServer/DBProcess.cpp b/src/server/LoginServer/DBProcess.cpp index b8197d36..45957a26 100644 --- a/src/server/LoginServer/DBProcess.cpp +++ b/src/server/LoginServer/DBProcess.cpp @@ -38,11 +38,11 @@ void CDBProcess::ReConnectODBC(CDatabase * m_db, const char * strdb, const char char strlog[256]; memset(strlog, 0x00, 256); CTime t = CTime::GetCurrentTime(); - sprintf(strlog, "Try ReConnectODBC... %d %d %d %d\r\n", t.GetMonth(), t.GetDay(), t.GetHour(), + sprintf(strlog, "Try ReConnectODBC... %d월 %d일 %d시 %d분\r\n", t.GetMonth(), t.GetDay(), t.GetHour(), t.GetMinute()); LogFileWrite(strlog); - // DATABASE ... + // DATABASE 연결... CString strConnect; strConnect.Format(_T("DSN=%s;UID=%s;PWD=%s"), strdb, strname, strpwd); int iCount = 0; @@ -295,9 +295,9 @@ BOOL CDBProcess::LoadUserCountList() { SQLGetData(hstmt, 3, SQL_C_SSHORT, &zone_2, 0, &Indexind); SQLGetData(hstmt, 4, SQL_C_SSHORT, &zone_3, 0, &Indexind); - // ⿡ Ÿ ޾Ƽ ˾Ƽ .... + // 여기에서 데이타를 받아서 알아서 사용.... if (serverid - 1 < m_pMain->m_nServerCount) { - m_pMain->m_ServerList[serverid - 1]->sUserCount = zone_1 + zone_2 + zone_3; // ̰ ^^; + m_pMain->m_ServerList[serverid - 1]->sUserCount = zone_1 + zone_2 + zone_3; // 기범이가 ^^; } } } diff --git a/src/server/LoginServer/DlgBrowsePath.cpp b/src/server/LoginServer/DlgBrowsePath.cpp index 24207535..977db3a6 100644 --- a/src/server/LoginServer/DlgBrowsePath.cpp +++ b/src/server/LoginServer/DlgBrowsePath.cpp @@ -64,7 +64,7 @@ END_MESSAGE_MAP() BOOL CDlgBrowsePath::OnInitDialog() { CDialog::OnInitDialog(); - // ֱٿ ´... + // 최근에 쓴 폴더를 가져온다... char szInitDir[256]; DWORD dwLength = 256; memset(szInitDir, 0, 256); @@ -163,12 +163,12 @@ void CDlgBrowsePath::OnSynchFolders() { } void CDlgBrowsePath::OnOK() { - m_CBPath.GetWindowText(m_szPath); // .. + m_CBPath.GetWindowText(m_szPath); // 경로 기억.. if (m_szPath.GetLength() > 0) { - m_CBPath.InsertString(0, m_szPath); // ְ... + m_CBPath.InsertString(0, m_szPath); // 경로 넣고... } - // ֱٿ صд.... + // 최근에 쓴 폴더를 저장해둔다.... char szInitDir[256] = ""; CString szKey; HKEY hKey; diff --git a/src/server/LoginServer/FileHeader.cpp b/src/server/LoginServer/FileHeader.cpp index 22260bb7..e512e492 100644 --- a/src/server/LoginServer/FileHeader.cpp +++ b/src/server/LoginServer/FileHeader.cpp @@ -130,7 +130,7 @@ bool CFileHeader::ReadLocal(CZipStorage * pStorage, WORD & iLocExtrFieldSize, bo return false; } - // jeszcze monaby porwna nazwy plikw + // jeszcze możnaby porównać nazwy plików if (!bIsDataDescr /* || !pStorage->IsSpanMode()*/) { if (!CheckCrcAndSizes(buf + 14)) { diff --git a/src/server/LoginServer/IOCPSocket2.cpp b/src/server/LoginServer/IOCPSocket2.cpp index 3aa12989..d366e9ff 100644 --- a/src/server/LoginServer/IOCPSocket2.cpp +++ b/src/server/LoginServer/IOCPSocket2.cpp @@ -238,17 +238,17 @@ void CIOCPSocket2::ReceivedData(int length) { int len = 0; - if (!strlen(m_pRecvBuff)) { // Ŷ̴ ϳ Ͱ 찡 ߻... + if (!strlen(m_pRecvBuff)) { // 패킷길이는 존재하나 실 데이터가 없는 경우가 발생... return; } - m_pBuffer->PutData(m_pRecvBuff, length); // Data ۿ ִ´ + m_pBuffer->PutData(m_pRecvBuff, length); // 받은 Data를 버퍼에 넣는다 char * pData = NULL; char * pDecData = NULL; while (PullOutCore(pData, len)) { if (pData) { - Parsing(len, pData); // Ľ Լ... + Parsing(len, pData); // 실제 파싱 함수... delete[] pData; pData = NULL; diff --git a/src/server/LoginServer/IOCPort.cpp b/src/server/LoginServer/IOCPort.cpp index 28ecbd19..7fcb9530 100644 --- a/src/server/LoginServer/IOCPort.cpp +++ b/src/server/LoginServer/IOCPort.cpp @@ -217,7 +217,7 @@ DWORD WINAPI ClientWorkerThread(LPVOID lp) { TRACE("AISocket Closed By 0 Byte Notify\n"); pSocket->CloseProcess(); pIocport->RidIOCPSocket(pSocket->GetSocketID(), pSocket); - // pIocport->PutOldSid( pSocket->GetSocketID() ); // Ŭ̾Ʈ Sid + // pIocport->PutOldSid( pSocket->GetSocketID() ); // 클라이언트 소켓은 Sid 관리하지 않음 LeaveCriticalSection(&g_critical); break; } @@ -342,7 +342,7 @@ void CIOCPort::Init(int serversocksize, int clientsocksize, int workernum) { m_SockArrayInActive[i] = NULL; } - m_ClientSockArray = new CIOCPSocket2 *[clientsocksize]; // ش Ŭ̾Ʈμ ٸ Ϳ ٴ ϼ + m_ClientSockArray = new CIOCPSocket2 *[clientsocksize]; // 해당 서버가 클라이언트로서 다른 컴터에 붙는 소켓수 for (int i = 0; i < clientsocksize; i++) { m_ClientSockArray[i] = NULL; } diff --git a/src/server/LoginServer/IOCPort.h b/src/server/LoginServer/IOCPort.h index 1281f496..99e48c13 100644 --- a/src/server/LoginServer/IOCPort.h +++ b/src/server/LoginServer/IOCPort.h @@ -43,7 +43,7 @@ class CIOCPort { CIOCPSocket2 ** m_SockArray; CIOCPSocket2 ** m_SockArrayInActive; - CIOCPSocket2 ** m_ClientSockArray; // Connect + CIOCPSocket2 ** m_ClientSockArray; // Connect용 소켓 protected: DWORD m_dwNumberOfWorkers; diff --git a/src/server/LoginServer/LoginServer.rc b/src/server/LoginServer/LoginServer.rc index 7aee606293155adfe7777f49c2d2c1bb4a9e0966..0258d2e0d6c939ef1083d49ab494bfd01f31508c 100644 GIT binary patch literal 13816 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 MP9&XXPdE|&2Tgk0j{pDw literal 6938 zcmcIpOK;=I5x( zn8O4EY!17a2@+(295O*JL9V&xPo%0zN|Ytp-mFd85c^eK{nfKe`}>1voF-XvofDJ4 z=F?=xQ^NB3BudB)k9ivAd_q#5CG&L5Nj6TSS>BNL_oY`+Jf6-coXFK^<5rfWR}+36 z#hmCv=8sIv4Lquwu47*Y>~hd`Z3b(f@j*`Z_ep=j>UEmjk^GhupI-QuW7s2;5^ZsU zd#s1o-vRf6@n>WT(V52p!~-ZiI}GGBNqHDAPMU!%qHFS1A&<$f-n#%Vv-S^@CH_+rxFpd~j|#Elsj@r$5sBl;8_apt_?FHtLGDNqhRp_N7;|G`zVB z$vBztU>4r+-Q)H#kmB(KxY*w>iB+^0>R~x&?kP2&9S+ornhHQulGJ(+F)e23o~d_j zN~A9BTaHBFsj2f-QN|N@Zg-eT&7kVXMrB|_B5MGdLJ&jx;91@`995-M?+wy(t zEu_e5v@5f#Cc8F$(mdbOjngO69D44Mdj91`!gXH$Kebz>uvEZW|3VejBZa87fz8@i zpRlTj^^t`iL&;xV*~v{5GoHTYX(JtLvP?jGNu0#rEM4VUl+D8_F~0tq@JUqnklAL+ z)5f<+dUaK*MLI^R)dSR79>$X}oq+Y+&61eM`3fDudyViykxJ_VN@+=$6y-^Z~7KgKx`l9c%=))oSa??GRsuglg&1I?QIzBm8i2VMCKm1;z<^uPR6(hE^NIpmh$mi=l>k z1)D&09xK|x5xgA;6&^qyV-0P}=vIY&il#rN)cRzyyQA-c zG8f$IriolB+9AN)d!4);pzdle^0{du_|QTF4nFoRX5By8HNy%*40XDDXrsDtu`6rQ1?%k zRtTa%i45<31*=kDQy6t zDJHLNszZPlwg~!M2uaY_e)hKQj?lzn+clWXuEB^8xkj-kHhl`_EM(QJoRrAgF%A^? z2PljCaaipfLI60_o)iGKgk6BFiUyBH+(Jc!a^8;+A}_$O^qpD@zS})=2Yl9n;#yd`9uD6!KEX`xH3;5=jrLVeljFX_}+Ta2iz};3lz&+wFv=VQ? zqBZ~-t??omX&G2WN(#VN`30oUE-4%ME)m46>>#SrgpVo_@a^Wv@Ynira?jTLY@oAK z(A3toU0vn_lXge_f}WUyiVUNCn(@`%CiY@Qpy+lP%xv35!@nHTVxeFR3JhfrELvXA zyS8hb5}D;GB!uXHtoRyIdkikiNupIuY_?Uc+3vzk9y{?_orXPUx;>&q#t0e4Z=LXt z%a9A>Eel7hr<{d*n!G54iTFh7xilH{4D#vI$N!SgfBgRM@Bj7vZyz923JN!aT(n3_ z)h+X_IOk~`PAl$e`TLd?Hopm{MlySwMmM+MF7be6gX|i6L~Ay+hnD(jIDxBK`YmKx zThVZVcm!-ADsc&1jkN~7pj-BUlwvX;=Nr!RB>c+dk3xtxhZ3y5OZ_ND^~76 zHG|rGX;sQ-DGs`7G2jOL0n`dDr~(#Q7~(4~DpfaF+`@F=a#wXPXLnt=%mi4nLBtVni6uxl{CjEoD*5#S=(O$q)bh^B3}`zrFv@Uw`-UH{{39fBDDfFCRbr`02x! z5C3kIMb4GOt`(D?w{#*23Yei>i6?`@o}>*Tv5q8|$rWqia>xwHfQR z)n_l?i<;?E>-5W7HWo$e9vy3 + diff --git a/src/server/LoginServer/LoginServer.vcxproj.user b/src/server/LoginServer/LoginServer.vcxproj.user index 1cbaf778..bbc55c83 100644 --- a/src/server/LoginServer/LoginServer.vcxproj.user +++ b/src/server/LoginServer/LoginServer.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\server diff --git a/src/server/LoginServer/SettingDlg.cpp b/src/server/LoginServer/SettingDlg.cpp index e41d3c2a..84dc0743 100644 --- a/src/server/LoginServer/SettingDlg.cpp +++ b/src/server/LoginServer/SettingDlg.cpp @@ -235,7 +235,7 @@ void CSettingDlg::OnCompress() { m_ZipArchive.Close(); - if (!m_bCompressOption) { // Current Version + if (!m_bCompressOption) { // Current Version 만 압축 if (!m_RepackingVersionList.empty()) { RepackingHistory(); } @@ -418,7 +418,7 @@ void CSettingDlg::FolderRecurse(const char * foldername, bool b_test) { continue; } - if (b_test) { // ܼ ˻縸 ... + if (b_test) { // 단순 검사만 수행... if (IsDBCSString(tempstr1)) { CString errmsg; errmsg.Format("%s include DBCS character", tempstr1); diff --git a/src/server/LoginServer/User.cpp b/src/server/LoginServer/User.cpp index fb458a4d..40e945cb 100644 --- a/src/server/LoginServer/User.cpp +++ b/src/server/LoginServer/User.cpp @@ -47,7 +47,7 @@ void CUser::Parsing(int len, char * pData) { Send(buff, send_index); break; case LS_SERVERLIST: - m_pMain->m_DBProcess.LoadUserCountList(); // ̰ ^^; + m_pMain->m_DBProcess.LoadUserCountList(); // 기범이가 ^^; SetByte(buff, LS_SERVERLIST, send_index); SetByte(buff, m_pMain->m_nServerCount, send_index); for (int i = 0; i < m_pMain->m_ServerList.size(); i++) { @@ -57,7 +57,7 @@ void CUser::Parsing(int len, char * pData) { SetShort(buff, strlen(m_pMain->m_ServerList[i]->strServerName), send_index); SetString(buff, m_pMain->m_ServerList[i]->strServerName, strlen(m_pMain->m_ServerList[i]->strServerName), send_index); - SetShort(buff, m_pMain->m_ServerList[i]->sUserCount, send_index); // ̰ ^^; + SetShort(buff, m_pMain->m_ServerList[i]->sUserCount, send_index); // 기범이가 ^^; } Send(buff, send_index); break; @@ -116,7 +116,7 @@ void CUser::LogInReq(char * pBuf) { return; fail_return: SetByte(send_buff, LS_LOGIN_REQ, send_index); - SetByte(send_buff, 0x02, send_index); // id, pwd ̻... + SetByte(send_buff, 0x02, send_index); // id, pwd 이상... Send(send_buff, send_index); } diff --git a/src/server/LoginServer/Zip.vcxproj.filters b/src/server/LoginServer/Zip.vcxproj.filters index a964fa08..5aa20298 100644 --- a/src/server/LoginServer/Zip.vcxproj.filters +++ b/src/server/LoginServer/Zip.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/server/LoginServer/Zip.vcxproj.user b/src/server/LoginServer/Zip.vcxproj.user index 88a55094..824d5a97 100644 --- a/src/server/LoginServer/Zip.vcxproj.user +++ b/src/server/LoginServer/Zip.vcxproj.user @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/src/server/LoginServer/ZipArchive.cpp b/src/server/LoginServer/ZipArchive.cpp index 8db3d26c..8187ada7 100644 --- a/src/server/LoginServer/ZipArchive.cpp +++ b/src/server/LoginServer/ZipArchive.cpp @@ -766,7 +766,7 @@ void CZipArchive::DeleteInternal(WORD uIndex) { m_centralDir.RemoveFile(uIndex); - // teraz uaktualnij offsety w pozostaych pozycjach central dir + // teraz uaktualnij offsety w pozostałych pozycjach central dir // (update offsets in file headers in the central dir) if (uOtherOffsetChanged) { for (int i = uIndex; i < GetNoEntries(); i++) { @@ -787,7 +787,7 @@ CString CZipArchive::GetDrive(LPCTSTR lpszFilePath) { //////////////////////////////////////////////////////////////////////////////////////////////////////// // -// Ư 丮 ü Ѵ. 2001.5.30 +// 특정 디렉토리를 제거한체 압축한다. 2001.5.30 // BOOL CZipArchive::AddNewFile(LPCTSTR lpszFilePath, LPCTSTR strPath, int iLevel, unsigned long nBufSize) { CString strFileName = _T(""); diff --git a/src/server/LoginServer/res/LoginServer.rc2 b/src/server/LoginServer/res/LoginServer.rc2 index 1420de442c4d559e1ccbfdfdddea9e1aa8b281ef..8530174504aadada84d2d4546a6077ed3bd05e99 100644 GIT binary patch literal 782 zcmd6l%Sr=55Jk_{d_{vxF$4ZVNJN6hh>zJy9vw1}M3}^dKd+u@MqDW9G8El?yI$Pe z)gSK_6+Kr);)W?#jJf53OYW)5-WLtIFn;c8$?SRIRkSELF`*H+dLy#pU|y|nZ`O>B zw;^X*Vre|;6FX7lWqnOSaYpxrw+(L{tDfhnk(GJbJu%=;evdpclIxV`!nhV)%Xeh{ zi51yi!Kk(3z`C$W);IRf`hwk07Bl8ud@h6kD+`WUO`#z;#(VzFGqgqKaoX3f7^rHg crmeHwbrX&Ge9tas`1{XTmpNqm#g1L?C%Ro|e*gdg literal 390 zcmb`D!3u&v5Qfj~Qw(^NT<8r%C8W~O@*3vM;=ty@?t1X;+kzmdqjMRCf$!u0r4&-a zvEG+eTQptKBu%!1Em(49wgWjh@nDTJ%0tI)?loj_3~0hm{Ish*%*h zNYCx%nwRyhth)M8nr|6S4v+f0!Z|SDaTBDIz@j UDFoHaJ00Oy86#Orl4Nb~6Vwf6f&c&j diff --git a/src/tool/KscViewer/KscViewer.rc b/src/tool/KscViewer/KscViewer.rc index 0acde988c9d3ab711578929050eee182f78e74ac..eef084db2e50ffedfb31c364cfa9c25ade39b4a4 100644 GIT binary patch literal 20536 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 SvYhhgrN~yT-E7AkS^7WUOrH(_ diff --git a/src/tool/KscViewer/KscViewer.vcxproj.filters b/src/tool/KscViewer/KscViewer.vcxproj.filters index e02b0ec0..35cc1f50 100644 --- a/src/tool/KscViewer/KscViewer.vcxproj.filters +++ b/src/tool/KscViewer/KscViewer.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/tool/KscViewer/KscViewer.vcxproj.user b/src/tool/KscViewer/KscViewer.vcxproj.user index 7912fcf6..1aa1e2ae 100644 --- a/src/tool/KscViewer/KscViewer.vcxproj.user +++ b/src/tool/KscViewer/KscViewer.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\game diff --git a/src/tool/KscViewer/res/KscViewer.rc2 b/src/tool/KscViewer/res/KscViewer.rc2 index 456e9f39838d7843c0826a6ef4086a08e2b43299..5458ec4d0d3e6f1379a927cbffc3cd2611c68247 100644 GIT binary patch literal 778 zcmd6lNeaS15JmsioT9;{Xuumt%tFKghqx4n76UOt)PCDycXH%OkRTTMAk|fuSgBV zX-nMdopLP8^Z3%zvfH|EcxAd)hyw09ksW!S)2X8|7-yQR3(Ap}oI}1h0(*=vP>l*t zFGEyNan`;>*zZTQUA1EKbSnrZZA4Im*Rt&kL? z=k{{V%lclPy1FWIv5Sb=GWbb5P}&fL{Xz6YxQF$xOhh!JRv_gMQv~CN^C}`mghxMz Tpk{riBm633BBmrsw)Q>&=P_mF diff --git a/src/tool/Launcher/Launcher/APISocket.cpp b/src/tool/Launcher/Launcher/APISocket.cpp index fd7aef34..f7cfe59f 100644 --- a/src/tool/Launcher/Launcher/APISocket.cpp +++ b/src/tool/Launcher/Launcher/APISocket.cpp @@ -172,11 +172,11 @@ BOOL CAPISocket::ReceiveProcess() { if (PACKET_HEADER == ntohs(*((WORD *)pData))) { short siCore = *((short *)(pData + 2)); if (siCore <= iCount) { - if (PACKET_TAIL == ntohs(*((WORD *)(pData + iCount - 2)))) // Ŷ κ ˻.. + if (PACKET_TAIL == ntohs(*((WORD *)(pData + iCount - 2)))) // 패킷 꼬리 부분 검사.. { DataPack * pDP = new DataPack(siCore, pData + 4); m_qRecvPkt.push(pDP); - m_CB.HeadIncrease(siCore + 6); // ȯ ε Ű.. + m_CB.HeadIncrease(siCore + 6); // 환형 버퍼 인덱스 증가 시키기.. bFoundTail = TRUE; } @@ -194,8 +194,8 @@ void CAPISocket::Send(BYTE * pData, int nSize) { return; } - // UZDream Ŷ Ŀ ִ κ. STX, ETX, size ٿش. κ Ŷ鶧 ٿ ־ . - // ո Ŷ Ŀ ߱ ؼ... + // UZDream 패킷 형식에 맞춰주는 부분. STX, ETX, size만 붙여준다. 따라서 나머지 부분은 패킷만들때 붙여서 넣어줘야 함. + // 불합리하지만 이전의 패킷 형식에 맞추기 위해선... // int nTotalSize = nSize+10; // BYTE *pSndData = m_RecvBuf; // *((WORD*)pSndData) = STX; pSndData+=2; diff --git a/src/tool/Launcher/Launcher/APISocket.h b/src/tool/Launcher/Launcher/APISocket.h index 7ef75391..04d4ca05 100644 --- a/src/tool/Launcher/Launcher/APISocket.h +++ b/src/tool/Launcher/Launcher/APISocket.h @@ -62,7 +62,7 @@ class CAPISocket { BOOL ReceiveProcess(); void Send(BYTE * pData, int nSize); - //Ŷ Լ + //패킷 만들기 함수 static void MP_AddByte(BYTE * dest, int & iOffset, BYTE byte) { CopyMemory(dest + iOffset, &byte, 1); iOffset++; @@ -91,7 +91,7 @@ class CAPISocket { } } - //Ŷ Parsing Լ + //패킷 Parsing 함수 static BYTE & Parse_GetByte(const BYTE * buf, int & iOffset) { iOffset++; return *(BYTE *)(buf + iOffset - 1); diff --git a/src/tool/Launcher/Launcher/BB_CircularBuffer.h b/src/tool/Launcher/Launcher/BB_CircularBuffer.h index 6472c552..97dabd4a 100644 --- a/src/tool/Launcher/Launcher/BB_CircularBuffer.h +++ b/src/tool/Launcher/Launcher/BB_CircularBuffer.h @@ -11,11 +11,11 @@ class BB_CircularBuffer { void PutData(BYTE * pData, int len); void GetData(BYTE * pData, int len); - int GetOutData(BYTE * pData); //HeadPos, ȭ + int GetOutData(BYTE * pData); //HeadPos, 변화 void PutData(BYTE & data); BYTE & GetHeadData() { return m_pBuffer[m_iHeadPos]; } //1 Byte Operation; - //false : 絥 ٺ, TRUE: + //false : 모든데이터 다빠짐, TRUE: 정상적으로 진행중 BOOL HeadIncrease(int increasement = 1); void SetEmpty() { m_iHeadPos = 0; @@ -28,10 +28,10 @@ class BB_CircularBuffer { int GetValidCount(); protected: - //over flow IndexOverFlow + //over flow 먼저 점검한 후 IndexOverFlow 점검 BOOL IsOverFlowCondition(int & len) { return (len >= m_iBufSize - GetValidCount()) ? TRUE : FALSE; } BOOL IsIndexOverFlow(int & len) { return (len + m_iTailPos >= m_iBufSize) ? TRUE : FALSE; } - void BufferResize(); //overflow condition ϶ size ι ø + void BufferResize(); //overflow condition 일때 size를 현재의 두배로 늘림 protected: int m_iBufSize; BYTE * m_pBuffer; diff --git a/src/tool/Launcher/Launcher/Launcher.rc b/src/tool/Launcher/Launcher/Launcher.rc index 46298d2fa027f65d1b315a3514c7d20f20d72e39..c1a84c1a34e3ebc3875e8e6efc84c813c66ffb93 100644 GIT binary patch literal 20514 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

=6*I3AD{pFLI~M8bi9Dz2 z`BJ5z63YKIHbq4u&lS{3O;-t>5v3f%338UD86nM&%i{RRfWV8e_5?pDNly<+1)@%x z#tgBiR3fos5|>W$Iff;PUM#?q5lGqQuP8z(bMA*^Jxd}!KFuq zVU{^@b)Z*-TmT*;k$8B7Fr1jAvkX1Jvm`RWrnq#3z$fI+6TMV~O*4^5qN|1Vh@b+$ zq9)79@N8G}q%55r?viFED`eQL zG~SkQSeB=AyG9Ci2Mmn|t{8tQO5&j(+IwGkLZcsse+lv!T7F`JS1NjbN;P91+Q8e9xz3Y}{*|2#6zbd5?v97@5j1`M; zOjaJDx%6O`9$|gG!Cx*Zr13Ev$N1c2M&LvN4Nk`SahwqPbf$qq#$yhFQ_&`)DJ7%m z=#yg@nWuB<waCo*LG*;*?DUy#$q;iVO;Ai2yHZWxM(o z}5-sJ#D9lcrcV=I3vo+Qjr}~21 zBu~X~qpE3v7dw_473EPjD}o_p@KJ$y5BNPo205Pf21q>G3;)C;1a!mXl2Xe!P9Egx zlsH0*!=UfJN!~A)GQ$q!QZ7Ab3Yr6cRZEuIINFP&SaaQBL4=w8y!#-HXIOWkBN&u$ zZv+wl+NP!#2ep#Q>5~vbsQ>yT=gFPe+aFK#_FsZp>6@r=8jgbN>1T{-9kLX696B;00Bt{d_t-UMtdQHd7tobzpKm^8trGFf2kdjL|gk`?%on22iMdMijR!#{wXwPPXlLu-M)d~S zU0V6vGYdKVn@51GJ>1zR+pD+d4nHA#AMM=P+25@lMHE{i{_aTN@s4;+{|oWmo!ed_ zsDi!gTh;0U*}qo1x&4UTdfZ6@@BOtarxfLeojXEiXldxlB=n0eS^i?yWD=l99NezmC$+oP*U(?OQB+4$iEMV1OFp3(+e=$t?`%D-5Q8IrT95&1r`e<= z!@B@P7|OzCkI@Kk6gi!Us(Bf@d3&#Je}FlJyg+_fn9v6LK(@hSo}&#n%j~cJG}(tp25o42-LN^9)LEI;QXo>IHHHs_O845)RYGeL{RC zhe9z=)jnO{B?k{~&$TB00MCNq93!HmADwLi)j2#|1=48-QXAy8WBdn|=y37WxcOHw zRrPVG3V9NA_MbK)5bAi^UeanP=Pk|6lWo_YJUAf9DX6KIO3p}%Hmm4opRqBU9FjUW zW|KpR6xn)b)*Fza{4pFh3TSvWZ0*vX>uuAeJz4F#J^CkwN*r?xOmZ>Q;+Joft{=?5 zy7FEqhkxIo(T;TUmBlyaZ@&5Wjlvv6-w@!wP8!h30n`E>+*FUE3Rv9SeYn z4~gFX^~(E>w#m+er8hUMh1u%wLyTGrxS#hs=k0ZVaeCpB&!l?ywST<+CGKctZuN02 z#Oi;5Xc|R9LDpYcm|NVcetY9;qbSdUS{k{y8%D#`-o5eh;?}~&t%qS=9W~q?K555r z;qfAUYqJBh6T~5_*2+3Mj)y~*bo3q^eEZK`;f~kEh1Gct7l3*^xmUkvQj8B-e5a$( zhpu0H>z#$MBW4Cgs%waGJy-p1aSQFVeem`#uV0(rUHN$n@g_*I^=w`T%1vYS4Z2#sn)I!WP;^toU!xkg9 z;X$Z*Zy^!^nOfT}9jfNZ)}&LY_^e(mY1R}ulZ%P5XRY_p%kNz8*>sBM#G!h<_Xgyg z*rv?K6Xz2Dr*+;u-+=3>91~-GcWcqA)BB|&< zvhl1~SM$!vazmrT0~T2o{IDxTp&LZG3<<_j9c~1=C6K|x83i4+1ygW3oO5e||Am4p zJUu9YAz(rIOQFxJmkj8q;xRcGE^k!yR=!Oj!qI$lGSr-7sfIMz7E{z0`}zZP(Ik2c zt_WbD8A9F>nFX&IWSLBYpd=%XDYkTFW<=2*rMlCa1uNR&84L0Z6P#bjA_NrR_ yIv3sx3Qkq=TF{f-3IaR(S0&x6K=qqI_10hei$MNa{t4e=XlSkJhTZ1+(0>8lIek$8 diff --git a/src/tool/Launcher/Launcher/Launcher.vcxproj.filters b/src/tool/Launcher/Launcher/Launcher.vcxproj.filters index 20ae98b2..ad508b4b 100644 --- a/src/tool/Launcher/Launcher/Launcher.vcxproj.filters +++ b/src/tool/Launcher/Launcher/Launcher.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/tool/Launcher/Launcher/Launcher.vcxproj.user b/src/tool/Launcher/Launcher/Launcher.vcxproj.user index 3282c740..9aa8caa8 100644 --- a/src/tool/Launcher/Launcher/Launcher.vcxproj.user +++ b/src/tool/Launcher/Launcher/Launcher.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\..\assets\game diff --git a/src/tool/Launcher/Launcher/LauncherDlg.cpp b/src/tool/Launcher/Launcher/LauncherDlg.cpp index 6e64268f..934c399a 100644 --- a/src/tool/Launcher/Launcher/LauncherDlg.cpp +++ b/src/tool/Launcher/Launcher/LauncherDlg.cpp @@ -56,9 +56,9 @@ BOOL CLauncherDlg::OnInitDialog() { CString szInfo; szInfo.LoadString(IDS_INFO_VERSION_CHECK); - m_Status.SetWindowText(szInfo); // ȭ鿡 ǥ.. + m_Status.SetWindowText(szInfo); // 화면에 표시.. - m_progress.SetColor(RGB(64, 255, 64)); // α׷ Ѵ. + m_progress.SetColor(RGB(64, 255, 64)); // 프로그래스 색을 정한다. m_pSocket = new CAPISocket(); @@ -95,7 +95,7 @@ BOOL CLauncherDlg::OnInitDialog() { dwType = REG_SZ; dwBytes = 256; - lStatus = RegQueryValueEx(m_hRegistryKey, "PATH", NULL, &dwType, (BYTE *)szBuff, &dwBytes); // ν + lStatus = RegQueryValueEx(m_hRegistryKey, "PATH", NULL, &dwType, (BYTE *)szBuff, &dwBytes); // 인스톨 경로 if (ERROR_SUCCESS != lStatus) { CString szErr; szErr.LoadString(IDS_ERR_REGISTRY_READ_PATH); @@ -106,7 +106,7 @@ BOOL CLauncherDlg::OnInitDialog() { dwType = REG_SZ; dwBytes = 256; - lStatus = RegQueryValueEx(m_hRegistryKey, "EXE", NULL, &dwType, (BYTE *)szBuff, &dwBytes); // ̸ + lStatus = RegQueryValueEx(m_hRegistryKey, "EXE", NULL, &dwType, (BYTE *)szBuff, &dwBytes); // 실행파일 이름 if (ERROR_SUCCESS != lStatus) { CString szErr; szErr.LoadString(IDS_ERR_REGISTRY_READ_EXE); @@ -118,7 +118,7 @@ BOOL CLauncherDlg::OnInitDialog() { dwType = REG_SZ; dwBytes = 256; lStatus = - RegQueryValueEx(m_hRegistryKey, "SERVICE", NULL, &dwType, (BYTE *)m_strServiceName, &dwBytes); // ̸.. + RegQueryValueEx(m_hRegistryKey, "SERVICE", NULL, &dwType, (BYTE *)m_strServiceName, &dwBytes); // 서비스 이름.. if (ERROR_SUCCESS != lStatus) { CString szErr; szErr.LoadString(IDS_ERR_REGISTRY_READ_SERVICE); @@ -126,7 +126,7 @@ BOOL CLauncherDlg::OnInitDialog() { exit(-1); } - // .. + // 소켓 접속.. char szIniPath[_MAX_PATH] = ""; ::GetCurrentDirectory(_MAX_PATH, szIniPath); lstrcat(szIniPath, "\\Server.Ini"); @@ -158,7 +158,7 @@ BOOL CLauncherDlg::OnInitDialog() { } else { CString szErr; szErr.LoadString(IDS_ERR_INVALID_SERVER_COUNT); - this->MessageBox(szInfo); // . + this->MessageBox(szInfo); // 끝낸다. PostQuitMessage(0); } @@ -273,12 +273,12 @@ void CLauncherDlg::PacketReceive_DownloadInfo(const BYTE * pBuf, int & iIndex) { void CLauncherDlg::PacketReceive_Version(const BYTE * pBuf, int & iIndex) { m_nServerVersion = m_pSocket->Parse_GetShort(pBuf, iIndex); - if (m_nCurVersion == m_nServerVersion) // ġϸ.. + if (m_nCurVersion == m_nServerVersion) // 버전이 일치하면.. { - this->StartGame(); // .. - } else if (m_nCurVersion < m_nServerVersion) // .. + this->StartGame(); // 게임 실행.. + } else if (m_nCurVersion < m_nServerVersion) // 버전이 낮으면.. { - PacketSend_DownloadInfo(); // ٿε û.. + PacketSend_DownloadInfo(); // 다운로드 요청.. } else { CString szErr; szErr.LoadString(IDS_ERR_INVALID_VERSION); @@ -288,7 +288,7 @@ void CLauncherDlg::PacketReceive_Version(const BYTE * pBuf, int & iIndex) { } void CLauncherDlg::StartGame() { - CString szCmd = GetCommandLine(); // Ŀǵ .. + CString szCmd = GetCommandLine(); // 커맨드 라인을 가져오고.. char szApp[_MAX_PATH] = ""; GetModuleFileName(NULL, szApp, _MAX_PATH); int iML = lstrlen(szApp); @@ -301,8 +301,8 @@ void CLauncherDlg::StartGame() { } } - std::string szExeFN = m_szInstalledPath + "\\" + m_szExeName; // ̸ .. - ::ShellExecute(NULL, "open", szExeFN.c_str(), szParam, m_szInstalledPath.c_str(), SW_SHOWNORMAL); // .. + std::string szExeFN = m_szInstalledPath + "\\" + m_szExeName; // 실행 파일 이름 만들고.. + ::ShellExecute(NULL, "open", szExeFN.c_str(), szParam, m_szInstalledPath.c_str(), SW_SHOWNORMAL); // 게임 실행.. PostQuitMessage(0); } @@ -326,7 +326,7 @@ void CLauncherDlg::DownloadProcess() { BOOL bDownloadSuccess = GetDownloadFile(szFullPath, m_szGetFileNames[i]); while (!bDownloadSuccess) { CString szErr; - szErr.LoadString(IDS_ERR_DOWNLOAD_PATCH_FILE_AND_RETRY); // ٽ õұ?? + szErr.LoadString(IDS_ERR_DOWNLOAD_PATCH_FILE_AND_RETRY); // 다시 시도할까여?? int iID = MessageBox(szErr, "Patch error", MB_YESNO); if (IDYES == iID) { bDownloadSuccess = GetDownloadFile(szFullPath, m_szGetFileNames[i]); @@ -364,7 +364,7 @@ void CLauncherDlg::DownloadProcess() { if (file.Open(szLocalFName.c_str(), CFile::modeRead | CFile::shareDenyNone, NULL)) { file.Close(); file.Remove(szLocalFName.c_str()); - if (m_hRegistryKey) // Ǯ , ϸ .. + if (m_hRegistryKey) // 압축 풀기와 쓰기, 압축 파일 삭제에 성공하면 버전을 쓰고.. { RegSetValueEx(m_hRegistryKey, "VERSION", NULL, REG_DWORD, ((BYTE *)(&m_nVersionNum[i])), 4); } @@ -390,10 +390,10 @@ void CLauncherDlg::DownloadProcess() { // itoa( m_nServerVersion, (char*)(LPCTSTR)version, 10 ); // WritePrivateProfileString("VERSION","CURRENT",version, inipath); - if (true == bExtractSuccess && m_hRegistryKey) // Ǯ , ϸ .. + if (true == bExtractSuccess && m_hRegistryKey) // 압축 풀기와 쓰기, 압축 파일 삭제에 성공하면 버전을 쓰고.. { long lStatus = RegSetValueEx(m_hRegistryKey, "VERSION", NULL, REG_DWORD, ((BYTE *)(&m_nServerVersion)), 4); - this->StartGame(); // .. + this->StartGame(); // 게임 실행.. } else { CString szErr; szErr.LoadString(IDS_ERR_PATCH); @@ -705,13 +705,13 @@ LRESULT CLauncherDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { case FD_READ: { m_pSocket->Receive(); - while (m_pSocket->PktQueueSize() > 0) // Ŷ Ʈ Ŷ ֳ???? + while (m_pSocket->PktQueueSize() > 0) // 패킷 리스트에 패킷이 있냐???? { int iOffset = 0; - DataPack * pDataPack = m_pSocket->PktQueueFront(); // ť ù° .. - this->PacketProcess(pDataPack->m_pData, iOffset); // Ŷ ó Ȳ ƴϴ. + DataPack * pDataPack = m_pSocket->PktQueueFront(); // 큐의 첫번째 것을 복사.. + this->PacketProcess(pDataPack->m_pData, iOffset); // 패킷을 처리할 상황이 아니다. delete pDataPack; - m_pSocket->PktQueuePop(); // Ŷ ť .. + m_pSocket->PktQueuePop(); // 패킷을 큐에서 꺼냄.. } } break; default: diff --git a/src/tool/Launcher/Launcher/LauncherDlg.h b/src/tool/Launcher/Launcher/LauncherDlg.h index 0d13533a..c1020cef 100644 --- a/src/tool/Launcher/Launcher/LauncherDlg.h +++ b/src/tool/Launcher/Launcher/LauncherDlg.h @@ -46,7 +46,7 @@ class CLauncherDlg : public CDialog { std::string m_szGetFileNames[MAX_DOWNLOAD_FILE]; int m_nVersionNum[MAX_DOWNLOAD_FILE]; - HKEY m_hRegistryKey; // Ʈ Ű ڵ.. + HKEY m_hRegistryKey; // 레지스트리 키 핸들.. // Construction public: diff --git a/src/tool/Launcher/Launcher/MacProgressCtrl.cpp b/src/tool/Launcher/Launcher/MacProgressCtrl.cpp index 0c29c03e..73e4b473 100644 --- a/src/tool/Launcher/Launcher/MacProgressCtrl.cpp +++ b/src/tool/Launcher/Launcher/MacProgressCtrl.cpp @@ -145,7 +145,7 @@ void CMacProgressCtrl::OnPaint() // // Remarks : The framework calls this member function when Windows // or an application makes a request to repaint a portion -// of an applications window. +// of an application’s window. // { CPaintDC dcPaint(this); // device context for painting diff --git a/src/tool/Launcher/Launcher/PacketDef.h b/src/tool/Launcher/Launcher/PacketDef.h index 73470986..828aecc2 100644 --- a/src/tool/Launcher/Launcher/PacketDef.h +++ b/src/tool/Launcher/Launcher/PacketDef.h @@ -4,10 +4,10 @@ // Packet Define /////////////////////////////////////////////////////////////// #define VERSION_REQ 0x01 // Send -#define DOWNLOAD_INFO_REQ 0x02 // Send - s1() | Recv FTP +#define DOWNLOAD_INFO_REQ 0x02 // Send - s1(현재버전) | Recv FTP #define LOGIN_REQ \ - 0x03 // Send - s1(ID) str1(IDڿ:20Ʈ) s1(PW) str1(PWڿ:12Ʈ) | Recv - b1(0: 1: 2:ID 3:PWƲ 4:) -#define MGAME_LOGIN_REQ 0x04 // !!! LOGIN_REQ !!! + 0x03 // Send - s1(ID길이) str1(ID문자열:20바이트이하) s1(PW길이) str1(PW문자열:12바이트이하) | Recv - b1(0:실패 1:성공 2:ID없음 3:PW틀림 4:서버점검중) +#define MGAME_LOGIN_REQ 0x04 // !!! LOGIN_REQ !!! 와 동일 #define SERVER_LIST \ - 0x05 // Recv - b1(ServerCount) loop( s1(IP), str1(IPڿ), s1(̸), str1(̸ڿ), s1(ο) ) + 0x05 // Recv - b1(ServerCount) loop( s1(IP길이), str1(IP문자열), s1(서버이름길이), str1(서버이름문자열), s1(서버접속인원) ) /////////////////////////////////////////////////////////////// diff --git a/src/tool/Launcher/Launcher/ServerMesh.cpp b/src/tool/Launcher/Launcher/ServerMesh.cpp index d3512009..7d391193 100644 --- a/src/tool/Launcher/Launcher/ServerMesh.cpp +++ b/src/tool/Launcher/Launcher/ServerMesh.cpp @@ -36,7 +36,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { D3DCOLOR color = D3DCOLOR_RGBA(50, 25, 25, 0); - // .. + // 제일 왼쪽.. ixposL = ixpos - SGRID_SIZE; izposL = izpos - SGRID_SIZE; ixposR = ixpos - SGRID_SIZE; @@ -56,7 +56,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 0); - // ι°.. + // 왼쪽 두번째.. ixposL = ixpos; izposL = izpos - SGRID_SIZE; @@ -77,7 +77,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 6); - // °.. + // 왼쪽 세번째.. ixposL = ixpos + SGRID_SIZE; izposL = izpos - SGRID_SIZE; @@ -98,7 +98,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 12); - // ʿ .. + // 왼쪽에서 끝.. ixposL = ixpos + SGRID_SIZE * 2; izposL = izpos - SGRID_SIZE; @@ -119,7 +119,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 18); - // ؿ ù°.. + // 밑에서 첫번째.. ixposL = ixpos - SGRID_SIZE; izposL = izpos - SGRID_SIZE; @@ -140,7 +140,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 24); - // ؿ ι°.. + // 밑에서 두번째.. ixposL = ixpos - SGRID_SIZE; izposL = izpos; @@ -161,7 +161,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 30); - // ؿ °.. + // 밑에서 세번째.. ixposL = ixpos - SGRID_SIZE; izposL = izpos + SGRID_SIZE; @@ -182,7 +182,7 @@ void CServerMesh::Tick(CN3Terrain * pTerrain, const __Vector3 & vPosPlayer) { AutoConcMesh(color, ixposL, ixposR, izposL, izposR, fHeightBottom, fHeightTop, 36); - // ؿ °.. + // 밑에서 끝번째.. ixposL = ixpos - SGRID_SIZE; izposL = izpos + SGRID_SIZE * 2; diff --git a/src/tool/Launcher/Launcher/res/Launcher.rc2 b/src/tool/Launcher/Launcher/res/Launcher.rc2 index ff5423e4b861c1a92027a2aed76a26ec707d59f5..67dd97df69bbe21a93743e512a8c5d0d75f87d5c 100644 GIT binary patch literal 776 zcmd6l%Sr=55Jk_{d_{vx(E*{Gos{mc+@AhT9KFaRgD#QbYJ+|@Y&+&cwZV>nU_72=q5b!B*q>C#=Lrt{N9+Mczfnw zSdr}&h-xeLtQ$1R`pVu}U!ePqV#d6U&qZ)Lv%r|;6dVF${K@}u2DivOPx;=5uB?`F cdUKZBcA_z#pV`F>|K5ysGl%RBg`7LzFR~hEfdBvi literal 387 zcmb`D!3u&v5Qfj~Qw(^NT<8r%g`(21^cw2S;=<;_?0WF++kzmdqjMRCf$!u0r4&-a zDQ(JZU(`vR?O+Q`&dxlLgR>skI;%Xi+RdGTERF$f_)OLVq4t29Y4BzV93djDkQAhs z>#fNT)%{Sm)v?IMCL(6b;79F1X+se92hsK6?w7wZ5z&NNfs{W?5sWL&tA`X39^Djz Sn&q92@T-iGn35z}+xrAn>Scrg diff --git a/src/tool/Launcher/ZipArchive/ZipArchive.cpp b/src/tool/Launcher/ZipArchive/ZipArchive.cpp index 21986223..b0302dce 100644 --- a/src/tool/Launcher/ZipArchive/ZipArchive.cpp +++ b/src/tool/Launcher/ZipArchive/ZipArchive.cpp @@ -849,7 +849,7 @@ void CZipArchive::DeleteInternal(WORD uIndex) { m_centralDir.RemoveFile(uIndex); - // teraz uaktualnij offsety w pozostaych pozycjach central dir + // teraz uaktualnij offsety w pozostałych pozycjach central dir // (update offsets in file headers in the central dir) if (uOtherOffsetChanged) { for (int i = uIndex; i < GetNoEntries(); i++) { diff --git a/src/tool/Launcher/ZipArchive/ZipArchive.vcxproj.filters b/src/tool/Launcher/ZipArchive/ZipArchive.vcxproj.filters index fdefa1ca..ff736419 100644 --- a/src/tool/Launcher/ZipArchive/ZipArchive.vcxproj.filters +++ b/src/tool/Launcher/ZipArchive/ZipArchive.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/tool/Launcher/ZipArchive/ZipArchive.vcxproj.user b/src/tool/Launcher/ZipArchive/ZipArchive.vcxproj.user index 88a55094..824d5a97 100644 --- a/src/tool/Launcher/ZipArchive/ZipArchive.vcxproj.user +++ b/src/tool/Launcher/ZipArchive/ZipArchive.vcxproj.user @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/src/tool/Launcher/ZipArchive/ZipCentralDir.cpp b/src/tool/Launcher/ZipArchive/ZipCentralDir.cpp index c629111d..810e7a53 100644 --- a/src/tool/Launcher/ZipArchive/ZipCentralDir.cpp +++ b/src/tool/Launcher/ZipArchive/ZipCentralDir.cpp @@ -166,7 +166,7 @@ void CZipCentralDir::ReadHeaders() { RemoveHeaders(); for (int i = 0; i < m_uEntriesNumber; i++) { CZipFileHeader * pHeader = new CZipFileHeader; - m_headers.Add(pHeader); // bezporednio nastpuje w razie wyjtku + m_headers.Add(pHeader); // bezpośrednio następuje w razie wyjątku if (!pHeader->Read(m_pStorage)) { ThrowError(ZIP_BADZIPFILE); diff --git a/src/tool/Launcher/ZipArchive/ZipFileHeader.cpp b/src/tool/Launcher/ZipArchive/ZipFileHeader.cpp index 6aa8c7b2..3344cdc4 100644 --- a/src/tool/Launcher/ZipArchive/ZipFileHeader.cpp +++ b/src/tool/Launcher/ZipArchive/ZipFileHeader.cpp @@ -133,7 +133,7 @@ bool CZipFileHeader::ReadLocal(CZipStorage * pStorage, WORD & iLocExtrFieldSize) return false; } - // jeszcze monaby porwna nazwy plikw + // jeszcze możnaby porównać nazwy plików if (!bIsDataDescr /* || !pStorage->IsSpanMode()*/) { if (!CheckCrcAndSizes(buf + 14)) { diff --git a/src/tool/N3CE/DlgChrProperty.cpp b/src/tool/N3CE/DlgChrProperty.cpp index e5b3a26c..3f3059ec 100644 --- a/src/tool/N3CE/DlgChrProperty.cpp +++ b/src/tool/N3CE/DlgChrProperty.cpp @@ -55,40 +55,40 @@ BOOL CDlgChrProperty::OnInitDialog() { CString str, strTmp; ///////////////////////////////////////////////////////////////////////////////////////////////////////// - // ij + // 캐릭터 m_LPChr.AddPropItem("Joint File", "", PIT_FILE, "N3 Joint File(*.N3Joint)|*.N3Joint||"); m_LPChr.AddPropItem("Collision Mesh File", "", PIT_FILE, "N3 Vector Mesh(*.N3VMesh)|*.N3VMesh||"); - m_LPChr.AddPropItem("Collision Mesh Delete", "Collision Mesh ", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Collision Mesh Delete", "Collision Mesh 삭제", PIT_BUTTON, ""); // m_LPChr.AddPropItem("Collision Skin File", "", PIT_FILE, "N3 Skin File(*.N3Skin)|*.N3Skin||"); - // m_LPChr.AddPropItem("Collision Skin Delete", "Collision Skin ", PIT_BUTTON, ""); + // m_LPChr.AddPropItem("Collision Skin Delete", "Collision Skin 삭제", PIT_BUTTON, ""); - m_LPChr.AddPropItem("Part Add", "Part ߰", PIT_BUTTON, ""); - m_LPChr.AddPropItem("Part Delete", "Part ", PIT_BUTTON, ""); - m_LPChr.AddPropItem("Plug Add", "Plug ߰", PIT_BUTTON, ""); - m_LPChr.AddPropItem("Plug Delete", "Plug ", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Part Add", "Part 추가", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Part Delete", "Part 삭제", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Plug Add", "Plug 추가", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Plug Delete", "Plug 삭제", PIT_BUTTON, ""); m_CBChrPart.ResetContent(); m_CBChrPart.SetCurSel(0); m_LPCPart.AddPropItem("Part File", "", PIT_FILE, "N3 Character part file(*.N3CPart)|*.N3CPart||"); - m_LPCPart.AddPropItem("Part Type", "", PIT_COMBO, "Ӹī||ü|ü|||??|"); + m_LPCPart.AddPropItem("Part Type", "", PIT_COMBO, "머리카락|얼굴|상체|하체|손|발|??|"); m_LPCPart.AddPropItem("Texture File", "", PIT_FILE, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); m_LPCPlug.AddPropItem("Plug Name", "", PIT_EDIT, ""); - m_LPCPlug.AddPropItem("Plug Type", "", PIT_COMBO, "|޼|"); + m_LPCPlug.AddPropItem("Plug Type", "", PIT_COMBO, "오른손장착|왼손장착|양손장착"); m_LPCPlug.AddPropItem("Plug Joint", "", PIT_EDIT, ""); m_LPCPlug.AddPropItem("Plug Mesh File", "", PIT_FILE, "N3 Progressive Mesh File(*.N3PMesh)|*.N3PMesh||"); m_LPCPlug.AddPropItem("Plug Texture File", "", PIT_FILE, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); m_LPCPlug.AddPropItem("Plug Offset", "", PIT_EDIT, ""); m_LPCPlug.AddPropItem("Plug Rotation", "Reset", PIT_BUTTON, ""); m_LPCPlug.AddPropItem("Plug Scale", "", PIT_EDIT, ""); - // ij + // 캐릭터 ///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////// - // Material + // Material 등록 정보 m_LPMaterial.AddPropItem("Render Flags", "0", PIT_EDIT, "", 0); strTmp = "Null|D3DBLEND_ZERO|D3DBLEND_ONE|D3DBLEND_SRCCOLOR|D3DBLEND_INVSRCCOLOR|D3DBLEND_SRCALPHA|D3DBLEND_INVSRCALPHA|D3DBLEND_DESTALPHA|\ @@ -111,10 +111,10 @@ D3DTOP_BUMPENVMAP|D3DTOP_BUMPENVMAPLUMINANCE|D3DTOP_DOTPRODUCT|D3DTOP_MULTIPLYAD m_LPMaterial.AddPropItem("Diffuse Color", "", PIT_COLOR, ""); m_LPMaterial.AddPropItem("Specular Color", "", PIT_COLOR, ""); m_LPMaterial.AddPropItem("Emissive Color", "", PIT_COLOR, ""); - // Material + // Material 등록 정보 ///////////////////////////////////// - // âũ ġ ϱ. + // 창크기 및 위치 조정하기. m_LPChr.GetWindowRect(&rc); nH = m_LPChr.GetItemHeight(0) * m_LPChr.GetCount() + 4; m_LPChr.SetWindowPos(NULL, rc.left, y, rc.Width(), nH, SWP_NOZORDER); @@ -146,11 +146,11 @@ D3DTOP_BUMPENVMAP|D3DTOP_BUMPENVMAPLUMINANCE|D3DTOP_DOTPRODUCT|D3DTOP_MULTIPLYAD m_LPMaterial.SetWindowPos(NULL, rc.left, y, rc.Width(), nH, SWP_NOZORDER); y += nH + 4; - // ȭ ü ũ.. + // 대화상자 전체 크기.. this->GetWindowRect(&rc); this->SetWindowPos(NULL, 0, 0, rc.Width(), y + GetSystemMetrics(SM_CYCAPTION) + 5, SWP_NOZORDER | SWP_NOMOVE); - // ߰ Ҽ + // 중간 분할선 조정 int nW = 100; m_LPChr.SetDividerWidth(nW); m_LPCPart.SetDividerWidth(nW); @@ -248,7 +248,7 @@ void CDlgChrProperty::UpdateInfo() { } } - // ̴ Ʈ(, ű ...) ǥ + // 붙이는 오브젝트(무기, 장신구 등...) 정보 표시 int nPlug = m_CBChrPlug.GetCurSel(); int nPlugCount = pChr->PlugCount(); m_CBChrPlug.ResetContent(); @@ -316,7 +316,7 @@ void CDlgChrProperty::UpdateInfo() { m_LPCPart.Invalidate(); // Property List Update m_LPCPlug.Invalidate(); // Property List Update - // + // 재질 if (pMtl) { pItem = m_LPMaterial.GetPropItem("Render Flags"); if (pItem) { @@ -444,17 +444,17 @@ BOOL CDlgChrProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) } else if (pItem->m_propName == "Part Type") { CN3CPart * pPD = pChr->Part(nPart); if (pPD) { - if (pItem->m_curValue == "Ӹī") { + if (pItem->m_curValue == "머리카락") { pPD->m_Type = PART_HAIR; - } else if (pItem->m_curValue == "") { + } else if (pItem->m_curValue == "얼굴") { pPD->m_Type = PART_FACE; - } else if (pItem->m_curValue == "ü") { + } else if (pItem->m_curValue == "상체") { pPD->m_Type = PART_UPPER; - } else if (pItem->m_curValue == "ü") { + } else if (pItem->m_curValue == "하체") { pPD->m_Type = PART_LOWER; - } else if (pItem->m_curValue == "") { + } else if (pItem->m_curValue == "손") { pPD->m_Type = PART_HAND; - } else if (pItem->m_curValue == "") { + } else if (pItem->m_curValue == "발") { pPD->m_Type = PART_FOOT; } else if (pItem->m_curValue == "??") { pPD->m_Type = PART_UNKNOWN; @@ -483,7 +483,7 @@ BOOL CDlgChrProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) } else if (pItem->m_propName == "Plug Type") { pPlug->m_Type = (e_PlugType)pItem->m_crColor; } else if (pItem->m_propName == "Plug Joint") { - int nJI = atoi(pItem->m_curValue); // Joint Index  ϵ... + int nJI = atoi(pItem->m_curValue); // Joint Index 가 영역을 벗어나지 못하도록... int nJC = 0; CN3Joint * pJ = pChr->Joint(); if (pJ) { diff --git a/src/tool/N3CE/FormViewAnimation.cpp b/src/tool/N3CE/FormViewAnimation.cpp index c4f6db11..bf7cab04 100644 --- a/src/tool/N3CE/FormViewAnimation.cpp +++ b/src/tool/N3CE/FormViewAnimation.cpp @@ -14,7 +14,7 @@ static char THIS_FILE[] = __FILE__; #define new DEBUG_NEW #endif -const float FRAME_PRECISION = 10.0f; // ǥ е +const float FRAME_PRECISION = 10.0f; // 프레임 표시 정밀도 ///////////////////////////////////////////////////////////////////////////// // CFormViewAnimation @@ -172,7 +172,7 @@ void CFormViewAnimation::UpdateFrameSliderAndOther() { CN3Chr * pChr = GetDocument()->m_Scene.ChrGet(0); int iAni = pChr->AniIndexCur(); __AnimData * pAniData = pChr->AniDataCur(); - if (pAniData) // ̴ Ʈ.. + if (pAniData) // 프레임 슬라이더 업데이트.. { float fFrmOld = m_SldFrm.GetCurrentFrame(); m_SldFrm.SetAnimationData(*pAniData); @@ -182,13 +182,13 @@ void CFormViewAnimation::UpdateFrameSliderAndOther() { float fTime = (pAniData->fFrmEnd - pAniData->fFrmStart) / pAniData->fFrmPerSec; // if(1 == pAniData->iBlendFlags) fTime += pAniData->fTimeBlend; CString szTime; - szTime.Format("ð : %.2f", fTime); + szTime.Format("시간 : %.2f초", fTime); SetDlgItemText(IDC_STATIC_ANIMATION_TIME_SUM, szTime); } else { - SetDlgItemText(IDC_STATIC_ANIMATION_TIME_SUM, "ð : ??"); + SetDlgItemText(IDC_STATIC_ANIMATION_TIME_SUM, "시간 : ??초"); } } else { - SetDlgItemText(IDC_STATIC_ANIMATION_TIME_SUM, "ð : ??"); + SetDlgItemText(IDC_STATIC_ANIMATION_TIME_SUM, "시간 : ??초"); } } @@ -238,7 +238,7 @@ void CFormViewAnimation::UpdateInfo() { SetDlgItemText(IDC_E_FRAME_BLEND0, szTmp); CheckDlgButton(IDC_C_DELAYED_LOOPING, - pAniData->iBlendFlags); // Ҷ ðŭ Ű鼭 Ѵ.. + pAniData->iBlendFlags); // 루핑할때 블렌딩 시간만큼 지연시키면서 루핑한다.. szTmp.Format("%.2f", pAniData->fFrmStrike0); SetDlgItemText(IDC_E_FRAME_STRIKE0, szTmp); @@ -255,7 +255,7 @@ void CFormViewAnimation::UpdateInfo() { float fTime = (pAniData->fFrmEnd - pAniData->fFrmStart) / pAniData->fFrmPerSec; // if(1 == pAniData->iBlendFlags) fTime += pAniData->fTimeBlend; CString szTime; - szTime.Format("ð : %.2f", fTime); + szTime.Format("시간 : %.2f초", fTime); SetDlgItemText(IDC_STATIC_ANIMATION_TIME_SUM, szTime); } } else { @@ -264,7 +264,7 @@ void CFormViewAnimation::UpdateInfo() { SetDlgItemText(IDC_E_FRAME_END, szTmp); SetDlgItemText(IDC_E_FRAME_PER_SEC, szTmp); - SetDlgItemText(IDC_STATIC_ANIMATION_TIME_SUM, "ð : ??"); + SetDlgItemText(IDC_STATIC_ANIMATION_TIME_SUM, "시간 : ??초"); } m_bUpdatingNow = FALSE; @@ -368,7 +368,7 @@ void CFormViewAnimation::GetData() { pAniData->fFrmStrike1 = (float)atof(szTmp); if (IsDlgButtonChecked(IDC_C_DELAYED_LOOPING)) { - pAniData->iBlendFlags = 1; // Ҷ ðŭ Ű鼭 Ѵ.. + pAniData->iBlendFlags = 1; // 루핑할때 블렌딩 시간만큼 지연시키면서 루핑한다.. } else { pAniData->iBlendFlags = 0; } @@ -408,7 +408,7 @@ void CFormViewAnimation::OnTimer(UINT nIDEvent) { SetDlgItemText(IDC_E_FRAME_CUR, szFrm); CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - pFrm->GetPaneRender()->InvalidateRect(NULL, FALSE); // .. + pFrm->GetPaneRender()->InvalidateRect(NULL, FALSE); // 렌더링.. } CFormView::OnTimer(nIDEvent); @@ -454,18 +454,18 @@ void CFormViewAnimation::OnSelchangeListAnimation0() { return; } - // Playe ߿ ť δ.. + // Playe 중에는 큐에 쌓인다.. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); CN3CEView * pView = pFrm->GetPaneRender(); if (pView->m_bPlayingNow) { pView->m_DequeAnimation.push_back(iAni); } else { - pChr->AniCurSet(iAni); // ϸ̼ .. + pChr->AniCurSet(iAni); // 에니메이션 세팅.. } ::SetFocus(GetDlgItem(IDC_E_ANI_NAME)->m_hWnd); - GetDocument()->m_Scene.m_fFrmCur = pAniData->fFrmStart; // ߰.. + GetDocument()->m_Scene.m_fFrmCur = pAniData->fFrmStart; // 프레임 맞추고.. pView->InvalidateRect(NULL, FALSE); } @@ -507,7 +507,7 @@ void CFormViewAnimation::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar * pScroll float fFrm = GetDocument()->m_Scene.m_fFrmCur; if ((void *)pScrollBar == (void *)&m_SldFrm) { fFrm = m_SldFrm.GetCurrentFrame(); - m_SldSceneFrm.SetPos(fFrm * FRAME_PRECISION); // Scene ̴ ش. + m_SldSceneFrm.SetPos(fFrm * FRAME_PRECISION); // Scene 슬라이더도 움직여준다. } else if ((void *)pScrollBar == (void *)&m_SldSceneFrm) { fFrm = m_SldSceneFrm.GetPos() / FRAME_PRECISION; } @@ -528,9 +528,9 @@ void CFormViewAnimation::OnSize(UINT nType, int cx, int cy) { if (m_SldSceneFrm.GetSafeHwnd() != NULL) { CRect rcOrg, rcClient; - m_SldSceneFrm.GetWindowRect(rcOrg); // ׷ Ʈ ȭ ǥ + m_SldSceneFrm.GetWindowRect(rcOrg); // 그래프 컨트롤의 원래 화면 좌표를 this->GetClientRect(rcClient); // - this->ClientToScreen(rcClient); // ȭ ǥ ٲٰ.. + this->ClientToScreen(rcClient); // 화면 좌표로 바꾸고.. int cx2 = rcClient.right - rcOrg.left - 5; int cy2 = rcOrg.Height(); @@ -541,9 +541,9 @@ void CFormViewAnimation::OnSize(UINT nType, int cx, int cy) { // if(m_SldFrm.GetSafeHwnd() != NULL) // { // CRect rcOrg, rcClient; - // m_SldFrm.GetWindowRect(rcOrg); // ׷ Ʈ ȭ ǥ + // m_SldFrm.GetWindowRect(rcOrg); // 그래프 컨트롤의 원래 화면 좌표를 // this->GetClientRect(rcClient); // - // this->ClientToScreen(rcClient); // ȭ ǥ ٲٰ.. + // this->ClientToScreen(rcClient); // 화면 좌표로 바꾸고.. // // int cx2 = rcClient.right - rcOrg.left - 5; // int cy2 = rcOrg.Height(); @@ -553,9 +553,9 @@ void CFormViewAnimation::OnSize(UINT nType, int cx, int cy) { if (m_ListAnim0.GetSafeHwnd() != NULL) { CRect rcOrg, rcClient; - m_ListAnim0.GetWindowRect(rcOrg); // ׷ Ʈ ȭ ǥ + m_ListAnim0.GetWindowRect(rcOrg); // 그래프 컨트롤의 원래 화면 좌표를 this->GetClientRect(rcClient); // - this->ClientToScreen(rcClient); // ȭ ǥ ٲٰ.. + this->ClientToScreen(rcClient); // 화면 좌표로 바꾸고.. int cx2 = rcOrg.Width(); int cy2 = rcClient.bottom - rcOrg.top - 5; @@ -565,9 +565,9 @@ void CFormViewAnimation::OnSize(UINT nType, int cx, int cy) { if (m_ListAnim1.GetSafeHwnd() != NULL) { CRect rcOrg, rcClient; - m_ListAnim1.GetWindowRect(rcOrg); // ׷ Ʈ ȭ ǥ + m_ListAnim1.GetWindowRect(rcOrg); // 그래프 컨트롤의 원래 화면 좌표를 this->GetClientRect(rcClient); // - this->ClientToScreen(rcClient); // ȭ ǥ ٲٰ.. + this->ClientToScreen(rcClient); // 화면 좌표로 바꾸고.. int cx2 = rcOrg.Width(); int cy2 = rcClient.bottom - rcOrg.top - 5; @@ -677,7 +677,7 @@ void CFormViewAnimation::OnUpdate(CView * pSender, LPARAM lHint, CObject * pHint CN3Chr * pChr = GetDocument()->m_Scene.ChrGet(0); if (pChr && m_ListAnim0.GetSafeHwnd()) { int iAni = m_ListAnim0.GetCurSel(); - pChr->AniCurSet(iAni); // ϸ̼ .. + pChr->AniCurSet(iAni); // 에니메이션 세팅.. } } @@ -912,7 +912,7 @@ void CFormViewAnimation::OnEditAnimationDataMoveUp() { } int iAni = m_ListAnim0.GetCurSel(); int iAniToChange = iAni - 1; - pAniCtrl->Swap(iAni, iAniToChange); // Ŷ Ʒ ٲ۴. + pAniCtrl->Swap(iAni, iAniToChange); // 위거랑 아래꺼랑 바꾼다. m_ListAnim0.SetCurSel(iAniToChange); this->UpdateAllInfo(); @@ -929,7 +929,7 @@ void CFormViewAnimation::OnEditAnimationDataMoveDown() { } int iAni = m_ListAnim0.GetCurSel(); int iAniToChange = iAni + 1; - pAniCtrl->Swap(iAni, iAniToChange); // Ŷ Ʒ ٲ۴. + pAniCtrl->Swap(iAni, iAniToChange); // 위거랑 아래꺼랑 바꾼다. m_ListAnim0.SetCurSel(iAniToChange); this->UpdateAllInfo(); @@ -938,8 +938,8 @@ void CFormViewAnimation::OnEditAnimationDataMoveDown() { void CFormViewAnimation::OnDblclkListAnimation0() { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); CMenu * pMenu = pFrm->GetMenu(); - CMenu * pSM = pMenu->GetSubMenu(1); // ޴ - pSM = pSM->GetSubMenu(3); // ϸ̼ ޴.. + CMenu * pSM = pMenu->GetSubMenu(1); // 편집 메뉴 + pSM = pSM->GetSubMenu(3); // 에니메이션 편집 메뉴.. } void CFormViewAnimation::OnBCalculateDelayTimeWithUpperAnimation() { @@ -990,9 +990,9 @@ void CFormViewAnimation::CalculateDelayTimeAndUpdate(int iAnimationIndexOffset) pAniData->fTimeBlend = fTDelta; this->UpdateInfo(); } else { - MessageBox(" ϸ̼ ̰ ˴ϴ."); + MessageBox("두 에니메이션의 값 차이가 음수가 됩니다."); } } else { - MessageBox("Animation Data ӵ 0 Դϴ."); + MessageBox("Animation Data 의 재생 속도가 0 입니다."); } } diff --git a/src/tool/N3CE/FormViewAnimation.h b/src/tool/N3CE/FormViewAnimation.h index 69c35566..61591126 100644 --- a/src/tool/N3CE/FormViewAnimation.h +++ b/src/tool/N3CE/FormViewAnimation.h @@ -16,7 +16,7 @@ class CN3CEDoc; class CFormViewAnimation : public CFormView { public: BOOL m_bUpdatingNow; - __AnimData m_AnimDataTemp; // ӽ ̱.. + __AnimData m_AnimDataTemp; // 임시 복사 및 붙이기용.. public: static int SortByName(const void * pArg1, const void * pArg2); diff --git a/src/tool/N3CE/FormViewProperty.cpp b/src/tool/N3CE/FormViewProperty.cpp index 9d37d36a..be518fbb 100644 --- a/src/tool/N3CE/FormViewProperty.cpp +++ b/src/tool/N3CE/FormViewProperty.cpp @@ -60,7 +60,7 @@ void CFormViewProperty::OnInitialUpdate() { CRect rc; this->GetClientRect(&rc); ///////////////////////////////////// - // Material + // Material 등록 정보 std::string strTmp; m_LPMtl.AddPropItem("Render Flags", "0", PIT_EDIT, "", 0); @@ -85,12 +85,12 @@ void CFormViewProperty::OnInitialUpdate() { m_LPMtl.AddPropItem("Emissive Color", "", PIT_COLOR, ""); m_LPMtl.AddPropItem("Texture", "", PIT_FILE, ""); - m_LPMtl.SetDividerWidth(100); // ߰ Ҽ - // Material + m_LPMtl.SetDividerWidth(100); // 중간 분할선 조정 + // Material 등록 정보 ///////////////////////////////////// ///////////////////////////////////// - // Plug + // Plug 등록 정보 m_LPPlug.AddPropItem("Joint", "", PIT_BUTTON, "", 0); m_LPPlug.AddPropItem("Position", "", PIT_BUTTON, "", 0); m_LPPlug.AddPropItem("Scale", "", PIT_BUTTON, "", 0); @@ -111,23 +111,23 @@ void CFormViewProperty::OnInitialUpdate() { } m_LPPlug.AddPropItem("FX Pos", "", PIT_COMBO, strTmp.c_str()); - m_LPPlug.SetDividerWidth(100); // ߰ Ҽ - // Plug + m_LPPlug.SetDividerWidth(100); // 중간 분할선 조정 + // Plug 등록 정보 ///////////////////////////////////// ////////////////////////////////////////////////// - // Coded (By Dino On 2002-10-11 9:53:37 ) - // FX Plug + // Coded (By Dino On 2002-10-11 오전 9:53:37 ) + // FX Plug 등록 정보 m_LPFXPlugPart.AddPropItem("FXB", "", PIT_FILE, "FX Bundle(*.FXB)|*.FXB||", 0); m_LPFXPlugPart.AddPropItem("Referance Index", "", PIT_EDIT, "", 0); m_LPFXPlugPart.AddPropItem("Offset Pos", "", PIT_EDIT, "", 0); m_LPFXPlugPart.AddPropItem("Offset Dir", "", PIT_EDIT, "", 0); m_LPFXPlugPart.SetDividerWidth(100); - // End Of Code (By Dino On 2002-10-11 9:53:37 ) + // End Of Code (By Dino On 2002-10-11 오전 9:53:37 ) ////////////////////////////////////////////////// - // Tree Control ̹ Ʈ + // Tree Control 에 이미지 리스트 연결 m_ImgList.Create(IDB_N3BASE_NODES, 20, 16, RGB(255, 0, 255)); m_TreeChr.SetImageList(&m_ImgList, TVSIL_NORMAL); @@ -179,7 +179,7 @@ END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CFormViewProperty message handlers void CFormViewProperty::UpdateWindowPos() { - // ϴ .. + // 일단 숨기고.. m_LPPlug.ShowWindow(SW_HIDE); m_LPMtl.ShowWindow(SW_HIDE); m_LPFXPlugPart.ShowWindow(SW_HIDE); @@ -219,7 +219,7 @@ void CFormViewProperty::UpdateWindowPos() { } ////////////////////////////////////////////////// - // Coded (By Dino On 2002-10-11 10:24:21 ) + // Coded (By Dino On 2002-10-11 오전 10:24:21 ) // FXPlugPart if (pBase && pBase->Type() & OBJ_FX_PLUG_PART) { int h = m_LPFXPlugPart.GetCount() * m_LPFXPlugPart.GetItemHeight(0); @@ -228,7 +228,7 @@ void CFormViewProperty::UpdateWindowPos() { m_LPFXPlugPart.ShowWindow(SW_SHOW); y -= 5; } - // End Of Code (By Dino On 2002-10-11 10:24:21 ) + // End Of Code (By Dino On 2002-10-11 오전 10:24:21 ) ////////////////////////////////////////////////// m_TreeChr.SetWindowPos(NULL, x, 5, cx, y, SWP_NOZORDER); @@ -317,7 +317,7 @@ void CFormViewProperty::UpdateInfo() { } } ////////////////////////////////////////////////// - // Coded (By Dino On 2002-10-11 10:31:36 ) + // Coded (By Dino On 2002-10-11 오전 10:31:36 ) // FXPlugPart else if (pBase->Type() & OBJ_FX_PLUG_PART) { CN3FXPlugPart * pFXPPart = (CN3FXPlugPart *)pBase; @@ -345,10 +345,10 @@ void CFormViewProperty::UpdateInfo() { m_LPFXPlugPart.Invalidate(); } - // End Of Code (By Dino On 2002-10-11 10:31:36 ) + // End Of Code (By Dino On 2002-10-11 오전 10:31:36 ) ////////////////////////////////////////////////// - // + // 재질 if (pMtl) { pItem = m_LPMtl.GetPropItem("Render Flags"); if (pItem) { @@ -458,7 +458,7 @@ BOOL CFormViewProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult CPropertyItem * pItem = (CPropertyItem *)lParam; CN3CPlug * pPlug = (CN3CPlug *)pBase; - pFrm->GetPaneRender()->m_eCursorMode = eCM_Nothing; // Ŀ带 س.. + pFrm->GetPaneRender()->m_eCursorMode = eCM_Nothing; // 커서모드를 보통으로 해놓고.. if (pItem->m_propName == "Joint") { pFrm->GetPaneRender()->m_eCursorMode = eCM_PickJoint; } else if (pItem->m_propName == "Position") { @@ -502,7 +502,7 @@ BOOL CFormViewProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult pFrm->GetPaneRender()->InvalidateRect(NULL, FALSE); } ////////////////////////////////////////////////// - // Coded (By Dino On 2002-10-11 10:37:54 ) + // Coded (By Dino On 2002-10-11 오전 10:37:54 ) // FXPlugPart else if ((void *)wParam == &m_LPFXPlugPart) { CN3Base * pBase = this->GetSelectedObject(); @@ -536,7 +536,7 @@ BOOL CFormViewProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult pItem->VectorSet(pFXPPart->m_vOffsetDir); } } - // End Of Code (By Dino On 2002-10-11 10:37:54 ) + // End Of Code (By Dino On 2002-10-11 오전 10:37:54 ) ////////////////////////////////////////////////// else { CFormView::OnNotify(wParam, lParam, pResult); @@ -559,14 +559,14 @@ void CFormViewProperty::UpdateAllInfo() { return; } - int nNodeCur = this->GetSelectedNode(); // õǾ ִ ȣ.. + int nNodeCur = this->GetSelectedNode(); // 현재 선택되어 있는 노드 번호.. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); CN3CEDoc * pDoc = (CN3CEDoc *)pFrm->GetActiveDocument(); CN3Chr * pChr = pDoc->m_Scene.ChrGet(0); - // Character Tree .. - m_TreeChr.DeleteAllItems(); // .. + // Character Tree 에 노드 삽입.. + m_TreeChr.DeleteAllItems(); // 모두 지우고.. m_hTI_Joint = m_TreeChr.InsertItem("Joints", 9, 9); m_hTI_Parts = m_TreeChr.InsertItem("Parts", 10, 10); m_hTI_Plugs = m_TreeChr.InsertItem("Plugs", 11, 11); @@ -578,7 +578,7 @@ void CFormViewProperty::UpdateAllInfo() { } HTREEITEM hInsert = NULL; ////////////////////////////////////////////////// - // Coded (By Dino On 2002-10-10 4:44:49 ) + // Coded (By Dino On 2002-10-10 오후 4:44:49 ) // FXPlug CN3FXPlug * pFXP = pChr->FXPlugGet(); if (pFXP) { @@ -590,13 +590,13 @@ void CFormViewProperty::UpdateAllInfo() { m_TreeChr.SetItemData(hInsert, (DWORD)pFXP->m_FXPParts[i]); } } - // End Of Code (By Dino On 2002-10-10 4:44:49 ) + // End Of Code (By Dino On 2002-10-10 오후 4:44:49 ) ////////////////////////////////////////////////// CN3Joint * pJoint = pChr->Joint(); if (pJoint) { CString szJN; - szJN.Format("Joints - ü(%d ~ %d), ü(%d ~ %d), Ӹī(%d ~ %d), (%d ~ %d)", pChr->JointPartStart(0), + szJN.Format("Joints - 상체(%d ~ %d), 하체(%d ~ %d), 머리카락(%d ~ %d), 망토(%d ~ %d)", pChr->JointPartStart(0), pChr->JointPartEnd(0), pChr->JointPartStart(1), pChr->JointPartEnd(1), pChr->JointPartStart(2), pChr->JointPartEnd(2), pChr->JointPartStart(3), pChr->JointPartEnd(3)); m_TreeChr.SetItemText(m_hTI_Joint, szJN); @@ -632,7 +632,7 @@ void CFormViewProperty::UpdateAllInfo() { } m_TreeChr.Expand(m_hTI_Plugs, TVE_EXPAND); - this->SelectNode(nNodeCur); // õ ȣ Ѵ.. + this->SelectNode(nNodeCur); // 전의 선택된 노드 번호대로 선택한다.. this->UpdateWindowPos(); } @@ -653,7 +653,7 @@ void CFormViewProperty::OnTreeChrEndLabelEdit(NMHDR * pNMHDR, LRESULT * pResult) if (pChr && pTDI->item.pszText) { int nS0 = -1, nS1 = -1, nS2 = -1, nS3 = -10; int nE0 = -1, nE1 = -1, nE2 = -1, nE3 = -1; - sscanf(pTDI->item.pszText, "Joints - ü(%d ~ %d), ü(%d ~ %d), Ӹī(%d ~ %d), (%d ~ %d)", &nS0, + sscanf(pTDI->item.pszText, "Joints - 상체(%d ~ %d), 하체(%d ~ %d), 머리카락(%d ~ %d), 망토(%d ~ %d)", &nS0, &nE0, &nS1, &nE1, &nS2, &nE2, &nS3, &nE3); pChr->JointPartSet(0, nS0, nE0); pChr->JointPartSet(1, nS1, nE1); @@ -677,7 +677,7 @@ void CFormViewProperty::OnTreeChrEndLabelEdit(NMHDR * pNMHDR, LRESULT * pResult) if (pBase) { if (pTDI->item.pszText) { if (pBase->Type() & OBJ_BASE_FILEACCESS) { - ((CN3BaseFileAccess *)pBase)->FileNameSet(pTDI->item.pszText); // ̸ ٲپ ش.. + ((CN3BaseFileAccess *)pBase)->FileNameSet(pTDI->item.pszText); // 파일 이름을 바꾸어 준다.. } else { pBase->m_szName = pTDI->item.pszText; } @@ -691,7 +691,7 @@ void CFormViewProperty::OnTreeChrRclick(NMHDR * pNMHDR, LRESULT * pResult) { ::GetCursorPos(&pt); CPoint pt2 = pt; m_TreeChr.ScreenToClient(&pt2); - HTREEITEM hI = m_TreeChr.HitTest(pt2); // ġ + HTREEITEM hI = m_TreeChr.HitTest(pt2); // 현재 위치에서 찍힌 if (NULL == hI) { return; } @@ -702,25 +702,25 @@ void CFormViewProperty::OnTreeChrRclick(NMHDR * pNMHDR, LRESULT * pResult) { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); CMenu * pMenu = pFrm->GetMenu(); - CMenu * pSM = pMenu->GetSubMenu(1); // ޴ + CMenu * pSM = pMenu->GetSubMenu(1); // 편집 메뉴 if (m_hTI_Joint == hI || m_hTI_Joint == hPI) { - pSM = pSM->GetSubMenu(0); // Joint ޴ + pSM = pSM->GetSubMenu(0); // Joint 편집 메뉴 pSM->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this); } if (m_hTI_Parts == hI || m_hTI_Parts == hPI) { - pSM = pSM->GetSubMenu(1); // Part ޴ + pSM = pSM->GetSubMenu(1); // Part 편집 메뉴 pSM->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this); } if (m_hTI_Plugs == hI || m_hTI_Plugs == hPI) { - pSM = pSM->GetSubMenu(2); // Plug ޴ + pSM = pSM->GetSubMenu(2); // Plug 편집 메뉴 pSM->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this); } if (m_hTI_FXPlug == hI || m_hTI_FXPlug == hPI) { - pSM = pSM->GetSubMenu(4); // FXPlug ޴ + pSM = pSM->GetSubMenu(4); // FXPlug 편집 메뉴 pSM->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this); } *pResult = 0; @@ -733,10 +733,10 @@ void CFormViewProperty::OnTreeChrDblclk(NMHDR * pNMHDR, LRESULT * pResult) { if (pBase && (pBase->Type() & OBJ_JOINT)) { this->OnEditChrJointSet(); - } else if (pBase && (pBase->Type() & OBJ_CHARACTER_PART)) // Part . + } else if (pBase && (pBase->Type() & OBJ_CHARACTER_PART)) // Part일 경우. { this->OnEditChrPartSet(); - } else if (pBase && (pBase->Type() & OBJ_CHARACTER_PLUG)) // ÷ . + } else if (pBase && (pBase->Type() & OBJ_CHARACTER_PLUG)) // 플러그일 경우. { this->OnEditChrPlugSet(); } @@ -828,7 +828,7 @@ void CFormViewProperty::OnEditChrPartSet() { FileName = dlg.GetPathName(); pPart->Release(); - pPart->LoadFromFile(std::string(FileName)); // Ͽ б. + pPart->LoadFromFile(std::string(FileName)); // 파일에서 읽기. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); GetDocument()->UpdateAllViews(NULL); @@ -1018,7 +1018,7 @@ void CFormViewProperty::OnEditChrPlugRotationReset() { CN3CPlug * pPlug = (CN3CPlug *)pBase; __Matrix44 mtxRot; mtxRot.Identity(); - pPlug->RotationSet(mtxRot); // ȸ ʱȭ.. + pPlug->RotationSet(mtxRot); // 회전값 초기화.. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); pFrm->GetPaneRender()->InvalidateRect(NULL, FALSE); @@ -1038,7 +1038,7 @@ void CFormViewProperty::SelectJointNode(HTREEITEM hItemParent, CN3Joint * pJoint return; } - this->SelectJointNode(hNext, pJoint); // ȣ.. + this->SelectJointNode(hNext, pJoint); // 재귀 호출.. } } @@ -1076,9 +1076,9 @@ void CFormViewProperty::OnUpdateEditSetVisible(CCmdUI * pCmdUI) { } if (bVisible) { - pCmdUI->SetText("\t(&V)"); + pCmdUI->SetText("숨기기\t(&V)"); } else { - pCmdUI->SetText("̱\t(&V)"); + pCmdUI->SetText("보이기\t(&V)"); } } diff --git a/src/tool/N3CE/FormViewTool.cpp b/src/tool/N3CE/FormViewTool.cpp index fc76e8c8..45042cdd 100644 --- a/src/tool/N3CE/FormViewTool.cpp +++ b/src/tool/N3CE/FormViewTool.cpp @@ -92,12 +92,12 @@ void CFormViewTool::OnBMakeSmooth() { continue; } - pSkin->ReGenerateSmoothNormal(); // ͸ .. // ε巴 Ի.. + pSkin->ReGenerateSmoothNormal(); // 법선 벡터를 만들고.. // 부드럽게 게산.. } } CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - pFrm->GetPaneRender()->InvalidateRect(NULL, FALSE); // .. + pFrm->GetPaneRender()->InvalidateRect(NULL, FALSE); // 렌더링.. } void CFormViewTool::OnInitialUpdate() { @@ -128,7 +128,7 @@ void CFormViewTool::OnUpdate(CView * pSender, LPARAM lHint, CObject * pHint) { void CFormViewTool::OnSelchangeCbLod() { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - pFrm->GetPaneRender()->InvalidateRect(NULL, FALSE); // .. + pFrm->GetPaneRender()->InvalidateRect(NULL, FALSE); // 렌더링.. } void CFormViewTool::OnBAddTestSound0() { @@ -238,9 +238,9 @@ void CFormViewTool::OnSize(UINT nType, int cx, int cy) { if (m_ListSound0.GetSafeHwnd() != NULL) { CRect rcOrg, rcClient; - m_ListSound0.GetWindowRect(rcOrg); // ׷ Ʈ ȭ ǥ + m_ListSound0.GetWindowRect(rcOrg); // 그래프 컨트롤의 원래 화면 좌표를 this->GetClientRect(rcClient); // - this->ClientToScreen(rcClient); // ȭ ǥ ٲٰ.. + this->ClientToScreen(rcClient); // 화면 좌표로 바꾸고.. int cx2 = rcClient.right - rcOrg.left - 5; int cy2 = rcOrg.Height(); @@ -250,9 +250,9 @@ void CFormViewTool::OnSize(UINT nType, int cx, int cy) { if (m_ListSound1.GetSafeHwnd() != NULL) { CRect rcOrg, rcClient; - m_ListSound1.GetWindowRect(rcOrg); // ׷ Ʈ ȭ ǥ + m_ListSound1.GetWindowRect(rcOrg); // 그래프 컨트롤의 원래 화면 좌표를 this->GetClientRect(rcClient); // - this->ClientToScreen(rcClient); // ȭ ǥ ٲٰ.. + this->ClientToScreen(rcClient); // 화면 좌표로 바꾸고.. int cx2 = rcClient.right - rcOrg.left - 5; int cy2 = rcOrg.Height(); diff --git a/src/tool/N3CE/MainFrm.cpp b/src/tool/N3CE/MainFrm.cpp index cc7ea3cf..0e056b36 100644 --- a/src/tool/N3CE/MainFrm.cpp +++ b/src/tool/N3CE/MainFrm.cpp @@ -71,12 +71,12 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); - // Engine + // Engine 생성 // m_Eng.InitEnv(); if (m_Eng.Init(TRUE, m_hWnd, 64, 64, 0, TRUE) == false) { return -1; } - m_Eng.GridCreate(20, 20); // ׸ .. + m_Eng.GridCreate(20, 20); // 그리드 만들기.. m_SndMgr.Init(m_hWnd); return 0; diff --git a/src/tool/N3CE/N3CE.rc b/src/tool/N3CE/N3CE.rc index 9e44953935be232cd22bf0192341ad426536b281..c6f29ea28787364996170b88baee4880119f21f5 100644 GIT binary patch literal 48284 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 literal 25571 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 OJ6w)Xtu=h^c>iB|h9l(w diff --git a/src/tool/N3CE/N3CE.vcxproj.filters b/src/tool/N3CE/N3CE.vcxproj.filters index 41f4d1ae..7e2f6030 100644 --- a/src/tool/N3CE/N3CE.vcxproj.filters +++ b/src/tool/N3CE/N3CE.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/tool/N3CE/N3CE.vcxproj.user b/src/tool/N3CE/N3CE.vcxproj.user index 7912fcf6..1aa1e2ae 100644 --- a/src/tool/N3CE/N3CE.vcxproj.user +++ b/src/tool/N3CE/N3CE.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\game diff --git a/src/tool/N3CE/N3CEDoc.cpp b/src/tool/N3CE/N3CEDoc.cpp index d7646bc6..12fb464e 100644 --- a/src/tool/N3CE/N3CEDoc.cpp +++ b/src/tool/N3CE/N3CEDoc.cpp @@ -36,7 +36,7 @@ CN3CEDoc::CN3CEDoc() { m_bLoadingNow = FALSE; - // Character ʱȭ.. + // Character 초기화.. CN3Chr * pChr = new CN3Chr(); m_Scene.ChrAdd(pChr); } @@ -50,7 +50,7 @@ BOOL CN3CEDoc::OnNewDocument() { if (m_Scene.ChrGet(0)) { m_Scene.ChrGet(0)->Release(); - m_Scene.ChrGet(0)->AniDefaultSet(); // ⺻ ϸ̼ .. + m_Scene.ChrGet(0)->AniDefaultSet(); // 기본 에니메이션 세팅.. } this->UpdateAllViews(NULL); @@ -90,7 +90,7 @@ BOOL CN3CEDoc::OnOpenDocument(LPCTSTR lpszPathName) { } // TODO: Add your specialized creation code here - char szPath[512]; // θ Ѵ.. + char szPath[512]; // 경로를 잘 가려야 한다.. lstrcpy(szPath, lpszPathName); int nFind = 0; for (int i = lstrlen(szPath) - 1; i >= 0; i--) { @@ -105,7 +105,7 @@ BOOL CN3CEDoc::OnOpenDocument(LPCTSTR lpszPathName) { m_bLoadingNow = TRUE; - m_Scene.PathSet(szPath); // θ ְ.. + m_Scene.PathSet(szPath); // 경로를 정해주고.. m_Scene.ChrGet(0)->Release(); m_Scene.ChrGet(0)->LoadFromFile(lpszPathName); CN3Joint * pJoint = m_Scene.ChrGet(0)->Joint(); @@ -117,7 +117,7 @@ BOOL CN3CEDoc::OnOpenDocument(LPCTSTR lpszPathName) { } if (m_Scene.ChrGet(0)->AniCtrl() == NULL) { - m_Scene.ChrGet(0)->AniDefaultSet(); // ⺻ ϸ̼ .. + m_Scene.ChrGet(0)->AniDefaultSet(); // 기본 에니메이션 세팅.. } m_bLoadingNow = FALSE; @@ -131,7 +131,7 @@ BOOL CN3CEDoc::OnSaveDocument(LPCTSTR lpszPathName) { CDocument::OnSaveDocument(lpszPathName); // TODO: Add your specialized creation code here - char szPath[512]; // θ Ѵ.. + char szPath[512]; // 경로를 잘 가려야 한다.. lstrcpy(szPath, lpszPathName); int nFind = 0; for (int i = lstrlen(szPath) - 1; i >= 0; i--) { @@ -147,14 +147,14 @@ BOOL CN3CEDoc::OnSaveDocument(LPCTSTR lpszPathName) { char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME]; _splitpath(lpszPathName, szDrive, szDir, szFName, NULL); - m_Scene.PathSet(szPath); // θ ְ.. + m_Scene.PathSet(szPath); // 경로를 정해주고.. CN3Chr * pChr = m_Scene.ChrGet(0); - pChr->m_szName = szFName; // ̸ ϰ.. + pChr->m_szName = szFName; // 이름을 정하고.. // CN3Joint* pJoint = pChr->Joint(); // if(pJoint) // { - // pJoint->SaveToFile(); // ش.. + // pJoint->SaveToFile(); // 관절도 저장해준다.. // } CN3CPlugBase * pPlug = NULL; @@ -172,7 +172,7 @@ BOOL CN3CEDoc::OnSaveDocument(LPCTSTR lpszPathName) { m_Scene.ChrGet(0)->SaveToFile(lpszPathName); m_Scene.SaveResrc(); - return TRUE; // ׳ ϸ ȵȴ.. 0 Byte ȴ. + return TRUE; // 그냥 저장하면 안된다.. 0 Byte 가 된다. } void CN3CEDoc::OnFileSaveAsOneFolder() { @@ -184,7 +184,7 @@ void CN3CEDoc::OnFileSaveAsOneFolder() { } CString szFullFileName = dlg.GetPathName(); - char szPath[512]; // θ Ѵ.. + char szPath[512]; // 경로를 잘 가려야 한다.. lstrcpy(szPath, szFullFileName); int nFind = 0; for (int i = lstrlen(szPath) - 1; i >= 0; i--) { @@ -200,14 +200,14 @@ void CN3CEDoc::OnFileSaveAsOneFolder() { char szDrive[_MAX_DRIVE], szDir[_MAX_DIR]; _splitpath(szFullFileName, szDrive, szDir, NULL, NULL); - m_Scene.PathSet(szPath); // θ ְ.. + m_Scene.PathSet(szPath); // 경로를 정해주고.. CN3Chr * pChr = m_Scene.ChrGet(0); CN3Joint * pJoint = pChr->Joint(); if (pJoint) { char szFN[256]; _makepath(szFN, szDrive, szDir, pChr->m_szName.c_str(), ".N3Joint"); - pJoint->SaveToFile(szFN); // ش.. + pJoint->SaveToFile(szFN); // 관절도 저장해준다.. } CN3CPlugBase * pPlug = NULL; @@ -257,7 +257,7 @@ void CN3CEDoc::OnFileSaveAsOneFolder() { } CN3AnimControl * pAni = pChr->AniCtrl(); - if (pAni && pAni->Count() > 0) // ϸ̼ ̸ ش.. + if (pAni && pAni->Count() > 0) // 에니메이션은 같은 이름으로 저장해준다.. { pAni->m_szName = pChr->m_szName; @@ -269,12 +269,12 @@ void CN3CEDoc::OnFileSaveAsOneFolder() { m_Scene.ChrGet(0)->SaveToFile(std::string(szFullFileName)); this->SetPathName(szFullFileName); - this->UpdateAllViews(NULL); // Ʈ.. + this->UpdateAllViews(NULL); // 모두 업데이트.. } void CN3CEDoc::OnCloseDocument() { if (m_Scene.ChrGet(0)) { - m_Scene.ChrGet(0)->Release(); // ̷ ؾ.. ϰ .. + m_Scene.ChrGet(0)->Release(); // 이렇게 해야.. 엔진이 없어지기 전에 깔끔하게 없어진다.. } CDocument::OnCloseDocument(); @@ -296,14 +296,14 @@ void CN3CEDoc::OnToolOptimizeAnimationData() { float fSamplingRate = 30.0f / pJointSrc->m_KeyRot.SamplingRate(); if (fSamplingRate != 6.0f && fSamplingRate != 3.0f && fSamplingRate != 2.0f && fSamplingRate != 1.0f) { - MessageBox(AfxGetMainWnd()->m_hWnd, "SamplingRate 5, 10, 15, 30 ˴ϴ.", "SamplingRate ", MB_OK); + MessageBox(AfxGetMainWnd()->m_hWnd, "SamplingRate 는 5, 10, 15, 30 만 지원됩니다.", "SamplingRate 오류", MB_OK); return; } MessageBox( AfxGetMainWnd()->m_hWnd, - " Joint Animation File ٸ ̸ Ӵϴ. ߿ ٽ Ҷ ʿմϴ.", - "Joint Animation ٸ̸ ", MB_OK); + "원본 Joint 와 Animation File 을 다른 이름으로 저장해 둡니다. 이 파일은 나중에 다시 편집할때 필요합니다.", + "Joint 및 Animation 파일 다른이름으로 저장", MB_OK); CString FileName; DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; @@ -315,7 +315,7 @@ void CN3CEDoc::OnToolOptimizeAnimationData() { std::string szFN(FileName); std::string szFNPrev = pAniCtrl->FileName(); - pAniCtrl->SaveToFile(szFN); // .. + pAniCtrl->SaveToFile(szFN); // 저장.. pAniCtrl->FileNameSet(szFNPrev); CFileDialog dlg2(FALSE, "N3Joint", NULL, dwFlags, "Joint File(*.N3Joint)|*.N3Joint||", NULL); @@ -325,46 +325,46 @@ void CN3CEDoc::OnToolOptimizeAnimationData() { FileName = dlg2.GetPathName(); szFNPrev = pJointSrc->FileName(); - pChr->Tick(0.0f); // ʱġ Tick + pChr->Tick(0.0f); // 초기위치로 Tick szFN = FileName; - pJointSrc->SaveToFile(szFN); // ٸ ̸ .. + pJointSrc->SaveToFile(szFN); // 원래걸 다른 이름으로 저장.. pJointSrc->FileNameSet(szFNPrev); int nK = pAniCtrl->Count(); CN3Joint JointDest; - pChr->Tick(0.0f); // ʱġ Tick - JointDest.CopyExceptAnimationKey(pJointSrc); // 鸸 Ѵ.. - JointDest.AddKey(pJointSrc, 0, 0); // ε Ű ߰ϰ Ѵ.. + pChr->Tick(0.0f); // 초기위치로 Tick + JointDest.CopyExceptAnimationKey(pJointSrc); // 뼈대 구조 및 값들만 복사한다음.. + JointDest.AddKey(pJointSrc, 0, 0); // 바인딩 포즈 키를 추가하고 복사한다.. int iAniCount = pAniCtrl->Count(); std::vector fFrmOffsets(iAniCount, 0); std::vector fFrmStarts(iAniCount, 0); - for (int i = 0; i < iAniCount; i++) // Animation Key ߰. + for (int i = 0; i < iAniCount; i++) // Animation Key 추가. { __AnimData * pAD = pAniCtrl->DataGet(i); if (pAD->fFrmEnd < pAD->fFrmStart) { - pAD->fFrmEnd = pAD->fFrmStart; // .. + pAD->fFrmEnd = pAD->fFrmStart; // 같은 프레임으로 만든다.. } int iS = (int)(pAD->fFrmStart / fSamplingRate); - int iE = (int)(pAD->fFrmEnd / fSamplingRate); // ݿøϷ 0.5f ־.. + int iE = (int)(pAD->fFrmEnd / fSamplingRate); // 반올림하려고 0.5f 넣었다.. if (iE < iS) { continue; } - JointDest.AddKey(pJointSrc, iS, iE); // Ű ߰ϰ Ѵ.. - fFrmOffsets[i] = (iE - iS + 1) * fSamplingRate; // Offset .. + JointDest.AddKey(pJointSrc, iS, iE); // 키를 추가하고 복사한다.. + fFrmOffsets[i] = (iE - iS + 1) * fSamplingRate; // 각 데이터의 Offset 계산.. fFrmStarts[i] = pAD->fFrmStart - (iS * fSamplingRate); } float fOffsetCur = fSamplingRate; - for (int i = 0; i < iAniCount; i++) // Animation Key Frame ٽ .. + for (int i = 0; i < iAniCount; i++) // Animation Key Frame 다시 계산.. { __AnimData * pAD = pAniCtrl->DataGet(i); - pAD->Offset(fOffsetCur - pAD->fFrmStart + fFrmStarts[i]); // ͸ Offsetŭ .. + pAD->Offset(fOffsetCur - pAD->fFrmStart + fFrmStarts[i]); // 모든 데이터를 Offset만큼 값을 적용.. fOffsetCur += fFrmOffsets[i]; } @@ -372,9 +372,9 @@ void CN3CEDoc::OnToolOptimizeAnimationData() { pAniCtrl->SaveToFile(); JointDest.SaveToFile(); - pChr->Tick(0.0f); // ʱġ Tick + pChr->Tick(0.0f); // 초기위치로 Tick pChr->JointSet(""); pChr->JointSet(JointDest.FileName()); - UpdateAllViews(NULL); // ʱȭ.. + UpdateAllViews(NULL); // 모든 뷰 초기화.. } diff --git a/src/tool/N3CE/N3CEView.cpp b/src/tool/N3CE/N3CEView.cpp index b5b934a5..32a5fa77 100644 --- a/src/tool/N3CE/N3CEView.cpp +++ b/src/tool/N3CE/N3CEView.cpp @@ -59,7 +59,7 @@ CN3CEView::CN3CEView() { m_pJointSelected = NULL; m_fTickPrev = CN3Base::TimeGet(); - m_eCursorMode = eCM_Nothing; // Ŀ .. + m_eCursorMode = eCM_Nothing; // 커서 모드 보통.. m_pFXPosTransform = new CN3Transform; m_pPosDummy = new CPosDummy; @@ -85,11 +85,11 @@ void CN3CEView::OnDraw(CDC * pDC) { CN3CEDoc * pDoc = GetDocument(); ASSERT_VALID(pDoc); if (TRUE == pDoc->m_bLoadingNow) { - return; // д ߿ ʴ´... + return; // 읽는 도중에는 렌더링하지 않는다... } - float fFrm = pDoc->m_Scene.m_fFrmCur; // Ϻη Ʈ Ϸ ̷ سҴ.. - pDoc->m_Scene.TickCameras(fFrm); // ī޶ Tick + float fFrm = pDoc->m_Scene.m_fFrmCur; // 일부러 프레임을 컨트롤 하려고 이렇게 해놓았다.. + pDoc->m_Scene.TickCameras(fFrm); // 카메라만 Tick pDoc->m_Scene.TickLights(fFrm); CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); @@ -111,33 +111,33 @@ void CN3CEView::OnDraw(CDC * pDC) { } DWORD dwAlphaBlend, dwAlphaOP, dwAlphaArg1; - if (m_bRenderOptionXRay) // ɼ .. + if (m_bRenderOptionXRay) // 반투명 옵션이 켜져 있으면.. { // backup state pFrm->m_Eng.s_lpD3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &dwAlphaBlend); pFrm->m_Eng.s_lpD3DDev->GetTextureStageState(0, D3DTSS_ALPHAOP, &dwAlphaOP); pFrm->m_Eng.s_lpD3DDev->GetTextureStageState(0, D3DTSS_ALPHAARG1, &dwAlphaArg1); - // render state + // render state 세팅 pFrm->m_Eng.s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); pFrm->m_Eng.s_lpD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); pFrm->m_Eng.s_lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); - pFrm->m_Eng.s_lpD3DDev->SetRenderState(D3DRS_TEXTUREFACTOR, 0x80000000); // alpha factor + pFrm->m_Eng.s_lpD3DDev->SetRenderState(D3DRS_TEXTUREFACTOR, 0x80000000); // alpha factor 설정 - // texture state (alpha) + // texture state 세팅(alpha) pFrm->m_Eng.s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); pFrm->m_Eng.s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR); } else { pFrm->m_Eng.s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); } - if (m_pJointSelected) // õǾ .. + if (m_pJointSelected) // 관절이 선택되어 있으면.. { DWORD dwZ = 0; pFrm->m_Eng.s_lpD3DDev->GetRenderState(D3DRS_ZENABLE, &dwZ); pFrm->m_Eng.s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, FALSE); m_pJointSelected->Render(&(pChr->m_Matrix), 0.02f); - // m_pJointSelected->CN3Transform::Render(&(pChr->m_Matrix), 0.3f); // ׸.. + // m_pJointSelected->CN3Transform::Render(&(pChr->m_Matrix), 0.3f); // 축 그리기.. pFrm->m_Eng.s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, dwZ); } @@ -147,7 +147,7 @@ void CN3CEView::OnDraw(CDC * pDC) { pChr->Tick(); if (pChr->IsAnimEnd()) { pChr->PosSet(0, 0, 0); - if (!m_DequeAnimation.empty()) // ϸ̼ ť .. + if (!m_DequeAnimation.empty()) // 에니메이션 큐가 있으면.. { int iAni = m_DequeAnimation[0]; pChr->AniCurSet(iAni); @@ -174,7 +174,7 @@ void CN3CEView::OnDraw(CDC * pDC) { if (nLOD >= MAX_CHR_LOD) { nLOD = MAX_CHR_LOD - 1; } - pChr->m_nLOD = nLOD; // LOD .. + pChr->m_nLOD = nLOD; // LOD 강제 설정.. pChr->Render(); @@ -194,7 +194,7 @@ void CN3CEView::OnDraw(CDC * pDC) { CN3CPlug * pPlug = (CN3CPlug *)pBase; if (pChr->MatrixGet(pPlug->m_nJointIndex)) { __Matrix44 mtxJ = *(pChr->MatrixGet(pPlug->m_nJointIndex)); - pPlug->RenderFXLines(pChr->m_Matrix, mtxJ); // FX  ׷ش. + pPlug->RenderFXLines(pChr->m_Matrix, mtxJ); // FX 들어갈 곳에 선을 그려준다. } } } @@ -204,7 +204,7 @@ void CN3CEView::OnDraw(CDC * pDC) { if (eCM_PlugFXPosition0 == m_eCursorMode || eCM_PlugFXPosition1 == m_eCursorMode || eCM_PlugFXPosition2 == m_eCursorMode || eCM_PlugFXPosition3 == m_eCursorMode || eCM_PlugFXPosition4 == m_eCursorMode || eCM_PlugFXPosition5 == m_eCursorMode || - eCM_PlugFXPosition6 == m_eCursorMode || eCM_PlugFXPosition7 == m_eCursorMode) // ÷ ȿ ġ 0 + eCM_PlugFXPosition6 == m_eCursorMode || eCM_PlugFXPosition7 == m_eCursorMode) // 플러그 효과 위치 0 { m_pPosDummy->Tick(); m_pPosDummy->Render(); @@ -234,7 +234,7 @@ void CN3CEView::OnDraw(CDC * pDC) { if(pMtxJ) pPlug->Render(pChr->m_Matrix, *pMtxJ); } */ - if (m_bRenderOptionXRay) // ɼ .. + if (m_bRenderOptionXRay) // 반투명 옵션이 켜져 있으면.. { // Restore state pFrm->m_Eng.s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, dwAlphaBlend); @@ -242,7 +242,7 @@ void CN3CEView::OnDraw(CDC * pDC) { pFrm->m_Eng.s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, dwAlphaArg1); } - // Sound ׽Ʈ... + // Sound 재생 테스트... if (pFrm->m_pSndObj0 && pChr->NeedPlaySound0()) { pFrm->m_pSndObj0->Play(); } @@ -254,7 +254,7 @@ void CN3CEView::OnDraw(CDC * pDC) { pFrm->m_Eng.s_lpD3DDev->EndScene(); pFrm->m_Eng.Present(m_hWnd); - // ǥ + // 프레임 표시 float fTick = CN3Base::TimeGet(); if (fTick > m_fTickPrev + 0.3f) { CString szAniName; @@ -285,7 +285,7 @@ void CN3CEView::OnInitialUpdate() { // TODO: You may populate your ListView with items by directly accessing // its list control through a call to GetListCtrl(). - DragAcceptFiles(); // Drag File ޴´.. + DragAcceptFiles(); // Drag File 을 받는다.. m_pJointSelected = NULL; @@ -294,7 +294,7 @@ void CN3CEView::OnInitialUpdate() { GetClientRect(rc); pFrm->m_Eng.Reset(TRUE, rc.Width(), rc.Height(), 0); - this->SetCameraToDefault(); // ī޶ ⺻ ϰ.. + this->SetCameraToDefault(); // 카메라를 기본값으로 하고.. this->InvalidateRect(NULL, FALSE); } @@ -402,8 +402,8 @@ void CN3CEView::OnLButtonDown(UINT nFlags, CPoint point) { pJoint->FindPointerByID(nJI, m_pJointSelected); } - CN3Base * pBase = pFrm->GetPaneProperty()->GetSelectedObject(); // Plug Joint Index ִ´.. - if (eCM_PickJoint == this->m_eCursorMode && // Ʈ .. + CN3Base * pBase = pFrm->GetPaneProperty()->GetSelectedObject(); // Plug 에 Joint Index 를 넣는다.. + if (eCM_PickJoint == this->m_eCursorMode && // 조인트 선택 모드.. pBase && (pBase->Type() & OBJ_CHARACTER_PLUG)) { CN3CPlug * pPlug = (CN3CPlug *)pBase; pPlug->m_nJointIndex = nJI; @@ -411,17 +411,17 @@ void CN3CEView::OnLButtonDown(UINT nFlags, CPoint point) { pFrm->GetPaneProperty()->UpdateInfo(); } ////////////////////////////////////////////////// - // Coded (By Dino On 2002-10-11 1:50:47 ) + // Coded (By Dino On 2002-10-11 오후 1:50:47 ) // FXPlug else if (pBase && - (pBase->Type() & OBJ_FX_PLUG_PART) // FXPlugPart õǾ ϴ Ʈ Ѵ. + (pBase->Type() & OBJ_FX_PLUG_PART) // FXPlugPart가 선택되어 있을경우 참조하는 조인트를 설정한다. && (nJI >= 0 && nJI < n)) { CN3FXPlugPart * pFXPPart = (CN3FXPlugPart *)pBase; pFXPPart->SetRefIdx(nJI); pFrm->GetPaneProperty()->UpdateInfo(); } - // End Of Code (By Dino On 2002-10-11 1:50:47 ) + // End Of Code (By Dino On 2002-10-11 오후 1:50:47 ) ////////////////////////////////////////////////// else if (m_pJointSelected && m_bRenderOptionJoint) { pFrm->GetPaneProperty()->SelectJointNode(TVI_ROOT, m_pJointSelected); @@ -451,7 +451,7 @@ void CN3CEView::OnViewJoint() { void CN3CEView::OnUpdateViewJoint(CCmdUI * pCmdUI) {} void CN3CEView::UpdateAllInfo() { - SetCameraToDefault(); // ī޶ ⺻ ... + SetCameraToDefault(); // 카메라를 기본값으로 만들고... m_pJointSelected = NULL; this->InvalidateRect(NULL, FALSE); } @@ -544,7 +544,7 @@ LRESULT CN3CEView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if (eCM_PlugFXPosition0 == m_eCursorMode || eCM_PlugFXPosition1 == m_eCursorMode || eCM_PlugFXPosition2 == m_eCursorMode || eCM_PlugFXPosition3 == m_eCursorMode || eCM_PlugFXPosition4 == m_eCursorMode || eCM_PlugFXPosition5 == m_eCursorMode || - eCM_PlugFXPosition6 == m_eCursorMode || eCM_PlugFXPosition7 == m_eCursorMode) // ÷ ȿ ġ 0 + eCM_PlugFXPosition6 == m_eCursorMode || eCM_PlugFXPosition7 == m_eCursorMode) // 플러그 효과 위치 0 { int iIndex = m_eCursorMode - eCM_PlugFXPosition0; if (iIndex >= 0 && iIndex < MAX_PLUG_FX_POSITION) { @@ -579,13 +579,13 @@ LRESULT CN3CEView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { void CN3CEView::OnMouseMove(UINT nFlags, CPoint point) { if (!::_IsKeyDown(VK_MENU) && - ((nFlags & MK_LBUTTON) || (nFlags & MK_MBUTTON) || (nFlags & MK_RBUTTON))) // Ŀ 忡 .. + ((nFlags & MK_LBUTTON) || (nFlags & MK_MBUTTON) || (nFlags & MK_RBUTTON))) // 커서 모드에 따라 조정.. { - // ϴ ÷װ õǾ . + // 일단 플러그가 선택되었는지 본다. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); CN3Base * pBase = pFrm->GetPaneProperty()->GetSelectedObject(); CN3Chr * pChr = GetDocument()->m_Scene.ChrGet(0); - if (eCM_Nothing != m_eCursorMode && // Ŀ 尡 ƴϰ.. + if (eCM_Nothing != m_eCursorMode && // 커서 모드가 보통게 아니고.. pChr && pBase && (pBase->Type() & OBJ_CHARACTER_PLUG)) { CN3CPlug * pPlug = (CN3CPlug *)pBase; @@ -598,7 +598,7 @@ void CN3CEView::OnMouseMove(UINT nFlags, CPoint point) { vAxis.Set(0, 0, 1); } - if (eCM_PlugPosition == m_eCursorMode) // ÷ ġ + if (eCM_PlugPosition == m_eCursorMode) // 플러그 위치 { const __Matrix44 * pMtxTmp = pChr->MatrixGet(pPlug->m_nJointIndex); if (pMtxTmp) { @@ -615,7 +615,7 @@ void CN3CEView::OnMouseMove(UINT nFlags, CPoint point) { pPlug->PositionSet(pPlug->Position() + vDelta); } - } else if (eCM_PlugScale == m_eCursorMode) // ÷ + } else if (eCM_PlugScale == m_eCursorMode) // 플러그 스케일 { CPoint ptDelta = point - m_ptPrev; if (_IsKeyDown(VK_CONTROL)) { @@ -625,7 +625,7 @@ void CN3CEView::OnMouseMove(UINT nFlags, CPoint point) { __Vector3 vScale = pPlug->Scale() + vAxis * (ptDelta.x * 0.003f); pPlug->ScaleSet(vScale); - } else if (eCM_PlugRotation == m_eCursorMode) // ÷ + } else if (eCM_PlugRotation == m_eCursorMode) // 플러그 스케일 { const __Matrix44 * pMtxTmp = pChr->MatrixGet(pPlug->m_nJointIndex); if (pMtxTmp) { @@ -657,7 +657,7 @@ void CN3CEView::OnMouseMove(UINT nFlags, CPoint point) { eCM_PlugFXPosition4 == m_eCursorMode || eCM_PlugFXPosition5 == m_eCursorMode || eCM_PlugFXPosition6 == m_eCursorMode || - eCM_PlugFXPosition7 == m_eCursorMode ) // ÷ ȿ ġ 0 + eCM_PlugFXPosition7 == m_eCursorMode ) // 플러그 효과 위치 0 { int iIndex = m_eCursorMode - eCM_PlugFXPosition0; if(iIndex >= 0 && iIndex < MAX_PLUG_FX_POSITION) @@ -676,7 +676,7 @@ void CN3CEView::OnMouseMove(UINT nFlags, CPoint point) { this->InvalidateRect(NULL, FALSE); } ////////////////////////////////////////////////// - // Coded (By Dino On 2002-10-11 2:04:29 ) + // Coded (By Dino On 2002-10-11 오후 2:04:29 ) // FXPlug else if (pChr && pBase && (pBase->Type() & OBJ_FX_PLUG_PART)) { CN3FXPlugPart * pFXPPart = (CN3FXPlugPart *)pBase; @@ -690,7 +690,7 @@ void CN3CEView::OnMouseMove(UINT nFlags, CPoint point) { vAxis.Set(0, 0, 1); } - if (nFlags & MK_SHIFT) // ġ + if (nFlags & MK_SHIFT) // 위치 { const __Matrix44 * pMtxTmp = pChr->MatrixGet(pFXPPart->GetRefIndex()); if (pMtxTmp) { @@ -707,7 +707,7 @@ void CN3CEView::OnMouseMove(UINT nFlags, CPoint point) { pFXPPart->m_vOffsetPos += vDelta; } - } else if (nFlags & MK_CONTROL) // ȸ + } else if (nFlags & MK_CONTROL) // 회전 { const __Matrix44 * pMtxTmp = pChr->MatrixGet(pFXPPart->GetRefIndex()); if (pMtxTmp) { @@ -735,7 +735,7 @@ void CN3CEView::OnMouseMove(UINT nFlags, CPoint point) { pFrm->GetPaneProperty()->UpdateInfo(); this->InvalidateRect(NULL, FALSE); } - // End Of Code (By Dino On 2002-10-11 2:04:29 ) + // End Of Code (By Dino On 2002-10-11 오후 2:04:29 ) ////////////////////////////////////////////////// } @@ -762,7 +762,7 @@ void CN3CEView::InitFXPos() { if (eCM_PlugFXPosition0 == m_eCursorMode || eCM_PlugFXPosition1 == m_eCursorMode || eCM_PlugFXPosition2 == m_eCursorMode || eCM_PlugFXPosition3 == m_eCursorMode || eCM_PlugFXPosition4 == m_eCursorMode || eCM_PlugFXPosition5 == m_eCursorMode || - eCM_PlugFXPosition6 == m_eCursorMode || eCM_PlugFXPosition7 == m_eCursorMode) // ÷ ȿ ġ 0 + eCM_PlugFXPosition6 == m_eCursorMode || eCM_PlugFXPosition7 == m_eCursorMode) // 플러그 효과 위치 0 { int iIndex = m_eCursorMode - eCM_PlugFXPosition0; if (iIndex >= 0 && iIndex < MAX_PLUG_FX_POSITION) { diff --git a/src/tool/N3CE/PosDummy.cpp b/src/tool/N3CE/PosDummy.cpp index 04aff5f2..7c8c8dd6 100644 --- a/src/tool/N3CE/PosDummy.cpp +++ b/src/tool/N3CE/PosDummy.cpp @@ -45,9 +45,9 @@ BOOL CPosDummy::MouseMsgFilter(LPMSG pMsg) { POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; DWORD nFlags = pMsg->wParam; if (m_pSelectedCube && (nFlags & MK_LBUTTON)) { - __Vector3 vRayDir, vRayOrig; // ȭ ߾() 콺 ͸ - __Vector3 vPN, vPV; // Ե - __Vector3 vPos; // ( ) + __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 + __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 + __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) __Vector3 vCameraDir = s_CameraData.vAt - s_CameraData.vEye; vCameraDir.Normalize(); GetPickRay(point, vRayDir, vRayOrig); diff --git a/src/tool/N3CE/StdAfx.h b/src/tool/N3CE/StdAfx.h index 591e32e5..45cafe36 100644 --- a/src/tool/N3CE/StdAfx.h +++ b/src/tool/N3CE/StdAfx.h @@ -3,7 +3,7 @@ // are changed infrequently // -// stl ... +// stl 쓸려고... #pragma warning(disable : 4786) #pragma once diff --git a/src/tool/N3CE/TransDummy.cpp b/src/tool/N3CE/TransDummy.cpp index 1facc0b5..bdb2b701 100644 --- a/src/tool/N3CE/TransDummy.cpp +++ b/src/tool/N3CE/TransDummy.cpp @@ -127,7 +127,7 @@ void CTransDummy::Tick() { if (m_SelObjArray.GetSize() == 0) { return; } - // Scale + // Scale 조정 __Vector3 vL = s_CameraData.vEye - m_vPos; float fL = vL.Magnitude() * 0.01f; m_vScale.Set(fL, fL, fL); @@ -135,7 +135,7 @@ void CTransDummy::Tick() { CN3Transform::Tick(-1000.0f); ReCalcMatrix(); - // Ÿ + // 거리에 따라 정렬 for (int i = 0; i < NUM_DUMMY; ++i) { __Vector3 vPos = m_DummyCubes[i].vCenterPos * m_Matrix; m_DummyCubes[i].fDistance = (vPos - s_CameraData.vEye).Magnitude(); @@ -167,7 +167,7 @@ void CTransDummy::Render() { HRESULT hr; // set transform - hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); // .. + hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); // 월드 행렬 적용.. // set texture hr = s_lpD3DDev->SetTexture(0, NULL); @@ -183,11 +183,11 @@ void CTransDummy::Render() { hr = s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); hr = s_lpD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE); - // ̾ ׸ + // 이어지 선 그리기 hr = s_lpD3DDev->SetFVF(FVF_XYZCOLOR); hr = s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 3, m_LineVertices, sizeof(__VertexXyzColor)); - // Cube ׸ + // Cube 그리기 hr = s_lpD3DDev->SetFVF(FVF_XYZNORMALCOLOR); for (int i = 0; i < NUM_DUMMY; ++i) { ASSERT(m_pSortedCubes[i]); @@ -266,7 +266,7 @@ BOOL CTransDummy::MouseMsgFilter(LPMSG pMsg) { m_vPrevScaleArray = NULL; } m_vPrevScaleArray = new __Vector3[iSize]; - for (int i = 0; i < iSize; ++i) // õ ü + for (int i = 0; i < iSize; ++i) // 모든 선택된 객체의 스케일 저장 { CN3Transform * pSelObj = m_SelObjArray.GetAt(i); _ASSERT(pSelObj); @@ -284,7 +284,7 @@ BOOL CTransDummy::MouseMsgFilter(LPMSG pMsg) { return TRUE; } } break; - case WM_RBUTTONUP: // ť ̹ 巡׷ ΰ ǵ + case WM_RBUTTONUP: // 큐브 선택 취소 및 이번 드래그로 움직인것 되돌려 놓기 { if (m_pSelectedCube) { __Vector3 vDiffPos = m_vPrevPos - m_vPos; diff --git a/src/tool/N3CE/TransDummy.h b/src/tool/N3CE/TransDummy.h index ea4034f5..079d1fa9 100644 --- a/src/tool/N3CE/TransDummy.h +++ b/src/tool/N3CE/TransDummy.h @@ -18,10 +18,10 @@ enum { const int NUM_CUBEVERTEX = 36; struct __DUMMYCUBE { - int iType; // Center , X, Y, Z . - __VertexXyzNormalColor Vertices[NUM_CUBEVERTEX]; // ť - __Vector3 vCenterPos; // ť  - float fDistance; // ī޶ Ÿ + int iType; // Center , X, Y, Z 종류 구분. + __VertexXyzNormalColor Vertices[NUM_CUBEVERTEX]; // 큐브의 구성 점들 + __Vector3 vCenterPos; // 큐브의 가운데 점 + float fDistance; // 카메라와의 거리 }; class CTransDummy : public CN3Transform { @@ -32,30 +32,30 @@ class CTransDummy : public CN3Transform { // Attributes public: protected: - __DUMMYCUBE m_DummyCubes[NUM_DUMMY]; // 4 ť(center, x, y, z); - __VertexXyzColor m_LineVertices[6]; // 4 ť긦 ִ̾ ϴ - CTypedPtrArray m_SelObjArray; // MapMng õ ü - __DUMMYCUBE * m_pSortedCubes[NUM_DUMMY]; // Cube Ÿ ĵ - __DUMMYCUBE * m_pSelectedCube; // õ ť - __Vector3 m_vPrevPos; // ̹ 콺 巡 ġ ȸ Ȯ/Ұ - __Quaternion m_qPrevRot; // ̹ 콺 巡 ġ ȸ Ȯ/Ұ + __DUMMYCUBE m_DummyCubes[NUM_DUMMY]; // 4개의 큐브(center, x, y, z); + __VertexXyzColor m_LineVertices[6]; // 4개의 큐브를 이어주는 선을 구성하는 점 + CTypedPtrArray m_SelObjArray; // MapMng에서 선택된 객체들 + __DUMMYCUBE * m_pSortedCubes[NUM_DUMMY]; // Cube 거리에 따라 정렬된 포인터 + __DUMMYCUBE * m_pSelectedCube; // 선택된 큐브 + __Vector3 m_vPrevPos; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 + __Quaternion m_qPrevRot; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 __Vector3 * - m_vPrevScaleArray; // ̹ 콺 巡 Ȯ/Ұ (õ ü ־ ϱ 迭) + m_vPrevScaleArray; // 이번 마우스 드래그 이전에 확대/축소값들 (선택된 객체들 모두의 값을 가지고 있어야 하기 때문에 배열) // Operations public: virtual void Tick(); virtual void Render(); virtual void Release(); - virtual void SetSelObj(CN3Transform * pObj); // õ ü ٲٱ - virtual void AddSelObj(CN3Transform * pObj); // õ ü ߰ - virtual BOOL MouseMsgFilter(LPMSG pMsg); // 콺 ޼ ó + virtual void SetSelObj(CN3Transform * pObj); // 선택된 객체 바꾸기 + virtual void AddSelObj(CN3Transform * pObj); // 선택된 객체 추가 + virtual BOOL MouseMsgFilter(LPMSG pMsg); // 마우스 메세지 처리 void GetPickRay(POINT point, __Vector3 & vDir, - __Vector3 & vOrig); // 콺 Ͱ Ű  Լ + __Vector3 & vOrig); // 마우스 포인터가 가리키는 쪽으로 뻗어나가는 선 얻는 함수 protected: - __DUMMYCUBE * Pick(int x, int y); // ť picking - void InitDummyCube(int iType, __DUMMYCUBE * pDummyCube, const __Vector3 & vOffset, D3DCOLOR color); // ť ʱȭ - static int SortCube(const void * pArg1, const void * pArg2); // ť ī޶ Ÿ Լ + __DUMMYCUBE * Pick(int x, int y); // 큐브 picking + void InitDummyCube(int iType, __DUMMYCUBE * pDummyCube, const __Vector3 & vOffset, D3DCOLOR color); // 큐브 초기화 + static int SortCube(const void * pArg1, const void * pArg2); // 큐브 카메라 거리에 대한 정렬함수 virtual void TransDiff(__Vector3 * pvDiffPos, __Quaternion * pvDiffRot, - __Vector3 * pvDiffScale); // ̸ŭ õ Ʈ Ų. + __Vector3 * pvDiffScale); // 차이만큼 선택된 오므젝트들을 변형시킨다. }; diff --git a/src/tool/N3CE/res/N3CE.rc2 b/src/tool/N3CE/res/N3CE.rc2 index d2ad7c9bc7b6cc84ba54f1782b29183876148996..83ffa26ef27b8aace7b0078a1e943e4acbbe5bdf 100644 GIT binary patch literal 768 zcmd6l%W48a5Jk^6eno@JUbzSq<7RAi1EIBP9yJ29rzuJlG^&B?r1eMhtAY<=~)RT3-X zQJ>grMPAld)>i1~zVx-_y}{8^w~egL%if6|k38|r3j;<>dGnt5y(tf(9hiS(MYdNU zs;oG%snI0sOM7R1f$k@YIg2K~5W)YM1;#9=;1C$&5B`laxJBl5%GVzBWVMph&ROo8 YiN<`sXBRX4eKR)o9I`tUa_xLS0nBD*H~;_u literal 383 zcmb`D%L;=q5JlI`R}8q6CeVI?s0%68(udok&IAWi14&%?_e~3hLc4S}!!U3T_bMfn zf_k5q@|^Er3y!><-9R3WJUHvE4$!inI|F%|0^0bQYyd(Ifb3`pW{C_T64po>veV^y zE2`#R)opVq3$aPaIqM*d>_M|3i2H-+`gr%tUztc~Le`+v4^u?riu39qLxe{+#h_++ Prz89-VResetContent(); m_pJoint[i]->Clear(); - m_pJoint[i]->InsertString(0, ""); + m_pJoint[i]->InsertString(0, "배꼽"); m_pJoint[i]->SetCurSel(0); - // m_CBPartName ä.. - m_pJoint[i]->InsertString(1, ""); - m_pJoint[i]->InsertString(2, "޼"); + // m_CBPartName들 채우기.. + m_pJoint[i]->InsertString(1, "오른손"); + m_pJoint[i]->InsertString(2, "왼손"); } m_strFileName.Empty(); @@ -113,7 +113,7 @@ bool CDlgEditFxg::LoadScript(const char * szPath) { } ////////////////////////////////////////////////// - // Ʈ ... + //각 컨트롤 셋팅... int cnt = pGroup->GetCount(); for (int i = 0; i < cnt; i++) { __FXBInfo * pInfo = pGroup->GetFXBInfo(i); @@ -195,7 +195,7 @@ void CDlgEditFxg::OnBtnSave() { FILE * file = fopen((LPCTSTR)m_strFileName, "w"); if (!file) { - MessageBox("n3fxgroup ..-.-;;", "ERR02", MB_OK); + MessageBox("n3fxgroup파일 생성 실패..-.-;;", "ERR02", MB_OK); return; } diff --git a/src/tool/N3FXE/DlgEditPartBillBoard.cpp b/src/tool/N3FXE/DlgEditPartBillBoard.cpp index e4d9ba7c..d70204e4 100644 --- a/src/tool/N3FXE/DlgEditPartBillBoard.cpp +++ b/src/tool/N3FXE/DlgEditPartBillBoard.cpp @@ -160,15 +160,15 @@ void CDlgEditPartBillBoard::OnPartBoardBtnLoadTex() { _makepath(szPath, szDrive, szDir, (LPCTSTR)strFName, szExt); m_strTexName = szPath; - // .. + //파일 갯수 세는 기능 넣을까 말까.. } else { m_strTexName = _T(""); - MessageBox(" ̸ 0000 ƴϴ..-.-;;", "ERR05", MB_OK); + MessageBox("파일 이름끝이 0000이 아니던데요..-.-;;", "ERR05", MB_OK); } UpdateData(FALSE); } else { - MessageBox("Texture fx Ʒ, Ȥ fx Ʒ ִ ġؾ մϴ..-.-;;", "ERR04", MB_OK); + MessageBox("Texture파일은 fx폴더 아래, 혹은 fx폴더 아래에 있는 폴더에 위치해야 합니다..-.-;;", "ERR04", MB_OK); } delete pBaseFileAccess; @@ -184,7 +184,7 @@ void CDlgEditPartBillBoard::OnPartBoardBtnSave() { FILE * file = fopen((LPCTSTR)m_strPathName, "w"); if (!file) { - MessageBox("n3fxpart ..-.-;;", "ERR02", MB_OK); + MessageBox("n3fxpart파일 생성 실패..-.-;;", "ERR02", MB_OK); return; } @@ -350,7 +350,7 @@ bool CDlgEditPartBillBoard::LoadPartScript(const char * szPath) { } ////////////////////////////////////////////////// - // Ʈ ... + //각 컨트롤 셋팅... m_bOnGround = pPart->m_bOnGround; m_bAlphaBlend = pPart->m_bAlpha; m_bTexLoop = pPart->m_bTexLoop; diff --git a/src/tool/N3FXE/DlgEditPartGround.cpp b/src/tool/N3FXE/DlgEditPartGround.cpp index ec4eceaa..997f71e6 100644 --- a/src/tool/N3FXE/DlgEditPartGround.cpp +++ b/src/tool/N3FXE/DlgEditPartGround.cpp @@ -107,7 +107,7 @@ bool CDlgEditPartGround::LoadPartScript(const char * szPath) { } ////////////////////////////////////////////////// - // Ʈ ... + //각 컨트롤 셋팅... m_chkAlpha = pPart->m_bAlpha; m_chkTexLoop = pPart->m_bTexLoop; @@ -187,7 +187,7 @@ void CDlgEditPartGround::OnPartGroundBtnSave() { FILE * file = fopen((LPCTSTR)m_strPathName, "w"); if (!file) { - MessageBox("n3fxpart ..-.-;;", "ERR02", MB_OK); + MessageBox("n3fxpart파일 생성 실패..-.-;;", "ERR02", MB_OK); return; } @@ -287,15 +287,15 @@ void CDlgEditPartGround::OnPartGroundBtnLoadTex() { _makepath(szPath, szDrive, szDir, (LPCTSTR)strFName, szExt); m_strTexName = szPath; - // .. + //파일 갯수 세는 기능 넣을까 말까.. } else { m_strTexName = _T(""); - MessageBox(" ̸ 0000 ƴϴ..-.-;;", "ERR05", MB_OK); + MessageBox("파일 이름끝이 0000이 아니던데요..-.-;;", "ERR05", MB_OK); } UpdateData(FALSE); } else { - MessageBox("Texture fx Ʒ, Ȥ fx Ʒ ִ ġؾ մϴ..-.-;;", "ERR04", MB_OK); + MessageBox("Texture파일은 fx폴더 아래, 혹은 fx폴더 아래에 있는 폴더에 위치해야 합니다..-.-;;", "ERR04", MB_OK); } delete pBaseFileAccess; diff --git a/src/tool/N3FXE/DlgEditPartMesh.cpp b/src/tool/N3FXE/DlgEditPartMesh.cpp index dd82d6e6..2f1150ce 100644 --- a/src/tool/N3FXE/DlgEditPartMesh.cpp +++ b/src/tool/N3FXE/DlgEditPartMesh.cpp @@ -153,7 +153,7 @@ void CDlgEditPartMesh::OnPartMeshBtnSave() { FILE * file = fopen((LPCTSTR)m_strPathName, "w"); if (!file) { - MessageBox("n3fxpart ..-.-;;", "ERR02", MB_OK); + MessageBox("n3fxpart파일 생성 실패..-.-;;", "ERR02", MB_OK); return; } @@ -265,7 +265,7 @@ bool CDlgEditPartMesh::LoadPartScript(const char * szPath) { } ////////////////////////////////////////////////// - // Ʈ ... + //각 컨트롤 셋팅... m_bOnGround = pPart->m_bOnGround; m_bAlphaBlend = pPart->m_bAlpha; @@ -405,7 +405,7 @@ void CDlgEditPartMesh::OnPartMeshBtnLoadShape() { m_strShapeName = PathName; UpdateData(FALSE); } else { - MessageBox("N3Shape fx Ʒ, Ȥ fx Ʒ ִ ġؾ մϴ..-.-;;", "ERR03", MB_OK); + MessageBox("N3Shape파일은 fx폴더 아래, 혹은 fx폴더 아래에 있는 폴더에 위치해야 합니다..-.-;;", "ERR03", MB_OK); } delete pBaseFileAccess; diff --git a/src/tool/N3FXE/DlgEditPartParticle.cpp b/src/tool/N3FXE/DlgEditPartParticle.cpp index 72e9ecb4..a072b1f6 100644 --- a/src/tool/N3FXE/DlgEditPartParticle.cpp +++ b/src/tool/N3FXE/DlgEditPartParticle.cpp @@ -217,7 +217,7 @@ void CDlgEditPartParticle::OnPartParticleBtnSave() { FILE * file = fopen((LPCTSTR)m_strPathName, "w"); if (!file) { - MessageBox("n3fxpart ..-.-;;", "ERR02", MB_OK); + MessageBox("n3fxpart파일 생성 실패..-.-;;", "ERR02", MB_OK); return; } @@ -342,7 +342,7 @@ bool CDlgEditPartParticle::LoadPartScript(const char * szPath) { } ////////////////////////////////////////////////// - // Ʈ ... + //각 컨트롤 셋팅... m_bOnGround = pPart->m_bOnGround; m_bAlphaBlend = pPart->m_bAlpha; @@ -519,14 +519,14 @@ void CDlgEditPartParticle::OnPartParticleBtnLoadTex() { m_strTexName = szPath; } else { m_strTexName = _T(""); - MessageBox(" ̸ 0000 ƴϴ..-.-;;", "ERR05", MB_OK); + MessageBox("파일 이름끝이 0000이 아니던데요..-.-;;", "ERR05", MB_OK); } - // ..^^ + //파일 갯수 세는 기능 넣을까 말까..^^ UpdateData(FALSE); } else { - MessageBox("Texture fx Ʒ, Ȥ fx Ʒ ִ ġؾ մϴ..-.-;;", "ERR04", MB_OK); + MessageBox("Texture파일은 fx폴더 아래, 혹은 fx폴더 아래에 있는 폴더에 위치해야 합니다..-.-;;", "ERR04", MB_OK); } delete pBaseFileAccess; @@ -621,7 +621,7 @@ void CDlgEditPartParticle::OnPartParticleBtnLoadMesh() { m_strShapeName = PathName; UpdateData(FALSE); } else { - MessageBox("N3Shape fx Ʒ, Ȥ fx Ʒ ִ ġؾ մϴ..-.-;;", "ERR03", MB_OK); + MessageBox("N3Shape파일은 fx폴더 아래, 혹은 fx폴더 아래에 있는 폴더에 위치해야 합니다..-.-;;", "ERR03", MB_OK); } delete pBaseFileAccess; diff --git a/src/tool/N3FXE/DlgEditScript.cpp b/src/tool/N3FXE/DlgEditScript.cpp index 4850649a..6f16769d 100644 --- a/src/tool/N3FXE/DlgEditScript.cpp +++ b/src/tool/N3FXE/DlgEditScript.cpp @@ -272,7 +272,7 @@ void CDlgEditScript::OnBtnStop() { m_pFXBundle->Stop(); } -//strPathName FullPath... +//strPathName은 FullPath... bool CDlgEditScript::LoadBundle(CString & strPathName) { if (m_pFXBundle) { delete m_pFXBundle; @@ -280,7 +280,7 @@ bool CDlgEditScript::LoadBundle(CString & strPathName) { } /////////////////////////////////////////////////// - // Dialogʱȭ.. + // Dialog초기화.. for (int i = 0; i < MAX_FX_PART; i++) { (*m_pPartStartTime[i]) = 0.0f; m_pPartName[i]->SetCurSel(0); @@ -294,7 +294,7 @@ bool CDlgEditScript::LoadBundle(CString & strPathName) { m_pFXBundle = new CN3FXBundle; m_pRefFrm->m_pCurrFX = m_pFXBundle; - if (m_pFXBundle->DecodeScriptFile((LPCTSTR)strPathName)) // ũƮ б ... + if (m_pFXBundle->DecodeScriptFile((LPCTSTR)strPathName)) //번들 스크립트 읽기 성공했으면... { // // set part editor @@ -310,7 +310,7 @@ bool CDlgEditScript::LoadBundle(CString & strPathName) { _splitpath(szPartFullPath.c_str(), szDrive, szDir, szFName, szExt); _makepath(szScriptFullPath, szDrive, szDir, szFName, "n3fxpart"); - //޺ڽ .. + //콤보박스 셋팅.. char szComboName[_MAX_PATH]; _splitpath(szScriptFullPath, szDrive, szDir, szFName, szExt); _makepath(szComboName, NULL, NULL, szFName, szExt); @@ -323,7 +323,7 @@ bool CDlgEditScript::LoadBundle(CString & strPathName) { m_pPartName[i]->SetCurSel(j); } } - // ð Ʈڽ ..^^ + //옆의 시간 에디트박스도 셋팅..^^ (*m_pPartStartTime[i]) = m_pFXBundle->GetPartSTime(i); } } @@ -348,7 +348,7 @@ bool CDlgEditScript::NewBundle() { } /////////////////////////////////////////////////// - // Dialogʱȭ.. + // Dialog초기화.. OnInitDialog(); /* for(int i=0;iInsertString(0, "NONE"); m_pPartName[i]->SetCurSel(0); - // m_CBPartName ä.. + // m_CBPartName들 채우기.. CString strPath; CN3BaseFileAccess * pBaseFileAccess = new CN3BaseFileAccess; @@ -457,7 +457,7 @@ void CDlgEditScript::ReloadCombo() { m_pPartName[i]->InsertString(0, "NONE"); m_pPartName[i]->SetCurSel(0); - // m_CBPartName ä.. + // m_CBPartName들 채우기.. CString strPath; CN3BaseFileAccess * pBaseFileAccess = new CN3BaseFileAccess; strPath = pBaseFileAccess->PathGet().c_str(); diff --git a/src/tool/N3FXE/Ground.h b/src/tool/N3FXE/Ground.h index f3a771aa..6bd61540 100644 --- a/src/tool/N3FXE/Ground.h +++ b/src/tool/N3FXE/Ground.h @@ -10,8 +10,8 @@ class CN3Texture; class CGround : public CN3Base { public: - int m_iSize; //Ѻ .. - int m_iTileSize; //Ÿ .. + int m_iSize; //한변의 길이.. + int m_iTileSize; //타일의 길이.. __VertexT1 * m_pVB; CN3Texture * m_pTile; diff --git a/src/tool/N3FXE/MainFrm.cpp b/src/tool/N3FXE/MainFrm.cpp index 63e4f996..12e5ef30 100644 --- a/src/tool/N3FXE/MainFrm.cpp +++ b/src/tool/N3FXE/MainFrm.cpp @@ -163,13 +163,13 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { // TODO: Remove this if you don't want tool tips m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); - // Engine + // Engine 생성 if (m_Eng.Init(TRUE, m_hWnd, 64, 64, 0, TRUE) == false) { return -1; } - m_Eng.GridCreate(200, 200); // ׸ .. + m_Eng.GridCreate(200, 200); // 그리드 만들기.. - // ⺻ ī޶ & Light .. + // 기본 카메라 & Light 만들기.. m_Camera.EyePosSet(0, 5, -15); //D3DCOLORVALUE crLgt = { 1.0f, 1.0f, 1.0f, 1.0f }; //m_Light.m_Data.InitDirection(0, __Vector3(-1, -1, -1), crLgt); @@ -177,7 +177,7 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { D3DCOLORVALUE crLgt; crLgt.a = 0.0f, crLgt.r = crLgt.g = crLgt.b = 0.8f; - //CN3Light* pLightGlobal = new CN3Light(); // ü Ʈ.. + //CN3Light* pLightGlobal = new CN3Light(); // 전체를 비출 라이트.. m_Light[0].m_Data.InitDirection(0, __Vector3(0, -1, 0), crLgt); m_Light[1].m_Data.InitDirection(1, __Vector3(0, 1, 0), crLgt); @@ -293,7 +293,7 @@ int CMainFrame::GetPartType(CString & PathName) { } else if (lstrcmpi(szBuf[0], "ground") == 0) { PartType = FX_PART_TYPE_BOTTOMBOARD; } - //^^v ־.. + //^^v 더 넣을꺼 있으면 넣어라.. fclose(stream); return PartType; @@ -331,7 +331,7 @@ void CMainFrame::OnFileLoadPart() { pEditPartWnd->ShowWindow(TRUE); m_pEditPartMesh.push_back(pEditPartWnd); } else { - MessageBox("n3fxpart µ ߽ϴ...-.-;;", "ERR01", MB_OK); + MessageBox("n3fxpart파일을 여는데 실패했습니다...-.-;;", "ERR01", MB_OK); pEditPartWnd->DestroyWindow(); delete pEditPartWnd; } @@ -346,7 +346,7 @@ void CMainFrame::OnFileLoadPart() { pEditPartWnd->ShowWindow(TRUE); m_pEditPartBillBoard.push_back(pEditPartWnd); } else { - MessageBox("n3fxpart µ ߽ϴ...-.-;;", "ERR01", MB_OK); + MessageBox("n3fxpart파일을 여는데 실패했습니다...-.-;;", "ERR01", MB_OK); pEditPartWnd->DestroyWindow(); delete pEditPartWnd; } @@ -361,7 +361,7 @@ void CMainFrame::OnFileLoadPart() { pEditPartWnd->ShowWindow(TRUE); m_pEditPartParticle.push_back(pEditPartWnd); } else { - MessageBox("n3fxpart µ ߽ϴ...-.-;;", "ERR01", MB_OK); + MessageBox("n3fxpart파일을 여는데 실패했습니다...-.-;;", "ERR01", MB_OK); pEditPartWnd->DestroyWindow(); delete pEditPartWnd; } @@ -376,7 +376,7 @@ void CMainFrame::OnFileLoadPart() { pEditPartWnd->ShowWindow(TRUE); m_pEditPartGround.push_back(pEditPartWnd); } else { - MessageBox("n3fxpart µ ߽ϴ...-.-;;", "ERR01", MB_OK); + MessageBox("n3fxpart파일을 여는데 실패했습니다...-.-;;", "ERR01", MB_OK); pEditPartWnd->DestroyWindow(); delete pEditPartWnd; } @@ -399,17 +399,17 @@ void CMainFrame::OnFileLoadBundle() { while (pos != NULL) { CString PathName = dlg.GetNextPathName(pos); - //ũƮ Ʈ â , ũƮ а, .. + //스크립트 에디트 창 만들고, 스크립트 정보들 읽고, 셋팅.. CDlgEditScript * pEditWnd = new CDlgEditScript; pEditWnd->Create(IDD_DLG_SCRIPTEDITOR, NULL); pEditWnd->m_pRefFrm = this; - // load ؼ ϸ ״ ϰ ϸ .. + // load 해서 성공하면 그대로 하고 실패하면 다 지워버려.. if (pEditWnd->LoadBundle(PathName)) { pEditWnd->ShowWindow(TRUE); m_pEditWndList.push_back(pEditWnd); } else { - MessageBox("n3fxbundle µ ߽ϴ.", "-.-;;", MB_OK); + MessageBox("n3fxbundle파일을 여는데 실패했습니다.", "-.-;;", MB_OK); pEditWnd->DestroyWindow(); delete pEditWnd; } @@ -461,7 +461,7 @@ void CMainFrame::TickRender() { m_pGround->Render(); } - //° renderstate... + //온갖 renderstate설정... if (m_pCurrFX) { DWORD dwLgt; m_Eng.s_lpD3DDev->GetRenderState(D3DRS_LIGHTING, &dwLgt); @@ -473,11 +473,11 @@ void CMainFrame::TickRender() { m_Eng.s_lpD3DDev->SetRenderState(D3DRS_LIGHTING, dwLgt); } - CN3Base::s_AlphaMgr.Render(); // ̰ ݵ ĺ ÷ο찡 ȳ.. + CN3Base::s_AlphaMgr.Render(); // 이걸 반드시 해줘야 알파블렌딩 버퍼 오버플로우가 안난다.. m_Eng.s_lpD3DDev->EndScene(); m_Eng.Present(GetActiveView()->m_hWnd); - // ǥ + // 프레임 표시 DWORD dwTick = GetTickCount(); static DWORD dwTickPrev = dwTick; static CString szFPS; @@ -666,17 +666,17 @@ void CMainFrame::OnViewBgcolor() { } void CMainFrame::OnFileNewBundle() { - //ũƮ Ʈ â , ũƮ а, .. + //스크립트 에디트 창 만들고, 스크립트 정보들 읽고, 셋팅.. CDlgEditScript * pEditWnd = new CDlgEditScript; pEditWnd->Create(IDD_DLG_SCRIPTEDITOR, NULL); pEditWnd->m_pRefFrm = this; - // load ؼ ϸ ״ ϰ ϸ .. + // load 해서 성공하면 그대로 하고 실패하면 다 지워버려.. if (pEditWnd->NewBundle()) { pEditWnd->ShowWindow(TRUE); m_pEditWndList.push_back(pEditWnd); } else { - MessageBox(" µ ߽ϴ.", "ERR;;", MB_OK); + MessageBox("새 번들을 만드는데 실패했습니다.", "ERR;;", MB_OK); pEditWnd->DestroyWindow(); delete pEditWnd; } @@ -694,7 +694,7 @@ void CMainFrame::OnFileOpenFloorTex() { } void CMainFrame::OnFileNewGroup() { - //ũƮ Ʈ â , ũƮ а, .. + //스크립트 에디트 창 만들고, 스크립트 정보들 읽고, 셋팅.. CDlgEditFxg * pEditWnd = new CDlgEditFxg; pEditWnd->Create(IDD_DLG_GROUP, NULL); pEditWnd->m_pRefFrm = this; @@ -716,17 +716,17 @@ void CMainFrame::OnFileLoadGroup() { while (pos != NULL) { CString PathName = dlg.GetNextPathName(pos); - //ũƮ Ʈ â , ũƮ а, .. + //스크립트 에디트 창 만들고, 스크립트 정보들 읽고, 셋팅.. CDlgEditFxg * pEditWnd = new CDlgEditFxg; pEditWnd->Create(IDD_DLG_GROUP, NULL); pEditWnd->m_pRefFrm = this; - // load ؼ ϸ ״ ϰ ϸ .. + // load 해서 성공하면 그대로 하고 실패하면 다 지워버려.. if (pEditWnd->LoadScript((LPCTSTR)PathName)) { pEditWnd->ShowWindow(TRUE); m_pEditGroup.push_back(pEditWnd); } else { - MessageBox("n3fxgroup µ ߽ϴ.", "-.-;;", MB_OK); + MessageBox("n3fxgroup파일을 여는데 실패했습니다.", "-.-;;", MB_OK); pEditWnd->DestroyWindow(); delete pEditWnd; } diff --git a/src/tool/N3FXE/N3FXE.rc b/src/tool/N3FXE/N3FXE.rc index 0e1ef648c67ab4c1bac3fcb7bd26e7de987c34bf..a0b093ee8a0a07cf02c87b0c949b3c1c79658e46 100644 GIT binary patch literal 91148 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 XEy|==$(|82o{Py_?QJHp-`M{G_S20S diff --git a/src/tool/N3FXE/N3FXE.vcxproj.filters b/src/tool/N3FXE/N3FXE.vcxproj.filters index a4926441..805b6f77 100644 --- a/src/tool/N3FXE/N3FXE.vcxproj.filters +++ b/src/tool/N3FXE/N3FXE.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/tool/N3FXE/N3FXE.vcxproj.user b/src/tool/N3FXE/N3FXE.vcxproj.user index 7912fcf6..1aa1e2ae 100644 --- a/src/tool/N3FXE/N3FXE.vcxproj.user +++ b/src/tool/N3FXE/N3FXE.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\game diff --git a/src/tool/N3FXE/res/N3FXE.rc2 b/src/tool/N3FXE/res/N3FXE.rc2 index b7fc2185ff54b2af2bfebfd955a2fffb603e383d..b868a5359bf21563a55dafbbad06048fb2b13561 100644 GIT binary patch literal 770 zcmd6l%W48a5Jk^6eno@J5C`-NL?cLu2J;}h;G@L>V_?)pe%|ENFd>TslBG1=U0rpn z=H99LI29DM+y#jVJw`lpO@|o+y85o%6`4J69JQ9Uow%jcuJlG^%|YCgzP+e9TVDe% zU5SjTFbq5o@2iwh z3d-&7mdjJRfi+liX0jbQIB;i;GulJVZfXWd;~3C{&uBalvIk^Kogd}^5h7xZq#-$; zFW0Q7?nPNw`#ck?h^#dhe9sOv4+LR<5KSBIcK$095skm_curValue.Format("%f", pC->m_Data.fFP); } - pItem = m_LPCamera.GetPropItem("Ȱ "); + pItem = m_LPCamera.GetPropItem("안개 사용"); if (pItem) { if (pC->m_bFogUse) { pItem->m_curValue = "On"; @@ -367,7 +367,7 @@ void CDlgBase::UpdateInfo() { pItem->m_curValue = "Off"; } } - pItem = m_LPCamera.GetPropItem("Ȱ "); + pItem = m_LPCamera.GetPropItem("안개 색"); if (pItem) { pItem->D3DColorSet(pC->m_FogColor); } @@ -458,7 +458,7 @@ void CDlgBase::UpdateInfo() { CN3Shape * pS = (CN3Shape *)pBase; CPropertyItem * pItem; - pItem = m_LPShape.GetPropItem("Ҽ"); + pItem = m_LPShape.GetPropItem("소속"); if (pItem) { pItem->m_curValue.Format("%d", pSI->m_iBelong); } @@ -476,7 +476,7 @@ void CDlgBase::UpdateInfo() { } pItem = m_LPShape.GetPropItem("NPC Status"); if (pItem) { - pItem->m_curValue.Format("%d", pSI->m_iNPC_Status); // NPC Ʈ NPC Type + pItem->m_curValue.Format("%d", pSI->m_iNPC_Status); // NPC 로 쓰는 오브젝트일 경우 NPC Type } int nPartCount = pS->PartCount(); @@ -647,7 +647,7 @@ void CDlgBase::UpdateInfo() { } } - // ̴ Ʈ(, ű ...) ǥ + // 붙이는 오브젝트(무기, 장신구 등...) 정보 표시 int nPlug = m_CBChrPlug.GetCurSel(); int nPlugCount = pC->PlugCount(); m_CBChrPlug.ResetContent(); @@ -829,13 +829,13 @@ BOOL CDlgBase::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { pC->m_Data.fNP = (float)atof(pItem->m_curValue); } else if (pItem->m_propName == "Far Plane") { pC->m_Data.fFP = (float)atof(pItem->m_curValue); - } else if (pItem->m_propName == "Ȱ ") { + } else if (pItem->m_propName == "안개 사용") { if (lstrcmpi(pItem->m_curValue, "on") == 0) { pC->m_bFogUse = TRUE; } else { pC->m_bFogUse = FALSE; } - } else if (pItem->m_propName == "Ȱ ") { + } else if (pItem->m_propName == "안개 색") { pC->m_FogColor = pItem->D3DColorGet(); } } @@ -887,7 +887,7 @@ BOOL CDlgBase::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { CN3SPart * pPD = pS->Part(nPart); CPropertyItem * pItem = (CPropertyItem *)lParam; - if (pItem->m_propName == "Ҽ" && pItem->m_curValue.GetLength() > 0) { + if (pItem->m_propName == "소속" && pItem->m_curValue.GetLength() > 0) { pSI->m_iBelong = atoi(pItem->m_curValue); } else if (pItem->m_propName == "Event ID" && pItem->m_curValue.GetLength() > 0) { pSI->m_iEventID = atoi(pItem->m_curValue); @@ -896,7 +896,7 @@ BOOL CDlgBase::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { } else if (pItem->m_propName == "NPC ID" && pItem->m_curValue.GetLength() > 0) { pSI->m_iNPC_ID = atoi(pItem->m_curValue); } else if (pItem->m_propName == "NPC Status" && pItem->m_curValue.GetLength() > 0) { - pSI->m_iNPC_Status = atoi(pItem->m_curValue); // NPC Ʈ NPC Type + pSI->m_iNPC_Status = atoi(pItem->m_curValue); // NPC 로 쓰는 오브젝트일 경우 NPC Type } else if (pItem->m_propName == "Collision Mesh File" && pItem->m_curValue.GetLength() > 0) { @@ -1024,7 +1024,7 @@ BOOL CDlgBase::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { CN3CPlugBase * pPlug = pC->Plug(nPlug); if (pItem->m_propName == "Plug Joint") { - int nJI = atoi(pItem->m_curValue); // Joint Index  ϵ... + int nJI = atoi(pItem->m_curValue); // Joint Index 가 영역을 벗어나지 못하도록... int nJC = 0; CN3Joint * pJ = pC->Joint(); if (pJ) { @@ -1129,7 +1129,7 @@ void CDlgBase::OnChangeEName() { pBase = pFrm->GetShapeForDisplay(); if (pBase != NULL) { CString str; - GetDlgItemText(IDC_E_NAME, str); // ̸ ٲٱ.. + GetDlgItemText(IDC_E_NAME, str); // 이름 바꾸기.. pBase->m_szName = str; } } diff --git a/src/tool/N3Indoor/DlgBrowsePath.cpp b/src/tool/N3Indoor/DlgBrowsePath.cpp index fb768b83..4e57a90a 100644 --- a/src/tool/N3Indoor/DlgBrowsePath.cpp +++ b/src/tool/N3Indoor/DlgBrowsePath.cpp @@ -65,7 +65,7 @@ END_MESSAGE_MAP() BOOL CDlgBrowsePath::OnInitDialog() { CDialog::OnInitDialog(); - // ֱٿ ´... + // 최근에 쓴 폴더를 가져온다... char szInitDir[256]; DWORD dwLength = 256; memset(szInitDir, 0, 256); @@ -164,12 +164,12 @@ void CDlgBrowsePath::OnSynchFolders() { } void CDlgBrowsePath::OnOK() { - m_CBPath.GetWindowText(m_szPath); // .. + m_CBPath.GetWindowText(m_szPath); // 경로 기억.. if (m_szPath.GetLength() > 0) { - m_CBPath.InsertString(0, m_szPath); // ְ... + m_CBPath.InsertString(0, m_szPath); // 경로 넣고... } - // ֱٿ صд.... + // 최근에 쓴 폴더를 저장해둔다.... char szInitDir[256] = ""; CString szKey; HKEY hKey; diff --git a/src/tool/N3Indoor/DlgSceneGraph.h b/src/tool/N3Indoor/DlgSceneGraph.h index 33dc5b48..d02fedf7 100644 --- a/src/tool/N3Indoor/DlgSceneGraph.h +++ b/src/tool/N3Indoor/DlgSceneGraph.h @@ -18,7 +18,7 @@ class CDlgSceneGraph : public CDialog { protected: void UpdateTreeItem(HTREEITEM hParent, CN3Base * pBase); - DWORD m_dwFlag; // Ͽ ǥ ͵ Ÿ ÷ + DWORD m_dwFlag; // 목록에 표시할 것들을 나타낸 플래그 // Construction public: diff --git a/src/tool/N3Indoor/DlgShapeList.cpp b/src/tool/N3Indoor/DlgShapeList.cpp index f77b7fa4..f5432549 100644 --- a/src/tool/N3Indoor/DlgShapeList.cpp +++ b/src/tool/N3Indoor/DlgShapeList.cpp @@ -62,7 +62,7 @@ END_MESSAGE_MAP() void CDlgShapeList::UpdateTree(CN3Scene * pScene) { m_ListShape.ResetContent(); - if (pScene && m_IsSourceObj) // Source .. + if (pScene && m_IsSourceObj) // Source용 버전.. { m_pSceneRef = pScene; @@ -76,7 +76,7 @@ void CDlgShapeList::UpdateTree(CN3Scene * pScene) { m_ListShape.SetItemDataPtr(i, pShape); } } - } else if (!pScene && !m_IsSourceObj) // Output .. + } else if (!pScene && !m_IsSourceObj) // Output용 버전.. { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); COrganizeView * pView = pFrm->GetOrganizeView(); @@ -111,7 +111,7 @@ void CDlgShapeList::UpdateTree(CN3Scene * pScene) { } } -int CDlgShapeList::GetTotalShapeInfoCount() // Output.. +int CDlgShapeList::GetTotalShapeInfoCount() // Output용.. { if (m_IsSourceObj) { ASSERT(0); @@ -144,7 +144,7 @@ void CDlgShapeList::UpdateTree(CN3Scene * pScene) { return i; } -CN3Shape * CDlgShapeList::GetShapeByiOrder(int iOrder) // Output.. +CN3Shape * CDlgShapeList::GetShapeByiOrder(int iOrder) // Output용.. { if (m_IsSourceObj) { ASSERT(0); @@ -183,7 +183,7 @@ void CDlgShapeList::UpdateTree(CN3Scene * pScene) { return NULL; } -void CDlgShapeList::SelectObject(void * pItemData) // Output .. +void CDlgShapeList::SelectObject(void * pItemData) // Output용 버전.. { if (m_IsSourceObj) { return; @@ -213,7 +213,7 @@ void CDlgShapeList::OnSelchangeListObj() { CMainFrame * pFrm = NULL; pFrm = (CMainFrame *)AfxGetMainWnd(); - // Source Output .. + // Source와 Output 공용.. int idx = m_ListShape.GetCurSel(); if (idx < 0) { return; @@ -292,7 +292,7 @@ BOOL CDlgShapeList::PreTranslateMessage(MSG * pMsg) { void CDlgShapeList::OnBtnSort() { // TODO: Add your control notification handler code here - // Source .. + // Source 버전.. if (m_IsSourceObj) { ShapeMap Map; Map.clear(); @@ -322,7 +322,7 @@ void CDlgShapeList::OnBtnSort() { it++; } } - // Output .. + // Output 버전.. else { ShapeInfoMap Map; Map.clear(); @@ -356,7 +356,7 @@ void CDlgShapeList::OnBtnSort() { void CDlgShapeList::OnOk() { // TODO: Add your control notification handler code here - // 翬 Source .. + // 당연히 Source 버전.. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); CN3Shape * pShape = NULL; int SelCount = m_ListShape.GetSelCount(); diff --git a/src/tool/N3Indoor/DlgShapeList.h b/src/tool/N3Indoor/DlgShapeList.h index b40e5293..9b22314a 100644 --- a/src/tool/N3Indoor/DlgShapeList.h +++ b/src/tool/N3Indoor/DlgShapeList.h @@ -17,7 +17,7 @@ class CDlgShapeList : public CDialog { CDlgShapeList(CWnd * pParent = NULL); // standard constructor CN3Scene * m_pSceneRef; - BOOL m_IsSourceObj; // Display̳? ( Ʈ ) + BOOL m_IsSourceObj; // Display용이냐? (툴에서 오브젝트 목록) // CMapMng* m_pMapMng; // Dialog Data @@ -28,10 +28,10 @@ class CDlgShapeList : public CDialog { CListBox m_ListShape; //}}AFX_DATA - void UpdateTree(CN3Scene * pScene = NULL); // Source.. Output .. - void SelectObject(void * pItemData); // Output.. - int GetTotalShapeInfoCount(); // Output.. - CN3Shape * GetShapeByiOrder(int iOrder); // Output.. + void UpdateTree(CN3Scene * pScene = NULL); // Source와.. Output 공용.. + void SelectObject(void * pItemData); // Output용.. + int GetTotalShapeInfoCount(); // Output용.. + CN3Shape * GetShapeByiOrder(int iOrder); // Output용.. // Overrides // ClassWizard generated virtual function overrides diff --git a/src/tool/N3Indoor/DlgUnusedFiles.cpp b/src/tool/N3Indoor/DlgUnusedFiles.cpp index 9f71e882..a5f01a9a 100644 --- a/src/tool/N3Indoor/DlgUnusedFiles.cpp +++ b/src/tool/N3Indoor/DlgUnusedFiles.cpp @@ -47,7 +47,7 @@ void CDlgUnusedFiles::OnDelete() { return; } - int iYesNo = MessageBox("ðڽϱ?", "Ȯ", MB_YESNO); + int iYesNo = MessageBox("지우시겠습니까?", "확인", MB_YESNO); if (IDYES != iYesNo) { return; diff --git a/src/tool/N3Indoor/FloorDlg.cpp b/src/tool/N3Indoor/FloorDlg.cpp index 67544dab..4b27961b 100644 --- a/src/tool/N3Indoor/FloorDlg.cpp +++ b/src/tool/N3Indoor/FloorDlg.cpp @@ -56,7 +56,7 @@ void CFloorDlg::OnOK() { // TODO: Add extra validation here int iCur = GetFloor(); if (iCur < 1) { - AfxMessageBox("0 ū ԷϽʽÿ...."); + AfxMessageBox("0보다 큰 수를 입력하십시오...."); return; } diff --git a/src/tool/N3Indoor/MainFrm.cpp b/src/tool/N3Indoor/MainFrm.cpp index 8e68be74..9cf06d44 100644 --- a/src/tool/N3Indoor/MainFrm.cpp +++ b/src/tool/N3Indoor/MainFrm.cpp @@ -80,13 +80,13 @@ static UINT indicators[] = { CMainFrame::CMainFrame() { // TODO: add member initialization code here - m_eState = STATE_EDIT; // .. + m_eState = STATE_EDIT; // 상태 변수들.. m_eSelectState = SELECT_STATE_PVOLUMN; m_dwRenderingOption = dw_Render_None; - m_pDlgSourceList = NULL; // Object ̾˷α - m_pDlgOutputList = NULL; // ʿ ġ Object ̾˷α - m_pSceneSource = NULL; // source object Ͽ ͵ Scene + m_pDlgSourceList = NULL; // Object 목록을 보여줄 다이알로그 + m_pDlgOutputList = NULL; // 맵에 배치한 Object를 보여줄 다이알로그 + m_pSceneSource = NULL; // source object 목록에 보여줄 것들을 담은 Scene m_pDummy = NULL; @@ -110,7 +110,7 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (m_Eng.Init(TRUE, m_hWnd, 64, 64, 0, TRUE) == false) { return 0; } - m_Eng.GridCreate(300, 300); // ׸ .. + m_Eng.GridCreate(300, 300); // 그리드 만들기.. m_Camera.EyePosSet(cvInitEyeOffset); @@ -162,7 +162,7 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { m_dwRenderingOption = dw_Render_None; m_eEditState = EDIT_SELECT; - // .. + // 경로 설정.. std::string str; char szPathCur[256] = ""; GetCurrentDirectory(256, szPathCur); @@ -366,7 +366,7 @@ void CMainFrame::OnUpdateViewOutputobject(CCmdUI * pCmdUI) { CN3Transform * CMainFrame::AddChr(CN3Scene * pDestScene, const std::string & szFN, BOOL bGenerateChainNumber) { CN3Chr * pChr = new CN3Chr; - if (false == pChr->LoadFromFile(szFN)) // θⰡ ϸ.. + if (false == pChr->LoadFromFile(szFN)) // 부르기가 실패하면.. { delete pChr; return NULL; @@ -383,8 +383,8 @@ CN3Transform * CMainFrame::AddChr(CN3Scene * pDestScene, const std::string & szF continue; } - szCompare[nL - 5] = NULL; // ڿ ٴ ٿ ڸ ȣ .. - if (pChr->m_szName == szCompare) // ̸ .. + szCompare[nL - 5] = NULL; // 뒤에 붙는 언더바와 네자리 번호는 뺀다.. + if (pChr->m_szName == szCompare) // 이름이 같으면.. { nChainNumber = atoi(&(szCompare[nL - 4])) + 1; } @@ -392,7 +392,7 @@ CN3Transform * CMainFrame::AddChr(CN3Scene * pDestScene, const std::string & szF char szName[_MAX_PATH]; wsprintf(szName, "%s_%.4d", pChr->m_szName.c_str(), nChainNumber); - pChr->m_szName = szName; // .. ̸ ´.. + pChr->m_szName = szName; // .. 이름을 짓는다.. } pDestScene->ChrAdd(pChr); @@ -401,13 +401,13 @@ CN3Transform * CMainFrame::AddChr(CN3Scene * pDestScene, const std::string & szF CN3Transform * CMainFrame::AddShape(CN3Scene * pDestScene, const std::string & szFN, BOOL bGenerateChainNumber) { CN3Shape * pShape = new CN3Shape; - if (false == pShape->LoadFromFile(szFN)) // θⰡ ϸ.. + if (false == pShape->LoadFromFile(szFN)) // 부르기가 실패하면.. { delete pShape; return NULL; } - pDestScene->ShapeAdd(pShape); // ߰ ϰ + pDestScene->ShapeAdd(pShape); // 추가 하고 return pShape; } @@ -418,10 +418,10 @@ void CMainFrame::LoadSourceObjects() { WIN32_FIND_DATA FindFileData; - // source\Chr ij ߰ + // source\Chr 폴더의 모든 캐릭터 추가 CString szChrPath; szChrPath.Format("%sChr\\", CN3Base::s_szPath.c_str()); - SetCurrentDirectory(szChrPath); // szFolder\Chr θ ٲٰ.. + SetCurrentDirectory(szChrPath); // szFolder\Chr 폴더로 경로를 바꾸고.. HANDLE hFind = FindFirstFile("*.N3Chr", &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { @@ -432,11 +432,11 @@ void CMainFrame::LoadSourceObjects() { FindClose(hFind); } - // source\Data shape ߰ + // source\Data 폴더의 모든 shape 추가 CString szShapePath; szShapePath.Format("%sObject\\", CN3Base::s_szPath.c_str()); - SetCurrentDirectory(szShapePath); // szFolder\Mesh θ ٲٰ.. - hFind = FindFirstFile("*.N3Shape", &FindFileData); // ã. + SetCurrentDirectory(szShapePath); // szFolder\Mesh 폴더로 경로를 바꾸고.. + hFind = FindFirstFile("*.N3Shape", &FindFileData); // 파일 찾기. if (hFind != INVALID_HANDLE_VALUE) { AddShape(m_pSceneSource, std::string(szShapePath + FindFileData.cFileName), FALSE); @@ -446,8 +446,8 @@ void CMainFrame::LoadSourceObjects() { FindClose(hFind); } - m_pSceneSource->Tick(); // Object ʱȭ - m_pDlgSourceList->UpdateTree(m_pSceneSource); // + m_pSceneSource->Tick(); // Object 초기화 + m_pDlgSourceList->UpdateTree(m_pSceneSource); // 목록 갱신 } void CMainFrame::RefreshSourceObjects() { @@ -474,12 +474,12 @@ void CMainFrame::RefreshSourceObjects() { } } -void CMainFrame::OutputDlgRefresh() // ҽϿ Object OutputScene ؼ ־ش. +void CMainFrame::OutputDlgRefresh() // 소스목록에서 선택한 Object를 넣으면 OutputScene으로 복사해서 넣어준다. { m_pDlgOutputList->UpdateTree(); } -void CMainFrame::RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd) // Ư 쿡 Object ׷ش. +void CMainFrame::RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd) // 특정 윈도우에 Object를 그려준다. { if (pObj == NULL || hWnd == NULL) { return; @@ -504,7 +504,7 @@ void CMainFrame::RefreshSourceObjects() { // begin pD3DDev->BeginScene(); - // Object ġ ũ ľ + // Object의 위치 및 크기 파악 __Vector3 vDir(-1, -1, 3); vDir.Normalize(); __Vector3 vMin = pObj->Min(); @@ -522,18 +522,18 @@ void CMainFrame::RefreshSourceObjects() { DWORD dwLighting; pD3DDev->GetRenderState(D3DRS_LIGHTING, &dwLighting); - // camera frustum ..(ApplyԼ ο transform ٲٱ⶧ ġ ־ Ѵ.) + // camera frustum 세팅..(Apply함수 내부에서 transform을 바꾸기때문에 이 위치에 넣어야 한다.) CN3Camera TempCamera; TempCamera.EyePosSet(vEye); TempCamera.AtPosSet(vAt); TempCamera.UpVectorSet(vUp); TempCamera.Tick(); - TempCamera.Apply(); // ӽī޶ ͸ ְ frustum .. + TempCamera.Apply(); // 임시카메라에 데이터를 넣고 frustum 정보를 계산.. // Set Render State pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE); - // ׸ + // 그리기 if (dwType & OBJ_CHARACTER) { CN3Chr * pChr = (CN3Chr *)pObj; pChr->Tick(-1000); @@ -547,7 +547,7 @@ void CMainFrame::RefreshSourceObjects() { pD3DDev->EndScene(); // end m_Eng.Present(hWnd); // present - // restore ( · ǵ picking ʴ´) + // restore (이전 상태로 되돌려주지 않으면 지형에서 picking이 제대로 되지 않는다) pD3DDev->SetTransform(D3DTS_VIEW, &mtxOldView); pD3DDev->SetTransform(D3DTS_PROJECTION, &mtxOldProj); CopyMemory(&CN3Base::s_CameraData, &CameraDataBackUp, sizeof(CameraDataBackUp)); @@ -647,7 +647,7 @@ ShapeInfo * CMainFrame::GetShapeForDisplay() { void CMainFrame::OnTipFocusSelobj() { // TODO: Add your command handler code here - // focus Object ã´.. + // focus를 가질 Object 를 찾는다.. bool bFound = false; CPortalVolume * pVol = NULL; COrganizeView * pView = GetOrganizeView(); @@ -710,7 +710,7 @@ void CMainFrame::OnTipFocusSelobj() { } } - if (vMin.x != FLT_MAX && vMax.x != -FLT_MAX) { // ü ũ⿡ ī޶ Ÿ + if (vMin.x != FLT_MAX && vMax.x != -FLT_MAX) { // 물체 크기에 맞춰 카메라 거리 조절 __Vector3 vDir = m_Camera.Dir(); __Vector3 vAt = vMin + ((vMax - vMin) / 2); m_Camera.AtPosSet(vAt); @@ -746,7 +746,7 @@ void CMainFrame::OnTipFocusSelobj() { } } - if (vMin.x != FLT_MAX && vMax.x != -FLT_MAX) { // ü ũ⿡ ī޶ Ÿ + if (vMin.x != FLT_MAX && vMax.x != -FLT_MAX) { // 물체 크기에 맞춰 카메라 거리 조절 __Vector3 vDir = m_Camera.Dir(); __Vector3 vAt = vMin + ((vMax - vMin) / 2); m_Camera.AtPosSet(vAt); @@ -805,7 +805,7 @@ void CMainFrame::OnTipFocusSelobj() { } } - if (vMin.x != FLT_MAX && vMax.x != -FLT_MAX) { // ü ũ⿡ ī޶ Ÿ + if (vMin.x != FLT_MAX && vMax.x != -FLT_MAX) { // 물체 크기에 맞춰 카메라 거리 조절 __Vector3 vDir = m_Camera.Dir(); __Vector3 vAt = vMin + ((vMax - vMin) / 2); m_Camera.AtPosSet(vAt); @@ -819,7 +819,7 @@ void CMainFrame::OnTipFocusAll() { __Vector3 vMin, vMax; FindMinMaxTotalShape(vMin, vMax); - if (vMin.x != FLT_MAX && vMax.x != -FLT_MAX) { // ü ũ⿡ ī޶ Ÿ + if (vMin.x != FLT_MAX && vMax.x != -FLT_MAX) { // 물체 크기에 맞춰 카메라 거리 조절 __Vector3 vDir = m_Camera.Dir(); __Vector3 vAt = vMin + ((vMax - vMin) / 2); m_Camera.AtPosSet(vAt); @@ -925,15 +925,15 @@ void CMainFrame::TotalValidateCheckAfterDelete() { bFound = false; SelectElement se = m_pDummy->m_SelObjArray.GetAt(i); - if (se.eST != TYPE_SHAPE_ONLY) // Volume̴.. + if (se.eST != TYPE_SHAPE_ONLY) // Volume이다.. { - // ã´.. + // 찾는다.. if (pView->m_PVSMgr.IsExistPortalVolumeByPointer((CPortalVolume *)se.pSelectPointer)) { bFound = true; } - } else // Shape.. + } else // Shape다.. { - // ã´.. + // 찾는다.. if (pView->m_PVSMgr.IsExistTotalShapeByPointer((ShapeInfo *)se.pSelectPointer)) { bFound = true; } @@ -943,7 +943,7 @@ void CMainFrame::TotalValidateCheckAfterDelete() { } } - // ã.. + // 못찾았으면.. if (!bFound) { m_pDummy->m_SelObjArray.RemoveAt(i); goto LOOP1; @@ -958,13 +958,13 @@ void CMainFrame::TotalValidateCheckAfterDelete() { for (int i = 0; i < iSize; ++i) { bFound = false; - // ã´.. + // 찾는다.. pVol = m_SelVolArray.GetAt(i); if (pView->m_PVSMgr.IsExistPortalVolumeByPointer((CPortalVolume *)pVol)) { bFound = true; } - // ã.. + // 못찾았으면.. if (!bFound) { m_SelVolArray.RemoveAt(i); goto LOOP2; @@ -973,24 +973,24 @@ void CMainFrame::TotalValidateCheckAfterDelete() { } // 3. m_LastSelectedElement Check.. - if (m_LastSelectedElement.eST != TYPE_SHAPE_ONLY) // Volume̴.. + if (m_LastSelectedElement.eST != TYPE_SHAPE_ONLY) // Volume이다.. { bFound = false; - // ã´.. + // 찾는다.. if (pView->m_PVSMgr.IsExistPortalVolumeByPointer((CPortalVolume *)m_LastSelectedElement.pSelectPointer)) { bFound = true; } - // ã.. + // 못찾았으면.. if (!bFound) { m_LastSelectedElement.pSelectPointer = NULL; } - } else // Shape.. + } else // Shape다.. { bFound = false; - // ã´.. + // 찾는다.. if (pView->m_PVSMgr.IsExistTotalShapeByPointer((ShapeInfo *)m_LastSelectedElement.pSelectPointer)) { bFound = true; } @@ -999,7 +999,7 @@ void CMainFrame::TotalValidateCheckAfterDelete() { bFound = true; } - // ã.. + // 못찾았으면.. if (!bFound) { m_LastSelectedElement.pSelectPointer = NULL; } @@ -1125,7 +1125,7 @@ void CMainFrame::OnTipDeleteUnusedFiles() { std::vector unusedFNs; std::string szFN; - // ϴ ʿ ִ´.. + // 일단 몽땅 다 맵에 넣는다.. mapBase mBases; int iSC = m_pDlgOutputList->GetTotalShapeInfoCount(); @@ -1158,7 +1158,7 @@ void CMainFrame::OnTipDeleteUnusedFiles() { pPart = pShape->Part(j); if (NULL == pPart) { CString szErr; - szErr.Format("NULL Part : %s - %d° Part", pShape->FileName().c_str(), j); + szErr.Format("NULL Part : %s - %d번째 Part", pShape->FileName().c_str(), j); invalidFNs.push_back(szErr.operator LPCTSTR()); continue; } @@ -1170,7 +1170,7 @@ void CMainFrame::OnTipDeleteUnusedFiles() { mBases.insert(valBase(szFN, pPMesh)); } else { CString szErr; - szErr.Format("NULL PMesh : %s - %d° Part", pShape->FileName().c_str(), j); + szErr.Format("NULL PMesh : %s - %d번째 Part", pShape->FileName().c_str(), j); invalidFNs.push_back(szErr.operator LPCTSTR()); } @@ -1183,7 +1183,7 @@ void CMainFrame::OnTipDeleteUnusedFiles() { mBases.insert(valBase(szFN, pTex)); } else { CString szErr; - szErr.Format("NULL Texture : %s - %d° Part, %d° Texture", pShape->FileName().c_str(), j, k); + szErr.Format("NULL Texture : %s - %d번째 Part, %d번째 Texture", pShape->FileName().c_str(), j, k); invalidFNs.push_back(szErr.operator LPCTSTR()); continue; } @@ -1191,7 +1191,7 @@ void CMainFrame::OnTipDeleteUnusedFiles() { } } - // ã.. + // 파일을 찾고.. std::string szPath = CN3Base::PathGet() + "object\\"; ::SetCurrentDirectory(szPath.c_str()); CFileFind ff; @@ -1213,7 +1213,7 @@ void CMainFrame::OnTipDeleteUnusedFiles() { szFN = szFNTmp; it_Base it = mBases.find(szFN); if (it != mBases.end()) { - continue; // ã Ŵ.. + continue; // 찾았으면 쓴거다.. } unusedFNs.push_back(szFN); @@ -1232,7 +1232,7 @@ void CMainFrame::OnTipDeleteUnusedFiles() { } } - // ȭ .. + // 파일 지우기 대화상자 띄우기.. CDlgUnusedFiles dlg; int iUFC = unusedFNs.size(); for (int i = 0; i < iUFC; i++) { @@ -1246,14 +1246,14 @@ void CMainFrame::OnTipDeleteUnusedFiles() { dlg.DoModal(); - // Ʈ.. + // 모두 업데이트.. if (m_pDummy) { m_pDummy->ClearObjs(); } m_SelVolArray.RemoveAll(); m_LastSelectedElement.pSelectPointer = NULL; - this->RefreshSourceObjects(); // Source Object ϰ.. + this->RefreshSourceObjects(); // Source Object 를 갱쉰하고.. if (m_pDlgSourceList) { m_pDlgSourceList->UpdateTree(m_pSceneSource); } diff --git a/src/tool/N3Indoor/MainFrm.h b/src/tool/N3Indoor/MainFrm.h index 643975c6..33915d8a 100644 --- a/src/tool/N3Indoor/MainFrm.h +++ b/src/tool/N3Indoor/MainFrm.h @@ -60,7 +60,7 @@ class CMainFrame : public CFrameWnd, public CN3Base { // States.. public: - e_State m_eState; // .. + e_State m_eState; // 상태 변수들.. e_SelectState m_eSelectState; DWORD m_dwRenderingOption; e_EditMode m_eEditState; @@ -80,20 +80,20 @@ class CMainFrame : public CFrameWnd, public CN3Base { CN3EngTool m_Eng; CN3Camera m_Camera; CN3Light m_Light; - CDlgBase * m_pDlgBase; // ü ȭ.. + CDlgBase * m_pDlgBase; // 객체 등록정보 편집 대화상자.. CTotalToolSheet * m_pTotalSheet; - CDlgShapeList * m_pDlgSourceList; // Object ̾˷α - CDlgShapeList * m_pDlgOutputList; // ʿ ġ Object ̾˷α - CN3Scene * m_pSceneSource; // source object Ͽ ͵ Scene - SelectElement m_LastSelectedElement; // õ ü.. Ŀ ⶧ .. + CDlgShapeList * m_pDlgSourceList; // Object 목록을 보여줄 다이알로그 + CDlgShapeList * m_pDlgOutputList; // 맵에 배치한 Object를 보여줄 다이알로그 + CN3Scene * m_pSceneSource; // source object 목록에 보여줄 것들을 담은 Scene + SelectElement m_LastSelectedElement; // 가장 마지막으로 선택된 객체.. 포커스 맞출때 쓴다.. //................. CArray m_SelVolArray; std::list m_FloorList; - CTransDummy * m_pDummy; // ü ̵ ȸ Ȯ/ ϴ ϴ Ŭ - CPosDummy m_PosDummy; // ̵ - CRotDummy m_RotDummy; // ȸ - CScaleDummy m_ScaleDummy; // Ȯ/ + CTransDummy * m_pDummy; // 물체를 이동 회전 확대/축소 하는 기능을 담당하는 클래스 + CPosDummy m_PosDummy; // 이동 + CRotDummy m_RotDummy; // 회전 + CScaleDummy m_ScaleDummy; // 확대/축소 CSwappedDummy m_SwappedDummy; //.................. @@ -110,19 +110,19 @@ class CMainFrame : public CFrameWnd, public CN3Base { // Implementation public: void FindMinMaxTotalShape(__Vector3 & vecMin, __Vector3 & vecMax); - void OutputDlgRefresh(); // ҽϿ Object OutputScene ؼ ־ش. + void OutputDlgRefresh(); // 소스목록에서 선택한 Object를 넣으면 OutputScene으로 복사해서 넣어준다. CN3Transform * AddChr(CN3Scene * pDestScene, const std::string & szFN, - BOOL bGenerateChainNumber); // ƯScene ij ü ߰ + BOOL bGenerateChainNumber); // 특정Scene에 캐릭터 객체를 복사해 추가 CN3Transform * AddShape(CN3Scene * pDestScene, const std::string & szFN, - BOOL bGenerateChainNumber); // ƯScene Shape ü ߰ + BOOL bGenerateChainNumber); // 특정Scene에 Shape 객체를 복사해 추가 void UpdateShapeInfoDisplay(); - void RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd); // Ư 쿡 Object ׷ش. + void RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd); // 특정 윈도우에 Object를 그려준다. ShapeInfo * GetShapeForDisplay(); void TotalValidateCheckAfterDelete(); // Scene Source.. - void LoadSourceObjects(); // Folder Source Object о´. + void LoadSourceObjects(); // Folder 에서 Source Object 를 읽어온다. void RefreshSourceObjects(); void SetFPSString(LPCTSTR pStr); diff --git a/src/tool/N3Indoor/N3Indoor.cpp b/src/tool/N3Indoor/N3Indoor.cpp index 123e1262..49bbca94 100644 --- a/src/tool/N3Indoor/N3Indoor.cpp +++ b/src/tool/N3Indoor/N3Indoor.cpp @@ -174,7 +174,7 @@ void CN3IndoorApp::Write(const char * lpszFormat, ...) { szFinal[0] = NULL; DWORD dwRWC = 0; - sprintf(szFinal, " [%.2d %.2d %.2d] ", time.wHour, time.wMinute, time.wSecond); + sprintf(szFinal, " [%.2d시 %.2d분 %.2d초] ", time.wHour, time.wMinute, time.wSecond); static char szBuff[1024]; szBuff[0] = NULL; @@ -196,7 +196,7 @@ void CN3IndoorApp::Write(const char * lpszFormat, ...) { } if (hFile) { - ::SetFilePointer(hFile, 0, NULL, FILE_END); // ߰ ϱ ؼ ű.. + ::SetFilePointer(hFile, 0, NULL, FILE_END); // 추가 하기 위해서 파일의 끝으로 옮기고.. WriteFile(hFile, szFinal, iLength, &dwRWC, NULL); CloseHandle(hFile); diff --git a/src/tool/N3Indoor/N3Indoor.rc b/src/tool/N3Indoor/N3Indoor.rc index 4ad46df962a215a076ecf9504e7ef0022ff4ba86..0614e917632420a97d64250b00ecafa8b77af522 100644 GIT binary patch literal 52626 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 diff --git a/src/tool/N3Indoor/N3Indoor.vcxproj.filters b/src/tool/N3Indoor/N3Indoor.vcxproj.filters index 6cf72ea3..9addd4d7 100644 --- a/src/tool/N3Indoor/N3Indoor.vcxproj.filters +++ b/src/tool/N3Indoor/N3Indoor.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/tool/N3Indoor/N3Indoor.vcxproj.user b/src/tool/N3Indoor/N3Indoor.vcxproj.user index 7912fcf6..1aa1e2ae 100644 --- a/src/tool/N3Indoor/N3Indoor.vcxproj.user +++ b/src/tool/N3Indoor/N3Indoor.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\game diff --git a/src/tool/N3Indoor/N3IndoorView.cpp b/src/tool/N3Indoor/N3IndoorView.cpp index 513a8dd2..6e4ed3c9 100644 --- a/src/tool/N3Indoor/N3IndoorView.cpp +++ b/src/tool/N3Indoor/N3IndoorView.cpp @@ -131,7 +131,7 @@ void CN3IndoorView::TickRender() { pFrm->m_Eng.s_lpD3DDev->EndScene(); pFrm->m_Eng.Present(m_hWnd); - // ǥ + // 프레임 표시 DWORD dwTick = GetTickCount(); static DWORD dwTickPrev = dwTick; static CString szFPS; @@ -191,7 +191,7 @@ BOOL CN3IndoorView::ExecuteModeMsgFilter(MSG * pMsg) { case WM_KEYDOWN: { float fRY = 0.01f; switch (pMsg->wParam) { - case 0x41: // .. + case 0x41: // 왼쪽.. if (m_bExecuteCameraTop) { pView->RestoreExecuteCameraChange(); m_bExecuteCameraTop = !m_bExecuteCameraTop; @@ -209,7 +209,7 @@ BOOL CN3IndoorView::ExecuteModeMsgFilter(MSG * pMsg) { } break; - case 0x44: // .. + case 0x44: // 오른쪽.. if (m_bExecuteCameraTop) { pView->RestoreExecuteCameraChange(); m_bExecuteCameraTop = !m_bExecuteCameraTop; @@ -227,7 +227,7 @@ BOOL CN3IndoorView::ExecuteModeMsgFilter(MSG * pMsg) { } break; - case 0x57: // .. + case 0x57: // 전진.. if (m_bExecuteCameraTop) { pView->RestoreExecuteCameraChange(); m_bExecuteCameraTop = !m_bExecuteCameraTop; @@ -249,7 +249,7 @@ BOOL CN3IndoorView::ExecuteModeMsgFilter(MSG * pMsg) { } break; - case 0x53: // .. + case 0x53: // 후진.. if (m_bExecuteCameraTop) { pView->RestoreExecuteCameraChange(); m_bExecuteCameraTop = !m_bExecuteCameraTop; @@ -271,7 +271,7 @@ BOOL CN3IndoorView::ExecuteModeMsgFilter(MSG * pMsg) { } break; - case 0x58: // .. + case 0x58: // 밑으로.. if (m_bExecuteCameraTop) { pView->RestoreExecuteCameraChange(); m_bExecuteCameraTop = !m_bExecuteCameraTop; @@ -287,7 +287,7 @@ BOOL CN3IndoorView::ExecuteModeMsgFilter(MSG * pMsg) { } break; - case 0x43: // .. + case 0x43: // 위로.. if (m_bExecuteCameraTop) { pView->RestoreExecuteCameraChange(); m_bExecuteCameraTop = !m_bExecuteCameraTop; @@ -360,7 +360,7 @@ BOOL CN3IndoorView::CustomCameraMove(MSG * pMsg) { return TRUE; } - // ü ġ + // 나머지 객체 선택 및 배치 static BOOL bSelectDrag = FALSE; switch (pMsg->message) { case WM_KEYDOWN: { @@ -395,7 +395,7 @@ BOOL CN3IndoorView::CustomCameraMove(MSG * pMsg) { } } break; - case WM_LBUTTONDOWN: // ü + case WM_LBUTTONDOWN: // 객체 선택 { if (!::_IsKeyDown(VK_MENU)) { ::SetCapture(pMsg->hwnd); @@ -416,10 +416,10 @@ BOOL CN3IndoorView::CustomCameraMove(MSG * pMsg) { } } break; - case WM_LBUTTONUP: // ü + case WM_LBUTTONUP: // 객체 선택 { if (bSelectDrag) { - if (abs(m_rcSelDrag.left - point.x) < 6 && abs(m_rcSelDrag.top - point.y) < 6) // ŬѰɷ + if (abs(m_rcSelDrag.left - point.x) < 6 && abs(m_rcSelDrag.top - point.y) < 6) // 클릭한걸로 간주 { CPortalVolume * pVol = NULL; pVol = pView->m_PVSMgr.PickCollision(point.x, point.y); @@ -427,7 +427,7 @@ BOOL CN3IndoorView::CustomCameraMove(MSG * pMsg) { pView->SelectVolumeByPick(pVol, (GetAsyncKeyState(VK_SHIFT) & 0xff00) ? false : true); } } else { - // 巹 + // 드레그 한 것 if (m_rcSelDrag.left > point.x) { m_rcSelDrag.right = m_rcSelDrag.left; m_rcSelDrag.left = point.x; @@ -446,7 +446,7 @@ BOOL CN3IndoorView::CustomCameraMove(MSG * pMsg) { bSelectDrag = FALSE; m_rcSelDrag.left = m_rcSelDrag.top = m_rcSelDrag.right = m_rcSelDrag.bottom = 0; - // ġ, ȸ ƮѴ. + // 위치, 회전값등을 업데이트한다. return TRUE; } diff --git a/src/tool/N3Indoor/N3IndoorView.h b/src/tool/N3Indoor/N3IndoorView.h index 4f0e27f8..886f5667 100644 --- a/src/tool/N3Indoor/N3IndoorView.h +++ b/src/tool/N3Indoor/N3IndoorView.h @@ -7,7 +7,7 @@ class CN3IndoorView : public CView { bool m_bSwapped; bool m_bValid; - RECT m_rcSelDrag; // 巡 + RECT m_rcSelDrag; // 드래그 영역 BOOL CustomCameraMove(MSG * pMsg); BOOL ExecuteModeMsgFilter(MSG * pMsg); diff --git a/src/tool/N3Indoor/OrganizeView.cpp b/src/tool/N3Indoor/OrganizeView.cpp index ba3c7f91..0cff1773 100644 --- a/src/tool/N3Indoor/OrganizeView.cpp +++ b/src/tool/N3Indoor/OrganizeView.cpp @@ -146,7 +146,7 @@ void COrganizeView::OnButtonFileName() { // TODO: Add your control notification handler code here CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); if (pFrm->m_strResourcePath.empty()) { - AfxMessageBox(" ҽ θ ϼ.."); + AfxMessageBox("먼저 리소스 경로를 설정하세여.."); } if (pFrm->m_pSceneSource) { @@ -193,7 +193,7 @@ void COrganizeView::OnButtonResourcePath() { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); pFrm->m_strResourcePath = szPath + "\\N3Indoor"; - // .. + // 경로 설정.. CN3Base::PathSet(szPath + "\\N3Indoor"); } @@ -707,7 +707,7 @@ void COrganizeView::OnItemchangingListSelect(NMHDR * pNMHDR, LRESULT * pResult) return; } - // Compile Mode.. + // Compile Mode면.. if (pFrm->m_eState == STATE_COMPILE) { pFrm->GetOrganizeView()->m_PVSMgr.CheckcompileMode(pVol); } @@ -758,7 +758,7 @@ void COrganizeView::SelectVolumeByPick(CPortalVolume * pVol, bool bOne) { __ASSERT(pFrm->m_pDummy, "Oops!! -.-;"); pFrm->m_pDummy->SetSelObj(se, bOne); - // Dummy Size 0 ũ.. pVol .. + // 만약 Dummy Size가 0보다 크고.. pVol이 없으면.. if ((pFrm->m_pDummy->m_SelObjArray.GetSize() > 0) && !pFrm->m_pDummy->IsExistTotalVolByPointer(pVol)) { pVol2 = pFrm->m_pDummy->GetFirstElementTotalVol(); if (pVol2) { @@ -772,7 +772,7 @@ void COrganizeView::SelectVolumeByPick(CPortalVolume * pVol, bool bOne) { m_SelectedListCtrl.SetHotItem(m_iSelectionIndex); RefreshLinkedList(); - // Compile Mode.. + // Compile Mode면.. if (pFrm->m_eState == STATE_COMPILE) { pFrm->GetOrganizeView()->m_PVSMgr.CheckcompileMode(pVol); } @@ -786,7 +786,7 @@ void COrganizeView::SelectVolumeByPick(CPortalVolume * pVol, bool bOne) { m_LinkedListCtrl.SetHotItem(m_iSelectionLinkedShapeIndex); } } else { - // Compile Mode.. + // Compile Mode면.. if (pFrm->m_eState == STATE_COMPILE) { pFrm->GetOrganizeView()->m_PVSMgr.CheckcompileMode(pVol); } @@ -796,12 +796,12 @@ void COrganizeView::SelectVolumeByPick(CPortalVolume * pVol, bool bOne) { if (bOne) { pFrm->m_SelVolArray.RemoveAll(); } else { - // ̹ ߰ ʴ´.. + // 이미 있으면 추가하지 않는다.. LOOP_1: int iSize = pFrm->m_SelVolArray.GetSize(); for (int i = 0; i < iSize; i++) { if (pFrm->m_SelVolArray[i] == pVol) { - // ̹ Ƿ øϿ + // 이미 있으므로 선택목록에서 제거 pFrm->m_SelVolArray.RemoveAt(i); bFound = true; goto LOOP_1; @@ -853,7 +853,7 @@ void COrganizeView::SelectVolumeByPick(CPortalVolume * pVol, bool bOne) { } } -void COrganizeView::SelectObjectByDragRect(RECT * pRect, BOOL bAdd) // 巡 ؼ ü ϱ +void COrganizeView::SelectObjectByDragRect(RECT * pRect, BOOL bAdd) // 드래그 해서 객체 선택하기 { CMainFrame * pFrm = NULL; pFrm = (CMainFrame *)AfxGetMainWnd(); @@ -866,7 +866,7 @@ void COrganizeView::SelectVolumeByPick(CPortalVolume * pVol, bool bOne) { pD3DDev->GetTransform(D3DTS_PROJECTION, &matProj); D3DXMatrixMultiply(&matVP, &matView, &matProj); - // ߿ ^^.. + // 나중에 ^^.. } void COrganizeView::RefreshTotalShape() { @@ -1212,14 +1212,14 @@ bool COrganizeView::OnFileNew() { return false; } - // ۾Ͱ ִ 캻.. + // 기존 작업데이터가 있는자 살펴본다.. if ((m_PVSMgr.m_iTotalCount != 0) || (m_PVSMgr.m_plShapeInfoList.size() > 0)) { - // .. - if (AfxMessageBox("۾ Ͱ ˴ϴ. Ͻðڽϱ?", MB_OKCANCEL | MB_APPLMODAL) == IDCANCEL) { + // 지울것인지 물어본다.. + if (AfxMessageBox("작업중인 데이터가 삭제됩니다. 계속하시겠습니까?", MB_OKCANCEL | MB_APPLMODAL) == IDCANCEL) { return false; } - // -.-; + // 지운다 -.-; m_PVSMgr.DeleteAllPvsObj(); RefreshSelectedList(); RefreshLinkToList(); @@ -1241,7 +1241,7 @@ bool COrganizeView::OnFileNew() { m_ComboFloor.ResetContent(); } - // ī޶ ʱȭ.. + // 카메라등등 초기화.. if (pFrm->m_pDummy) { pFrm->m_pDummy->ClearObjs(); } @@ -1418,12 +1418,12 @@ void COrganizeView::OpenGDFileInternal(std::string strFile) { void COrganizeView::OnFileSaveWorkshop() { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); if (pFrm->m_strFileName.size() <= 0) { - AfxMessageBox("SourceList ϴ..Data Դϴ.."); + AfxMessageBox("SourceList가 없습니다..Data는 저장되지 않을것 입니다.."); return; } if (!GetDlgItemInt(IDC_TOTAL_MOVE_X) || !GetDlgItemInt(IDC_TOTAL_MOVE_X) || !GetDlgItemInt(IDC_TOTAL_MOVE_Z)) { - AfxMessageBox("Map Offset 0 Դϴ.Data Դϴ.."); + AfxMessageBox("Map Offset이 0 입니다.Data는 저장되지 않을것 입니다.."); return; } @@ -1440,12 +1440,12 @@ void COrganizeView::OnFileSaveWorkshop() { void COrganizeView::OnFileSaveGamedata() { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); if (pFrm->m_strFileName.size() <= 0) { - AfxMessageBox("SourceList ϴ..Data Դϴ.."); + AfxMessageBox("SourceList가 없습니다..Data는 저장되지 않을것 입니다.."); return; } if (!GetDlgItemInt(IDC_TOTAL_MOVE_X) || !GetDlgItemInt(IDC_TOTAL_MOVE_X) || !GetDlgItemInt(IDC_TOTAL_MOVE_Z)) { - AfxMessageBox("Map Offset 0 Դϴ.Data Դϴ.."); + AfxMessageBox("Map Offset이 0 입니다.Data는 저장되지 않을것 입니다.."); return; } @@ -1466,9 +1466,9 @@ void COrganizeView::OnFileSaveGamedata() { //////////////////////////////////////////////////////////////////////// void COrganizeView::OnFileServerData() { - // ۾Ͱ ִ 캻.. + // 기존 작업데이터가 있는자 살펴본다.. if (!(m_PVSMgr.m_iTotalCount && m_PVSMgr.m_plShapeInfoList.size())) { - AfxMessageBox("Data ϴ..Data Դϴ.."); + AfxMessageBox("Data가 없습니다..Data는 저장되지 않을것 입니다.."); return; } @@ -1530,24 +1530,24 @@ void COrganizeView::WriteCollisionData(HANDLE hFile, int iMax) { const int TERRAIN_CELL_SIZE = 4; float fSize = (iMax - 1) * TERRAIN_CELL_SIZE; - WriteFile(hFile, &fSize, 4, &dwNum, NULL); // ʺ - WriteFile(hFile, &fSize, 4, &dwNum, NULL); // + WriteFile(hFile, &fSize, 4, &dwNum, NULL); // 맵 실제 미터 단위 너비 + WriteFile(hFile, &fSize, 4, &dwNum, NULL); // 맵 실제 미터 단위 길이 - // 浹 üũ .. + // 충돌 체크 폴리곤 데이터 쓰기.. int iColCount = 0; WriteFile(hFile, &iColCount, 4, &dwNum, NULL); - const int CELL_MAIN_DEVIDE = 4; // μ 4 X 4 꼿 .. - const int CELL_SUB_SIZE = 4; // 4 Meter 꼿 ̴.. - const int CELL_MAIN_SIZE = CELL_MAIN_DEVIDE * CELL_SUB_SIZE; // μ ũ 꼿 X 꼿 ũ̴. + const int CELL_MAIN_DEVIDE = 4; // 메인셀은 4 X 4 의 서브셀로 나뉜다.. + const int CELL_SUB_SIZE = 4; // 4 Meter 가 서브셀의 사이즈이다.. + const int CELL_MAIN_SIZE = CELL_MAIN_DEVIDE * CELL_SUB_SIZE; // 메인셀 크기는 서브셀갯수 X 서브셀 크기이다. - // Cell Data . + // Cell Data 쓰기. int z = 0; for (float fZ = 0.0f; fZ < fSize; fZ += CELL_MAIN_SIZE, z++) { int x = 0; for (float fX = 0.0f; fX < fSize; fX += CELL_MAIN_SIZE, x++) { BOOL bExist = FALSE; - WriteFile(hFile, &bExist, 4, &dwNum, NULL); // Ͱ ִ .. + WriteFile(hFile, &bExist, 4, &dwNum, NULL); // 데이터가 있는 셀인지 쓰고.. } } } @@ -1581,7 +1581,7 @@ void COrganizeView::WriteObjectEventData(HANDLE hFile, int iFloor) { siiter siit = pVol->m_plShapeInfoList.begin(); while (siit != pVol->m_plShapeInfoList.end()) { pSI = *siit++; - if (pSI->m_iEventID || pSI->m_iEventType || pSI->m_iNPC_ID || pSI->m_iNPC_Status) { // ̺Ʈ + if (pSI->m_iEventID || pSI->m_iEventType || pSI->m_iNPC_ID || pSI->m_iNPC_Status) { // 이벤트가 있으면 iCount++; } } @@ -1599,7 +1599,7 @@ void COrganizeView::WriteObjectEventData(HANDLE hFile, int iFloor) { siiter siit = pVol->m_plShapeInfoList.begin(); while (siit != pVol->m_plShapeInfoList.end()) { pSI = *siit++; - if (pSI->m_iEventID || pSI->m_iEventType || pSI->m_iNPC_ID || pSI->m_iNPC_Status) // ̺Ʈ + if (pSI->m_iEventID || pSI->m_iEventType || pSI->m_iNPC_ID || pSI->m_iNPC_Status) // 이벤트가 있으면 { WriteFile(hFile, &(pSI->m_iBelong), 4, &dwNum, NULL); sEvent = (short)(pSI->m_iEventID); @@ -1653,7 +1653,7 @@ void COrganizeView::WriteTerrainData(HANDLE hFile, int iMax, int iFloor) { iTempOffs += 4; TRACE1("File Offset %d\n", iTempOffs); - // ׳ ϳ ص Ʈũ Ҷ ڸ ̰ Ѳ ؾ .. ... + // 그냥 하나씩 저장해도 차이 없지만 네트워크로 저장할때는 파일 엑세스 숫자를 줄이고 한꺼번에 저장해야 빠르다.. ... DWORD dwAlloc = iMax * iMax * sizeof(float); HGLOBAL hAlloc = ::GlobalAlloc(GMEM_FIXED, dwAlloc); __ASSERT(hAlloc, "Global allocation failed."); @@ -1665,7 +1665,7 @@ void COrganizeView::WriteTerrainData(HANDLE hFile, int iMax, int iFloor) { } } - WriteFile(hFile, pfHeights, dwAlloc, &dwNum, NULL); // Ͽ .. + WriteFile(hFile, pfHeights, dwAlloc, &dwNum, NULL); // 파일에 쓴다.. iTempOffs += dwAlloc; TRACE1("File Offset %d\n", iTempOffs); pfHeights = NULL; @@ -1858,7 +1858,7 @@ void COrganizeView::OnSetFloor() { int iSize = pFrm->m_SelVolArray.GetSize(); if (iSize < 1) { - AfxMessageBox("õǾִ Volume ϴ...."); + AfxMessageBox("선택되어있는 Volume이 없습니다...."); return; } @@ -1870,7 +1870,7 @@ void COrganizeView::OnSetFloor() { int iCur = FDlg.GetFloor(); - // ߰.. + // 데이터 추가.. FloorInfo FInfo; FInfo.m_iFloor = iCur; for (int i = 0; i < iSize; i++) { @@ -1879,9 +1879,9 @@ void COrganizeView::OnSetFloor() { pFrm->m_FloorList.push_back(FInfo); - // ComboBox ߰.. + // ComboBox 추가.. CString str; - str.Format("%d ", iCur); + str.Format("%d 층", iCur); m_ComboFloor.AddString(str); iSize = m_ComboFloor.GetCount(); m_ComboFloor.SetCurSel(iSize - 1); @@ -1935,7 +1935,7 @@ void COrganizeView::RefreshFloorCombo() { FInfo = *vfit++; CString str; - str.Format("%d ", FInfo.m_iFloor); + str.Format("%d 층", FInfo.m_iFloor); m_ComboFloor.AddString(str); iSize = m_ComboFloor.GetCount(); m_ComboFloor.SetCurSel(iSize - 1); @@ -1971,10 +1971,10 @@ void COrganizeView::RefreshFloorInfoAll(int iID) { FInfo.m_vVolume.push_back(vecVol[i]); } - if (iCount != 0) // Ѱ .. + if (iCount != 0) // 한개라도 남아있으면.. { CString str; - str.Format("%d ", FInfo.m_iFloor); + str.Format("%d 층", FInfo.m_iFloor); m_ComboFloor.AddString(str); int iSize = m_ComboFloor.GetCount(); m_ComboFloor.SetCurSel(iSize - 1); @@ -1984,7 +1984,7 @@ void COrganizeView::RefreshFloorInfoAll(int iID) { m_FloorVector.push_back(FInfo); } - // .. + // 전부 지운다.. vfit = pFrm->m_FloorList.begin(); while (vfit != pFrm->m_FloorList.end()) { FInfo = *vfit++; diff --git a/src/tool/N3Indoor/OrganizeView.h b/src/tool/N3Indoor/OrganizeView.h index 60db1538..605faa61 100644 --- a/src/tool/N3Indoor/OrganizeView.h +++ b/src/tool/N3Indoor/OrganizeView.h @@ -60,7 +60,7 @@ class COrganizeView : public CFormView { //.. void OnCurserSelect(e_EditMode eED); void SelectVolumeByPick(CPortalVolume * pVol, bool bOne = true); - void SelectObjectByDragRect(RECT * pRect, BOOL bAdd); // 巡 ؼ ü ϱ + void SelectObjectByDragRect(RECT * pRect, BOOL bAdd); // 드래그 해서 객체 선택하기 void TickRender(); diff --git a/src/tool/N3Indoor/PVSDef.h b/src/tool/N3Indoor/PVSDef.h index e69de29b..8b137891 100644 --- a/src/tool/N3Indoor/PVSDef.h +++ b/src/tool/N3Indoor/PVSDef.h @@ -0,0 +1 @@ + diff --git a/src/tool/N3Indoor/PVSManager.cpp b/src/tool/N3Indoor/PVSManager.cpp index f1755519..96045c91 100644 --- a/src/tool/N3Indoor/PVSManager.cpp +++ b/src/tool/N3Indoor/PVSManager.cpp @@ -204,7 +204,7 @@ void CPVSManager::DeleteTotalShapeLinkByiOrder(int iOrder) { pSI = *siit; - // Shape ִ Volume ãƼ.. óѴ.. + // 먼저 지워질 Shape를 가지고 있는 Volume들을 찾아서.. 처리한다.. ShapePart * pSP = NULL; CPortalVolume * pVol = NULL; @@ -230,7 +230,7 @@ void CPVSManager::DeleteTotalShapeLinkByiOrder(int iOrder) { m_plShapeInfoList.erase(siit); } -// Edit .. +// Edit 모드.. void CPVSManager::TickEdit() { CPortalVolume * pVol = NULL; WVOL wvol; @@ -340,7 +340,7 @@ void CPVSManager::RenderEdit() { } } -// Compile .. +// Compile 모드.. void CPVSManager::TickCompile() { CPortalVolume * pVol = NULL; WVOL wvol; @@ -385,13 +385,13 @@ bool CPVSManager::StartExecuteMode() { int iSize = pFrm->m_SelVolArray.GetSize(); if (iSize < 1) { - AfxMessageBox("õǾִ Volume ϴ...."); + AfxMessageBox("선택되어있는 Volume이 없습니다...."); return false; } m_pCurVol = pFrm->m_SelVolArray.GetAt(0); - // Camera Ѵ.. + // Camera를 셋팅한다.. m_vBackupEye = pFrm->m_Camera.EyePos(); m_vBackupAt = pFrm->m_Camera.AtPos(); @@ -405,7 +405,7 @@ bool CPVSManager::StartExecuteMode() { } void CPVSManager::EndExecuteMode() { - // Camera Ѵ.. + // Camera 셋팅을 복구한다.. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); pFrm->m_Camera.EyePosSet(m_vBackupEye); pFrm->m_Camera.UpVectorSet(__Vector3(0.0f, 1.0f, 0.0f)); @@ -415,12 +415,12 @@ void CPVSManager::EndExecuteMode() { void CPVSManager::ExecuteCameraChange() { if (m_pPvsList.size() < 1) { - AfxMessageBox(" Ʈ ϴ...."); + AfxMessageBox("선택 가능한 리스트가 없습니다...."); return; } if (!m_pCurVol) { - AfxMessageBox("õǾִ Volume ϴ...."); + AfxMessageBox("선택되어있는 Volume이 없습니다...."); return; } @@ -443,7 +443,7 @@ void CPVSManager::RestoreExecuteCameraChange() { pFrm->m_Camera.Apply(); } -// Execute .. +// Execute 모드.. void CPVSManager::TickExecute() { CPortalVolume * pVol = NULL; CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); @@ -597,7 +597,7 @@ void CPVSManager::TotalCollisionRenderEdit() { if ((pSI = pView->GetSelectedTotalShape()) && pSI) { pSI->m_pShape->Tick(-1000); - // εҶ ̸ .. + // 로딩할때 미리 계산해 놓은 월드 행렬 적용.. __Matrix44 mtxBackup; CN3Base::s_lpD3DDev->GetTransform(D3DTS_WORLD, &mtxBackup); CN3Base::s_lpD3DDev->SetTransform(D3DTS_WORLD, &pSI->m_Matrix); @@ -614,7 +614,7 @@ void CPVSManager::TotalCollisionRenderEdit() { pSI = *siit++; pSI->m_pShape->Tick(-1000); - // εҶ ̸ .. + // 로딩할때 미리 계산해 놓은 월드 행렬 적용.. __Matrix44 mtxBackup; CN3Base::s_lpD3DDev->GetTransform(D3DTS_WORLD, &mtxBackup); CN3Base::s_lpD3DDev->SetTransform(D3DTS_WORLD, &pSI->m_Matrix); @@ -653,7 +653,7 @@ void CPVSManager::SplitShapeToVolumn(CDialog * pDlg) { pSI->m_pShape->Tick(); pSI->m_pShape->SetMaxLOD(); - // ǰ.. + // 뽀갠다.. CPortalVolume * pVol = NULL; iter it = m_pPvsList.begin(); @@ -664,7 +664,7 @@ void CPVSManager::SplitShapeToVolumn(CDialog * pDlg) { pVol = *it++; - // Shape ŭ 鼭.. Transform Ű.. ˻.. + // Shape의폴리곤 갯수만큼 돌면서.. 먼저 Transform 시키고.. 검사.. pVol->SplitAndMakeShape(pSI); pVol->SplitAndMakeCollision(pSI); } @@ -686,7 +686,7 @@ void CPVSManager::RegisterShape(std::string szStr, CN3Shape * pShape) { void CPVSManager::DoAllCompile() { if (m_pPvsList.size() < 1) { - AfxMessageBox(" Ʈ ϴ...."); + AfxMessageBox("선택 가능한 리스트가 없습니다...."); return; } @@ -770,7 +770,7 @@ void CPVSManager::CheckcompileMode(CPortalVolume * pVol) { void CPVSManager::ComputeVisibilty(CPortalVolume * const pVol) { SetPriority(pVol); - // ӵ ϱ ؼ.. 켱 .. Ѵ.. + // 렌더링 속도를 빠르게 하기 위해서.. 우선순위대로 정렬한 후.. 순서대로 렌더링한다.. std::priority_queue, Myless> pQueue; CPortalVolume * pVolTo = NULL; @@ -791,7 +791,7 @@ void CPVSManager::ComputeVisibilty(CPortalVolume * const pVol) { pQueue.pop(); } - // ׿ Լ.. ^^ + // 디버그용 함수.. ^^ DebugFunc(); } @@ -940,7 +940,7 @@ bool CPVSManager::Save(HANDLE hFile) { iT = pView->GetDlgItemInt(IDC_TOTAL_MOVE_Z); WriteFile(hFile, &iT, sizeof(int), &dwNum, NULL); - // ü Shape.. + // 전체 Shape.. int iCount = m_plShapeInfoList.size(); WriteFile(hFile, &iCount, sizeof(int), &dwNum, NULL); @@ -951,7 +951,7 @@ bool CPVSManager::Save(HANDLE hFile) { WriteFile(hFile, &pSI->m_iID, sizeof(int), &dwNum, NULL); WriteCryptographString(hFile, pSI->m_strShapeFile); - // Shape .. + // Shape의 데이터 저장.. WriteFile(hFile, &pSI->m_iBelong, sizeof(int), &dwNum, NULL); WriteFile(hFile, &pSI->m_iEventID, sizeof(int), &dwNum, NULL); WriteFile(hFile, &pSI->m_iEventType, sizeof(int), &dwNum, NULL); @@ -966,7 +966,7 @@ bool CPVSManager::Save(HANDLE hFile) { iter it = m_pPvsList.begin(); while (it != m_pPvsList.end()) { - // ڽ .. + // 자신의 데이터 저장.. pVol = *it++; pVol->Save(hFile, m_bGameData); } @@ -1026,7 +1026,7 @@ bool CPVSManager::Load(HANDLE hFile) { } if (!pFrm->m_pSceneSource) { - AfxMessageBox("SourceList Load ߽ϴ..Data ε Դϴ.."); + AfxMessageBox("SourceList를 Load하지 못했습니다..Data는 로드되지 않을것 입니다.."); return false; } @@ -1046,7 +1046,7 @@ bool CPVSManager::Load(HANDLE hFile) { m_iTotalCount = 0; m_iCurIndex = -1; - // ü Shape ε.. + // 전체 Shape 갯수 로드.. int iCount, iCount2; ReadFile(hFile, &iCount, sizeof(int), &dwNum, NULL); @@ -1054,11 +1054,11 @@ bool CPVSManager::Load(HANDLE hFile) { ShapeInfo * pSI = new ShapeInfo; ReadFile(hFile, &pSI->m_iID, sizeof(int), &dwNum, NULL); - // ڿ .. + // 문자열 길이.. strSrc = ReadDecryptString(hFile); pSI->m_strShapeFile = strSrc; - // SourceList.. Shape Pointer Ѵ.. + // SourceList에서.. Shape의 Pointer를 연결한다.. pSI->m_pShape = pFrm->m_pSceneSource->ShapeGetByFileName(strSrc); ASSERT(pSI->m_pShape); @@ -1087,7 +1087,7 @@ bool CPVSManager::Load(HANDLE hFile) { m_pPvsList.push_back(pVol); } - // ũ ̵ о Ŵ.. + // 링크된 아이디들을 읽어서 연결시킴.. WVID wvid; WVOL wvol; IDAndPriority IDAP; @@ -1185,7 +1185,7 @@ CPortalVolume * CPVSManager::GetPortalVolPointerByID(int iID) { iter it = m_pPvsList.begin(); while (it != m_pPvsList.end()) { - // ڽ .. + // 자신의 데이터 저장.. pVol = *it++; if (pVol->m_iID == iID) { return pVol; @@ -1311,7 +1311,7 @@ CPortalVolume * CPVSManager::PickCollision(float fx, float fy) { it = m_pPvsList.begin(); while (it != m_pPvsList.end()) { pVol = *it++; - if (pVol->PickWithVolume(vPos, vDir, &vPick)) // üũ ұϴٰ.. + if (pVol->PickWithVolume(vPos, vDir, &vPick)) // 양면 체크 할까하다가.. { fDT = (vPick - CN3Base::s_CameraData.vEye).Magnitude(); if (fDT <= fDistMax) { @@ -1323,7 +1323,7 @@ CPortalVolume * CPVSManager::PickCollision(float fx, float fy) { return pVolNe; - // Volume ŭ 鼭.. Volume Shape ˻Ѵ.. ߿ .. + // 먼저 Volume 갯수만큼 돌면서.. Volume에 링큳된 Shape들을 먼저 검사한다.. 나중에 구현.. } void CPVSManager::UpdatePosAll(float fx, float fy, float fz) { diff --git a/src/tool/N3Indoor/PVSManager.h b/src/tool/N3Indoor/PVSManager.h index a384c995..4a1fc8a8 100644 --- a/src/tool/N3Indoor/PVSManager.h +++ b/src/tool/N3Indoor/PVSManager.h @@ -18,7 +18,7 @@ class COrganizeView; -// 켱 .. +// 우선순위대로 정렬.. template struct Myless : public std::less { bool operator()(const T & x, const T & y) const { return (x->m_iPriority > y->m_iPriority); } }; @@ -77,15 +77,15 @@ class CPVSManager : public CN3BaseFileAccess { bool Save(HANDLE hFile); void SetMaxShapeIndex(); - // Edit .. + // Edit 모드.. void TickEdit(); void RenderEdit(); - // Compile .. + // Compile 모드.. void TickCompile(); void RenderCompile(); - // Execute .. + // Execute 모드.. void TickExecute(); void RenderExecute(); @@ -108,7 +108,7 @@ class CPVSManager : public CN3BaseFileAccess { // Utility.. e_PvsWallType GetReverseWallType(e_PvsWallType ePWT); - // Visibility Ѵ.. + // Visibility를 결정한다.. void ComputeVisibilty(CPortalVolume * const pVol); void SetPriority(CPortalVolume * const pVol); void SetPriorityEx(CPortalVolume * const pVol, e_PvsWallType ePWT, int iRecursive); @@ -118,10 +118,10 @@ class CPVSManager : public CN3BaseFileAccess { void SetPriorityNoneRecursiveEx(CPortalVolume * const pVol, int iRecursive); void DebugFunc(); - // Shape ° ɰ.. + // Shape를 공간에 맞게 쪼갠다.. void SplitShapeToVolumn(CDialog * pDlg); - // Shape Ʈ Ѵ.. + // Shape를 리스트에 등록한다.. void RegisterShape(std::string szStr, CN3Shape * pShape); bool IsValidPortalVolume(CPortalVolume * pVol); diff --git a/src/tool/N3Indoor/PortalVol.cpp b/src/tool/N3Indoor/PortalVol.cpp index dd82c0e7..7673d2e6 100644 --- a/src/tool/N3Indoor/PortalVol.cpp +++ b/src/tool/N3Indoor/PortalVol.cpp @@ -43,7 +43,7 @@ CPortalVol::CPortalVol() { unsigned short * pIdx = m_pIndex; - // Ʒ. + // 아랫면. *pIdx++ = 0; *pIdx++ = 1; *pIdx++ = 3; @@ -51,7 +51,7 @@ CPortalVol::CPortalVol() { *pIdx++ = 3; *pIdx++ = 1; - // ո.. + // 앞면.. *pIdx++ = 7; *pIdx++ = 3; *pIdx++ = 6; @@ -59,7 +59,7 @@ CPortalVol::CPortalVol() { *pIdx++ = 6; *pIdx++ = 3; - // .. + // 왼쪽.. *pIdx++ = 4; *pIdx++ = 0; *pIdx++ = 7; @@ -67,7 +67,7 @@ CPortalVol::CPortalVol() { *pIdx++ = 7; *pIdx++ = 0; - // .. + // 오른쪽.. *pIdx++ = 6; *pIdx++ = 2; *pIdx++ = 5; @@ -75,7 +75,7 @@ CPortalVol::CPortalVol() { *pIdx++ = 5; *pIdx++ = 2; - // ޸.. + // 뒷면.. *pIdx++ = 5; *pIdx++ = 1; *pIdx++ = 4; @@ -83,7 +83,7 @@ CPortalVol::CPortalVol() { *pIdx++ = 4; *pIdx++ = 1; - // .. + // 윗면.. *pIdx++ = 4; *pIdx++ = 7; *pIdx++ = 5; @@ -373,7 +373,7 @@ void CPortalVol::RenderShape() { return; } - // PMesh Index Buffer .. + // PMesh에 전달할 Index Buffer를 만든다.. viter vit = m_viIndex.begin(); __VPI vpi; @@ -419,7 +419,7 @@ void CPortalVol::RenderShape() { } void CPortalVol::RenderCollision() { - // .. + // 행렬 계산.. __Matrix44 mtxWorld; mtxWorld.Identity(); @@ -569,7 +569,7 @@ void CPortalVol::Load(FILE * stream) { unsigned short * pIdx = m_pIndex; - // Ʒ. + // 아랫면. *pIdx++ = 0; *pIdx++ = 1; *pIdx++ = 3; @@ -577,7 +577,7 @@ void CPortalVol::Load(FILE * stream) { *pIdx++ = 3; *pIdx++ = 1; - // ո.. + // 앞면.. *pIdx++ = 7; *pIdx++ = 3; *pIdx++ = 6; @@ -585,7 +585,7 @@ void CPortalVol::Load(FILE * stream) { *pIdx++ = 6; *pIdx++ = 3; - // .. + // 왼쪽.. *pIdx++ = 4; *pIdx++ = 0; *pIdx++ = 7; @@ -593,7 +593,7 @@ void CPortalVol::Load(FILE * stream) { *pIdx++ = 7; *pIdx++ = 0; - // .. + // 오른쪽.. *pIdx++ = 6; *pIdx++ = 2; *pIdx++ = 5; @@ -601,7 +601,7 @@ void CPortalVol::Load(FILE * stream) { *pIdx++ = 5; *pIdx++ = 2; - // ޸.. + // 뒷면.. *pIdx++ = 5; *pIdx++ = 1; *pIdx++ = 4; @@ -609,7 +609,7 @@ void CPortalVol::Load(FILE * stream) { *pIdx++ = 4; *pIdx++ = 1; - // .. + // 윗면.. *pIdx++ = 4; *pIdx++ = 7; *pIdx++ = 5; @@ -638,11 +638,11 @@ void CPortalVol::Load(FILE * stream) { Translate(); - // ũ ε.. + // 링크된 갯수를 로드.. int iLinkedCount = 0; fread(&iLinkedCount, sizeof(int), 1, stream); - // ũ ̵ ε.. + // 링크된 아이디 로드.. int iID; for (int i = 0; i < iLinkedCount; i++) { fread(&iID, sizeof(int), 1, stream); @@ -651,16 +651,16 @@ void CPortalVol::Load(FILE * stream) { } void CPortalVol::Save(FILE * stream) { - // ڽ Ÿ .. + // 먼저 자신의 타입을 저장.. fwrite(&_iTypeVolumn, sizeof(int), 1, stream); - // ڽ ̵ .. + // 자신의 아이디를 저장.. fwrite(&m_iID, sizeof(int), 1, stream); - // ڽ .. + // 자신의 데이터 저장.. CPvsBase::Save(stream); - // ũ .. + // 링크된 갯수를 저장.. int iCount = 0; iter it = m_pPvsList.begin(); while (it != m_pPvsList.end()) { @@ -669,7 +669,7 @@ void CPortalVol::Save(FILE * stream) { } fwrite(&iCount, sizeof(int), 1, stream); - //ũ ̵ .. + //링크된 아이디 저장.. CPvsBase * pBase = NULL; it = m_pPvsList.begin(); while (it != m_pPvsList.end()) { @@ -708,8 +708,8 @@ void CPortalVol::SplitAndMakeShape(CN3Shape * pShape) { GAPP->Write("Part Count %d", iPartCount); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - // Index Buffer .. Vertex Buffer ؼ.. ؽ .. - // (3 ؽ ) ʴ ٸ.. ε ۿ Ѵ.. + // 기존 Index Buffer 에서.. Vertex Buffer를 참조해서.. 버텍스를 얻어낸다음.. + // 폴리곤 단위(3개의 버텍스가 전부)로 보이지 않는 다면.. 인덱스 버퍼에서 제거한다.. for (int i = 0; i < iPartCount; i++) { int iIndexCount = pShape->GetIndexbufferCount(i); @@ -932,7 +932,7 @@ bool CPortalVol::IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vD __Vector3 pVec; float fDet; - // By : Ecli666 ( On 2001-09-12 10:39:01 ) + // By : Ecli666 ( On 2001-09-12 오전 10:39:01 ) pVec.Cross(vEdge1, vEdge2); fDet = pVec.Dot(vDir); @@ -940,13 +940,13 @@ bool CPortalVol::IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vD return false; } - // ~(By Ecli666 On 2001-09-12 10:39:01 ) + // ~(By Ecli666 On 2001-09-12 오전 10:39:01 ) pVec.Cross(vDir, vEdge2); // If determinant is near zero, ray lies in plane of triangle fDet = vEdge1.Dot(pVec); - if (fDet < 0.0001f) { // 0 ﰢ ϴ. + if (fDet < 0.0001f) { // 거의 0에 가까우면 삼각형 평면과 지나가는 선이 평행하다. return false; } @@ -976,17 +976,17 @@ bool CPortalVol::IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vD fU *= fInvDet; fV *= fInvDet; - // t Ŭ ָ ִ. - // t*dir + orig ϸ ִ. - // u v ǹ̴ ϱ? - // : v0 (0,0), v1(1,0), v2(0,1) <ȣ (U, V)ǥ> ̷ Ÿ + // t가 클수록 멀리 직선과 평면과 만나는 점이 멀다. + // t*dir + orig 를 구하면 만나는 점을 구할 수 있다. + // u와 v의 의미는 무엇일까? + // 추측 : v0 (0,0), v1(1,0), v2(0,1) <괄호안은 (U, V)좌표> 이런식으로 어느 점에 가깝나 나타낸 것 같음 // if (pVCol) { - (*pVCol) = vOrig + (vDir * fT); // .. + (*pVCol) = vOrig + (vDir * fT); // 접점을 계산.. } - // *t < 0 ̸ ... + // *t < 0 이면 뒤쪽... if (fT < 0.0f) { return false; } diff --git a/src/tool/N3Indoor/PortalVol.h b/src/tool/N3Indoor/PortalVol.h index 41634403..e01d16fa 100644 --- a/src/tool/N3Indoor/PortalVol.h +++ b/src/tool/N3Indoor/PortalVol.h @@ -32,22 +32,22 @@ class CPortalVol : public CPvsBase { __VertexColor m_pvVertex[8]; unsigned short m_pIndex[36]; - // ε忡 ʿ ߰ .. + // 로드에 필요한 중간 데이터.. std::list m_piIDList; //.. std::list m_pPvsList; - //.. 忡 ʿ .. + //.. 컴파일 모드에서 필요한 거.. std::list m_pVisibleiIDList; - //.. pvsMgr Tick ʿ .. + //.. pvsMgr의 Tick에서 필요한 거.. e_ExtBool m_eRenderType; - //.. 忡 Portal 켱.. -1 Ŭ Ѵ.. 0 ڱ ڽ.. + //.. 컴파일 모드에서 Portal의 우선순위.. -1로 먼저 클리어 한다음.. 0 순위는 자기 자신.. int m_iPriority; - //.. Shape ̸.. + //.. Shape 파일 이름.. std::string m_strShapeFile; CN3Shape * m_pShape; __Matrix44 m_MtxShapeMove; diff --git a/src/tool/N3Indoor/PortalVolume.cpp b/src/tool/N3Indoor/PortalVolume.cpp index 88efd45d..215d693d 100644 --- a/src/tool/N3Indoor/PortalVolume.cpp +++ b/src/tool/N3Indoor/PortalVolume.cpp @@ -37,7 +37,7 @@ CPortalVolume::CPortalVolume() { unsigned short * pIdx = m_pIndex; - // Ʒ. + // 아랫면. *pIdx++ = 0; *pIdx++ = 1; *pIdx++ = 3; @@ -45,7 +45,7 @@ CPortalVolume::CPortalVolume() { *pIdx++ = 3; *pIdx++ = 1; - // ո.. + // 앞면.. *pIdx++ = 7; *pIdx++ = 3; *pIdx++ = 6; @@ -53,7 +53,7 @@ CPortalVolume::CPortalVolume() { *pIdx++ = 6; *pIdx++ = 3; - // .. + // 왼쪽.. *pIdx++ = 4; *pIdx++ = 0; *pIdx++ = 7; @@ -61,7 +61,7 @@ CPortalVolume::CPortalVolume() { *pIdx++ = 7; *pIdx++ = 0; - // .. + // 오른쪽.. *pIdx++ = 6; *pIdx++ = 2; *pIdx++ = 5; @@ -69,7 +69,7 @@ CPortalVolume::CPortalVolume() { *pIdx++ = 5; *pIdx++ = 2; - // ޸.. + // 뒷면.. *pIdx++ = 5; *pIdx++ = 1; *pIdx++ = 4; @@ -77,7 +77,7 @@ CPortalVolume::CPortalVolume() { *pIdx++ = 4; *pIdx++ = 1; - // .. + // 윗면.. *pIdx++ = 4; *pIdx++ = 7; *pIdx++ = 5; @@ -88,7 +88,7 @@ CPortalVolume::CPortalVolume() { m_eState = STATE_NONE; m_eRenderType = TYPE_UNKNOWN; - m_iPriority = -1; //.. 忡 Portal 켱.. -1 Ŭ Ѵ.. 0 ڱ ڽ.. + m_iPriority = -1; //.. 컴파일 모드에서 Portal의 우선순위.. -1로 먼저 클리어 한다음.. 0 순위는 자기 자신.. } CPortalVolume::~CPortalVolume() { @@ -598,7 +598,7 @@ void CPortalVolume::RenderCollisionEdit() { pSI->m_pShape->Tick(-1000); pSI->m_pShape->m_bDontRender = false; - // εҶ ̸ .. + // 로딩할때 미리 계산해 놓은 월드 행렬 적용.. __Matrix44 mtxBackup; CN3Base::s_lpD3DDev->GetTransform(D3DTS_WORLD, &mtxBackup); CN3Base::s_lpD3DDev->SetTransform(D3DTS_WORLD, &pSI->m_pShape->m_Matrix); @@ -691,7 +691,7 @@ void CPortalVolume::RenderCollisionCompile() { while (ciit != m_lpShapeColPartList.end()) { pCI = *ciit++; - // .. + // 행렬 계산.. __Matrix44 mtxWorld; mtxWorld.Identity(); @@ -729,16 +729,16 @@ void CPortalVolume::RenderCollisionExecute() { bool CPortalVolume::Load(HANDLE hFile, bool bGameData) { CN3Transform::Load(hFile); - // ڽ ε.. + // 자신의 데이터 로드.. DWORD dwNum; std::string strSrc; - // ũ ε.. + // 링크된 갯수를 로드.. int iLinkedCount = 0; ReadFile(hFile, &iLinkedCount, sizeof(int), &dwNum, NULL); - // ũ ̵ ε.. + // 링크된 아이디 로드.. WVID wvid; for (int i = 0; i < iLinkedCount; i++) { ReadFile(hFile, &wvid.iID, sizeof(int), &dwNum, NULL); @@ -748,7 +748,7 @@ bool CPortalVolume::Load(HANDLE hFile, bool bGameData) { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - // ũ Shape ε.. + // 링크된 Shape 갯수 로드.. int iCount = 0; int iSize = 0; ReadFile(hFile, &iCount, sizeof(int), &dwNum, NULL); @@ -756,11 +756,11 @@ bool CPortalVolume::Load(HANDLE hFile, bool bGameData) { ShapeInfo * pSI = new ShapeInfo; ReadFile(hFile, &pSI->m_iID, sizeof(int), &dwNum, NULL); - // ڿ .. + // 문자열 길이.. strSrc = CPVSManager::ReadDecryptString(hFile); pSI->m_strShapeFile = strSrc; - // SourceList.. Shape Pointer Ѵ.. + // SourceList에서.. Shape의 Pointer를 연결한다.. pSI->m_pShape = pFrm->m_pSceneSource->ShapeGetByFileName(strSrc); ASSERT(pSI->m_pShape); @@ -851,17 +851,17 @@ bool CPortalVolume::Save(HANDLE hFile, bool bGameData) { DWORD dwNum; std::string strSrc; - // ڽ ̵ .. + // 자신의 아이디를 저장.. WriteFile(hFile, &m_iID, sizeof(int), &dwNum, NULL); - // ڽ .. + // 자신의 데이터 저장.. CN3Transform::Save(hFile); - // ũ .. + // 링크된 갯수를 저장.. int iCount = m_VoltList.size(); WriteFile(hFile, &iCount, sizeof(int), &dwNum, NULL); - //ũ ̵ .. + //링크된 아이디 저장.. WVOL wvol; witer wit = m_VoltList.begin(); while (wit != m_VoltList.end()) { @@ -870,7 +870,7 @@ bool CPortalVolume::Save(HANDLE hFile, bool bGameData) { WriteFile(hFile, &wvol.ePWT, sizeof(int), &dwNum, NULL); } - // ũ Shape .. + // 링크된 Shape 갯수 저장.. iCount = m_plShapeInfoList.size(); WriteFile(hFile, &iCount, sizeof(int), &dwNum, NULL); @@ -882,7 +882,7 @@ bool CPortalVolume::Save(HANDLE hFile, bool bGameData) { CPVSManager::WriteCryptographString(hFile, pSI->m_strShapeFile); - // Shape .. + // Shape의 데이터 저장.. WriteFile(hFile, &pSI->m_iBelong, sizeof(int), &dwNum, NULL); WriteFile(hFile, &pSI->m_iEventID, sizeof(int), &dwNum, NULL); WriteFile(hFile, &pSI->m_iEventType, sizeof(int), &dwNum, NULL); @@ -907,7 +907,7 @@ void CPortalVolume::SaveGameData(HANDLE hFile) { int iCount = 0; CPortalVolume * pVol = NULL; - // Visible Volume ID.. + // Visible Volume의 ID.. iCount = m_pVisiblePvsList.size(); WriteFile(hFile, &iCount, sizeof(int), &dwNum, NULL); @@ -923,7 +923,7 @@ void CPortalVolume::SaveGameData(HANDLE hFile) { iCount = m_lpShapePartList.size(); WriteFile(hFile, &iCount, sizeof(int), &dwNum, NULL); - // Shape κ .. + // Shape의 부분 정보.. ShapePart * pSP = NULL; spiter spit = m_lpShapePartList.begin(); while (spit != m_lpShapePartList.end()) { @@ -1336,7 +1336,7 @@ bool CPortalVolume::IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & __Vector3 pVec; float fDet; - // By : Ecli666 ( On 2001-09-12 10:39:01 ) + // By : Ecli666 ( On 2001-09-12 오전 10:39:01 ) pVec.Cross(vEdge1, vEdge2); fDet = pVec.Dot(vDir); @@ -1344,13 +1344,13 @@ bool CPortalVolume::IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & return false; } - // ~(By Ecli666 On 2001-09-12 10:39:01 ) + // ~(By Ecli666 On 2001-09-12 오전 10:39:01 ) pVec.Cross(vDir, vEdge2); // If determinant is near zero, ray lies in plane of triangle fDet = vEdge1.Dot(pVec); - if (fDet < 0.0001f) { // 0 ﰢ ϴ. + if (fDet < 0.0001f) { // 거의 0에 가까우면 삼각형 평면과 지나가는 선이 평행하다. return false; } @@ -1380,17 +1380,17 @@ bool CPortalVolume::IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & fU *= fInvDet; fV *= fInvDet; - // t Ŭ ָ ִ. - // t*dir + orig ϸ ִ. - // u v ǹ̴ ϱ? - // : v0 (0,0), v1(1,0), v2(0,1) <ȣ (U, V)ǥ> ̷ Ÿ + // t가 클수록 멀리 직선과 평면과 만나는 점이 멀다. + // t*dir + orig 를 구하면 만나는 점을 구할 수 있다. + // u와 v의 의미는 무엇일까? + // 추측 : v0 (0,0), v1(1,0), v2(0,1) <괄호안은 (U, V)좌표> 이런식으로 어느 점에 가깝나 나타낸 것 같음 // if (pVCol) { - (*pVCol) = vOrig + (vDir * fT); // .. + (*pVCol) = vOrig + (vDir * fT); // 접점을 계산.. } - // *t < 0 ̸ ... + // *t < 0 이면 뒤쪽... if (fT < 0.0f) { return false; } diff --git a/src/tool/N3Indoor/PortalVolume.h b/src/tool/N3Indoor/PortalVolume.h index 8c281aea..c5395578 100644 --- a/src/tool/N3Indoor/PortalVolume.h +++ b/src/tool/N3Indoor/PortalVolume.h @@ -81,11 +81,11 @@ typedef struct tagShapeInfo : public CN3Transform { int m_iID; std::string m_strShapeFile; - int m_iBelong; // Ҽ - 0:Ҽ 1: 2:ī罺 3:?? .... + int m_iBelong; // 소속 - 0:소속 없음 1:엘모라드 2:카루스 3:?? .... int m_iEventID; // Event ID int m_iEventType; // Event Type - int m_iNPC_ID; // NPC Ʈ NPC ID - int m_iNPC_Status; // NPC Ʈ Default Status + int m_iNPC_ID; // NPC 로 쓰는 오브젝트일 경우 NPC ID + int m_iNPC_Status; // NPC 로 쓰는 오브젝트일 경우 Default Status CN3Shape * m_pShape; @@ -186,8 +186,8 @@ class CPortalVolume : public CN3Transform { //////////////////////////////////////// std::list m_VoltList; - std::list m_piIDList; // ε忡 ʿ ߰ .. - std::list m_piVisibleIDList; // ε忡 ʿ ߰ .. + std::list m_piIDList; // 로드에 필요한 중간 데이터.. + std::list m_piVisibleIDList; // 로드에 필요한 중간 데이터.. std::list m_plShapeInfoList; std::list m_lpShapePartList; std::list<__ColIndex *> m_lpShapeColPartList; @@ -195,7 +195,7 @@ class CPortalVolume : public CN3Transform { //////////////////////////////////////// public: - int m_iPriority; //.. 忡 Portal 켱.. -1 Ŭ Ѵ.. 0 ڱ ڽ.. + int m_iPriority; //.. 컴파일 모드에서 Portal의 우선순위.. -1로 먼저 클리어 한다음.. 0 순위는 자기 자신.. private: bool QueryHeight(float fx, float fz, float & fy); diff --git a/src/tool/N3Indoor/PortalWall.cpp b/src/tool/N3Indoor/PortalWall.cpp index b8d1db05..84b7a3c0 100644 --- a/src/tool/N3Indoor/PortalWall.cpp +++ b/src/tool/N3Indoor/PortalWall.cpp @@ -371,14 +371,14 @@ void CPortalWall::Load(FILE * stream) { } void CPortalWall::Save(FILE * stream) { - // ڽ Ÿ .. + // 먼저 자신의 타입을 저장.. fwrite(&_iTypeWall, sizeof(int), 1, stream); fwrite(&m_eWallType, sizeof(int), 1, stream); - // ڽ ̵ .. + // 자신의 아이디를 저장.. fwrite(&m_iID, sizeof(int), 1, stream); - // ڽ .. + // 자신의 데이터 저장.. CPvsBase::Save(stream); } diff --git a/src/tool/N3Indoor/PosDummy.cpp b/src/tool/N3Indoor/PosDummy.cpp index a8da1788..51a71722 100644 --- a/src/tool/N3Indoor/PosDummy.cpp +++ b/src/tool/N3Indoor/PosDummy.cpp @@ -26,11 +26,11 @@ void CPosDummy::SetSelObj(SelectElement Obj, bool bOne) { if (bOne) { m_SelObjArray.RemoveAll(); } else { - // ̹ ߰ ʴ´.. + // 이미 있으면 추가하지 않는다.. int iSize = m_SelObjArray.GetSize(); for (int i = 0; i < iSize; i++) { if (m_SelObjArray[i].pSelectPointer == Obj.pSelectPointer) { - // ̹ Ƿ øϿ + // 이미 있으므로 선택목록에서 제거 m_SelObjArray.RemoveAt(i); if (m_SelObjArray.GetSize() > 0) { SelectElement se = m_SelObjArray.GetAt(0); @@ -57,9 +57,9 @@ BOOL CPosDummy::MouseMsgFilter(LPMSG pMsg) { POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; DWORD nFlags = pMsg->wParam; if (m_pSelectedCube && (nFlags & MK_LBUTTON)) { - __Vector3 vRayDir, vRayOrig; // ȭ ߾() 콺 ͸ - __Vector3 vPN, vPV; // Ե - __Vector3 vPos; // ( ) + __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 + __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 + __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) __Vector3 vCameraDir = s_CameraData.vAt - s_CameraData.vEye; vCameraDir.Normalize(); GetPickRay(point, vRayDir, vRayOrig); @@ -74,7 +74,7 @@ BOOL CPosDummy::MouseMsgFilter(LPMSG pMsg) { float fT = D3DXVec3Dot(&vPN, &vPR) / D3DXVec3Dot(&vPN, &vRayDir); vPos = vRayOrig + vRayDir * fT; - // ̸ Ѵ. + // 평면상의 점에서 지형의 높이를 구한다. __Vector3 v1, v2, v3, v4; float fSize = 1000.0f; v1.Set(-fSize, 0.0f, fSize); diff --git a/src/tool/N3Indoor/PvsMgr.cpp b/src/tool/N3Indoor/PvsMgr.cpp index 260bc340..b8f0956a 100644 --- a/src/tool/N3Indoor/PvsMgr.cpp +++ b/src/tool/N3Indoor/PvsMgr.cpp @@ -256,7 +256,7 @@ void CPvsMgr::RenderCompile() { } } - // Debug .. + // Debug용 렌더링.. /* typedef typename std::list<__Collision>::iterator citer; citer cit = m_ColList.begin(); while (cit != m_ColList.end()) @@ -349,7 +349,7 @@ void CPvsMgr::TotalShapeRender() { pSh->Tick(-1000); pSh->Render(); - CN3Base::s_AlphaMgr.Render(); // Alpha primitive ׸... + CN3Base::s_AlphaMgr.Render(); // Alpha primitive 그리기... } CN3Base::s_lpD3DDev->SetRenderState(D3DRS_POINTSIZE, dwPointSize); @@ -415,7 +415,7 @@ void CPvsMgr::TotalCollisionRender() { pSh->Tick(-1000); pSh->CollisionMesh()->Render(0xffffffff); - CN3Base::s_AlphaMgr.Render(); // Alpha primitive ׸... + CN3Base::s_AlphaMgr.Render(); // Alpha primitive 그리기... } CN3Base::s_lpD3DDev->SetRenderState(D3DRS_POINTSIZE, dwPointSize); @@ -464,7 +464,7 @@ void CPvsMgr::Load(FILE * stream) { } } - // ũ ̵ о Ŵ.. + // 링크된 아이디들을 읽어서 연결시킴.. iter it = m_pPvsList.begin(); while (it != m_pPvsList.end()) { pBase = *it++; @@ -505,7 +505,7 @@ void CPvsMgr::Save(FILE * stream) { iter it = m_pPvsList.begin(); while (it != m_pPvsList.end()) { - // ڽ .. + // 자신의 데이터 저장.. pBase = *it++; pBase->Save(stream); } @@ -543,7 +543,7 @@ void CPvsMgr::ComputeVisibilty(CPortalVol * const pVolMy) { SetPriority(pVolMy); - // PortalVolθ ̷ Ʈ .. + // PortalVol로만 이루어진 리스트를 만듬.. std::priority_queue, Myless> pQueue; CPvsBase * pBase = NULL; @@ -555,7 +555,7 @@ void CPvsMgr::ComputeVisibilty(CPortalVol * const pVolMy) { } } - // ׿ Ʈ̽.. + // 디버그용 트레이스.. CPortalVol * pVol = NULL; while (!pQueue.empty()) { pVol = pQueue.top(); @@ -566,7 +566,7 @@ void CPvsMgr::ComputeVisibilty(CPortalVol * const pVolMy) { } pVolMy->m_eRenderType = TYPE_TRUE; - // 浹üũ غ.. + // 충돌체크 준비.. PrepareCollisionDetect(pVolMy); CollisionDetectMain(pVolMy); } @@ -587,7 +587,7 @@ void CPvsMgr::SetPriority(CPortalVol * const pVolMy) { pVolMy->m_iPriority = 0; int igPriority = 0; - // 켱 .. ϱ Ȯ Ϸ.. ù° Wall 켱 .. + // 재귀적으로 우선순위 결정.. 좀더 복잡하구 정확히 하려면.. 첫번째의 Wall과 같은 방향이 우선순위가 높다.. SetPriorityRecursive(pVolMy, igPriority + 1); } @@ -601,7 +601,7 @@ void CPvsMgr::SetPriorityRecursive(CPortalVol * const pVolMy, int iRecursive) { if (pBase->IsKindOf(RUNTIME_CLASS(CPortalVol))) { pVol = (CPortalVol *)pBase; if ((pVol->m_iPriority == -1) || - (pVol->m_iPriority > iRecursive)) // 켱 ʾҰų 켱 ũ.. + (pVol->m_iPriority > iRecursive)) // 우선순위가 정해지지 않았거나 현재 우선순위보다 크면.. { pVol->m_iPriority = iRecursive; SetPriorityRecursive(pVol, iRecursive + 1); @@ -682,12 +682,12 @@ void CPvsMgr::PrepareCollisionDetectOne(CPortalVol * const pVol, CPortalWall * c void CPvsMgr::PrepareCollisionDetectTwo(CPortalVol * pVol, CPortalWall * pWall, e_WallType eWT, __Collision & Col) { switch (Col.eWT) { - case WALL_ZB: // .. + case WALL_ZB: // 뒤쪽.. Col.Vvec[0] = pVol->m_pvVertex[7]; Col.Vvec[1] = pVol->m_pvVertex[3]; Col.Vvec[2] = pVol->m_pvVertex[6]; Col.Vvec[3] = pVol->m_pvVertex[2]; - // .. + // 뒤쪽 투영된 값.. Col.Vvec[4] = pWall->m_pvVertex[0]; Col.Vvec[4].z = pVol->m_pvVertex[7].z; Col.Vvec[5] = pWall->m_pvVertex[1]; @@ -698,12 +698,12 @@ void CPvsMgr::PrepareCollisionDetectTwo(CPortalVol * pVol, CPortalWall * pWall, Col.Vvec[7].z = pVol->m_pvVertex[2].z; break; - case WALL_ZF: // .. + case WALL_ZF: // 앞쪽.. Col.Vvec[0] = pVol->m_pvVertex[5]; Col.Vvec[1] = pVol->m_pvVertex[1]; Col.Vvec[2] = pVol->m_pvVertex[4]; Col.Vvec[3] = pVol->m_pvVertex[0]; - // .. + // 앞쪽 투영된 값.. Col.Vvec[4] = pWall->m_pvVertex[0]; Col.Vvec[4].z = pVol->m_pvVertex[5].z; Col.Vvec[5] = pWall->m_pvVertex[1]; @@ -714,12 +714,12 @@ void CPvsMgr::PrepareCollisionDetectTwo(CPortalVol * pVol, CPortalWall * pWall, Col.Vvec[7].z = pVol->m_pvVertex[0].z; break; - case WALL_XL: // .. + case WALL_XL: // 왼쪽.. Col.Vvec[0] = pVol->m_pvVertex[6]; Col.Vvec[1] = pVol->m_pvVertex[2]; Col.Vvec[2] = pVol->m_pvVertex[5]; Col.Vvec[3] = pVol->m_pvVertex[1]; - // .. + // 왼쪽 투영된 값.. Col.Vvec[4] = pWall->m_pvVertex[0]; Col.Vvec[4].x = pVol->m_pvVertex[6].x; Col.Vvec[5] = pWall->m_pvVertex[1]; @@ -730,12 +730,12 @@ void CPvsMgr::PrepareCollisionDetectTwo(CPortalVol * pVol, CPortalWall * pWall, Col.Vvec[7].x = pVol->m_pvVertex[1].x; break; - case WALL_XR: // .. + case WALL_XR: // 오른쪽.. Col.Vvec[0] = pVol->m_pvVertex[4]; Col.Vvec[1] = pVol->m_pvVertex[0]; Col.Vvec[2] = pVol->m_pvVertex[7]; Col.Vvec[3] = pVol->m_pvVertex[3]; - // .. + // 오른쪽 투영된 값.. Col.Vvec[4] = pWall->m_pvVertex[0]; Col.Vvec[4].x = pVol->m_pvVertex[4].x; Col.Vvec[5] = pWall->m_pvVertex[1]; @@ -746,12 +746,12 @@ void CPvsMgr::PrepareCollisionDetectTwo(CPortalVol * pVol, CPortalWall * pWall, Col.Vvec[7].x = pVol->m_pvVertex[3].x; break; - case WALL_YT: // + case WALL_YT: // 위쪽 Col.Vvec[0] = pVol->m_pvVertex[0]; Col.Vvec[1] = pVol->m_pvVertex[1]; Col.Vvec[2] = pVol->m_pvVertex[3]; Col.Vvec[3] = pVol->m_pvVertex[2]; - // .. + // 위쪽 투영된 값.. Col.Vvec[4] = pWall->m_pvVertex[0]; Col.Vvec[4].y = pVol->m_pvVertex[0].y; Col.Vvec[5] = pWall->m_pvVertex[1]; @@ -762,12 +762,12 @@ void CPvsMgr::PrepareCollisionDetectTwo(CPortalVol * pVol, CPortalWall * pWall, Col.Vvec[7].y = pVol->m_pvVertex[2].y; break; - case WALL_YB: // Ʒ + case WALL_YB: // 아래쪽 Col.Vvec[0] = pVol->m_pvVertex[7]; Col.Vvec[1] = pVol->m_pvVertex[6]; Col.Vvec[2] = pVol->m_pvVertex[4]; Col.Vvec[3] = pVol->m_pvVertex[5]; - // Ʒ .. + // 아래쪽 투영된 값.. Col.Vvec[4] = pWall->m_pvVertex[0]; Col.Vvec[4].y = pVol->m_pvVertex[7].y; Col.Vvec[5] = pWall->m_pvVertex[1]; @@ -793,33 +793,33 @@ bool CPvsMgr::CollisionDetectMain(CPortalVol * const pVolMy) { while (icit != m_ColList.end()) { Col = *icit++; - // Volumn ִ 浹 üũ .. + // Volumn에 있는 충돌 체크 점들.. for (int i = 0; i < 9; i++) { for (int j = 0; j < 5; j++) { if ((i == 8) && (j == 4)) { int k = 98; } - // .. + // 선분을 만든다.. vDir = Col.Wvec[j] - Col.Vvec[i]; vDir.Normalize(); - // 켱 浹 üũ.. + // 우선 순위대로 충돌 체크.. ivit = m_pVoltList.begin(); while (ivit != m_pVoltList.end()) { pVol = *ivit++; - // ڱ ڽ ˻ ʴ´.. + // 자기 자신은 검사하지 않는다.. if (pVol == pVolMy) { continue; } - // Debug.. + // Debug용.. /* if ( (i == 1) && (j == 1) && (pVol->m_iID == 0) ) { m_dcol.Vvec[0] = Col.Wvec[j]; m_dcol.Vvec[1] = Col.Vvec[i]; }*/ - // Portal Wall ִ Portal Wall ˻.. 浹 ʴ 鸸 .. !! + // Portal Wall이 있는 면은 Portal Wall과 먼저 검사한후.. 충돌하지 않는 면만 인정.. !! switch (CollisionDetectSub(Col.Vvec[i], vDir, pVol)) { case COLLISION_AND_CONTINUE: if (pVol->m_eRenderType == TYPE_UNKNOWN) { @@ -827,7 +827,7 @@ bool CPvsMgr::CollisionDetectMain(CPortalVol * const pVolMy) { TRACE3("id %d, i %d, j %d \n", pVol->m_iID, i, j); } break; - case COLLISION_AND_STOP: // ش п ؼ ˻ ʴ´.. + case COLLISION_AND_STOP: // 해당 선분에 대해서만 검사하지 않는다.. if (pVol->m_eRenderType == TYPE_UNKNOWN) { pVol->m_eRenderType = TYPE_TRUE; TRACE3("id %d, i %d, j %d \n", pVol->m_iID, i, j); @@ -846,7 +846,7 @@ bool CPvsMgr::CollisionDetectMain(CPortalVol * const pVolMy) { return false; } -// Debug.. +// Debug용.. /* void CPvsMgr::RenderCollision(__Collision& col) { @@ -919,12 +919,12 @@ void CPvsMgr::RenderCollision(__Collision& col) */ e_ReturnCode CPvsMgr::CollisionDetectSub(const __Vector3 & vOrig, const __Vector3 & vDir, CPortalVol * pVolMy) { - // ľ ɲ.. - // 1. Wall ˻ؼ..Wall 浹 üũ Volumn 浹 .. + // 고쳐야 될껏들.. + // 1. Wall단위로 검사해서..Wall과 충돌 체크 없이 Volumn의 면과 충돌한 면이 있으면.. // 2. Return COLLISION_AND_STOP; - // 3. Ѵ 浹 .. ϴ COLLISION_AND_CONTINUE ϰ ٸ Wall ˻.. - // 4. COLLISION_AND_CONTINUE õǾ .. COLLISION_AND_CONTINUE return.. - // 5. ƴϸ..NO_COLLISION .. + // 3. 둘다 충돌 했으면.. 일단 COLLISION_AND_CONTINUE를 셋팅하고 다른 Wall을 계속 검사.. + // 4. COLLISION_AND_CONTINUE가 셋팅되어 있으면.. COLLISION_AND_CONTINUE를 return.. + // 5. 아니면..NO_COLLISION를 리턴.. #define TM_DEF_MAC(A) \ { \ @@ -1054,7 +1054,7 @@ bool CPvsMgr::IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, __Vector3 pVec; float fDet; - // By : Ecli666 ( On 2001-09-12 10:39:01 ) + // By : Ecli666 ( On 2001-09-12 오전 10:39:01 ) pVec.Cross(vEdge1, vEdge2); fDet = pVec.Dot(vDir); @@ -1062,13 +1062,13 @@ bool CPvsMgr::IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, return false; } - // ~(By Ecli666 On 2001-09-12 10:39:01 ) + // ~(By Ecli666 On 2001-09-12 오전 10:39:01 ) pVec.Cross(vDir, vEdge2); // If determinant is near zero, ray lies in plane of triangle fDet = vEdge1.Dot(pVec); - if (fDet < 0.0001f) { // 0 ﰢ ϴ. + if (fDet < 0.0001f) { // 거의 0에 가까우면 삼각형 평면과 지나가는 선이 평행하다. return false; } @@ -1098,17 +1098,17 @@ bool CPvsMgr::IntersectTriangle(const __Vector3 & vOrig, const __Vector3 & vDir, fU *= fInvDet; fV *= fInvDet; - // t Ŭ ָ ִ. - // t*dir + orig ϸ ִ. - // u v ǹ̴ ϱ? - // : v0 (0,0), v1(1,0), v2(0,1) <ȣ (U, V)ǥ> ̷ Ÿ + // t가 클수록 멀리 직선과 평면과 만나는 점이 멀다. + // t*dir + orig 를 구하면 만나는 점을 구할 수 있다. + // u와 v의 의미는 무엇일까? + // 추측 : v0 (0,0), v1(1,0), v2(0,1) <괄호안은 (U, V)좌표> 이런식으로 어느 점에 가깝나 나타낸 것 같음 // if (pVCol) { - (*pVCol) = vOrig + (vDir * fT); // .. + (*pVCol) = vOrig + (vDir * fT); // 접점을 계산.. } - // *t < 0 ̸ ... + // *t < 0 이면 뒤쪽... if (fT < 0.0f) { return false; } @@ -1150,7 +1150,7 @@ void CPvsMgr::CalcCompile() { pBase->SetState(STATE_NONE); } - // Visibility Ѵ.. !!!!!!!! + // Visibility를 결정한다.. !!!!!!!! m_ColList.clear(); m_pVoltList.clear(); @@ -1195,11 +1195,11 @@ void CPvsMgr::SplitShapeToVolumn() { return; } - // Shape lod ְ .. + // 배경 Shape의 lod 레벨을 최고로 만든다.. pShape->Tick(); pShape->SetMaxLOD(); - // ǰ.. + // 뽀갠다.. CPvsBase * pBase = NULL; CPortalVol * pVol = NULL; @@ -1209,7 +1209,7 @@ void CPvsMgr::SplitShapeToVolumn() { if (pBase->IsKindOf(RUNTIME_CLASS(CPortalVol))) { pVol = (CPortalVol *)pBase; - // Shape ŭ 鼭.. Transform Ű.. ˻.. + // Shape의폴리곤 갯수만큼 돌면서.. 먼저 Transform 시키고.. 검사.. pVol->SplitAndMakeShape(pShape); } } diff --git a/src/tool/N3Indoor/PvsMgr.h b/src/tool/N3Indoor/PvsMgr.h index 0a312b0e..5f25e993 100644 --- a/src/tool/N3Indoor/PvsMgr.h +++ b/src/tool/N3Indoor/PvsMgr.h @@ -25,7 +25,7 @@ typedef struct tagDEBUGCOLLISION { __Vector3 Vvec[8]; } __DCollision; -// 켱 .. +// 우선순위대로 정렬.. template struct Myless : public std::less { bool operator()(const T & x, const T & y) const { return (x->m_iPriority > y->m_iPriority); } }; @@ -41,8 +41,8 @@ class CPvsMgr { bool m_bShapePerVolumn; std::list m_pPvsList; - std::list<__Collision> m_ColList; // 浹üũ Structure Ʈ.. - std::list m_pVoltList; // ĵ 浹üũ Volumn Ʈ.. + std::list<__Collision> m_ColList; // 충돌체크 Structure 리스트.. + std::list m_pVoltList; // 정렬된 충돌체크 Volumn 리스트.. __DCollision m_dcol; //.. Main Shape.. ^^ @@ -81,15 +81,15 @@ class CPvsMgr { void Load(FILE * stream); void Save(FILE * stream); - // Edit .. + // Edit 모드.. void TickEdit(); void RenderEdit(); - // Compile .. + // Compile 모드.. void TickCompile(); void RenderCompile(); - // Execute .. + // Execute 모드.. void TickExecute(); void RenderExecute(); @@ -100,7 +100,7 @@ class CPvsMgr { void TotalShapeRender(); void TotalCollisionRender(); - // Visibility Ѵ.. + // Visibility를 결정한다.. void ComputeVisibilty(CPortalVol * const pVol); void SetPriority(CPortalVol * const pVol); void SetPriorityRecursive(CPortalVol * const pVol, int iRecursive); @@ -115,10 +115,10 @@ class CPvsMgr { bool CheckPvsWall(const __Vector3 & vOrig, const __Vector3 & vDir, CPortalVol * pVolMy, e_WallType eWT); bool CheckPvsVolumnWall(const __Vector3 & vOrig, const __Vector3 & vDir, CPortalVol * pVolMy, e_WallType eWT); - // Shape ° ɰ.. + // Shape를 공간에 맞게 쪼갠다.. void SplitShapeToVolumn(); - // Debug .. + // Debug 용 렌더링.. // void RenderCollision(__Collision& col); public: diff --git a/src/tool/N3Indoor/RotDummy.cpp b/src/tool/N3Indoor/RotDummy.cpp index dfa5d404..c9e1b972 100644 --- a/src/tool/N3Indoor/RotDummy.cpp +++ b/src/tool/N3Indoor/RotDummy.cpp @@ -79,11 +79,11 @@ void CRotDummy::SetSelObj(SelectElement Obj, bool bOne) { if (bOne) { m_SelObjArray.RemoveAll(); } else { - // ̹ ߰ ʴ´.. + // 이미 있으면 추가하지 않는다.. int iSize = m_SelObjArray.GetSize(); for (int i = 0; i < iSize; i++) { if (m_SelObjArray[i].pSelectPointer == Obj.pSelectPointer) { - // ̹ Ƿ øϿ + // 이미 있으므로 선택목록에서 제거 m_SelObjArray.RemoveAt(i); return; } @@ -94,5 +94,5 @@ void CRotDummy::SetSelObj(SelectElement Obj, bool bOne) { m_vPos = Obj.pSelectPointer->Pos(); m_qRot = Obj.pSelectPointer->Rot(); - m_qRot.Identity(); // Quaternion ȸ̱ ... ʱȭ ش.. + m_qRot.Identity(); // Quaternion 회전이기 땜시... 초기화를 해준다.. } diff --git a/src/tool/N3Indoor/ShapeTypeDlg.cpp b/src/tool/N3Indoor/ShapeTypeDlg.cpp index 61d35a48..6e647df6 100644 --- a/src/tool/N3Indoor/ShapeTypeDlg.cpp +++ b/src/tool/N3Indoor/ShapeTypeDlg.cpp @@ -66,7 +66,7 @@ void CShapeTypeDlg::OnOK() { CButton *pBut = (CButton *)GetDlgItem(IDC_RADIO_PARTIAL), *pBut2 = (CButton *)GetDlgItem(IDC_RADIO_NONEPARTIAL); if (!pBut->GetCheck() && !pBut2->GetCheck()) { - AfxMessageBox(" Shape Type ϼ.."); + AfxMessageBox("먼저 Shape Type을 설정하세여.."); return; } diff --git a/src/tool/N3Indoor/SwappedDummy.cpp b/src/tool/N3Indoor/SwappedDummy.cpp index c2cf5e71..a275771d 100644 --- a/src/tool/N3Indoor/SwappedDummy.cpp +++ b/src/tool/N3Indoor/SwappedDummy.cpp @@ -60,9 +60,9 @@ BOOL CSwappedDummy::MouseMsgFilter(LPMSG pMsg) { POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; DWORD nFlags = pMsg->wParam; if (m_pSelectedCube && (nFlags & MK_LBUTTON)) { - __Vector3 vRayDir, vRayOrig; // ȭ ߾() 콺 ͸ - __Vector3 vPN, vPV; // Ե - __Vector3 vPos; // ( ) + __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 + __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 + __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) __Vector3 vCameraDir = s_CameraData.vAt - s_CameraData.vEye; vCameraDir.Normalize(); GetPickRay(point, vRayDir, vRayOrig); @@ -109,7 +109,7 @@ BOOL CSwappedDummy::MouseMsgFilter(LPMSG pMsg) { return TRUE; } } break; - case WM_RBUTTONUP: // ť + case WM_RBUTTONUP: // 큐브 선택 취소 { if (m_pSelectedCube) { ReleaseCapture(); diff --git a/src/tool/N3Indoor/TransDummy.cpp b/src/tool/N3Indoor/TransDummy.cpp index b0a97f52..48582a2f 100644 --- a/src/tool/N3Indoor/TransDummy.cpp +++ b/src/tool/N3Indoor/TransDummy.cpp @@ -128,7 +128,7 @@ void CTransDummy::Tick() { if (m_ceDType != DUMMY_SWAP && m_SelObjArray.GetSize() == 0) { return; } - // Scale + // Scale 조정 __Vector3 vL = s_CameraData.vEye - m_vPos; float fL = vL.Magnitude() * 0.01f; m_vScale.Set(fL, fL, fL); @@ -136,7 +136,7 @@ void CTransDummy::Tick() { CN3Transform::Tick(-1000.0f); ReCalcMatrix(); - // Ÿ + // 거리에 따라 정렬 for (int i = 0; i < NUM_DUMMY; ++i) { __Vector3 vPos = m_DummyCubes[i].vCenterPos * m_Matrix; m_DummyCubes[i].fDistance = (vPos - s_CameraData.vEye).Magnitude(); @@ -168,7 +168,7 @@ void CTransDummy::Render() { HRESULT hr; // set transform - hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); // .. + hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); // 월드 행렬 적용.. // set texture hr = s_lpD3DDev->SetTexture(0, NULL); @@ -184,11 +184,11 @@ void CTransDummy::Render() { hr = s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); hr = s_lpD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE); - // ̾ ׸ + // 이어지 선 그리기 hr = s_lpD3DDev->SetFVF(FVF_XYZCOLOR); hr = s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 3, m_LineVertices, sizeof(__VertexXyzColor)); - // Cube ׸ + // Cube 그리기 hr = s_lpD3DDev->SetFVF(FVF_XYZNORMALCOLOR); for (int i = 0; i < NUM_DUMMY; ++i) { ASSERT(m_pSortedCubes[i]); @@ -205,11 +205,11 @@ void CTransDummy::SetSelObj(SelectElement Obj, bool bOne) { if (bOne) { m_SelObjArray.RemoveAll(); } else { - // ̹ ߰ ʴ´.. + // 이미 있으면 추가하지 않는다.. int iSize = m_SelObjArray.GetSize(); for (int i = 0; i < iSize; i++) { if (m_SelObjArray[i].pSelectPointer == Obj.pSelectPointer) { - // ̹ Ƿ øϿ + // 이미 있으므로 선택목록에서 제거 m_SelObjArray.RemoveAt(i); return; } @@ -272,7 +272,7 @@ BOOL CTransDummy::MouseMsgFilter(LPMSG pMsg) { m_vPrevPos = m_vPos; m_qPrevRot = m_qRot; - for (int i = 0; i < iSize; ++i) // õ ü + for (int i = 0; i < iSize; ++i) // 모든 선택된 객체의 스케일 저장 { Tv tv; se = m_SelObjArray.GetAt(i); @@ -317,7 +317,7 @@ BOOL CTransDummy::MouseMsgFilter(LPMSG pMsg) { return TRUE; } } break; - case WM_RBUTTONUP: // ť + case WM_RBUTTONUP: // 큐브 선택 취소 { if (m_pSelectedCube) { ReleaseCapture(); @@ -404,7 +404,7 @@ void CTransDummy::TransDiff(__Vector3 * pvDiffPos, __Quaternion * pqDiffRot, __V case TYPE_VOLUME_TOTAL: { CPortalVolume * pVol = (CPortalVolume *)se.pSelectPointer; - // Volume ׷ Link Shape.. + // Volume과 그럿에 Link된 Shape들.. pVol->PosSet(pVol->Pos() + (*pvDiffPos)); ShapeInfo * pSI = NULL; @@ -426,7 +426,7 @@ void CTransDummy::TransDiff(__Vector3 * pvDiffPos, __Quaternion * pqDiffRot, __V for (int i = 0; i < iSize; ++i) { se = m_SelObjArray.GetAt(i); switch (se.eST) { - case TYPE_VOLUME_TOTAL: // Volume ׷ Link Shape ȸ ȵȴ.. + case TYPE_VOLUME_TOTAL: // Volume과 그럿에 Link된 Shape들은 회전이 안된다.. break; case TYPE_VOLUME_ONLY: diff --git a/src/tool/N3Indoor/TransDummy.h b/src/tool/N3Indoor/TransDummy.h index c69776ca..cbb869a9 100644 --- a/src/tool/N3Indoor/TransDummy.h +++ b/src/tool/N3Indoor/TransDummy.h @@ -19,10 +19,10 @@ enum { const int NUM_CUBEVERTEX = 36; struct __DUMMYCUBE { - int iType; // Center , X, Y, Z . - __VertexXyzNormalColor Vertices[NUM_CUBEVERTEX]; // ť - __Vector3 vCenterPos; // ť  - float fDistance; // ī޶ Ÿ + int iType; // Center , X, Y, Z 종류 구분. + __VertexXyzNormalColor Vertices[NUM_CUBEVERTEX]; // 큐브의 구성 점들 + __Vector3 vCenterPos; // 큐브의 가운데 점 + float fDistance; // 카메라와의 거리 }; class CPortalVolume; @@ -55,23 +55,23 @@ class CTransDummy : public CN3Transform { public: protected: e_DummyType m_ceDType; - __DUMMYCUBE m_DummyCubes[NUM_DUMMY]; // 4 ť(center, x, y, z); - __VertexXyzColor m_LineVertices[6]; // 4 ť긦 ִ̾ ϴ + __DUMMYCUBE m_DummyCubes[NUM_DUMMY]; // 4개의 큐브(center, x, y, z); + __VertexXyzColor m_LineVertices[6]; // 4개의 큐브를 이어주는 선을 구성하는 점 public: e_DummyType m_cePrevType; - CArray m_SelObjArray; // MapMng õ ü + CArray m_SelObjArray; // MapMng에서 선택된 객체들 protected: - __DUMMYCUBE * m_pSortedCubes[NUM_DUMMY]; // Cube Ÿ ĵ - __DUMMYCUBE * m_pSelectedCube; // õ ť - __Vector3 m_vPrevPos; // ̹ 콺 巡 ġ ȸ Ȯ/Ұ - __Quaternion m_qPrevRot; // ̹ 콺 巡 ġ ȸ Ȯ/Ұ + __DUMMYCUBE * m_pSortedCubes[NUM_DUMMY]; // Cube 거리에 따라 정렬된 포인터 + __DUMMYCUBE * m_pSelectedCube; // 선택된 큐브 + __Vector3 m_vPrevPos; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 + __Quaternion m_qPrevRot; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 typedef std::vector<__Vector3> Tv; typedef typename std::vector::iterator tvit; std::vector - m_vPrevScaleArray; // ̹ 콺 巡 Ȯ/Ұ (õ ü ־ ϱ 迭) + m_vPrevScaleArray; // 이번 마우스 드래그 이전에 확대/축소값들 (선택된 객체들 모두의 값을 가지고 있어야 하기 때문에 배열) - // __Vector3* m_vPrevScaleArray; // ̹ 콺 巡 Ȯ/Ұ (õ ü ־ ϱ 迭) + // __Vector3* m_vPrevScaleArray; // 이번 마우스 드래그 이전에 확대/축소값들 (선택된 객체들 모두의 값을 가지고 있어야 하기 때문에 배열) // Operations public: @@ -82,7 +82,7 @@ class CTransDummy : public CN3Transform { virtual void Tick(); virtual void Render(); virtual void Release(); - virtual void SetSelObj(SelectElement Obj, bool bOne = true); // õ ü ٲٱ + virtual void SetSelObj(SelectElement Obj, bool bOne = true); // 선택된 객체 바꾸기 void ClearObjs() { m_SelObjArray.RemoveAll(); tvit ti = m_vPrevScaleArray.begin(); @@ -92,14 +92,14 @@ class CTransDummy : public CN3Transform { } m_vPrevScaleArray.clear(); } - virtual void AddSelObj(SelectElement Obj); // õ ü ߰ - virtual BOOL MouseMsgFilter(LPMSG pMsg); // 콺 ޼ ó + virtual void AddSelObj(SelectElement Obj); // 선택된 객체 추가 + virtual BOOL MouseMsgFilter(LPMSG pMsg); // 마우스 메세지 처리 void GetPickRay(POINT point, __Vector3 & vDir, - __Vector3 & vOrig); // 콺 Ͱ Ű  Լ + __Vector3 & vOrig); // 마우스 포인터가 가리키는 쪽으로 뻗어나가는 선 얻는 함수 protected: - __DUMMYCUBE * Pick(int x, int y); // ť picking - void InitDummyCube(int iType, __DUMMYCUBE * pDummyCube, const __Vector3 & vOffset, D3DCOLOR color); // ť ʱȭ - static int SortCube(const void * pArg1, const void * pArg2); // ť ī޶ Ÿ Լ + __DUMMYCUBE * Pick(int x, int y); // 큐브 picking + void InitDummyCube(int iType, __DUMMYCUBE * pDummyCube, const __Vector3 & vOffset, D3DCOLOR color); // 큐브 초기화 + static int SortCube(const void * pArg1, const void * pArg2); // 큐브 카메라 거리에 대한 정렬함수 virtual void TransDiff(__Vector3 * pvDiffPos, __Quaternion * pvDiffRot, - __Vector3 * pvDiffScale); // ̸ŭ õ Ʈ Ų. + __Vector3 * pvDiffScale); // 차이만큼 선택된 오므젝트들을 변형시킨다. }; diff --git a/src/tool/N3Indoor/res/N3Indoor.rc2 b/src/tool/N3Indoor/res/N3Indoor.rc2 index 21a1635ef31ef65a86198f264a27906a9af3122a..5c3ce5a3f0fb7b3f47a03e5f9e23cb9d992049da 100644 GIT binary patch literal 776 zcmd6lNeaS15JmsioT9;{Xh2UO>O#Z;r>!`2FyH`5TzGl)RTFWcpi3#LySgU+@2dMP zR;&n(x^HFx0ux_1<7ZOZrt1iv#gj2=$L!7$oSe#dFtEb~9*xeskv?cj7|mZx%} WHlNq*Y=)mVV;|<=*&&mE=lcMk#AkZ| literal 387 zcmb`D!3x4K42IA4DFQnVSI{RIn};E;GIdwkmXrnR3T=1T+gk-e(BpCmA@F_tzm!5s zsP|P}D%E67v4br*@^*Fuc{uUlthYKq%YN<*6ln@*<7ct~2sr?TexID == DTexID) { - //... + //지우자... delete (*it); it = m_Attributes[i].erase(it); } else { @@ -108,8 +108,8 @@ void CDTexGroup::DelAttrByDTexID(int DTexID) { } // -// DTexMng ִ û... -// DTex Ǿ ִ ׷ NONE .. +// DTexMng에 있는 정보들 청소... +// DTex에 저장되어 있는 현재 그룹 정보를 NONE으로 셋팅.. // void CDTexGroup::ClearDTex() { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); diff --git a/src/tool/N3ME/DTexGroupMng.cpp b/src/tool/N3ME/DTexGroupMng.cpp index 9787e7c3..1785daee 100644 --- a/src/tool/N3ME/DTexGroupMng.cpp +++ b/src/tool/N3ME/DTexGroupMng.cpp @@ -83,7 +83,7 @@ int CDTexGroupMng::GetBrushSize() { // void CDTexGroupMng::SetGroup(const char * pName) { //^^ - //Ϸ ׷ ع.. + //셋팅하려는 그룹이 있으면 걍 리턴해버려.. it_DTexGroup it = m_Groups.begin(); int iSize = m_Groups.size(); for (int i = 0; i < iSize; i++, it++) { @@ -100,7 +100,7 @@ void CDTexGroupMng::SetGroup(const char * pName) { wsprintf(pGroup->m_Name, pName); - //ο idx ϱ ؼ ϴ .. + //새로운 idx를 지정하기 위해서 일단 정렬을 하자.. it = m_Groups.begin(); iSize = m_Groups.size(); int * ArrayIdx = new int[iSize]; @@ -127,7 +127,7 @@ void CDTexGroupMng::SetGroup(const char * pName) { // // SetGroupID.. -// ID ׷ ֱ.. +// ID로 그룹 넣기.. // void CDTexGroupMng::SetGroupID(const char * pName, int id) { CDTexGroup * pGroup = new CDTexGroup; @@ -142,7 +142,7 @@ void CDTexGroupMng::SetGroupID(const char * pName, int id) { } // -// qsort ϴ Լ... +// qsort를 위해 정렬하는 함수... // int CDTexGroupMng::CompareIdx(const void * arg1, const void * arg2) { int a, b; @@ -159,7 +159,7 @@ int CDTexGroupMng::CompareIdx(const void * arg1, const void * arg2) { } // -// ׷ .. +// 그룹 지우기.. // void CDTexGroupMng::DelGroup(int ID) { it_DTexGroup it = m_Groups.begin(); @@ -179,7 +179,7 @@ void CDTexGroupMng::DelGroup(int ID) { } // -// ׷ȿ Ÿ ֱ.. +// 그룹안에 타일 넣기.. // void CDTexGroupMng::SetTile(int ID, int attr, __DTexTileAttr tile) { it_DTexGroup it = m_Groups.begin(); diff --git a/src/tool/N3ME/DTexGroupMng.h b/src/tool/N3ME/DTexGroupMng.h index 66a285f4..b7e4d8e3 100644 --- a/src/tool/N3ME/DTexGroupMng.h +++ b/src/tool/N3ME/DTexGroupMng.h @@ -16,11 +16,11 @@ typedef typename std::list::iterator it_DTexGroup; class CDTexGroupMng : public CN3Base { public: - std::list m_Groups; //׷ ͵ ִ Ʈ. - CDlgDTexGroupView * m_pGroupView; // ۾Ҷ ׷ ִ â. + std::list m_Groups; //그룹 테이터들을 가지고 있는 리스트. + CDlgDTexGroupView * m_pGroupView; //실제 작업할때 그룹들을 보여주는 창. - DTEXATTR m_SelectedDTex; //۾ ׷â ׷ Ӽ. - DTEXTILEATTR m_SelectedDTexTile; //۾ ؽ Ÿ. + DTEXATTR m_SelectedDTex; //작업시 그룹창에서 선택한 그룹과 속성. + DTEXTILEATTR m_SelectedDTexTile; //작업시 선택한 실제 텍스쳐 타일. CMainFrame * m_pMainFrm; diff --git a/src/tool/N3ME/DTexMng.cpp b/src/tool/N3ME/DTexMng.cpp index e7642d0b..c214e4d4 100644 --- a/src/tool/N3ME/DTexMng.cpp +++ b/src/tool/N3ME/DTexMng.cpp @@ -115,7 +115,7 @@ void CDTexMng::DelDTexByID(int id) { // // Load.. -// DTex ؽ ҽ оδ. +// DTex정보들과 실제 텍스쳐 소스들을 읽어들인다. // void CDTexMng::LoadFromFile(CString RealFileName) { Init(m_pMainFrm); @@ -151,13 +151,13 @@ void CDTexMng::LoadFromFile(CString RealFileName) { ProgressBar.StepIt(); - // ؽ ҽ а.. + // 실제 텍스쳐 소스를 읽고.. CDTex * pDTex = new CDTex; pDTex->Init(); pDTex->m_ID = i; pDTex->m_pTex->LoadFromFile(szDTexFileName); - // ׿ Ÿ а.. + // 그에 관한 타일 정보들을 읽고.. char szDir[_MAX_DIR], szFName[_MAX_FNAME]; _splitpath(szDTexFileName, NULL, szDir, szFName, NULL); wsprintf(szDTexInfoFileName, "%s%s%s.dif", s_szPath.c_str(), szDir, szFName); // Texture Information file @@ -209,7 +209,7 @@ void CDTexMng::LoadFromFile(CString RealFileName) { m_NextID = id + 1; } - // ؽ ҽ а.. + // 실제 텍스쳐 소스를 읽고.. CDTex * pDTex = new CDTex; pDTex->Init(); pDTex->m_ID = id; @@ -234,7 +234,7 @@ void CDTexMng::LoadFromFile(CString RealFileName) { } if (version == 1) { - // ׿ Ÿ а.. + // 그에 관한 타일 정보들을 읽고.. char szDir[_MAX_DIR], szFName[_MAX_FNAME]; _splitpath(szDTexFileName, NULL, szDir, szFName, NULL); wsprintf(szDTexInfoFileName, "%s%s%s.dif", s_szPath.c_str(), szDir, @@ -269,7 +269,7 @@ void CDTexMng::LoadFromFile(CString RealFileName) { void CDTexMng::SaveToFile(CString RealFileName) { char szDTexDir[_MAX_PATH]; wsprintf(szDTexDir, "%sDTex", s_szPath.c_str()); - CreateDirectory("dtex", NULL); // .. + CreateDirectory("dtex", NULL); // 경로 만들고.. char szDTexInfoFileName[_MAX_PATH]; wsprintf(szDTexInfoFileName, "%sDTEX\\%s.dtx", s_szPath.c_str(), (LPCTSTR)RealFileName); @@ -304,15 +304,15 @@ void CDTexMng::SaveToFile(CString RealFileName) { /* // - // version1 ... - // difϸ... + // version1 저장방식... + // dif파일만들기... // char szDir[_MAX_DIR], szFName[_MAX_FNAME]; _splitpath(szDTexFileName, NULL, szDir, szFName, NULL); wsprintf(szDTexInfoFileName, "%s%s%s.dif", s_szPath.c_str(), szDir, szFName); // Texture Information file - // ׿ Ÿ а.. + // 그에 관한 타일 정보들을 읽고.. HANDLE hFile = CreateFile(szDTexInfoFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile != INVALID_HANDLE_VALUE) @@ -332,11 +332,11 @@ void CDTexMng::SaveToFile(CString RealFileName) { } // -// ӿ ִ Ÿ ؽ ȯ .. +// 게임에서 쓸수 있는 타일 텍스쳐 포멧으로 변환후 저장.. // void CDTexMng::SaveGameTile() { D3DFORMAT Format; - int Size = DTEX_SIZE / NUM_DTEXTILE; //ؽ .. + int Size = DTEX_SIZE / NUM_DTEXTILE; //단위텍스쳐의 길이.. D3DLOCKED_RECT d3dlr; HANDLE hFile; @@ -381,7 +381,7 @@ void CDTexMng::SaveGameTile() { CreateFile(szDTexGameFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); for (ix = 0; ix < NUM_DTEXTILE; ix++) { - //ؽ ̽ , ؽ ä, ȯϰ, . + //텍스쳐 서페이스 만들고, 텍스쳐 채우고, 형식 변환하고, 저장. TileTex.Create(Size, Size, Format, TRUE); TileTex.Get()->LockRect(0, &d3dlrTarget, 0, 0); pSourceImg = (char *)((char *)d3dlr.pBits + (ix * Size * Bits) + (iz * Size * d3dlr.Pitch)); diff --git a/src/tool/N3ME/DTexMng.h b/src/tool/N3ME/DTexMng.h index 7cb41c16..647680e5 100644 --- a/src/tool/N3ME/DTexMng.h +++ b/src/tool/N3ME/DTexMng.h @@ -19,7 +19,7 @@ class CDTexMng : public CN3Base { public: std::list m_pDTex; CMainFrame * m_pMainFrm; - //int m_NumDTex; //dtex ִ 迭 + 1...^^ + //int m_NumDTex; //dtex를 담고 있는 마지막 배열 + 1...^^ //CDTex* m_pDTex[MAX_TILETEXTURE]; public: diff --git a/src/tool/N3ME/DlgAddSoundGroup.cpp b/src/tool/N3ME/DlgAddSoundGroup.cpp index 4c89ae61..e4983511 100644 --- a/src/tool/N3ME/DlgAddSoundGroup.cpp +++ b/src/tool/N3ME/DlgAddSoundGroup.cpp @@ -112,7 +112,7 @@ BOOL CDlgAddSoundGroup::OnInitDialog() { void CDlgAddSoundGroup::OnBtnBgeName1() { DWORD dwFlags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; - CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave(*.wav)|*.wav||", NULL); + CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave파일(*.wav)|*.wav||", NULL); if (dlg.DoModal() == IDCANCEL) { return; @@ -125,7 +125,7 @@ void CDlgAddSoundGroup::OnBtnBgeName1() { void CDlgAddSoundGroup::OnBtnBgeName2() { DWORD dwFlags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; - CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave(*.wav)|*.wav||", NULL); + CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave파일(*.wav)|*.wav||", NULL); if (dlg.DoModal() == IDCANCEL) { return; @@ -138,7 +138,7 @@ void CDlgAddSoundGroup::OnBtnBgeName2() { void CDlgAddSoundGroup::OnBtnBgeName3() { DWORD dwFlags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; - CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave(*.wav)|*.wav||", NULL); + CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave파일(*.wav)|*.wav||", NULL); if (dlg.DoModal() == IDCANCEL) { return; @@ -151,7 +151,7 @@ void CDlgAddSoundGroup::OnBtnBgeName3() { void CDlgAddSoundGroup::OnBtnBgeName4() { DWORD dwFlags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; - CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave(*.wav)|*.wav||", NULL); + CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave파일(*.wav)|*.wav||", NULL); if (dlg.DoModal() == IDCANCEL) { return; @@ -164,7 +164,7 @@ void CDlgAddSoundGroup::OnBtnBgeName4() { void CDlgAddSoundGroup::OnBtnBgmName1() { DWORD dwFlags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; - CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave(*.wav)|*.wav||", NULL); + CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave파일(*.wav)|*.wav||", NULL); if (dlg.DoModal() == IDCANCEL) { return; @@ -177,7 +177,7 @@ void CDlgAddSoundGroup::OnBtnBgmName1() { void CDlgAddSoundGroup::OnBtnBgmName2() { DWORD dwFlags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; - CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave(*.wav)|*.wav||", NULL); + CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave파일(*.wav)|*.wav||", NULL); if (dlg.DoModal() == IDCANCEL) { return; @@ -190,7 +190,7 @@ void CDlgAddSoundGroup::OnBtnBgmName2() { void CDlgAddSoundGroup::OnBtnBgmName3() { DWORD dwFlags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; - CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave(*.wav)|*.wav||", NULL); + CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave파일(*.wav)|*.wav||", NULL); if (dlg.DoModal() == IDCANCEL) { return; @@ -203,7 +203,7 @@ void CDlgAddSoundGroup::OnBtnBgmName3() { void CDlgAddSoundGroup::OnBtnBgmName4() { DWORD dwFlags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; - CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave(*.wav)|*.wav||", NULL); + CFileDialog dlg(TRUE, "wav", NULL, dwFlags, "Wave파일(*.wav)|*.wav||", NULL); if (dlg.DoModal() == IDCANCEL) { return; @@ -219,7 +219,7 @@ void CDlgAddSoundGroup::OnOK() { GetDlgItemText(IDC_EDT_GROUPNAME, m_SndInfo.szName, 256); if (m_SndInfo.szName[0] == 0) { - AfxMessageBox("̸ Էϼž ؿ.\nոӸ  ϸ ȵǴ° ?^^"); + AfxMessageBox("묶음이름을 입력하셔야 해요.\n앞머리에 띄어쓰기 하면 안되는거 알죠?^^"); return; } diff --git a/src/tool/N3ME/DlgBar.cpp b/src/tool/N3ME/DlgBar.cpp index e8083a23..aeeb83e5 100644 --- a/src/tool/N3ME/DlgBar.cpp +++ b/src/tool/N3ME/DlgBar.cpp @@ -60,7 +60,7 @@ END_MESSAGE_MAP() void CDlgBar::OnBSetResourcePath() { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - pFrm->OnResourcePathSet(); // Project .. + pFrm->OnResourcePathSet(); // Project 세팅.. } void CDlgBar::OnChangeETransformX() { diff --git a/src/tool/N3ME/DlgBase.cpp b/src/tool/N3ME/DlgBase.cpp index 61716594..c5e2f7bd 100644 --- a/src/tool/N3ME/DlgBase.cpp +++ b/src/tool/N3ME/DlgBase.cpp @@ -64,7 +64,7 @@ BOOL CDlgBase::OnInitDialog() { int nH = 0; ///////////////////////////////////// - // Transform + // Transform 등록 정보 m_LPTransform.AddPropItem("Position", "", PIT_EDIT, ""); m_LPTransform.AddPropItem("Rotation", "", PIT_EDIT, ""); m_LPTransform.AddPropItem("Scale", "", PIT_EDIT, ""); @@ -72,31 +72,31 @@ BOOL CDlgBase::OnInitDialog() { m_LPTransform.GetWindowRect(&rc); nH = m_LPTransform.GetItemHeight(0) * m_LPTransform.GetCount() + 4; m_LPTransform.SetWindowPos(NULL, 0, 0, rc.Width(), nH, SWP_NOZORDER | SWP_NOMOVE); - // Transform + // Transform 등록 정보 ///////////////////////////////////// ///////////////////////////////////// - // Camera + // Camera 등록 정보 m_LPCamera.AddPropItem("Eye", "", PIT_EDIT, ""); m_LPCamera.AddPropItem("At", "", PIT_EDIT, ""); m_LPCamera.AddPropItem("Up", "", PIT_EDIT, ""); m_LPCamera.AddPropItem("Field Of View", "", PIT_EDIT, ""); m_LPCamera.AddPropItem("Near Plane", "", PIT_EDIT, ""); m_LPCamera.AddPropItem("Far Plane", "", PIT_EDIT, ""); - m_LPCamera.AddPropItem("Ȱ ", "", PIT_EDIT, ""); - // m_LPCamera.AddPropItem("Ȱ е", "", PIT_EDIT, ""); - m_LPCamera.AddPropItem("Ȱ ", "", PIT_EDIT, ""); - // m_LPCamera.AddPropItem("Ȱ ", "", PIT_EDIT, ""); - // m_LPCamera.AddPropItem("Ȱ ", "", PIT_EDIT, ""); + m_LPCamera.AddPropItem("안개 사용", "", PIT_EDIT, ""); + // m_LPCamera.AddPropItem("안개 밀도", "", PIT_EDIT, ""); + m_LPCamera.AddPropItem("안개 색", "", PIT_EDIT, ""); + // m_LPCamera.AddPropItem("안개 시작", "", PIT_EDIT, ""); + // m_LPCamera.AddPropItem("안개 끝", "", PIT_EDIT, ""); m_LPCamera.GetWindowRect(&rc); nH = m_LPCamera.GetItemHeight(0) * m_LPCamera.GetCount() + 4; m_LPCamera.SetWindowPos(NULL, 0, 0, rc.Width(), nH, SWP_NOZORDER | SWP_NOMOVE); - // Camera + // Camera 등록 정보 ///////////////////////////////////// ///////////////////////////////////// - // Light + // Light 등록 정보 m_LPLight.AddPropItem("On", "", PIT_EDIT, ""); m_LPLight.AddPropItem("Number", "", PIT_EDIT, ""); m_LPLight.AddPropItem("Type", "", PIT_COMBO, "Null|Point|Spot|Directional|"); @@ -112,13 +112,13 @@ BOOL CDlgBase::OnInitDialog() { m_LPLight.GetWindowRect(&rc); nH = m_LPLight.GetItemHeight(0) * m_LPLight.GetCount() + 4; m_LPLight.SetWindowPos(NULL, 0, 0, rc.Width(), nH, SWP_NOZORDER | SWP_NOMOVE); - // Light + // Light 등록 정보 ///////////////////////////////////// CString str, strTmp; ///////////////////////////////////// - // Material + // Material 등록 정보 m_LPMaterial.AddPropItem("Render Flags", "0", PIT_EDIT, "", 0); strTmp = "Null|D3DBLEND_ZERO|D3DBLEND_ONE|D3DBLEND_SRCCOLOR|D3DBLEND_INVSRCCOLOR|D3DBLEND_SRCALPHA|D3DBLEND_INVSRCALPHA|D3DBLEND_DESTALPHA|\ @@ -145,7 +145,7 @@ D3DTOP_BUMPENVMAP|D3DTOP_BUMPENVMAPLUMINANCE|D3DTOP_DOTPRODUCT|D3DTOP_MULTIPLYAD m_LPMaterial.GetWindowRect(&rc); nH = m_LPMaterial.GetItemHeight(0) * m_LPMaterial.GetCount() + 4; m_LPMaterial.SetWindowPos(NULL, 0, 0, rc.Width(), nH, SWP_NOZORDER | SWP_NOMOVE); - // Material + // Material 등록 정보 ///////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -155,20 +155,20 @@ D3DTOP_BUMPENVMAP|D3DTOP_BUMPENVMAPLUMINANCE|D3DTOP_DOTPRODUCT|D3DTOP_MULTIPLYAD // for(int i = 0; i < nPartCount; i++) { strTmp.Format("%d", i); m_CBShapePart.AddString(strTmp); } // m_CBShapePart.SetCurSel(0); - m_LPShape.AddPropItem("Ҽ", "", PIT_EDIT, ""); + m_LPShape.AddPropItem("소속", "", PIT_EDIT, ""); m_LPShape.AddPropItem("Event ID", "", PIT_EDIT, ""); m_LPShape.AddPropItem("Event Type", "", PIT_EDIT, ""); m_LPShape.AddPropItem("NPC ID", "", PIT_EDIT, ""); m_LPShape.AddPropItem("NPC Status", "", PIT_EDIT, ""); - m_LPShape.AddPropItem("Part Add", "Part ߰", PIT_BUTTON, ""); - m_LPShape.AddPropItem("Part Delete", "Part ", PIT_BUTTON, ""); + m_LPShape.AddPropItem("Part Add", "Part 추가", PIT_BUTTON, ""); + m_LPShape.AddPropItem("Part Delete", "Part 삭제", PIT_BUTTON, ""); m_LPShape.AddPropItem("Face, Vertex Count", "", PIT_EDIT, ""); m_LPShape.AddPropItem("Texture File", "", PIT_FILE_MULTI, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); m_LPShape.AddPropItem("Mesh File", "", PIT_FILE, "N3 Progressive Mesh File(*.N3PMesh)|*.N3PMesh||"); m_LPShape.AddPropItem("Collision Mesh File", "", PIT_FILE, "N3 Vector Mesh(*.N3VMesh)|*.N3VMesh||"); - m_LPShape.AddPropItem("Collision Mesh Delete", "Collision Mesh ", PIT_BUTTON, ""); + m_LPShape.AddPropItem("Collision Mesh Delete", "Collision Mesh 삭제", PIT_BUTTON, ""); m_LPShape.GetWindowRect(&rc); nH = m_LPShape.GetItemHeight(0) * m_LPShape.GetCount() + 4; @@ -177,17 +177,17 @@ D3DTOP_BUMPENVMAP|D3DTOP_BUMPENVMAPLUMINANCE|D3DTOP_DOTPRODUCT|D3DTOP_MULTIPLYAD ///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// - // ij + // 캐릭터 m_LPChr.AddPropItem("Joint File", "", PIT_FILE, "N3 Joint File(*.N3Joint)|*.N3Joint||"); m_LPChr.AddPropItem("Collision Mesh File", "", PIT_FILE, "N3 Vector Mesh(*.N3VMesh)|*.N3VMesh||"); - m_LPChr.AddPropItem("Collision Mesh Delete", "Collision Mesh ", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Collision Mesh Delete", "Collision Mesh 삭제", PIT_BUTTON, ""); // m_LPChr.AddPropItem("Collision Skin File", "", PIT_FILE, "N3 Skin File(*.N3Skin)|*.N3Skin||"); - // m_LPChr.AddPropItem("Collision Skin Delete", "Collision Skin ", PIT_BUTTON, ""); + // m_LPChr.AddPropItem("Collision Skin Delete", "Collision Skin 삭제", PIT_BUTTON, ""); - m_LPChr.AddPropItem("Part Add", "Part ߰", PIT_BUTTON, ""); - m_LPChr.AddPropItem("Part Delete", "Part ", PIT_BUTTON, ""); - m_LPChr.AddPropItem("Plug Add", "Plug ߰", PIT_BUTTON, ""); - m_LPChr.AddPropItem("Plug Delete", "Plug ", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Part Add", "Part 추가", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Part Delete", "Part 삭제", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Plug Add", "Plug 추가", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Plug Delete", "Plug 삭제", PIT_BUTTON, ""); m_CBChrPart.ResetContent(); m_CBChrPart.SetCurSel(0); @@ -199,17 +199,17 @@ D3DTOP_BUMPENVMAP|D3DTOP_BUMPENVMAPLUMINANCE|D3DTOP_DOTPRODUCT|D3DTOP_MULTIPLYAD } m_CBChrLOD.SetCurSel(0); - m_LPCPart.AddPropItem("Part Type", "", PIT_COMBO, "Ӹī||ü|ü|||??|"); + m_LPCPart.AddPropItem("Part Type", "", PIT_COMBO, "머리카락|얼굴|상체|하체|손|발|??|"); m_LPCPart.AddPropItem("Texture File", "", PIT_FILE, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); // m_LPCPart.AddPropItem("Mesh File", "", PIT_FILE, "N3 Indexed Mesh File(*.N3IMesh)|*.N3IMesh||"); // m_LPCPart.AddPropItem("Skin File", "", PIT_FILE, "N3 Skin File(*.N3Skin)|*.N3Skin||"); - m_LPCPlug.AddPropItem("Plug Type", "", PIT_COMBO, "|޼|"); + m_LPCPlug.AddPropItem("Plug Type", "", PIT_COMBO, "오른손장착|왼손장착|양손장착"); m_LPCPlug.AddPropItem("Plug Joint", "", PIT_EDIT, ""); m_LPCPlug.AddPropItem("Plug Mesh File", "", PIT_FILE, "N3 Progressive Mesh File(*.N3PMesh)|*.N3PMesh||"); m_LPCPlug.AddPropItem("Plug Texture File", "", PIT_FILE, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); m_LPCPlug.AddPropItem("Plug Offset", "", PIT_EDIT, ""); m_LPCPlug.AddPropItem("Plug Rotation", "Reset", PIT_BUTTON, ""); m_LPCPlug.AddPropItem("Plug Scale", "", PIT_EDIT, ""); @@ -225,7 +225,7 @@ D3DTOP_BUMPENVMAP|D3DTOP_BUMPENVMAPLUMINANCE|D3DTOP_DOTPRODUCT|D3DTOP_MULTIPLYAD m_LPCPlug.GetWindowRect(&rc); nH = m_LPCPlug.GetItemHeight(0) * m_LPCPlug.GetCount() + 4; m_LPCPlug.SetWindowPos(NULL, 0, 0, rc.Width(), nH, SWP_NOZORDER | SWP_NOMOVE); - // ij + // 캐릭터 ///////////////////////////////////////////////////////////////////////////////////////////////////////// int nW = 100; @@ -339,7 +339,7 @@ void CDlgBase::UpdateInfo() { if (pItem) { pItem->m_curValue.Format("%f", pC->m_Data.fFP); } - pItem = m_LPCamera.GetPropItem("Ȱ "); + pItem = m_LPCamera.GetPropItem("안개 사용"); if (pItem) { if (pC->m_bFogUse) { pItem->m_curValue = "On"; @@ -347,15 +347,15 @@ void CDlgBase::UpdateInfo() { pItem->m_curValue = "Off"; } } - // pItem = m_LPCamera.GetPropItem("Ȱ е"); + // pItem = m_LPCamera.GetPropItem("안개 밀도"); // if(pItem) pItem->m_curValue.Format("%f", pC->m_fFogDensity); - pItem = m_LPCamera.GetPropItem("Ȱ "); + pItem = m_LPCamera.GetPropItem("안개 색"); if (pItem) { pItem->D3DColorSet(pC->m_FogColor); } - // pItem = m_LPCamera.GetPropItem("Ȱ "); + // pItem = m_LPCamera.GetPropItem("안개 시작"); // if(pItem) pItem->m_curValue.Format("%f", pC->m_fFogStart); - // pItem = m_LPCamera.GetPropItem("Ȱ "); + // pItem = m_LPCamera.GetPropItem("안개 끝"); // if(pItem) pItem->m_curValue.Format("%f", pC->m_fFogEnd); m_LPCamera.Invalidate(); @@ -444,7 +444,7 @@ void CDlgBase::UpdateInfo() { CN3Shape * pS = (CN3Shape *)pBase; CPropertyItem * pItem; - pItem = m_LPShape.GetPropItem("Ҽ"); + pItem = m_LPShape.GetPropItem("소속"); if (pItem) { pItem->m_curValue.Format("%d", pS->m_iBelong); } @@ -462,7 +462,7 @@ void CDlgBase::UpdateInfo() { } pItem = m_LPShape.GetPropItem("NPC Status"); if (pItem) { - pItem->m_curValue.Format("%d", pS->m_iNPC_Status); // NPC Ʈ NPC Type + pItem->m_curValue.Format("%d", pS->m_iNPC_Status); // NPC 로 쓰는 오브젝트일 경우 NPC Type } int nPartCount = pS->PartCount(); @@ -659,7 +659,7 @@ void CDlgBase::UpdateInfo() { // } } - // ̴ Ʈ(, ű ...) ǥ + // 붙이는 오브젝트(무기, 장신구 등...) 정보 표시 int nPlug = m_CBChrPlug.GetCurSel(); int nPlugCount = pC->PlugCount(); m_CBChrPlug.ResetContent(); @@ -834,19 +834,19 @@ BOOL CDlgBase::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { pC->m_Data.fNP = (float)atof(pItem->m_curValue); } else if (pItem->m_propName == "Far Plane") { pC->m_Data.fFP = (float)atof(pItem->m_curValue); - } else if (pItem->m_propName == "Ȱ ") { + } else if (pItem->m_propName == "안개 사용") { if (lstrcmpi(pItem->m_curValue, "on") == 0) { pC->m_bFogUse = TRUE; } else { pC->m_bFogUse = FALSE; } } - // else if(pItem->m_propName == "Ȱ е") pC->m_fFogDensity = (float)atof(pItem->m_curValue); - else if (pItem->m_propName == "Ȱ ") { + // else if(pItem->m_propName == "안개 밀도") pC->m_fFogDensity = (float)atof(pItem->m_curValue); + else if (pItem->m_propName == "안개 색") { pC->m_FogColor = pItem->D3DColorGet(); } - // else if(pItem->m_propName == "Ȱ ") pC->m_fFogStart = (float)atof(pItem->m_curValue); - // else if(pItem->m_propName == "Ȱ ") pC->m_fFogEnd = (float)atof(pItem->m_curValue); + // else if(pItem->m_propName == "안개 시작") pC->m_fFogStart = (float)atof(pItem->m_curValue); + // else if(pItem->m_propName == "안개 끝") pC->m_fFogEnd = (float)atof(pItem->m_curValue); } if ((void *)wParam == &m_LPLight && (pBase->Type() & OBJ_LIGHT)) { @@ -896,7 +896,7 @@ BOOL CDlgBase::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { CN3SPart * pPD = pS->Part(nPart); CPropertyItem * pItem = (CPropertyItem *)lParam; - if (pItem->m_propName == "Ҽ" && pItem->m_curValue.GetLength() > 0) { + if (pItem->m_propName == "소속" && pItem->m_curValue.GetLength() > 0) { pS->m_iBelong = atoi(pItem->m_curValue); } else if (pItem->m_propName == "Event ID" && pItem->m_curValue.GetLength() > 0) { pS->m_iEventID = atoi(pItem->m_curValue); @@ -905,7 +905,7 @@ BOOL CDlgBase::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { } else if (pItem->m_propName == "NPC ID" && pItem->m_curValue.GetLength() > 0) { pS->m_iNPC_ID = atoi(pItem->m_curValue); } else if (pItem->m_propName == "NPC Status" && pItem->m_curValue.GetLength() > 0) { - pS->m_iNPC_Status = atoi(pItem->m_curValue); // NPC Ʈ NPC Type + pS->m_iNPC_Status = atoi(pItem->m_curValue); // NPC 로 쓰는 오브젝트일 경우 NPC Type } else if (pItem->m_propName == "Collision Mesh File" && pItem->m_curValue.GetLength() > 0) { @@ -1023,12 +1023,12 @@ BOOL CDlgBase::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { if (pItem->m_propName == "Part Type") { CN3CPart * pPD = pC->Part(nPart); if (pPD) { - //del m_Type if(pItem->m_curValue == "Ӹī") pPD->m_Type = PART_HAIR; - //del m_Type else if(pItem->m_curValue == "") pPD->m_Type = PART_FACE; - //del m_Type else if(pItem->m_curValue == "ü") pPD->m_Type = PART_UPPER; - //del m_Type else if(pItem->m_curValue == "ü") pPD->m_Type = PART_LOWER; - //del m_Type else if(pItem->m_curValue == "") pPD->m_Type = PART_HAND; - //del m_Type else if(pItem->m_curValue == "") pPD->m_Type = PART_FOOT; + //del m_Type if(pItem->m_curValue == "머리카락") pPD->m_Type = PART_HAIR; + //del m_Type else if(pItem->m_curValue == "얼굴") pPD->m_Type = PART_FACE; + //del m_Type else if(pItem->m_curValue == "상체") pPD->m_Type = PART_UPPER; + //del m_Type else if(pItem->m_curValue == "하체") pPD->m_Type = PART_LOWER; + //del m_Type else if(pItem->m_curValue == "손") pPD->m_Type = PART_HAND; + //del m_Type else if(pItem->m_curValue == "발") pPD->m_Type = PART_FOOT; //del m_Type else if(pItem->m_curValue == "??") pPD->m_Type = PART_UNKNOWN; } this->UpdateInfo(); @@ -1067,7 +1067,7 @@ BOOL CDlgBase::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { CN3CPlugBase * pPlug = pC->Plug(nPlug); if (pItem->m_propName == "Plug Joint") { - int nJI = atoi(pItem->m_curValue); // Joint Index  ϵ... + int nJI = atoi(pItem->m_curValue); // Joint Index 가 영역을 벗어나지 못하도록... int nJC = 0; CN3Joint * pJ = pC->Joint(); if (pJ) { @@ -1160,7 +1160,7 @@ void CDlgBase::OnChangeEName() { } if (pBase != NULL) { CString str; - GetDlgItemText(IDC_E_NAME, str); // ̸ ٲٱ.. + GetDlgItemText(IDC_E_NAME, str); // 이름 바꾸기.. pBase->m_szName = str; } } diff --git a/src/tool/N3ME/DlgBrowsePath.cpp b/src/tool/N3ME/DlgBrowsePath.cpp index 24207535..977db3a6 100644 --- a/src/tool/N3ME/DlgBrowsePath.cpp +++ b/src/tool/N3ME/DlgBrowsePath.cpp @@ -64,7 +64,7 @@ END_MESSAGE_MAP() BOOL CDlgBrowsePath::OnInitDialog() { CDialog::OnInitDialog(); - // ֱٿ ´... + // 최근에 쓴 폴더를 가져온다... char szInitDir[256]; DWORD dwLength = 256; memset(szInitDir, 0, 256); @@ -163,12 +163,12 @@ void CDlgBrowsePath::OnSynchFolders() { } void CDlgBrowsePath::OnOK() { - m_CBPath.GetWindowText(m_szPath); // .. + m_CBPath.GetWindowText(m_szPath); // 경로 기억.. if (m_szPath.GetLength() > 0) { - m_CBPath.InsertString(0, m_szPath); // ְ... + m_CBPath.InsertString(0, m_szPath); // 경로 넣고... } - // ֱٿ صд.... + // 최근에 쓴 폴더를 저장해둔다.... char szInitDir[256] = ""; CString szKey; HKEY hKey; diff --git a/src/tool/N3ME/DlgDTexGroupView.cpp b/src/tool/N3ME/DlgDTexGroupView.cpp index a23b6275..cfd012d4 100644 --- a/src/tool/N3ME/DlgDTexGroupView.cpp +++ b/src/tool/N3ME/DlgDTexGroupView.cpp @@ -124,7 +124,7 @@ void CDlgDTexGroupView::OnSelchangedTreeDtexGroup(NMHDR * pNMHDR, LRESULT * pRes HTREEITEM hChild = m_Tree.GetChildItem(hTree); HTREEITEM hParent = m_Tree.GetParentItem(hTree); - if (hParent == NULL) // ׷ ǥ ϸ .. + if (hParent == NULL) // 그 그룹의 대표적인 썸네일만 보여주자.. { hTree = m_Tree.GetChildItem(hTree); hTree = m_Tree.GetChildItem(hTree); diff --git a/src/tool/N3ME/DlgDTexGroupView.h b/src/tool/N3ME/DlgDTexGroupView.h index ade9c0db..d3a21bed 100644 --- a/src/tool/N3ME/DlgDTexGroupView.h +++ b/src/tool/N3ME/DlgDTexGroupView.h @@ -15,7 +15,7 @@ class CDlgDTexGroupView : public CDialog { CN3Texture * m_pPrevTex; RECT m_PrevTexRect; - int m_iRadioState; // 0 ڵ 2 3 ǮŸ + int m_iRadioState; // 0 자동찍기 2 강제찍기 3 강제풀타일 찍기 public: CDTexGroupMng * m_pDTexGroupMng; diff --git a/src/tool/N3ME/DlgEditWarp.cpp b/src/tool/N3ME/DlgEditWarp.cpp index 4360522e..078b58a7 100644 --- a/src/tool/N3ME/DlgEditWarp.cpp +++ b/src/tool/N3ME/DlgEditWarp.cpp @@ -168,7 +168,7 @@ void CDlgEditWarp::OnOK() { void CDlgEditWarp::OnBtnExport() { CFileDialog dlg(FALSE, "wap", "Noname", OFN_EXPLORER | OFN_LONGNAMES | OFN_OVERWRITEPROMPT, - "Warp Info(*.wap)|*.wap||"); + "Warp Info파일(*.wap)|*.wap||"); if (dlg.DoModal() == IDOK) { CString str = dlg.GetPathName(); @@ -178,7 +178,7 @@ void CDlgEditWarp::OnBtnExport() { void CDlgEditWarp::OnBtnImport() { DWORD dwFlags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; - CFileDialog dlg(TRUE, "wap", NULL, dwFlags, "Warp Info(*.wap)|*.wap||", NULL); + CFileDialog dlg(TRUE, "wap", NULL, dwFlags, "Warp Info파일(*.wap)|*.wap||", NULL); if (dlg.DoModal() == IDCANCEL) { return; diff --git a/src/tool/N3ME/DlgFolderSelect.cpp b/src/tool/N3ME/DlgFolderSelect.cpp index e687b46e..f3fc2740 100644 --- a/src/tool/N3ME/DlgFolderSelect.cpp +++ b/src/tool/N3ME/DlgFolderSelect.cpp @@ -42,7 +42,7 @@ END_MESSAGE_MAP() BOOL CDlgFolderSelect::OnInitDialog() { CDialog::OnInitDialog(); - // ֱٿ ´... + // 최근에 쓴 폴더를 가져온다... char szInitDir[256]; DWORD dwLength = 256; memset(szInitDir, 0, 256); @@ -76,7 +76,7 @@ BOOL CDlgFolderSelect::OnInitDialog() { void CDlgFolderSelect::OnSelchangedBrowseTree(NMHDR * pNMHDR, LRESULT * pResult) { NM_TREEVIEW * pNMTreeView = (NM_TREEVIEW *)pNMHDR; - // ٲ... Ʈ ٲپش.. + // 선택이 바뀌면... 파일 리스트를 바꾸어준다.. HTREEITEM hItem = m_DirTree.GetSelectedItem(); CString Path = m_DirTree.GetFullPath(hItem); @@ -96,7 +96,7 @@ void CDlgFolderSelect::OnTunnelTree() { void CDlgFolderSelect::OnOK() { // TODO: Add extra validation here - // ֱٿ صд.... + // 최근에 쓴 폴더를 저장해둔다.... char szInitDir[256] = ""; DWORD dwLength = 256; CString szKey; diff --git a/src/tool/N3ME/DlgLight.cpp b/src/tool/N3ME/DlgLight.cpp index 7358b5db..8d5ad0ca 100644 --- a/src/tool/N3ME/DlgLight.cpp +++ b/src/tool/N3ME/DlgLight.cpp @@ -119,7 +119,7 @@ void CDlgLight::OnBtnUpload() { UpdateData(TRUE); if (m_strLightObjName.IsEmpty()) { - MessageBox("Light Objectü ̸ Ǿ ʽϴ.", "-.-;"); + MessageBox("Light Object객체의 이름이 지정되어 있지 않습니다.", "-.-;"); return; } diff --git a/src/tool/N3ME/DlgMakeNPCPath.cpp b/src/tool/N3ME/DlgMakeNPCPath.cpp index 4e202078..0e55a349 100644 --- a/src/tool/N3ME/DlgMakeNPCPath.cpp +++ b/src/tool/N3ME/DlgMakeNPCPath.cpp @@ -127,7 +127,7 @@ BOOL CDlgMakeNPCPath::OnInitDialog() { char szLine[512] = "", szID[80] = "", szBuff[4][80] = {"", "", "", ""}; char szName[512] = ""; - //NPC ... + //NPC종류에 관한 정의... char szNpcFileName[MAX_PATH]; wsprintf(szNpcFileName, "npclist\\npclist.txt"); FILE * stream = fopen(szNpcFileName, "r"); @@ -160,7 +160,7 @@ BOOL CDlgMakeNPCPath::OnInitDialog() { fclose(stream); } - //NPCӿ .. + //NPC움직임에 관한 정의.. wsprintf(szNpcFileName, "npclist\\npcacttypelist.txt"); stream = fopen(szNpcFileName, "r"); if (stream) { @@ -192,8 +192,8 @@ BOOL CDlgMakeNPCPath::OnInitDialog() { m_NPCList.GetLBText(0, m_strSelNPCName); m_iSelNPCID = (int)m_NPCList.GetItemData(0); - //m_ActTypeList.AddString("̴"); - //m_ActTypeList.AddString("ȿ̴"); + //m_ActTypeList.AddString("움직이는"); + //m_ActTypeList.AddString("안움직이는"); m_ActTypeList.SetCurSel(0); m_iSelActType = (int)m_ActTypeList.GetItemData(0); @@ -298,7 +298,7 @@ void CDlgMakeNPCPath::OnBtnSavePathset() { void CDlgMakeNPCPath::OnBtnSaveServerPathset() { CFileDialog dlg(FALSE, "snr", "Noname", OFN_EXPLORER | OFN_LONGNAMES | OFN_OVERWRITEPROMPT, - " NPC Route(*.snr)|*.snr||"); + "서버 NPC Route파일(*.snr)|*.snr||"); if (dlg.DoModal() == IDOK) { CString str = dlg.GetPathName(); diff --git a/src/tool/N3ME/DlgPondProperty.cpp b/src/tool/N3ME/DlgPondProperty.cpp index 5d32fde2..78f534bc 100644 --- a/src/tool/N3ME/DlgPondProperty.cpp +++ b/src/tool/N3ME/DlgPondProperty.cpp @@ -70,7 +70,7 @@ BOOL CDlgPondProperty::OnInitDialog() { m_LPPond.AddPropItem("WaterScaleHeight(int)", "", PIT_EDIT, ""); m_LPPond.AddPropItem("Texture File", "", PIT_FILE, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); m_LPPond.AddPropItem("Alpha factor(hex)", "", PIT_EDIT, ""); m_LPPond.AddPropItem("Water tu(float)", "", PIT_EDIT, ""); @@ -156,9 +156,9 @@ void CDlgPondProperty::UpdateInfo() { } if (pSelPond->GetChangUVState() == TRUE) { - GetDlgItem(IDC_BU_RECALCUV)->SetWindowText(""); + GetDlgItem(IDC_BU_RECALCUV)->SetWindowText("점으로"); } else { - GetDlgItem(IDC_BU_RECALCUV)->SetWindowText("ϰ"); + GetDlgItem(IDC_BU_RECALCUV)->SetWindowText("평편하게"); } if (m_pPondMng->GetChooseGroup() == TRUE) { @@ -325,7 +325,7 @@ BOOL CDlgPondProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) } else if (pItem->m_propName == "WaterScaleWidth(int)") { int iWidht = (int)atoi(pItem->m_curValue); if (MAX_PONDMESH_VERTEX < iWidht * pSelPond->GetWaterScaleHeight()) { - MessageBox("ִ Ѱ踦 Ѿϴ."); + MessageBox("만들수있는 한계를 넘었습니다."); pItem->m_curValue.Format("%d", pSelPond->GetWaterScaleWidht()); return TRUE; } else { @@ -335,7 +335,7 @@ BOOL CDlgPondProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) } else if (pItem->m_propName == "WaterScaleHeight(int)") { int iHeight = (int)atoi(pItem->m_curValue); if (MAX_PONDMESH_VERTEX < iHeight * pSelPond->GetWaterScaleWidht()) { - MessageBox("ִ Ѱ踦 Ѿϴ."); + MessageBox("만들수있는 한계를 넘었습니다."); pItem->m_curValue.Format("%d", pSelPond->GetWaterScaleHeight()); return TRUE; } else { @@ -344,7 +344,7 @@ BOOL CDlgPondProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) } } else if (pItem->m_propName == "Texture File") { CN3Base tmp; - tmp.m_szName = pItem->m_curValue; // η ٲٱ + tmp.m_szName = pItem->m_curValue; // 상대경로로 바꾸기 if (pSelPond->SetTextureName(tmp.m_szName.c_str()) == FALSE) { CString strMsg; strMsg.Format("Cannot get \"%s\"Texture, check file and directory", pItem->m_curValue); @@ -370,10 +370,10 @@ void CDlgPondProperty::OnOK() { if (m_pPondMng->GetPondMesh(pSelPond->GetPondID()) == NULL) { CDialog::OnOK(); } else { - MessageBox("ߺǴ ̵ Դϴ."); + MessageBox("중복되는 아이디 입니다."); } } else { - MessageBox("Texture ʾҽϴ."); + MessageBox("Texture를 지정하지 않았습니다."); } } } @@ -419,10 +419,10 @@ void CDlgPondProperty::OnButtonRecalUV() { pSelPond->SetChangUVState(); if (pSelPond->GetChangUVState() == TRUE) { - GetDlgItem(IDC_BU_RECALCUV)->SetWindowText(""); + GetDlgItem(IDC_BU_RECALCUV)->SetWindowText("점으로"); pSelPond->ReCalcUV(); } else { - GetDlgItem(IDC_BU_RECALCUV)->SetWindowText("ϰ"); + GetDlgItem(IDC_BU_RECALCUV)->SetWindowText("평편하게"); pSelPond->ReCalcVexUV(); } @@ -435,7 +435,7 @@ void CDlgPondProperty::OnButtonDeletePond() { } CPondMesh * pSelPond = m_pPondMng->GetSelPond(); if (pSelPond) { - if (MessageBox("õ ðڽϱ?", "Remove pond", MB_YESNO | MB_DEFBUTTON2) == IDNO) { + if (MessageBox("선택된 연못을 지우시겠습니까?", "Remove pond", MB_YESNO | MB_DEFBUTTON2) == IDNO) { return; } m_pPondMng->RemovePondMesh(pSelPond->GetPondID()); diff --git a/src/tool/N3ME/DlgRegenUser.cpp b/src/tool/N3ME/DlgRegenUser.cpp index 6df0d2d4..8a6ad8d3 100644 --- a/src/tool/N3ME/DlgRegenUser.cpp +++ b/src/tool/N3ME/DlgRegenUser.cpp @@ -47,7 +47,7 @@ END_MESSAGE_MAP() void CDlgRegenUser::OnBtnLoadPathset() { DWORD dwFlags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; - CFileDialog dlg(TRUE, "trur", NULL, dwFlags, "trur(*.trur)|*.trur||", NULL); + CFileDialog dlg(TRUE, "trur", NULL, dwFlags, "trur파일(*.trur)|*.trur||", NULL); if (dlg.DoModal() == IDCANCEL) { return; @@ -73,7 +73,7 @@ void CDlgRegenUser::OnBtnPathDelete() { void CDlgRegenUser::OnBtnSavePathset() { if (m_PathName.IsEmpty()) { CFileDialog dlg(FALSE, "trur", "Noname", OFN_EXPLORER | OFN_LONGNAMES | OFN_OVERWRITEPROMPT, - "trur(*.trur)|*.trur||"); + "trur파일(*.trur)|*.trur||"); if (dlg.DoModal() == IDOK) { m_PathName = dlg.GetPathName(); @@ -128,7 +128,7 @@ void CDlgRegenUser::PutRegion(VERTEXRECT * pVR) { void CDlgRegenUser::OnBtnSaveAs() { CFileDialog dlg(FALSE, "trur", "Noname", OFN_EXPLORER | OFN_LONGNAMES | OFN_OVERWRITEPROMPT, - "trur(*.trur)|*.trur||"); + "trur파일(*.trur)|*.trur||"); if (dlg.DoModal() == IDOK) { m_PathName = dlg.GetPathName(); diff --git a/src/tool/N3ME/DlgRiverProperty.cpp b/src/tool/N3ME/DlgRiverProperty.cpp index 79ebf60f..33977cf1 100644 --- a/src/tool/N3ME/DlgRiverProperty.cpp +++ b/src/tool/N3ME/DlgRiverProperty.cpp @@ -61,13 +61,13 @@ BOOL CDlgRiverProperty::OnInitDialog() { m_LPRiver.AddPropItem("meter / u", "", PIT_EDIT, ""); m_LPRiver.AddPropItem("meter / v", "", PIT_EDIT, ""); m_LPRiver.AddPropItem("Texture File", "", PIT_FILE, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); m_LPRiver.AddPropItem("Animation Texture FPS", "", PIT_EDIT, ""); m_LPRiver.AddPropItem("Speed2", "", PIT_EDIT, ""); m_LPRiver.AddPropItem("meter / u2", "", PIT_EDIT, ""); m_LPRiver.AddPropItem("meter / v2", "", PIT_EDIT, ""); m_LPRiver.AddPropItem("Animation Texture File", "", PIT_FILE, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); int nW = 100; m_LPRiver.SetDividerWidth(nW); @@ -236,7 +236,7 @@ BOOL CDlgRiverProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult CPropertyItem * pItem = (CPropertyItem *)lParam; if (pItem->m_propName == "River ID") { if (m_pRiverMng->SetRiverID(pSelRiver, (int)atoi(pItem->m_curValue)) == FALSE) { - MessageBox("ϴ IDԴϴ."); + MessageBox("존재하는 ID입니다."); pItem->m_curValue.Format("%d", pSelRiver->GetRiverID()); } } else if (pItem->m_propName == "Alpha factor(hex)") { @@ -249,7 +249,7 @@ BOOL CDlgRiverProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult pSelRiver->SetMeterPerV((float)atof(pItem->m_curValue)); } else if (pItem->m_propName == "Texture File") { CN3Base tmp; - tmp.m_szName = pItem->m_curValue; // η ٲٱ + tmp.m_szName = pItem->m_curValue; // 상대경로로 바꾸기 if (pSelRiver->SetTextureName(tmp.m_szName.c_str()) == FALSE) { CString strMsg; strMsg.Format("Cannot get \"%s\"Texture, check file and directory", pItem->m_curValue); @@ -267,16 +267,16 @@ BOOL CDlgRiverProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult } else if (pItem->m_propName == "meter / v2") { pSelRiver->SetMeterPerV2((float)atof(pItem->m_curValue)); } else if (pItem->m_propName == "Animation Texture File") { - // ϸ̼ Ǵ ؽ ( ̸κ ˾Ƴ. ȣ ؾ) + // 에니메이션 되는 텍스쳐 지정 (갯수는 파일 이름으로부터 알아낸다. 따라서 맨 마지막번호파일을 지정해야함) CN3Base tmp; - tmp.m_szName = pItem->m_curValue; // η ٲٱ - // ȭ ̸ и + tmp.m_szName = pItem->m_curValue; // 상대경로로 바꾸기 + // 화일 이름 분리 char szDir[_MAX_DIR]; char szFName[_MAX_FNAME]; char szExt[_MAX_EXT]; _splitpath(tmp.m_szName.c_str(), NULL, szDir, szFName, szExt); - int iCount = atoi(szFName + lstrlen(szFName) - 2) + 1; // ̸ ڸ ڷ ȯ + int iCount = atoi(szFName + lstrlen(szFName) - 2) + 1; // 파일 이름의 끝에 두자리를 숫자로 변환 CString strFName = szDir; strFName += szFName; strFName = strFName.Left(strFName.GetLength() - 2); @@ -304,10 +304,10 @@ void CDlgRiverProperty::OnOK() { if (m_pRiverMng->GetRiverMesh(pSelRiver->GetRiverID()) == NULL) { CDialog::OnOK(); } else { - MessageBox("ߺǴ ̵ Դϴ."); + MessageBox("중복되는 아이디 입니다."); } } else { - MessageBox("Texture ʾҽϴ."); + MessageBox("Texture를 지정하지 않았습니다."); } } } @@ -339,7 +339,7 @@ void CDlgRiverProperty::OnButtonDeleteRiver() { } CRiverMesh * pSelRiver = m_pRiverMng->GetSelRiver(); if (pSelRiver) { - if (MessageBox("õ ðڽϱ?", "Remove river", MB_YESNO | MB_DEFBUTTON2) == IDNO) { + if (MessageBox("선택된 강을 지우시겠습니까?", "Remove river", MB_YESNO | MB_DEFBUTTON2) == IDNO) { return; } m_pRiverMng->RemoveRiverMesh(pSelRiver->GetRiverID()); diff --git a/src/tool/N3ME/DlgSceneGraph.cpp b/src/tool/N3ME/DlgSceneGraph.cpp index 551a3e92..83f21f2a 100644 --- a/src/tool/N3ME/DlgSceneGraph.cpp +++ b/src/tool/N3ME/DlgSceneGraph.cpp @@ -174,7 +174,7 @@ void CDlgSceneGraph::OnSelchangedTreeObj(NMHDR * pNMHDR, LRESULT * pResult) { NM_TREEVIEW * pNMTreeView = (NM_TREEVIEW *)pNMHDR; // TODO: Add your control notification handler code here - //pNMTreeView->itemNew->lParam //̰ õ (CN3Base*)̴. + //pNMTreeView->itemNew->lParam //이것이 선택된 아이템의 (CN3Base*)이다. m_pMapMng->SelectObject((CN3Base *)pNMTreeView->itemNew.lParam, m_IsSourceObj); Invalidate(FALSE); diff --git a/src/tool/N3ME/DlgSceneGraph.h b/src/tool/N3ME/DlgSceneGraph.h index e2724563..aed7ae3b 100644 --- a/src/tool/N3ME/DlgSceneGraph.h +++ b/src/tool/N3ME/DlgSceneGraph.h @@ -13,14 +13,14 @@ class CMapMng; class CDlgSceneGraph : public CDialog { public: CN3Scene * m_pSceneRef; - BOOL m_IsSourceObj; // Display̳? ( Ʈ ) + BOOL m_IsSourceObj; // Display용이냐? (툴에서 오브젝트 목록) CMapMng * m_pMapMng; CImageList m_ImgList; protected: void UpdateTreeItem(HTREEITEM hParent, CN3Base * pBase); - DWORD m_dwFlag; // Ͽ ǥ ͵ Ÿ ÷ + DWORD m_dwFlag; // 목록에 표시할 것들을 나타낸 플래그 public: void SelectObject(HTREEITEM hItem, void * pItemData); diff --git a/src/tool/N3ME/DlgSetDTex.cpp b/src/tool/N3ME/DlgSetDTex.cpp index 5382570d..3366f28d 100644 --- a/src/tool/N3ME/DlgSetDTex.cpp +++ b/src/tool/N3ME/DlgSetDTex.cpp @@ -109,7 +109,7 @@ BOOL CDlgSetDTex::OnInitDialog() { CWnd * pView = GetDlgItem(IDC_TEXTUREVIEW); pView->SetWindowPos(NULL, 0, 0, (int)m_fTexSurfaceSize, (int)m_fTexSurfaceSize, SWP_DRAWFRAME | SWP_NOMOVE); - // texture ׸ .. + // texture 그리는 버퍼.. pFrm->m_pEng->s_lpD3DDev->CreateVertexBuffer(4 * sizeof(__VertexTransformed), 0, FVF_TRANSFORMED, D3DPOOL_MANAGED, &m_pTexVB, NULL); @@ -123,7 +123,7 @@ BOOL CDlgSetDTex::OnInitDialog() { pVertices[3].Set(0.0f, m_fTexSurfaceSize - 1.0f, 0.1f, 0.5f, 0x00000000, 1.0f / DTexSize, DTexSize / DTexSize); m_pTexVB->Unlock(); - // Grid ׸ .. + // Grid 그리는 버퍼.. pFrm->m_pEng->s_lpD3DDev->CreateVertexBuffer(((NUM_DTEXTILE - 1) << 2) * sizeof(__VertexTransformedColor), 0, FVF_TRANSFORMEDCOLOR, D3DPOOL_MANAGED, &m_pGridVB, NULL); @@ -244,7 +244,7 @@ void CDlgSetDTex::OnSelchangeComboFilelist() { int index; index = m_FileList.GetCurSel(); Invalidate(FALSE); - // ־ ... + //딴거 넣어야 돼... } void CDlgSetDTex::RenderGrid(LPDIRECT3DDEVICE9 lpDDev) { @@ -474,7 +474,7 @@ void CDlgSetDTex::OnBtnDelgroup() { } pDTexGroupMng->DelGroup(DelGroupID); - // ؾ߰? ȿ ׷ϱ .... + //맵정보도 갱신해야겠지? 무효한 그룹정보니까 지워버려야지.... CLyTerrain * pRefTerrain = pFrm->GetMapMng()->GetTerrain(); if (pRefTerrain) { int ix, iz; @@ -482,7 +482,7 @@ void CDlgSetDTex::OnBtnDelgroup() { for (iz = 0; iz < pRefTerrain->m_iHeightMapSize; iz++) { int TargetID; - //2... + //2번... TargetID = pRefTerrain->m_ppMapData[ix][iz].DTexInfo2.Attr.Group; if (TargetID == DelGroupID) { pRefTerrain->m_ppMapData[ix][iz].DTexInfo2.Attr.Group = 0; @@ -491,7 +491,7 @@ void CDlgSetDTex::OnBtnDelgroup() { pRefTerrain->m_ppMapData[ix][iz].DTexInfo2.TexIdx.TexID = -1; } - //1... + //1번... TargetID = pRefTerrain->m_ppMapData[ix][iz].DTexInfo1.Attr.Group; if (TargetID == DelGroupID) { pRefTerrain->m_ppMapData[ix][iz].DTexInfo1 = pRefTerrain->m_ppMapData[ix][iz].DTexInfo2; @@ -551,7 +551,7 @@ void CDlgSetDTex::OnBtnDeldtex() { int index = m_FileList.GetCurSel(); int DelDTexID; - //dtex...^^ + //dtex지우기...^^ CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); CDTexGroupMng * pDTexGroupMng = pFrm->GetDTexGroupMng(); @@ -571,7 +571,7 @@ void CDlgSetDTex::OnBtnDeldtex() { m_FileList.SetCurSel(index); } - // ؾ߰? ؽ ׷ ٸ ؽķ .. + //맵정보도 갱신해야겠지? 없는 텍스쳐정보는 같은 그룹의 다른 텍스쳐로 갱신.. CLyTerrain * pRefTerrain = pFrm->GetMapMng()->GetTerrain(); if (pRefTerrain) { int ix, iz; @@ -581,7 +581,7 @@ void CDlgSetDTex::OnBtnDeldtex() { int Group, Attr; DTEXTILEATTR DTexTileAttr; - //2... + //2번... TargetID = pRefTerrain->m_ppMapData[ix][iz].DTexInfo2.TexIdx.TexID; if (TargetID == DelDTexID) { Group = pRefTerrain->m_ppMapData[ix][iz].DTexInfo2.Attr.Group; @@ -594,7 +594,7 @@ void CDlgSetDTex::OnBtnDeldtex() { } } - //1... + //1번... TargetID = pRefTerrain->m_ppMapData[ix][iz].DTexInfo1.TexIdx.TexID; if (TargetID == DelDTexID) { Group = pRefTerrain->m_ppMapData[ix][iz].DTexInfo1.Attr.Group; diff --git a/src/tool/N3ME/DlgShapeList.h b/src/tool/N3ME/DlgShapeList.h index 8197a3b0..c83da751 100644 --- a/src/tool/N3ME/DlgShapeList.h +++ b/src/tool/N3ME/DlgShapeList.h @@ -17,7 +17,7 @@ class CDlgShapeList : public CDialog { CDlgShapeList(CWnd * pParent = NULL); // standard constructor CN3Scene * m_pSceneRef; - BOOL m_IsSourceObj; // Display̳? ( Ʈ ) + BOOL m_IsSourceObj; // Display용이냐? (툴에서 오브젝트 목록) CMapMng * m_pMapMng; // Dialog Data diff --git a/src/tool/N3ME/DlgSowSeed.cpp b/src/tool/N3ME/DlgSowSeed.cpp index 2f5dec09..9e021105 100644 --- a/src/tool/N3ME/DlgSowSeed.cpp +++ b/src/tool/N3ME/DlgSowSeed.cpp @@ -88,7 +88,7 @@ BOOL CDlgSowSeed::OnInitDialog() { Sow_Array[i][j] = rand() % 3; } } - // Seed List о .. + // Seed List 읽어 오기.. //SetDlgItemText(IDC_STATIC_GRASSINFO, m_FileName); return TRUE; // return TRUE unless you set the focus to a control @@ -193,7 +193,7 @@ void CDlgSowSeed::RePaint() { char Name[60]; pFrame->GetMapMng()->m_pDlgSourceList->m_ListShape.GetText(group_list->Obj_ID, Name); group_list->Group_id = groupCount; - sprintf(text, "Ǯ ID: %d , ϸ:%s", group_list->Group_id, Name); + sprintf(text, "풀 ID: %d , 파일명:%s", group_list->Group_id, Name); int CurPos = m_CB_TileGroup.GetCount(); m_CB_TileGroup.AddString(text); m_CB_TileGroup.SetCurSel(CurPos); @@ -237,12 +237,12 @@ void CDlgSowSeed::OnBtnGrassinfosave() { void CDlgSowSeed::OnBtnGrassRead() { int count = m_CB_Seed.GetCount(); if (count >= 8) { - MessageBox("̻ ؽĸ .", ""); + MessageBox("더이상 텍스쳐를 넣을 수가 없어요.", "빠떼루"); return; } DWORD dwFlags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; - CFileDialog dlg(TRUE, "dxt", NULL, dwFlags, "Ǯ ؽ(*.dxt)|*.dxt||", NULL); + CFileDialog dlg(TRUE, "dxt", NULL, dwFlags, "풀 텍스쳐(*.dxt)|*.dxt||", NULL); if (dlg.DoModal() == IDCANCEL) { return; diff --git a/src/tool/N3ME/DlgUnusedFiles.cpp b/src/tool/N3ME/DlgUnusedFiles.cpp index 27a28c7e..003e5d15 100644 --- a/src/tool/N3ME/DlgUnusedFiles.cpp +++ b/src/tool/N3ME/DlgUnusedFiles.cpp @@ -46,7 +46,7 @@ void CDlgUnusedFiles::OnDelete() { return; } - int iYesNo = MessageBox("ðڽϱ?", "Ȯ", MB_YESNO); + int iYesNo = MessageBox("지우시겠습니까?", "확인", MB_YESNO); if (IDYES != iYesNo) { return; diff --git a/src/tool/N3ME/EventCell.cpp b/src/tool/N3ME/EventCell.cpp index ad0d0f6c..0eb0f7ac 100644 --- a/src/tool/N3ME/EventCell.cpp +++ b/src/tool/N3ME/EventCell.cpp @@ -83,7 +83,7 @@ void CEventCell::MakeTileVB(int x, int z, DWORD color) { return; } - if ((x + z) % 2 == 0) // Ÿ.. + if ((x + z) % 2 == 0) // 슬래쉬 모양의 타일.. { __Vector3 v; v.x = x * TERRAIN_CELL_SIZE; @@ -105,7 +105,7 @@ void CEventCell::MakeTileVB(int x, int z, DWORD color) { return; } - if ((x + z) % 2 == 1) //齽 Ÿ.. + if ((x + z) % 2 == 1) //백슬레쉬 모양의 타일.. { __Vector3 v; v.x = x * TERRAIN_CELL_SIZE; diff --git a/src/tool/N3ME/EventMgr.cpp b/src/tool/N3ME/EventMgr.cpp index e48ff617..a4451583 100644 --- a/src/tool/N3ME/EventMgr.cpp +++ b/src/tool/N3ME/EventMgr.cpp @@ -133,7 +133,7 @@ void CEventMgr::Render() { D3DXMATRIX mtx; D3DXMatrixIdentity(&mtx); - hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // .. + hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // 월드 행렬 적용.. // set texture hr = s_lpD3DDev->SetTexture(0, NULL); @@ -153,7 +153,7 @@ void CEventMgr::Render() { hr = s_lpD3DDev->SetFVF(FVF_XYZCOLOR); - //̹ ׸... + //이미 만들어진 길 그리기... std::list::iterator itEvent; CEventCell * pEvent; @@ -166,12 +166,12 @@ void CEventMgr::Render() { pEvent->Render(0xff0000ff); } - //ȭڿ õ ׸. + //대화상자에서 선택된 길 그리기. if (m_pDlgEventList->m_pSelEvent) { m_pDlgEventList->m_pSelEvent->Render(0xff00ff00); } - // ִ & ׸.. + //만들고 있는 길 & 영역 그리기.. m_pCurrEvent->Render(0xffff0000); // restore @@ -283,7 +283,7 @@ void CEventMgr::SaveToFile(const char * RealFileName) { GetCurrentDirectory(_MAX_PATH, szOldPath); SetCurrentDirectory(s_szPath.c_str()); - CreateDirectory("event", NULL); // .. + CreateDirectory("event", NULL); // 경로 만들고.. char szNPCPathFileName[_MAX_PATH]; wsprintf(szNPCPathFileName, "%sevent\\%s.evt", s_szPath.c_str(), (LPCTSTR)RealFileName); @@ -358,7 +358,7 @@ void CEventMgr::MakeEventArray() { } void CEventMgr::SaveInfoTextFile(char * szEvent) { - // text ... + // text 파일 버전... FILE * stream = fopen(szEvent, "r"); //if(!stream) return; @@ -443,7 +443,7 @@ void CEventMgr::SaveInfoTextFile(char * szEvent) { /* void CEventMgr::SaveInfoTextFile(char* szEvent) { - // text ... + // text 파일 버전... FILE* stream = fopen(szEvent, "w"); if(!stream) return; diff --git a/src/tool/N3ME/EventMgr.h b/src/tool/N3ME/EventMgr.h index 95e70848..25b5456e 100644 --- a/src/tool/N3ME/EventMgr.h +++ b/src/tool/N3ME/EventMgr.h @@ -18,7 +18,7 @@ class CEventMgr : public CN3Base { int m_MapSize; short ** m_ppEvent; CMapMng * m_pRefMapMng; - bool m_bActive; // ̱ Ȱȭ Ǿ ִ...1:Ȱȭ, 0:Ȱȭ.. + bool m_bActive; // 이기능이 활성화 되어 있는지...1:활성화, 0:비활성화.. CDlgEditEvent * m_pDlgEventList; public: diff --git a/src/tool/N3ME/LightObjMgr.cpp b/src/tool/N3ME/LightObjMgr.cpp index 2a3aa4b1..5582c41c 100644 --- a/src/tool/N3ME/LightObjMgr.cpp +++ b/src/tool/N3ME/LightObjMgr.cpp @@ -23,7 +23,7 @@ static char THIS_FILE[] = __FILE__; ////////////////////////////////////////////////////////////////////// CLightObjMgr::CLightObjMgr() { - m_pRefMapMng = NULL; // .. + m_pRefMapMng = NULL; // 지형 참조 포인터.. m_bActive = false; m_iVersion = 1; @@ -35,14 +35,14 @@ CLightObjMgr::CLightObjMgr() { m_ListObj.clear(); - m_BaseCube[0].Set(0, 1, 0); // LT - m_BaseCube[1].Set(1, 1, 0); // RT - m_BaseCube[2].Set(0, 0, 0); // LB - m_BaseCube[3].Set(1, 0, 0); // RB - m_BaseCube[4].Set(0, 1, 1); // LT - m_BaseCube[5].Set(1, 1, 1); // RT - m_BaseCube[6].Set(0, 0, 1); // LB - m_BaseCube[7].Set(1, 0, 1); // RB + m_BaseCube[0].Set(0, 1, 0); // 앞쪽 LT + m_BaseCube[1].Set(1, 1, 0); // 앞쪽 RT + m_BaseCube[2].Set(0, 0, 0); // 앞쪽 LB + m_BaseCube[3].Set(1, 0, 0); // 앞쪽 RB + m_BaseCube[4].Set(0, 1, 1); // 뒤쪽 LT + m_BaseCube[5].Set(1, 1, 1); // 뒤쪽 RT + m_BaseCube[6].Set(0, 0, 1); // 뒤쪽 LB + m_BaseCube[7].Set(1, 0, 1); // 뒤쪽 RB m_pCurrLO = NULL; m_VtxPosDummy.Release(); @@ -218,7 +218,7 @@ void CLightObjMgr::Render() { D3DXMATRIX mtx; D3DXMatrixIdentity(&mtx); - hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // .. + hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // 월드 행렬 적용.. // set texture hr = s_lpD3DDev->SetTexture(0, NULL); @@ -238,7 +238,7 @@ void CLightObjMgr::Render() { hr = s_lpD3DDev->SetFVF(FVF_XYZCOLOR); - //̹ ƮƮ ׸... + //이미 만들어진 라이트오브젝트 그리기... std::list::iterator it; LIGHTOBJ * pLO; for (it = m_ListObj.begin(); it != m_ListObj.end(); it++) { @@ -251,13 +251,13 @@ void CLightObjMgr::Render() { hr = s_lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 12, &(m_CubeVB[0]), sizeof(__VertexXyzColor)); } - // ִ ƮƮ ׸. + //현재 만들고 있는 라이트오브젝트 그리기. if (m_pCurrLO && m_pCurrLO->pRefLight) { MakeCube(m_pCurrLO->pRefLight->Pos(), 0xffff0000); hr = s_lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 12, &(m_CubeVB[0]), sizeof(__VertexXyzColor)); } - //̾α â õ ׸.. + //다이얼로그 창에서 선택된 길 그리기.. pLO = m_pDlg->m_pSelLO; if (pLO) { MakeCube(pLO->pRefLight->Pos(), 0xff00ff00); diff --git a/src/tool/N3ME/LightObjMgr.h b/src/tool/N3ME/LightObjMgr.h index 26301b6e..4cdc2e17 100644 --- a/src/tool/N3ME/LightObjMgr.h +++ b/src/tool/N3ME/LightObjMgr.h @@ -32,7 +32,7 @@ class CLightObjMgr : public CN3BaseFileAccess { __VertexXyzColor m_CubeVB[36]; CDlgLight * m_pDlg; - CMapMng * m_pRefMapMng; // .. + CMapMng * m_pRefMapMng; // 지형 참조 포인터.. bool m_bActive; std::list m_ListObj; diff --git a/src/tool/N3ME/LyTerrain.cpp b/src/tool/N3ME/LyTerrain.cpp index b705fbbd..a05429d0 100644 --- a/src/tool/N3ME/LyTerrain.cpp +++ b/src/tool/N3ME/LyTerrain.cpp @@ -1,5 +1,5 @@ // LyTerrain.cpp: implementation of the CLyTerrain class. -// - 2001. 9.24.~ Map Editor ȯ... +// - 2001. 9.24.~ Map Editor용으로 변환... // ////////////////////////////////////////////////////////////////////// @@ -58,18 +58,18 @@ CLyTerrain::CLyTerrain() { m_EyePos.x = m_EyePos.y = 0; - m_ColorMapVB = NULL; // ÷ʾ.. - m_TileVB = NULL; // Ÿ - m_LightMapVB = NULL; // ϳ Ʈ + m_ColorMapVB = NULL; // 컬러맵쓸때.. + m_TileVB = NULL; // 타일 + m_LightMapVB = NULL; // 하나의 라이트맵 - m_iHeightLimit = 600; // е .. - m_iDistLimit = 30; // Ŭ е .. + m_iHeightLimit = 600; // 작을 수록 더 정밀도가 높아진다.. + m_iDistLimit = 30; // 클수록 정밀도가 높아진다.. m_iHeightMapSize = 1025; m_iMaxLevel = 9; //(log2(m_iHeightMapSize-1)) - 1 - m_iColorMapTexSize = 128; //÷ ؽ ũ.. - m_iColorMapPixelPerUnitDistance = 4; //UnitDistance  ÷ ȼ .. + m_iColorMapTexSize = 128; //컬러맵 텍스쳐의 크기.. + m_iColorMapPixelPerUnitDistance = 4; //UnitDistance당 들어가는 컬러맵의 픽셀 수.. m_iNumColorMap = 32; m_iNumTileMap = 0; @@ -254,7 +254,7 @@ void CLyTerrain::Release() { if (m_pColorTexture) { for (int x = 0; x < m_iNumColorMap; x++) { if (m_pColorTexture[x]) { - // for(int z=0;zCreateVertexBuffer(8 * sizeof(__VertexTransformedT2), 0, FVF_TRANSFORMEDT2, D3DPOOL_MANAGED, &m_pColorMapTmpVB, NULL); - //÷ ؽ .. + //컬러맵 텍스쳐 만들기.. m_iNumColorMap = (((m_iHeightMapSize - 1) * m_iColorMapPixelPerUnitDistance) / m_iColorMapTexSize) + 1; if (((m_iHeightMapSize - 1) * m_iColorMapPixelPerUnitDistance) % m_iColorMapTexSize == 0) { m_iNumColorMap--; @@ -496,10 +496,10 @@ bool CLyTerrain::SaveToFilePartition(const char * lpszPath, float psx, float psz WriteFile(hFile, &(HeightMapSize), sizeof(int), &dwRWC, NULL); - CProgressBar ProgressBar; // Ȳ.. + CProgressBar ProgressBar; // 진행 상황.. if (HeightMapSize > 0) { - // ׳ ϳ ص Ʈũ Ҷ ڸ ̰ Ѳ ؾ .. ... + // 그냥 하나씩 저장해도 차이 없지만 네트워크로 저장할때는 파일 엑세스 숫자를 줄이고 한꺼번에 저장해야 빠르다.. ... DWORD dwAlloc = HeightMapSize * HeightMapSize * sizeof(float); HGLOBAL hAlloc = ::GlobalAlloc(GMEM_FIXED, dwAlloc); __ASSERT(hAlloc, "Global allocation failed."); @@ -513,12 +513,12 @@ bool CLyTerrain::SaveToFilePartition(const char * lpszPath, float psx, float psz pfHeights[idx] = m_ppMapData[x][z].fHeight; } } - WriteFile(hFile, pfHeights, dwAlloc, &dwRWC, NULL); // Ͽ .. + WriteFile(hFile, pfHeights, dwAlloc, &dwRWC, NULL); // 파일에 쓴다.. pfHeights = NULL; ::GlobalUnlock(hAlloc); ::GlobalFree(hAlloc); - // Detail Texture .. + // Detail Texture 저장.. dwAlloc = HeightMapSize * HeightMapSize * sizeof(DTEXINFO) * 2; hAlloc = ::GlobalAlloc(GMEM_FIXED, dwAlloc); __ASSERT(hAlloc, "Global allocation failed."); @@ -529,7 +529,7 @@ bool CLyTerrain::SaveToFilePartition(const char * lpszPath, float psx, float psz ProgressBar.StepIt(); for (x = sx; x < ex; x++) { //////////////////////////////////////////////////////////////////// - // ... + // 쓰레기 정보 차단... if (m_ppMapData[x][z].DTexInfo1.TexIdx.TileX < 0 || m_ppMapData[x][z].DTexInfo1.TexIdx.TileX >= NUM_DTEXTILE) { m_ppMapData[x][z].DTexInfo1.TexIdx.TileX = 0; @@ -546,7 +546,7 @@ bool CLyTerrain::SaveToFilePartition(const char * lpszPath, float psx, float psz m_ppMapData[x][z].DTexInfo2.TexIdx.TileY >= NUM_DTEXTILE) { m_ppMapData[x][z].DTexInfo2.TexIdx.TileY = 0; } - // ... + // 쓰레기 정보 차단... //////////////////////////////////////////////////////////////////// int idx = (z - sz) * HeightMapSize + (x - sx); @@ -554,16 +554,16 @@ bool CLyTerrain::SaveToFilePartition(const char * lpszPath, float psx, float psz pDTexInfos[idx * 2 + 1] = m_ppMapData[x][z].DTexInfo2; } } - WriteFile(hFile, pDTexInfos, dwAlloc, &dwRWC, NULL); // Ͽ .. + WriteFile(hFile, pDTexInfos, dwAlloc, &dwRWC, NULL); // 파일에 쓴다.. pDTexInfos = NULL; ::GlobalUnlock(hAlloc); ::GlobalFree(hAlloc); } - //Ʈ ... - //N3ME_DATA_VERSION 1̻.. + //라이트맵 정보 기록... + //N3ME_DATA_VERSION 1이상부터.. int NumLightMap = DetectRealLightMap(sx, sz, HeightMapSize); - WriteFile(hFile, &(NumLightMap), sizeof(int), &dwRWC, NULL); // LightMap .. + WriteFile(hFile, &(NumLightMap), sizeof(int), &dwRWC, NULL); // LightMap의 갯수 기록.. if (NumLightMap > 0) { ProgressBar.Create("Save Light Map Data", 50, NumLightMap); @@ -595,7 +595,7 @@ bool CLyTerrain::SaveToFilePartition(const char * lpszPath, float psx, float psz } } - //Ǯ .. + //풀 관련 정보 저장.. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); int NumSeedInfo = pFrm->m_SeedGroupList.size(); @@ -615,11 +615,11 @@ bool CLyTerrain::SaveToFilePartition(const char * lpszPath, float psx, float psz CloseHandle(hFile); ///////////////////////////////////////////////////////////////////////////////////////////////////// - // ÷ . + // 컬러맵 쓰기. char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath(lpszPath, szDrive, szDir, szFName, szExt); char szNewFName[_MAX_PATH] = ""; - _makepath(szNewFName, szDrive, szDir, szFName, "tcm"); // ̸ ̸ ÷ .. + _makepath(szNewFName, szDrive, szDir, szFName, "tcm"); // 파일 이름과 동일한 이름으로 컬러맵 저장.. HANDLE hCMFile = CreateFile(szNewFName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); @@ -629,7 +629,7 @@ bool CLyTerrain::SaveToFilePartition(const char * lpszPath, float psx, float psz } ////////////////////////////////////////////////////////// - //ϴ ÷ ....װ ... + //일단 국지적인 컬러맵을 생성한 다음에....그걸 써야해... // ProgressBar.Create("Create ColorMap", 50, NumColorMap * NumColorMap + NumColorMap); @@ -642,10 +642,10 @@ bool CLyTerrain::SaveToFilePartition(const char * lpszPath, float psx, float psz // // fill color map.. - // bmp÷ ... - // ٽ о ... - // ٽ ߶ ... - // ߶ bmp Importϴ ó о .. + // bmp컬러맵 만들고... + // 다시 읽어온 다음에... + // 다시 잘라서 저장한 다음에... + // 잘라 저장한 bmp를 Import하는 것처럼 읽어서 셋팅.. CString strTmpColorMap("c:\\MiniMap.bmp"); ColorMapExport((LPCTSTR)strTmpColorMap); @@ -694,7 +694,7 @@ bool CLyTerrain::SaveToFilePartition(const char * lpszPath, float psx, float psz // // Save() -// ʿͿ Ÿ ϱ.. +// 맵에디터에서 쓰는 파일 타입으로 저장하기.. // bool CLyTerrain::SaveToFile(const char * lpszPath) { HANDLE hFile = CreateFile(lpszPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); @@ -710,10 +710,10 @@ bool CLyTerrain::SaveToFile(const char * lpszPath) { WriteFile(hFile, &(m_iHeightMapSize), sizeof(int), &dwRWC, NULL); - CProgressBar ProgressBar; // Ȳ.. + CProgressBar ProgressBar; // 진행 상황.. if (m_iHeightMapSize > 0) { - // ׳ ϳ ص Ʈũ Ҷ ڸ ̰ Ѳ ؾ .. ... + // 그냥 하나씩 저장해도 차이 없지만 네트워크로 저장할때는 파일 엑세스 숫자를 줄이고 한꺼번에 저장해야 빠르다.. ... DWORD dwAlloc = m_iHeightMapSize * m_iHeightMapSize * sizeof(float); HGLOBAL hAlloc = ::GlobalAlloc(GMEM_FIXED, dwAlloc); __ASSERT(hAlloc, "Global allocation failed."); @@ -726,12 +726,12 @@ bool CLyTerrain::SaveToFile(const char * lpszPath) { pfHeights[z * m_iHeightMapSize + x] = m_ppMapData[x][z].fHeight; } } - WriteFile(hFile, pfHeights, dwAlloc, &dwRWC, NULL); // Ͽ .. + WriteFile(hFile, pfHeights, dwAlloc, &dwRWC, NULL); // 파일에 쓴다.. pfHeights = NULL; ::GlobalUnlock(hAlloc); ::GlobalFree(hAlloc); - // Detail Texture .. + // Detail Texture 저장.. dwAlloc = m_iHeightMapSize * m_iHeightMapSize * sizeof(DTEXINFO) * 2; hAlloc = ::GlobalAlloc(GMEM_FIXED, dwAlloc); __ASSERT(hAlloc, "Global allocation failed."); @@ -742,7 +742,7 @@ bool CLyTerrain::SaveToFile(const char * lpszPath) { ProgressBar.StepIt(); for (x = 0; x < m_iHeightMapSize; x++) { //////////////////////////////////////////////////////////////////// - // ... + // 쓰레기 정보 차단... if (m_ppMapData[x][z].DTexInfo1.TexIdx.TileX < 0 || m_ppMapData[x][z].DTexInfo1.TexIdx.TileX >= NUM_DTEXTILE) { m_ppMapData[x][z].DTexInfo1.TexIdx.TileX = 0; @@ -759,23 +759,23 @@ bool CLyTerrain::SaveToFile(const char * lpszPath) { m_ppMapData[x][z].DTexInfo2.TexIdx.TileY >= NUM_DTEXTILE) { m_ppMapData[x][z].DTexInfo2.TexIdx.TileY = 0; } - // ... + // 쓰레기 정보 차단... //////////////////////////////////////////////////////////////////// pDTexInfos[(z * m_iHeightMapSize + x) * 2] = m_ppMapData[x][z].DTexInfo1; pDTexInfos[(z * m_iHeightMapSize + x) * 2 + 1] = m_ppMapData[x][z].DTexInfo2; } } - WriteFile(hFile, pDTexInfos, dwAlloc, &dwRWC, NULL); // Ͽ .. + WriteFile(hFile, pDTexInfos, dwAlloc, &dwRWC, NULL); // 파일에 쓴다.. pDTexInfos = NULL; ::GlobalUnlock(hAlloc); ::GlobalFree(hAlloc); } - //Ʈ ... - //N3ME_DATA_VERSION 1̻.. + //라이트맵 정보 기록... + //N3ME_DATA_VERSION 1이상부터.. DetectRealLightMap(0, 0, m_iHeightMapSize); - WriteFile(hFile, &(m_iNumLightMap), sizeof(int), &dwRWC, NULL); // LightMap .. + WriteFile(hFile, &(m_iNumLightMap), sizeof(int), &dwRWC, NULL); // LightMap의 갯수 기록.. int CountLightMap = m_iNumLightMap; if (CountLightMap > 0) { @@ -809,7 +809,7 @@ bool CLyTerrain::SaveToFile(const char * lpszPath) { } } - //Ǯ .. + //풀 관련 정보 저장.. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); int NumSeedInfo = pFrm->m_SeedGroupList.size(); @@ -829,11 +829,11 @@ bool CLyTerrain::SaveToFile(const char * lpszPath) { CloseHandle(hFile); ///////////////////////////////////////////////////////////////////////////////////////////////////// - // ÷ . + // 컬러맵 쓰기. char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath(lpszPath, szDrive, szDir, szFName, szExt); char szNewFName[_MAX_PATH] = ""; - _makepath(szNewFName, szDrive, szDir, szFName, "tcm"); // ̸ ̸ ÷ .. + _makepath(szNewFName, szDrive, szDir, szFName, "tcm"); // 파일 이름과 동일한 이름으로 컬러맵 저장.. HANDLE hCMFile = CreateFile(szNewFName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); @@ -858,14 +858,14 @@ bool CLyTerrain::SaveToFile(const char * lpszPath) { { ProgressBar.StepIt(); - _makepath(szNewFName, szDrive, szDir, szFName, NULL); // ̸ ̸ ÷ .. - wsprintf(szAdd, "_%02d%02d.DXT", x, z); // Tool θ ̰ ȣ Ȯڸ ٿ .. + _makepath(szNewFName, szDrive, szDir, szFName, NULL); // 파일 이름과 동일한 이름으로 컬러맵 저장.. + wsprintf(szAdd, "_%02d%02d.DXT", x, z); // Tool 경로를 붙이고 번호와 확장자를 붙여서 저장.. lstrcat(szNewFName, szAdd); m_pColorTexture[x][z].SaveToFile(szNewFName); } } */ - // ÷ . + // 컬러맵 쓰기. ///////////////////////////////////////////////////////////////////////////////////////////////////// return true; @@ -885,19 +885,19 @@ bool CLyTerrain::LoadFromFile(const char * lpszPath) { int HeightMapSize; int version = 0; ReadFile(hFile, &(version), sizeof(int), &dwRWC, NULL); - if (version < 0) // ϵ ͵.... + if (version < 0) //버전이 기록된 데이터들.... { ReadFile(hFile, &(HeightMapSize), sizeof(int), &dwRWC, NULL); } else { - HeightMapSize = version; // ϵǾ ͵.. + HeightMapSize = version; //버전이 기록되어 있지 않은 이전 데이터들.. } Init(HeightMapSize); - CProgressBar ProgressBar; // Ȳ.. + CProgressBar ProgressBar; // 진행 상황.. if (m_iHeightMapSize > 0) { - // ׳ ϳ ص Ʈũ Ҷ ڸ ̰ Ѳ ؾ .. ... + // 그냥 하나씩 저장해도 차이 없지만 네트워크로 저장할때는 파일 엑세스 숫자를 줄이고 한꺼번에 저장해야 빠르다.. ... DWORD dwAlloc = m_iHeightMapSize * m_iHeightMapSize * sizeof(float); HGLOBAL hAlloc = ::GlobalAlloc(GMEM_FIXED, dwAlloc); __ASSERT(hAlloc, "Global allocation failed."); @@ -916,7 +916,7 @@ bool CLyTerrain::LoadFromFile(const char * lpszPath) { hAlloc = NULL; fHeights = NULL; - // ׳ ϳ ص Ʈũ Ҷ ڸ ̰ Ѳ ؾ .. ... + // 그냥 하나씩 저장해도 차이 없지만 네트워크로 저장할때는 파일 엑세스 숫자를 줄이고 한꺼번에 저장해야 빠르다.. ... dwAlloc = m_iHeightMapSize * m_iHeightMapSize * sizeof(DTEXINFO) * 2; hAlloc = ::GlobalAlloc(GMEM_FIXED, dwAlloc); __ASSERT(hAlloc, "Global allocation failed."); @@ -939,10 +939,10 @@ bool CLyTerrain::LoadFromFile(const char * lpszPath) { pDTIs = NULL; } - if (version <= -1) // 1....^^ + if (version <= -1) //버전 1부터....^^ { - //Ʈ б.. - ReadFile(hFile, &(m_iNumLightMap), sizeof(int), &dwRWC, NULL); // LightMap .. + //라이트맵 정보 읽기.. + ReadFile(hFile, &(m_iNumLightMap), sizeof(int), &dwRWC, NULL); // LightMap의 갯수 기록.. ProgressBar.Create("Load Light Map Data", 50, m_iNumLightMap); if (version > -3) { @@ -979,9 +979,9 @@ bool CLyTerrain::LoadFromFile(const char * lpszPath) { } } } - if (version <= -2) // 2....^^ + if (version <= -2) //버전 2부터....^^ { - // Ǯ б.. + // 풀씨에 관한 정보 읽기.. int NumSeedInfo; ReadFile(hFile, &(NumSeedInfo), sizeof(int), &dwRWC, NULL); @@ -1002,14 +1002,14 @@ bool CLyTerrain::LoadFromFile(const char * lpszPath) { CloseHandle(hFile); ///////////////////////////////////////////////////////////////////////////////////////////////////// - // ÷ б. + // 컬러맵 읽기. ProgressBar.Create("Load color map..", 50, m_iNumColorMap * m_iNumColorMap); char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath(lpszPath, szDrive, szDir, szFName, szExt); char szNewFName[_MAX_PATH] = "", szAdd[_MAX_PATH] = ""; - _makepath(szNewFName, szDrive, szDir, szFName, "tcm"); // ̸ ̸ ÷ Ǿ ִ. + _makepath(szNewFName, szDrive, szDir, szFName, "tcm"); // 파일 이름과 동일한 이름으로 컬러맵 저장되어 있다. HANDLE hCMFile = CreateFile(szNewFName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hCMFile) { for (x = 0; x < m_iNumColorMap; x++) { @@ -1017,12 +1017,12 @@ bool CLyTerrain::LoadFromFile(const char * lpszPath) { ProgressBar.StepIt(); _makepath(szNewFName, szDrive, szDir, szFName, - NULL); // ̸ ̸ ÷ Ǿ ִ. - wsprintf(szAdd, "_%02d%02d.DXT", x, z); // Tool θ ̰ ȣ Ȯڸ ٿ Ǿ ִ. + NULL); // 파일 이름과 동일한 이름으로 컬러맵 저장되어 있다. + wsprintf(szAdd, "_%02d%02d.DXT", x, z); // Tool 경로를 붙이고 번호와 확장자를 붙여서 저장되어 있다. lstrcat(szNewFName, szAdd); if (m_pColorTexture[x][z].LoadFromFile(szNewFName) == false) { - MessageBox(::GetActiveWindow(), "÷ 32bit dxtϸ ־..", ".", MB_OK); + MessageBox(::GetActiveWindow(), "컬러맵은 32bit dxt파일만 사용할 수 있어요..", "ㅠ.ㅠ", MB_OK); } } } @@ -1038,10 +1038,10 @@ bool CLyTerrain::LoadFromFile(const char * lpszPath) { CloseHandle(hCMFile); } - // ÷ б. + // 컬러맵 읽기. ///////////////////////////////////////////////////////////////////////////////////////////////////// - //Ʈؽ ְ, ؽĵ .. + //라이트맵텍스쳐 수도 있고, 텍스쳐도 세팅.. m_pRoot->SetWholeClipped(); m_pRoot->ClearMinMaxY(); m_pRoot->SetMinMaxY(); @@ -1095,7 +1095,7 @@ void CLyTerrain::ConvertLightMapToolDataV2toV3() { } } - //dc Ʈ.. + //dc만들어서 비트맵축소.. pBMP->SaveToFile("c:\\templightmap.bmp"); int SmallSize = LIGHTMAP_TEX_SIZE - 2; @@ -1144,11 +1144,11 @@ void CLyTerrain::ConvertLightMapToolDataV2toV3() { SelectObject(hBMDC, hOldBM); SelectObject(hSmallDC, hOldBM2); - DeleteFile("c:\\templightmap.bmp"); // ӽ ش.. + DeleteFile("c:\\templightmap.bmp"); // 임시 파일을 지워준다.. } } - //׵θ .. + //테두리 만들기.. D3DLOCKED_RECT d3dlrDest; DWORD * pDestBits; int srcX, srcZ; @@ -1285,7 +1285,7 @@ void CLyTerrain::ConvertLightMapToolDataV2toV3() { // // SaveGameData -// ӿ Ÿ .. +// 게임에 쓸 데이타를 저장.. // void CLyTerrain::SaveGameData(HANDLE hFile) { MMap TexTree; @@ -1293,7 +1293,7 @@ void CLyTerrain::SaveGameData(HANDLE hFile) { // /////////////////////// - // Ÿ 籸... + // 데이타 재구성... // short tmpTexIdx; short tmpTileIdx; @@ -1365,13 +1365,13 @@ void CLyTerrain::SaveGameData(HANDLE hFile) { } // - // ...^^... + // 기록 시작...^^... // DWORD dwRWC; WriteFile(hFile, &m_iHeightMapSize, sizeof(int), &dwRWC, NULL); - // ... - // ׳ ϳ ص Ʈũ Ҷ ڸ ̰ Ѳ ؾ .. ... + // 각 꼭지점 정보 저장... + // 그냥 하나씩 저장해도 차이 없지만 네트워크로 저장할때는 파일 엑세스 숫자를 줄이고 한꺼번에 저장해야 빠르다.. ... DWORD dwAlloc = sizeof(GAMEMAPDATA) * m_iHeightMapSize * m_iHeightMapSize; HGLOBAL hAlloc = ::GlobalAlloc(GMEM_FIXED, dwAlloc); __ASSERT(hAlloc, "Global allocation failed."); @@ -1412,15 +1412,15 @@ void CLyTerrain::SaveGameData(HANDLE hFile) { } } - WriteFile(hFile, pGMDs, dwAlloc, &dwRWC, NULL); // Ϸ Ƽ .... + WriteFile(hFile, pGMDs, dwAlloc, &dwRWC, NULL); // 좀더 빨리 저장하려고 몰아서 저장.... GlobalUnlock(hAlloc); GlobalFree(hAlloc); hAlloc = NULL; pGMDs = NULL; - // ġ  y .. + // 각 패치의 가운데 y값과 반지름 저장.. int ti_PatchSize = 8; // 32m = 8tiles.. - float re_HalfDist = (float)((ti_PatchSize >> 1) << 2); //ġ ..(m) + float re_HalfDist = (float)((ti_PatchSize >> 1) << 2); //패치길이의 절반..(m단위) float MinY, MaxY; int pat_HeightMapSize = (m_iHeightMapSize - 1) / ti_PatchSize; @@ -1452,7 +1452,7 @@ void CLyTerrain::SaveGameData(HANDLE hFile) { } } - //ŸϿ Ǯ Ӽ .. + //타일에 풀 속성 저장.. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); pFrm->GetMapMng()->m_SowSeedMng.SaveDataGame(); LPSEEDGROUP SeedAttr = new SEEDGROUP[m_iHeightMapSize * m_iHeightMapSize]; @@ -1515,7 +1515,7 @@ void CLyTerrain::SaveGameData(HANDLE hFile) { } } - /* Ǯ + /* 원래의 풀 저장 int NumSeedInfo = pFrm->m_SeedGroupList.size(); for(int x=0; xObj_Id, v.SeedGroup_Sub->Seed_Count); + fprintf(stream, "서브 %d,%d\t", v.SeedGroup_Sub->Obj_Id, v.SeedGroup_Sub->Seed_Count); } fprintf(stream, "\n"); @@ -1561,11 +1561,11 @@ void CLyTerrain::SaveGameData(HANDLE hFile) { } fclose(stream); - //WriteFile(hFile, szFName, _MAX_PATH, &dwRWC, NULL); // ÷ ̸ . - //÷ MapMng Ѵ.. + //WriteFile(hFile, szFName, _MAX_PATH, &dwRWC, NULL); // 컬러맵 이름 저장. + //컬러맵은 MapMng에서 따로 저장한다.. // - // Ÿؽ ... + // 타일텍스쳐정보 저장... // WriteFile(hFile, &NumTile, sizeof(int), &dwRWC, NULL); if (NumTile != 0) { @@ -1580,7 +1580,7 @@ void CLyTerrain::SaveGameData(HANDLE hFile) { pTexture = GetTileTex(TexIdx); if (pTexture) { - // θ ̸ Ȯڸ ش. + // 경로를 빼고 파일이름과 확장자만 저장해준다. char szTileFN[MAX_PATH]; _splitpath(pTexture->FileName().c_str(), NULL, NULL, szFName, NULL); wsprintf(szTileFN, "dtex\\%s_%d.gtt", szFName, YIdx); @@ -1605,15 +1605,15 @@ void CLyTerrain::SaveGameData(HANDLE hFile) { } } - //Ʈ ... + //라이트맵 정보 기록... DetectRealLightMap(0, 0, m_iHeightMapSize); int CountLightMap; CountLightMap = 0; - //Ʈ Ϸ ؼ ⶧ 0 ؼ ... + //라이트맵은 따로 파일로 저장해서 쓰기때문에 걍 0으로 해서 저장... //CountLightMap = m_iNumLightMap; - WriteFile(hFile, &(CountLightMap), sizeof(int), &dwRWC, NULL); // LightMap .. + WriteFile(hFile, &(CountLightMap), sizeof(int), &dwRWC, NULL); // LightMap의 갯수 기록.. if (CountLightMap > 0) { ProgressBar.Create("Save Light Map Data", 50, m_iNumLightMap); @@ -1660,7 +1660,7 @@ void CLyTerrain::MakeGameLightMap(char * szFullPathName) { int * PatchInfo = new int[PatchCount * PatchCount]; ZeroMemory(PatchInfo, sizeof(int) * PatchCount * PatchCount); - // ũ⵵ ˾Ƴ.. + //각각의 파일을 만들어 보고 크기도 알아내자.. int Size = sizeof(int) * PatchCount * PatchCount + sizeof(int); int px, pz; int tx, tz; @@ -1688,19 +1688,19 @@ void CLyTerrain::MakeGameLightMap(char * szFullPathName) { continue; } - //ӽ غ, 뷮 ˾Ƴ....ұ? + //임시파일 만들고 저장함 해보고, 용량 알아낸다음....저장할까? char szTmpName[_MAX_PATH]; sprintf(szTmpName, "c:\\temp_lightmap.binn"); HANDLE hFile = CreateFile(szTmpName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - WriteFile(hFile, &(TexCount), sizeof(int), &dwRWC, NULL); // LightMap .. + WriteFile(hFile, &(TexCount), sizeof(int), &dwRWC, NULL); // LightMap의 갯수 기록.. for (tx = 0; tx < PATCH_TILE_SIZE; tx++) { for (tz = 0; tz < PATCH_TILE_SIZE; tz++) { if (m_ppIsLightMap[tpx + tx][tpz + tz] == true && m_ppLightMapTexture[tpx + tx][tpz + tz]) { - WriteFile(hFile, &(tx), sizeof(int), &dwRWC, NULL); // ġȿ ǥ - WriteFile(hFile, &(tz), sizeof(int), &dwRWC, NULL); // LightMap .. + WriteFile(hFile, &(tx), sizeof(int), &dwRWC, NULL); // 패치안에서의 좌표 + WriteFile(hFile, &(tz), sizeof(int), &dwRWC, NULL); // LightMap의 갯수 기록.. m_ppLightMapTexture[tpx + tx][tpz + tz]->Convert(D3DFMT_A4R4G4B4, LIGHTMAP_TEX_SIZE, LIGHTMAP_TEX_SIZE); @@ -1746,11 +1746,11 @@ void CLyTerrain::MakeGameLightMap(char * szFullPathName) { continue; } - WriteFile(hFile, &(TexCount), sizeof(int), &dwRWC, NULL); // LightMap .. + WriteFile(hFile, &(TexCount), sizeof(int), &dwRWC, NULL); // LightMap의 갯수 기록.. for (tx = 0; tx < PATCH_TILE_SIZE; tx++) { for (tz = 0; tz < PATCH_TILE_SIZE; tz++) { if (m_ppIsLightMap[tpx + tx][tpz + tz] == true && m_ppLightMapTexture[tpx + tx][tpz + tz]) { - WriteFile(hFile, &(tx), sizeof(int), &dwRWC, NULL); // ġȿ ǥ + WriteFile(hFile, &(tx), sizeof(int), &dwRWC, NULL); // 패치안에서의 좌표 WriteFile(hFile, &(tz), sizeof(int), &dwRWC, NULL); // CN3Texture * pNewTex = new CN3Texture; @@ -1774,12 +1774,12 @@ void CLyTerrain::MakeGameLightMap(char * szFullPathName) { void CLyTerrain::MakeGameColorMap(char * szFullPathName) { HANDLE hCMFile = CreateFile(szFullPathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - CProgressBar ProgressBar; // Ȳ.. + CProgressBar ProgressBar; // 진행 상황.. ProgressBar.Create("Save game color map..", 50, m_iNumColorMap * m_iNumColorMap); ProgressBar.SetStep(1); /////////////////////////////////////////////////////////////// - //...(ҽŰ ʴ¹..) + //원본...(축소시키지 않는방법..) //* CN3Texture TexTmp; TexTmp.Create(m_iColorMapTexSize, m_iColorMapTexSize, D3DFMT_A1R5G5B5, TRUE); @@ -1806,7 +1806,7 @@ void CLyTerrain::MakeGameColorMap(char * szFullPathName) { /////////////////////////////////////////////////////////////// // - // New...(ҽŰ¹..) + // New...(축소시키는방법..) /* int x,z; CBitMapFile BMP[3][3]; @@ -1837,7 +1837,7 @@ void CLyTerrain::MakeGameColorMap(char * szFullPathName) { } //for(int az=0;az<3;az++) } //for(int ax=0;ax<3;ax++) - //ȼ 迭... + //픽셀 재배열... int SmallSize = m_iColorMapTexSize - 2; TexTmp.Convert(D3DFMT_X8R8G8B8, m_iColorMapTexSize, m_iColorMapTexSize); TexTmp.Get()->LockRect(0, &d3dlrTex, 0, 0); @@ -1908,7 +1908,7 @@ void CLyTerrain::MakeGameColorMap(char * szFullPathName) { SelectObject( hSmallDC, hOldBM2 ); - DeleteFile(buff); // ӽ ش.. + DeleteFile(buff); // 임시 파일을 지워준다.. } } TexTmp.Get()->UnlockRect(0); @@ -1927,17 +1927,17 @@ void CLyTerrain::MakeGameColorMap(char * szFullPathName) { CloseHandle(hCMFile); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // ȼ ϳ о ִ ؽ .. - // ׷ texturestagestate mirror ϱ ص Ǵ...-.- + // 픽셀을 하나씩 밀어서 선을 없애는 텍스쳐 저장.. + // 그런데 texturestagestate에서 mirror쓰면 좀 어색하긴 해도 어느정도는 되더라...-.- // /* HANDLE hCMFile = CreateFile(szFullPathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - CProgressBar ProgressBar; // Ȳ.. + CProgressBar ProgressBar; // 진행 상황.. ProgressBar.Create("Save game color map..", 50, m_iNumColorMap * m_iNumColorMap); ProgressBar.SetStep(1); - //bitmap... + //bitmap가공... ColorMapExport("c:\\TempColormap.bmp"); int OrgWidth, OrgHeight; @@ -1976,7 +1976,7 @@ void CLyTerrain::MakeGameColorMap(char * szFullPathName) { hBMDC, 0,0, OrgWidth, OrgHeight, SRCCOPY); - // n3texture .. + // n3texture 가공.. CN3Texture TexTmp; LPDWORD pImgTarget; D3DLOCKED_RECT d3dlrTarget; @@ -2025,7 +2025,7 @@ void CLyTerrain::MakeGameColorMap(char * szFullPathName) { memcpy(&(pImgTarget[i*TexSize]), &(pBitmapBits[sx + (sz+i)*SmallWidth]), DestWidth*sizeof(DWORD)); TexTmp.Get()->UnlockRect(0); - TexTmp.Convert(D3DFMT_DXT1); // DXT1 Convert + TexTmp.Convert(D3DFMT_DXT1); // DXT1 형식으로 Convert TexTmp.Save(hCMFile); } } @@ -2035,24 +2035,24 @@ void CLyTerrain::MakeGameColorMap(char * szFullPathName) { SelectObject( hBMDC, hOldBM ); SelectObject( hSmallDC, hOldBM2 ); - DeleteFile("c:\\TempColormap.bmp"); // ӽ ش.. + DeleteFile("c:\\TempColormap.bmp"); // 임시 파일을 지워준다.. */ // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////// - // ÷ ش.(old version..) - // ÷ ̸.. ̸(Ȯڴ .) ش. - // ÷ ġ ... + // 컬러맵을 저장해준다.(old version..) + // 컬러 맵 이름.. 파일이름만(확장자는 없다.) 저장해준다. + // 컬러맵을 패치별로 따로 저장... /* char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath(m_szFileName, szDrive, szDir, szFName, szExt); - CProgressBar ProgressBar; // Ȳ.. + CProgressBar ProgressBar; // 진행 상황.. ProgressBar.Create("Save game color map..", m_iNumColorMap * m_iNumColorMap, 50); ProgressBar.SetStep(1); - WriteFile(hFile, szFName, _MAX_PATH, &dwRWC, NULL); // ÷ ̸ . + WriteFile(hFile, szFName, _MAX_PATH, &dwRWC, NULL); // 컬러맵 이름 저장. CN3Texture TexTmp; char szNewFName[_MAX_PATH] = "", szAdd[_MAX_PATH] = ""; @@ -2062,9 +2062,9 @@ void CLyTerrain::MakeGameColorMap(char * szFullPathName) { { ProgressBar.StepIt(); - m_pColorTexture[x][z].SaveToFile("c:\\TempConversion.DXT"); // ӽ÷ . - TexTmp.LoadFromFile("c:\\TempConversion.DXT"); // д´. - TexTmp.Convert(D3DFMT_DXT1); // DXT1 Convert + m_pColorTexture[x][z].SaveToFile("c:\\TempConversion.DXT"); // 임시로 저장. + TexTmp.LoadFromFile("c:\\TempConversion.DXT"); // 읽는다. + TexTmp.Convert(D3DFMT_DXT1); // DXT1 형식으로 Convert _makepath(szNewFName, szDrive, szDir, szFName, NULL); wsprintf(szAdd, "_%02d%02d.dxt", x, z); @@ -2072,7 +2072,7 @@ void CLyTerrain::MakeGameColorMap(char * szFullPathName) { TexTmp.SaveToFile(szNewFName); } } - DeleteFile("c:\\TempConversion.DXT"); // ӽ ش.. + DeleteFile("c:\\TempConversion.DXT"); // 임시 파일을 지워준다.. */ // /////////////////////////////////////////////////////////////////////////////////////////// @@ -2096,7 +2096,7 @@ void CLyTerrain::Tick() { } // -// ðŸ ϱ...(Ÿϴ) +// 가시거리 범위 정하기...(타일단위) // void CLyTerrain::SetVisibleRect() { int tx, tz; @@ -2114,22 +2114,22 @@ void CLyTerrain::SetVisibleRect() { m_VisibleRect.left = m_VisibleRect.right = tx; m_VisibleRect.top = m_VisibleRect.bottom = tz; - // ü Ϳ Far ġ .. + // 사면체의 법선 벡터와 Far 네 귀퉁이 위치 계산.. float fS = sinf(CN3Base::s_CameraData.fFOV / 2.0f); float fPL = CN3Base::s_CameraData.fFP; - float fAspect = CN3Base::s_CameraData.fAspect; // Ⱦ + float fAspect = CN3Base::s_CameraData.fAspect; // 종횡비 - // Far Plane ġ + // Far Plane 의 네 귀퉁이 위치 계산 __Vector3 vFPs[4] = {__Vector3(fPL * -fS * fAspect, fPL * fS, fPL), // LeftTop __Vector3(fPL * fS * fAspect, fPL * fS, fPL), // rightTop __Vector3(fPL * fS * fAspect, fPL * -fS, fPL), // RightBottom __Vector3(fPL * -fS * fAspect, fPL * -fS, fPL)}; // LeftBottom for (int i = 0; i < 4; i++) { - // ġ ȸ Ѵ.. + // 귀퉁이 위치에 회전 행렬을 적용한다.. vFPs[i] = vFPs[i] * CN3Base::s_CameraData.mtxViewInverse; - int tx, tz; // Ÿǥ... + int tx, tz; // 타일좌표계... tx = (int)(vFPs[i].x / TERRAIN_CELL_SIZE); tz = (int)(vFPs[i].z / TERRAIN_CELL_SIZE); @@ -2191,7 +2191,7 @@ void CLyTerrain::Render() { hr = s_lpD3DDev->GetSamplerState(1, D3DSAMP_ADDRESSU, &AddressU2); hr = s_lpD3DDev->GetSamplerState(1, D3DSAMP_ADDRESSV, &AddressV2); - // ؽĵ 輱 ִ..^^ + // 각각의 텍스쳐들을 연결했을때 경계선을 없앨 수 있다..^^ hr = s_lpD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR); hr = s_lpD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR); hr = s_lpD3DDev->SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR); @@ -2212,7 +2212,7 @@ void CLyTerrain::Render() { RenderBrushArea(); - //Ʈ .. + //라이트맵 라인.. //if(m_bDrawLineLightMap) if (m_vLineLightMap[0] != m_vLineLightMap[1]) { HRESULT hr; @@ -2247,7 +2247,7 @@ void CLyTerrain::Render() { } // -// ׸ƴ ʱȭ..('ƴϴ' ʱȭ) +// 각점에 대해 그릴지아닐지를 초기화..('아니다'로 초기화) // inline void CLyTerrain::ClearRenderInfo() { for (int i = 0; i < m_iHeightMapSize; i++) { @@ -2257,7 +2257,7 @@ inline void CLyTerrain::ClearRenderInfo() { // // Log2(x) = l.. -// 2 ¼ ؼ ۵...(x>0) +// 2의 승수에 대해서만 제대로 작동...(x>0) // inline int CLyTerrain::Log2(int x) { int l = 0; @@ -2269,7 +2269,7 @@ inline int CLyTerrain::Log2(int x) { } // -// ̰ Լ... +// 높이값 얻는 함수... // float CLyTerrain::GetHeight(float x, float z) { int ix, iz; @@ -2290,20 +2290,20 @@ float CLyTerrain::GetHeight(float x, float z) { float y; float h1, h2, h3, h12, h13; - if ((ix + iz) % 2 == 0) //簢 / .. + if ((ix + iz) % 2 == 0) //사각형이 / 모양.. { h1 = m_ppMapData[ix][iz].fHeight; h3 = m_ppMapData[ix + 1][iz + 1].fHeight; - if (dZ > dX) // ﰢ.. + if (dZ > dX) //윗쪽 삼각형.. { h2 = m_ppMapData[ix][iz + 1].fHeight; - h12 = h1 + (h2 - h1) * dZ; // h1 h2 ̰ - h13 = h1 + (h3 - h1) * dZ; // h1 h3 ̰ + h12 = h1 + (h2 - h1) * dZ; // h1과 h2사이의 높이값 + h13 = h1 + (h3 - h1) * dZ; // h1과 h3사이의 높이값 - y = h12 + ((h13 - h12) * (dX / dZ)); // ã ϴ ̰ + y = h12 + ((h13 - h12) * (dX / dZ)); // 찾고자 하는 높이값 return y; - } else //Ʒ ﰢ.. + } else //아래쪽 삼각형.. { if (dX == 0.0f) { return h1; @@ -2311,18 +2311,18 @@ float CLyTerrain::GetHeight(float x, float z) { h2 = m_ppMapData[ix + 1][iz].fHeight; - h12 = h1 + (h2 - h1) * dX; // h1 h2 ̰ - h13 = h1 + (h3 - h1) * dX; // h1 h3 ̰ + h12 = h1 + (h2 - h1) * dX; // h1과 h2사이의 높이값 + h13 = h1 + (h3 - h1) * dX; // h1과 h3사이의 높이값 - y = h12 + ((h13 - h12) * (dZ / dX)); // ã ϴ ̰ + y = h12 + ((h13 - h12) * (dZ / dX)); // 찾고자 하는 높이값 return y; } - } else if ((ix + iz) % 2 == 1) //簢 .. + } else if ((ix + iz) % 2 == 1) //사각형이 역슬레쉬 모양.. { h1 = m_ppMapData[ix + 1][iz].fHeight; h3 = m_ppMapData[ix][iz + 1].fHeight; - if ((dX + dZ) > 1.0f) // ﰢ.. + if ((dX + dZ) > 1.0f) //윗쪽 삼각형.. { if (dZ == 0.0f) { return h1; @@ -2334,15 +2334,15 @@ float CLyTerrain::GetHeight(float x, float z) { y = h12 + ((h13 - h12) * ((1.0f - dX) / dZ)); return y; - } else //Ʒ ﰢ.. + } else //아래쪽 삼각형.. { if (dX == 1.0f) { return h1; } h2 = m_ppMapData[ix][iz].fHeight; - h12 = h2 + (h1 - h2) * dX; // h1 h2 ̰ - h13 = h3 + (h1 - h3) * dX; // h1 h3 ̰ + h12 = h2 + (h1 - h2) * dX; // h1과 h2사이의 높이값 + h13 = h3 + (h1 - h3) * dX; // h1과 h3사이의 높이값 y = h12 + ((h13 - h12) * (dZ / (1.0f - dX))); return y; @@ -2353,7 +2353,7 @@ float CLyTerrain::GetHeight(float x, float z) { // // GetPatchNum(float fSize) -// fSizeũ ġ ü ʿ μη  .... +// fSize크기의 패치가 전체 맵에서 가로세로로 몇개씩 나오는지.... // SIZE CLyTerrain::GetPatchNum(float fSize) { SIZE size; @@ -2369,7 +2369,7 @@ SIZE CLyTerrain::GetPatchNum(float fSize) { // // MouseMsgFilter(LPMSG pMsg) -// 콺 ó.. +// 마우스 처리.. // BOOL CLyTerrain::MouseMsgFilter(LPMSG pMsg) { if (m_iEditMode == TEM_NOT) { @@ -2380,7 +2380,7 @@ BOOL CLyTerrain::MouseMsgFilter(LPMSG pMsg) { static POINT ptSelHeightMapPos; static int iPrevScreenY = 0; const float fDelta = 0.10f; - static int iSumOfEditedHeight = 0; // ̹ 巡׷ ȭ + static int iSumOfEditedHeight = 0; // 이번 드래그로 변화된 지형높이의 합 switch (pMsg->message) { case WM_MOUSEMOVE: { @@ -2396,7 +2396,7 @@ BOOL CLyTerrain::MouseMsgFilter(LPMSG pMsg) { } } - if (nFlags & MK_LBUTTON && m_iEditMode == TEM_LIGHTMAP) //Ʈĥϱ.. + if (nFlags & MK_LBUTTON && m_iEditMode == TEM_LIGHTMAP) //라이트맵칠하기.. { __Vector3 vPos; if (Pick(point.x, point.y, &vPos, &ptSelHeightMapPos)) { @@ -2414,7 +2414,7 @@ BOOL CLyTerrain::MouseMsgFilter(LPMSG pMsg) { } } - if (nFlags & MK_RBUTTON && m_iEditMode == TEM_LIGHTMAP) //Ʈĥϱ.. + if (nFlags & MK_RBUTTON && m_iEditMode == TEM_LIGHTMAP) //라이트맵칠하기.. { __Vector3 vPos; if (Pick(point.x, point.y, &vPos, &ptSelHeightMapPos)) { @@ -2447,7 +2447,7 @@ BOOL CLyTerrain::MouseMsgFilter(LPMSG pMsg) { iz = (int)vPos.z / TERRAIN_CELL_SIZE; SetDTex(ix, iz); } - if (m_iEditMode == TEM_LIGHTMAP) //Ʈĥϱ.. + if (m_iEditMode == TEM_LIGHTMAP) //라이트맵칠하기.. { int ix, iz; ix = (int)vPos.x / TERRAIN_CELL_SIZE; @@ -2703,8 +2703,8 @@ BOOL CLyTerrain::MouseMsgFilter(LPMSG pMsg) { // // Terrain Picking -// vec : ŷȰ ǥ -// pHeightMapPos : ŷ ̸ ǥ +// vec : 지형에서 피킹된곳의 실좌표 +// pHeightMapPos : 피킹된 곳에서 가장 가까운 높이맵의 좌표 bool CLyTerrain::Pick(int x, int y, __Vector3 * vec, POINT * pHeightMapPos) { __Vector3 vec2, vec3; // vec1 & vec2 is 2D.. vec3 & vec4 is 3D.. CRect rect; @@ -2731,7 +2731,7 @@ bool CLyTerrain::Pick(int x, int y, __Vector3 * vec, POINT * pHeightMapPos) { // Get the inverse view matrix D3DXMATRIX matView, m; D3DXVECTOR3 vOrig, vDir; - CN3Base::s_lpD3DDev->GetTransform(D3DTS_VIEW, &matView); // Ƕ..!! ..~~ + CN3Base::s_lpD3DDev->GetTransform(D3DTS_VIEW, &matView); // 내 맘대로 되라..!! 얍..~~ D3DXMatrixInverse(&m, NULL, &matView); // Transform the screen space pick ray into 3D space @@ -2807,7 +2807,7 @@ bool CLyTerrain::Pick(int x, int y, __Vector3 * vec, POINT * pHeightMapPos) { continue; } - if ((ix + iz) % 2 == 1) // .. ޼ ε... + if ((ix + iz) % 2 == 1) // 당근.. 왼손 바인딩... { A.Set((float)ix * TERRAIN_CELL_SIZE, m_ppMapData[ix][iz].fHeight, (float)iz * TERRAIN_CELL_SIZE); C.Set((float)(ix + 1) * TERRAIN_CELL_SIZE, m_ppMapData[ix + 1][iz].fHeight, @@ -2943,7 +2943,7 @@ int CLyTerrain::DetectRealLightMap(int sx, int sz, int range) { bIsEmpty = true; - //ܰ׵θ ִ°.. + //외각테두리 있는거.. for (int bx = 0; bx < LIGHTMAP_TEX_SIZE; bx++) { for (int bz = 0; bz < LIGHTMAP_TEX_SIZE; bz++) { DWORD dwAlpha = pImg[bx + bz * LIGHTMAP_TEX_SIZE]; @@ -2956,7 +2956,7 @@ int CLyTerrain::DetectRealLightMap(int sx, int sz, int range) { } } } - /* ܰ׵θ °.. + /* 외각테두리 없는거.. for(int i=0; iGet()->UnlockRect(0); - if (bIsEmpty) //ֺ Ʈ̾...-.-++ + if (bIsEmpty) //텅빈 라이트맵이었당...-.-++ { m_iNumLightMap--; m_ppIsLightMap[x][z] = false; @@ -3001,10 +3001,10 @@ void CLyTerrain::FillLightMap(int x, int z, int lcx, int lcz, DWORD Color, float memset(d3dlrt.pBits, 0x00, sizeof(DWORD) * LIGHTMAP_TEX_SIZE * LIGHTMAP_TEX_SIZE); /////////////////////////////////////// - //ܰ ׸... + //외각 라인 그리기... /////////////////////////////////////// - //(LT) ĥϱ.. + //왼쪽(LT) 칠하기.. if ((x - 1) >= 0 && (z + 1) < m_iHeightMapSize && m_ppLightMapTexture[x - 1][z + 1]) { D3DLOCKED_RECT d3dlrtSource; m_ppLightMapTexture[x - 1][z + 1]->Get()->LockRect(0, &d3dlrtSource, 0, 0); @@ -3014,7 +3014,7 @@ void CLyTerrain::FillLightMap(int x, int z, int lcx, int lcz, DWORD Color, float pDest[0] = pSource[((LIGHTMAP_TEX_SIZE - 2) * LIGHTMAP_TEX_SIZE) + (LIGHTMAP_TEX_SIZE - 2)]; m_ppLightMapTexture[x - 1][z + 1]->Get()->UnlockRect(0); } - //(LM) ĥϱ.. + //왼쪽(LM) 칠하기.. if ((x - 1) >= 0 && m_ppLightMapTexture[x - 1][z]) { D3DLOCKED_RECT d3dlrtSource; m_ppLightMapTexture[x - 1][z]->Get()->LockRect(0, &d3dlrtSource, 0, 0); @@ -3026,7 +3026,7 @@ void CLyTerrain::FillLightMap(int x, int z, int lcx, int lcz, DWORD Color, float } m_ppLightMapTexture[x - 1][z]->Get()->UnlockRect(0); } - //(LB) ĥϱ.. + //왼쪽(LB) 칠하기.. if ((x - 1) >= 0 && (z - 1) >= 0 && m_ppLightMapTexture[x - 1][z - 1]) { D3DLOCKED_RECT d3dlrtSource; m_ppLightMapTexture[x - 1][z - 1]->Get()->LockRect(0, &d3dlrtSource, 0, 0); @@ -3036,7 +3036,7 @@ void CLyTerrain::FillLightMap(int x, int z, int lcx, int lcz, DWORD Color, float pDest[(LIGHTMAP_TEX_SIZE - 1) * LIGHTMAP_TEX_SIZE] = pSource[LIGHTMAP_TEX_SIZE + (LIGHTMAP_TEX_SIZE - 2)]; m_ppLightMapTexture[x - 1][z - 1]->Get()->UnlockRect(0); } - //Ʒ(CB) ĥϱ.. + //아래쪽(CB) 칠하기.. if ((z - 1) >= 0 && m_ppLightMapTexture[x][z - 1]) { D3DLOCKED_RECT d3dlrtSource; m_ppLightMapTexture[x][z - 1]->Get()->LockRect(0, &d3dlrtSource, 0, 0); @@ -3048,7 +3048,7 @@ void CLyTerrain::FillLightMap(int x, int z, int lcx, int lcz, DWORD Color, float sizeof(DWORD) * (LIGHTMAP_TEX_SIZE - 2)); m_ppLightMapTexture[x][z - 1]->Get()->UnlockRect(0); } - //(RT) ĥϱ.. + //오른쪽(RT) 칠하기.. if ((x + 1) < m_iHeightMapSize && (z + 1) < m_iHeightMapSize && m_ppLightMapTexture[x + 1][z + 1]) { D3DLOCKED_RECT d3dlrtSource; m_ppLightMapTexture[x + 1][z + 1]->Get()->LockRect(0, &d3dlrtSource, 0, 0); @@ -3058,7 +3058,7 @@ void CLyTerrain::FillLightMap(int x, int z, int lcx, int lcz, DWORD Color, float pDest[LIGHTMAP_TEX_SIZE - 1] = pSource[1 + ((LIGHTMAP_TEX_SIZE - 2) * LIGHTMAP_TEX_SIZE)]; m_ppLightMapTexture[x + 1][z + 1]->Get()->UnlockRect(0); } - //(RM) ĥϱ.. + //오른쪽(RM) 칠하기.. if ((x + 1) < m_iHeightMapSize && m_ppLightMapTexture[x + 1][z]) { D3DLOCKED_RECT d3dlrtSource; m_ppLightMapTexture[x + 1][z]->Get()->LockRect(0, &d3dlrtSource, 0, 0); @@ -3070,7 +3070,7 @@ void CLyTerrain::FillLightMap(int x, int z, int lcx, int lcz, DWORD Color, float } m_ppLightMapTexture[x + 1][z]->Get()->UnlockRect(0); } - //(RB) ĥϱ.. + //오른쪽(RB) 칠하기.. if ((x + 1) < m_iHeightMapSize && (z - 1) >= 0 && m_ppLightMapTexture[x + 1][z - 1]) { D3DLOCKED_RECT d3dlrtSource; m_ppLightMapTexture[x + 1][z - 1]->Get()->LockRect(0, &d3dlrtSource, 0, 0); @@ -3081,7 +3081,7 @@ void CLyTerrain::FillLightMap(int x, int z, int lcx, int lcz, DWORD Color, float pSource[1 + LIGHTMAP_TEX_SIZE]; m_ppLightMapTexture[x + 1][z - 1]->Get()->UnlockRect(0); } - //(CT) ĥϱ.. + //위쪽(CT) 칠하기.. if ((z + 1) < m_iHeightMapSize && m_ppLightMapTexture[x][z + 1]) { D3DLOCKED_RECT d3dlrtSource; m_ppLightMapTexture[x][z + 1]->Get()->LockRect(0, &d3dlrtSource, 0, 0); @@ -3102,7 +3102,7 @@ void CLyTerrain::FillLightMap(int x, int z, int lcx, int lcz, DWORD Color, float m_iNumLightMap++; } - //ĥϱ... + //본격칠하기... m_ppLightMapTexture[x][z]->Get()->LockRect(0, &d3dlrt, 0, 0); LPDWORD pDest = (LPDWORD)d3dlrt.pBits; @@ -3111,7 +3111,7 @@ void CLyTerrain::FillLightMap(int x, int z, int lcx, int lcz, DWORD Color, float DWORD OrgColor = pDest[PixelPos]; DWORD NewColor = 0x00000000; - if (m_pDlgSetLightMap->MoreLight()) // ׸() + if (m_pDlgSetLightMap->MoreLight()) //옅게 그리기(지우기) { //if(OrgColor < Color) pDest[lcx + (LIGHTMAP_TEX_SIZE-lcz-1)*LIGHTMAP_TEX_SIZE] = 0xffffffff; NewColor = 0x00000000; @@ -3305,19 +3305,19 @@ void CLyTerrain::FillLightMap(int x, int z, int lcx, int lcz, DWORD Color, float } // -// lcx, lcz ƮŸϳ ǥ.. +// lcx, lcz는 라이트맵타일내에서의 좌표.. // void CLyTerrain::SetLightMap(int x, int z, int lcx, int lcz) { DWORD SrcColor; int PenSize, Hardness; PenSize = m_pDlgSetLightMap->GetPenSize(); //1~(LIGHTMAP_TEX_SIZE-2) Hardness = m_pDlgSetLightMap->GetHardness(); //1~100 - SrcColor = m_pDlgSetLightMap->GetColor(); //ü ÷. + SrcColor = m_pDlgSetLightMap->GetColor(); //전체적인 컬러. int ix, iz; int dist; int nx, nz, nlx, nlz; - int LimitFullColor = (((float)Hardness / 100.0f) * (float)PenSize); //߽ɿ Ǯ÷ ä Ÿ.. + int LimitFullColor = (((float)Hardness / 100.0f) * (float)PenSize); //중심에서 풀컬러로 채워지는 거리.. for (ix = lcx - PenSize + 1; ix < lcx + PenSize; ix++) { for (iz = lcz - PenSize + 1; iz < lcz + PenSize; iz++) { dist = m_iDistanceTable[T_Abs(lcx - ix)][T_Abs(lcz - iz)] + 1; @@ -3364,8 +3364,8 @@ void CLyTerrain::SetLightMap(int x, int z, int lcx, int lcz) { // // // MakeDistanceTable -// Ÿ ̺ ְ ̸ ̺ .. -// Ÿ.. +// 거리를 계산하지 말고 테이블에서 가져올 수 있게 미리 테이블 생성.. +// 정수 단위 거리.. // void CLyTerrain::MakeDistanceTable() { int x, z; @@ -3379,8 +3379,8 @@ void CLyTerrain::MakeDistanceTable() { } // -// ִ Ÿϰ Ÿ ؼ ̺ Լ. -// char 1̸ ְ, 0̸ . +// 지형에서 갈수 있는 타일과 갈 수 없는 타일 구분해서 테이블 만드는 함수. +// char형으로 1이면 갈 수 있고, 0이면 갈 수 없다. // void CLyTerrain::MakeMoveTable(short ** ppEvent) { int x, z; @@ -3437,7 +3437,7 @@ void CLyTerrain::SaveServerData(HANDLE hFile) { int x, z; - // ׳ ϳ ص Ʈũ Ҷ ڸ ̰ Ѳ ؾ .. ... + // 그냥 하나씩 저장해도 차이 없지만 네트워크로 저장할때는 파일 엑세스 숫자를 줄이고 한꺼번에 저장해야 빠르다.. ... DWORD dwAlloc = m_iHeightMapSize * m_iHeightMapSize * sizeof(float); HGLOBAL hAlloc = ::GlobalAlloc(GMEM_FIXED, dwAlloc); __ASSERT(hAlloc, "Global allocation failed."); @@ -3451,7 +3451,7 @@ void CLyTerrain::SaveServerData(HANDLE hFile) { pfHeights[x * m_iHeightMapSize + z] = m_ppMapData[x][z].fHeight; } } - WriteFile(hFile, pfHeights, dwAlloc, &dwRWC, NULL); // Ͽ .. + WriteFile(hFile, pfHeights, dwAlloc, &dwRWC, NULL); // 파일에 쓴다.. pfHeights = NULL; ::GlobalUnlock(hAlloc); ::GlobalFree(hAlloc); @@ -3487,7 +3487,7 @@ void CLyTerrain::VerifyTexInfo(LPDTEXINFO pDTex) { // // SetDTex.. -// ڵϼ ִ ... +// 자동완성 기능이 있는 것... // void CLyTerrain::SetDTex(int x, int y) { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); @@ -3667,7 +3667,7 @@ void CLyTerrain::SetDTex(int x, int y) { // // SetDTexManual.. -// ڵϼ ׳ ϳ ..... +// 자동완성 기능이 없이 그냥 하나만 찍는 것..... // void CLyTerrain::SetDTexManual(int x, int y) { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); @@ -3755,7 +3755,7 @@ void CLyTerrain::SetDTexManual(int x, int y) { } if (pDTexGroupMng->m_pGroupView->m_iRadioState == 3) { - Dest2DTex.TexIdx.TexID = -1; // Ǯ + Dest2DTex.TexIdx.TexID = -1; // 강제찍기의 풀로찍기 } m_ppMapData[x][y].DTexInfo1 = Dest1DTex; @@ -3857,8 +3857,8 @@ void CLyTerrain::TilingAll() { } // -// ÷ Ÿ ֱ... -// ȸ...׷ Ÿϵ ⿭ ִ°.. +// 컬러맵 만들 타일 넣기... +// 아직 안만들어진...그런 타일들 대기열에 넣는것.. // void CLyTerrain::PutColorMapTile(int x, int z) { MMIter it = m_ColorMapTileTree.lower_bound((short)x); @@ -3874,7 +3874,7 @@ void CLyTerrain::PutColorMapTile(int x, int z) { } // -// ÷ Ÿϵ ÷ .. +// 컬러맵 만들지 않은 타일들 컬러맵 만들기.. // void CLyTerrain::GeneraterColorMap(bool bIsAll) { CProgressBar ProgressBar; @@ -3906,10 +3906,10 @@ void CLyTerrain::GeneraterColorMap(bool bIsAll) { } // -// ÷ؽ ϱ.. +// 컬러맵텍스쳐 셋팅하기.. // // -// Ÿϸ ״ ҽѼ ÷ .. +// 타일맵을 그대로 축소시켜서 컬러맵을 만드는 방법.. // /* void CLyTerrain::SetColorMap(int x, int y) @@ -4043,7 +4043,7 @@ void CLyTerrain::SetColorMap(int x, int y) s_lpD3DDev->EndScene(); - //÷ ؽĿ ... + //컬러맵 텍스쳐에 쓰기... LPDIRECT3DSURFACE9 pBackBuff; hr = s_lpD3DDev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuff); @@ -4051,7 +4051,7 @@ void CLyTerrain::SetColorMap(int x, int y) hr = pBackBuff->GetDesc(&desc); if(desc.Format!=D3DFMT_X8R8G8B8) { - MessageBox(::GetActiveWindow(),"ȭ带 32bit ٲټ.\n׷ ÷ ...","!!",MB_OK); + MessageBox(::GetActiveWindow(),"화면색상모드를 32bit모드로 바꾸세요.\n그렇지 않으면 컬러맵을 만들 수 없어요..ㅠ.ㅠ","경고!!",MB_OK); return; } @@ -4102,12 +4102,12 @@ void CLyTerrain::SetColorMap(int x, int y) hr = s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, dwZ); hr = s_lpD3DDev->SetRenderState(D3DRS_LIGHTING, dwLgt); - m_pColorTexture[idxX][idxZ].GenerateMipMap(); // Mip Map .. + m_pColorTexture[idxX][idxZ].GenerateMipMap(); // Mip Map 을 만든다.. } /*/ // -// Ÿϸʿ ȼ øؼ ɷ ... +// 타일맵에서 픽셀을 샘플링해서 걸러맵을 만드는 방법... // //* void CLyTerrain::SetColorMap(int x, int y) { @@ -4225,7 +4225,7 @@ void CLyTerrain::SetColorMap(int x, int y) { hr = s_lpD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2); - //light map ... + //light map 찍기... // //if(m_ppIsLightMap[x][y]) //{ @@ -4265,7 +4265,7 @@ void CLyTerrain::SetColorMap(int x, int y) { //CRect rcD(0,0,128,128), rcS(0,0,2,2); //s_lpD3DDev->Present(&rcD, &rcD, hWnd, NULL); - //÷ ؽĿ ... + //컬러맵 텍스쳐에 쓰기... LPDIRECT3DSURFACE9 pBackBuff; hr = s_lpD3DDev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuff); @@ -4275,7 +4275,7 @@ void CLyTerrain::SetColorMap(int x, int y) { hr = pBackBuff->GetDesc(&desc); if (desc.Format != D3DFMT_X8R8G8B8) { MessageBox(::GetActiveWindow(), - "ȭ带 32bit ٲټ.\n׷ ÷ ...", "!!", + "화면색상모드를 32bit모드로 바꾸세요.\n그렇지 않으면 컬러맵을 만들 수 없어요..ㅠ.ㅠ", "경고!!", MB_OK); return; } @@ -4335,18 +4335,18 @@ void CLyTerrain::SetColorMap(int x, int y) { hr = s_lpD3DDev->SetRenderState(D3DRS_LIGHTING, dwLgt); hr = s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, dwFog); - m_pColorTexture[idxX][idxZ].GenerateMipMap(); // Mip Map .. + m_pColorTexture[idxX][idxZ].GenerateMipMap(); // Mip Map 을 만든다.. } //*/ // // IntersectTriangle.. // -// orig : ... -// dir : ŷ .. -// v0, v1, v2 : ﰢ .. -// t : orig ŷ Ÿ.. -// u, v : v0(0,0) v1(1,0) v2(0,1) ŷ uvǥ.. +// orig : 시작점... +// dir : 피킹 방향.. +// v0, v1, v2 : 삼각형의 세점.. +// t : orig부터 피킹된점까지 거리.. +// u, v : v0(0,0) v1(1,0) v2(0,1)로 봤을때 피킹된 점의 uv좌표.. // BOOL CLyTerrain::IntersectTriangle(const D3DXVECTOR3 orig, const D3DXVECTOR3 dir, D3DXVECTOR3 & v0, D3DXVECTOR3 & v1, D3DXVECTOR3 & v2, float * t, float * u, float * v) { @@ -4360,7 +4360,7 @@ BOOL CLyTerrain::IntersectTriangle(const D3DXVECTOR3 orig, const D3DXVECTOR3 dir // If determinant is near zero, ray lies in plane of triangle FLOAT det = D3DXVec3Dot(&edge1, &pvec); - if (det < 0.0001f) { // 0 ﰢ ϴ. + if (det < 0.0001f) { // 거의 0에 가까우면 삼각형 평면과 지나가는 선이 평행하다. return FALSE; } @@ -4390,10 +4390,10 @@ BOOL CLyTerrain::IntersectTriangle(const D3DXVECTOR3 orig, const D3DXVECTOR3 dir *u *= fInvDet; *v *= fInvDet; - // t Ŭ ָ ִ. - // t*dir + orig ϸ ִ. - // u v ǹ̴ ϱ? - // : v0 (0,0), v1(1,0), v2(0,1) <ȣ (U, V)ǥ> ̷ Ÿ + // t가 클수록 멀리 직선과 평면과 만나는 점이 멀다. + // t*dir + orig 를 구하면 만나는 점을 구할 수 있다. + // u와 v의 의미는 무엇일까? + // 추측 : v0 (0,0), v1(1,0), v2(0,1) <괄호안은 (U, V)좌표> 이런식으로 어느 점에 가깝나 나타낸 것 같음 // return TRUE; @@ -4401,11 +4401,11 @@ BOOL CLyTerrain::IntersectTriangle(const D3DXVECTOR3 orig, const D3DXVECTOR3 dir ////////////////////////////////////////////////// // Coded By : Dino -// Coded On 2001-06-21 12:18:31 -// Ʒ Edit Լ +// Coded On 2001-06-21 오후 12:18:31 +// 아래로 지형 Edit관련 함수들 // -// Ʈ ȯ... +// 에디트 모드로 전환... // void CLyTerrain::SetEditMode(int iEditMode) { m_iEditMode = iEditMode; @@ -4445,7 +4445,7 @@ void CLyTerrain::SetApexHeight(int x, int z, float fHeight) { // // GetApexHeight.. -// Ÿ ̸ ϴ Լ... +// 각타일의 꼭지점의 높이를 구하는 함수... // float CLyTerrain::GetApexHeight(int x, int z) const { if (m_ppMapData && x < m_iHeightMapSize && z < m_iHeightMapSize && x >= 0 && z >= 0) { @@ -4455,7 +4455,7 @@ float CLyTerrain::GetApexHeight(int x, int z) const { } // -// 귯  IntensityMap ٽ Ѵ. +// 브러쉬의 모양과 사이즈에 따라서 IntensityMap을 다시 구성한다. // void CLyTerrain::UpdateBrushIntensityMap(int iShape, int iSize, float fFallOff) { ASSERT(fFallOff >= 0.0f && iSize > 0); @@ -4467,7 +4467,7 @@ void CLyTerrain::UpdateBrushIntensityMap(int iShape, int iSize, float fFallOff) iHalfRadius = (iSize / 2) + 1; if (iShape == BRUSHSHAPE_CIRCLE) { - if (iSize % 2) // Brush  Ȧ϶ + if (iSize % 2) // Brush 사이즈가 홀수일때 { for (int i = iStart; i < iEnd; ++i) { for (int j = iStart; j < iEnd; ++j) { @@ -4482,7 +4482,7 @@ void CLyTerrain::UpdateBrushIntensityMap(int iShape, int iSize, float fFallOff) } } } - } else // Brush  ¦϶ + } else // Brush 사이즈가 짝수일때 { float fTmp = (iHalfRadius - 0.5f); for (int i = iStart; i < iEnd; ++i) { @@ -4501,7 +4501,7 @@ void CLyTerrain::UpdateBrushIntensityMap(int iShape, int iSize, float fFallOff) float fIntensity[MAX_BRUSH_SIZE]; ZeroMemory(fIntensity, sizeof(fIntensity)); - if (iSize % 2) // Brush  Ȧ϶ + if (iSize % 2) // Brush 사이즈가 홀수일때 { for (int i = 0; i <= iSize / 2; ++i) { fIntensity[i] = GetFallOffValue(fFallOff, float(i) / iHalfRadius); @@ -4517,7 +4517,7 @@ void CLyTerrain::UpdateBrushIntensityMap(int iShape, int iSize, float fFallOff) } } } - } else // Brush  ¦϶ + } else // Brush 사이즈가 짝수일때 { for (int i = 0; i <= iSize / 2; ++i) { fIntensity[i] = GetFallOffValue(fFallOff, float(i + 0.5f) / (iHalfRadius)); @@ -4568,7 +4568,7 @@ float CLyTerrain::GetFallOffValue(float fFallOff, float x) { } // -// Լ.... +// 지형 높이 조절함수.... // void CLyTerrain::Heighten(POINT ptCenter, float fHeight) { float fNewHeight = FLT_MAX; @@ -4620,7 +4620,7 @@ void CLyTerrain::Heighten(POINT ptCenter, float fHeight) { // // void CLyTerrain::Flaten(POINT ptCenter) { - // ο ̰ ̸ ؼ ۿ . + // 새로운 값과 기존 높이값을 차이를 계산해서 버퍼에 저장. for (int i = 0; i < MAX_BRUSH_SIZE; ++i) { for (int j = 0; j < MAX_BRUSH_SIZE; ++j) { int iMapX, iMapZ; @@ -4638,12 +4638,12 @@ void CLyTerrain::Flaten(POINT ptCenter) { } // -// ϸϰ Լ.. +// 지형 완만하게 만드는 함수.. // void CLyTerrain::Smooth(POINT ptCenter) { float fMapHeightDiff[MAX_BRUSH_SIZE][MAX_BRUSH_SIZE]; ZeroMemory(fMapHeightDiff, sizeof(fMapHeightDiff)); - const int iWSize = 5; // Ȧ Ѵ. + const int iWSize = 5; // 홀수여야 한다. const int iHalfWSize = iWSize / 2; float fWeight[iWSize][iWSize] = { {1, 2, 3, 2, 1}, @@ -4653,7 +4653,7 @@ void CLyTerrain::Smooth(POINT ptCenter) { {1, 2, 3, 2, 1} }; - // ο ̰ ̸ ؼ ۿ . + // 새로운 값과 기존 높이값을 차이를 계산해서 버퍼에 저장. for (int i = 0; i < MAX_BRUSH_SIZE; ++i) { for (int j = 0; j < MAX_BRUSH_SIZE; ++j) { int iMapX, iMapZ; @@ -4680,7 +4680,7 @@ void CLyTerrain::Smooth(POINT ptCenter) { } } - // ۿ ִ m_fBrushIntensityMap Ͽ ̰ + // 버퍼에 있는 값을 m_fBrushIntensityMap 적용하여 높이값 수정 for (int i = 0; i < MAX_BRUSH_SIZE; ++i) { for (int j = 0; j < MAX_BRUSH_SIZE; ++j) { int iMapX, iMapZ; @@ -4792,7 +4792,7 @@ void CLyTerrain::RenderBrushArea() { // // Import... -// ߿ ̾Ƴ N3SceneϷ б.. +// 마야에서 뽑아낸 N3Scene파일로 부터 지형 읽기.. // void CLyTerrain::Import(LPCTSTR pFileName, float fSize) { int HeightMapSize; @@ -4808,7 +4808,7 @@ void CLyTerrain::Import(LPCTSTR pFileName, float fSize) { Init(HeightMapSize); CN3VMesh * pVMesh = new CN3VMesh; - __ASSERT(pVMesh, "VMesh 㿩..."); + __ASSERT(pVMesh, "VMesh가 안읽허여..ㅜ.ㅜ"); pVMesh->LoadFromFile(pFileName); @@ -4914,7 +4914,7 @@ void CLyTerrain::Import(LPCTSTR pFileName, float fSize) { for (ix = sx; ix <= ex; ix++) { for (iz = sz; iz <= ez; iz++) { - // ﰢ ׽Ʈ... + // 삼각형 점 포함 테스트... float a, b, c; float x, z; x = (float)ix * TERRAIN_CELL_SIZE; @@ -4949,7 +4949,7 @@ void CLyTerrain::Import(LPCTSTR pFileName, float fSize) { ////////////////////////////////////////////////////////////////////////////////////////////////// /* -//... +//구버전... CProgressBar ProgressBar; ProgressBar.Create("Import terrain VMesh..", 50, 1000); ProgressBar.SetPos(1); @@ -4959,7 +4959,7 @@ void CLyTerrain::Import(LPCTSTR pFileName, float fSize) { { for(int iz=0;izSetWholeClipped(); m_pRoot->ClearMinMaxY(); m_pRoot->SetMinMaxY(); @@ -5030,7 +5030,7 @@ void CLyTerrain::Import(LPCTSTR pFileName, float fSize) { // void CLyTerrain::ImportHeight(LPCTSTR pFileName) { CN3VMesh * pVMesh = new CN3VMesh; - __ASSERT(pVMesh, "VMesh ..."); + __ASSERT(pVMesh, "VMesh가 안읽혀여..ㅜ.ㅜ"); pVMesh->LoadFromFile(pFileName); @@ -5125,7 +5125,7 @@ void CLyTerrain::ImportHeight(LPCTSTR pFileName) { for (ix = sx; ix <= ex; ix++) { for (iz = sz; iz <= ez; iz++) { - // ﰢ ׽Ʈ... + // 삼각형 점 포함 테스트... float a, b, c; float x, z; x = (float)ix * TERRAIN_CELL_SIZE; @@ -5158,7 +5158,7 @@ void CLyTerrain::ImportHeight(LPCTSTR pFileName) { ProgressBar.SetPos(iPosProgress); } - //Ʈؽ ְ, ؽĵ .. + //라이트맵텍스쳐 수도 있고, 텍스쳐도 세팅.. m_pRoot->SetWholeClipped(); m_pRoot->ClearMinMaxY(); m_pRoot->SetMinMaxY(); @@ -5169,7 +5169,7 @@ void CLyTerrain::ImportHeight(LPCTSTR pFileName) { void CLyTerrain::ImportHeight(LPCTSTR pFileName) { CN3VMesh* pVMesh = new CN3VMesh; - __ASSERT(pVMesh, "VMesh 㿩..."); + __ASSERT(pVMesh, "VMesh가 안읽허여..ㅜ.ㅜ"); pVMesh->LoadFromFile(pFileName); @@ -5202,7 +5202,7 @@ void CLyTerrain::ImportHeight(LPCTSTR pFileName) { for(int iz=0;izSetWholeClipped(); m_pRoot->ClearMinMaxY(); m_pRoot->SetMinMaxY(); @@ -5264,7 +5264,7 @@ void CLyTerrain::ColorMapImport(LPCTSTR lpszPathName) { return; } - CProgressBar ProgressBar; // Ȳ.. + CProgressBar ProgressBar; // 진행 상황.. ProgressBar.Create("Import color map..", 50, m_iNumColorMap * m_iNumColorMap); ProgressBar.SetStep(1); @@ -5298,7 +5298,7 @@ void CLyTerrain::ColorMapExport(LPCTSTR lpszPathName) { return; } - CProgressBar ProgressBar; // Ȳ.. + CProgressBar ProgressBar; // 진행 상황.. ProgressBar.Create("Export color map..", 50, m_iNumColorMap * m_iNumColorMap); ProgressBar.SetStep(1); @@ -5337,7 +5337,7 @@ void CLyTerrain::ColorMapExport(LPCTSTR lpszPathName) { } } - BMF.SaveToFile(lpszPathName); // Ʈ .. + BMF.SaveToFile(lpszPathName); // 비트맵으로 저장.. } void CLyTerrain::GenerateMiniMap(LPCTSTR lpszPathName, int size) { @@ -5353,7 +5353,7 @@ void CLyTerrain::GenerateMiniMap(LPCTSTR lpszPathName, int size) { return; } - CProgressBar ProgressBar; // Ȳ.. + CProgressBar ProgressBar; // 진행 상황.. ProgressBar.Create("Generate MiniMap..", 50, m_iNumColorMap * m_iNumColorMap); ProgressBar.SetStep(1); @@ -5394,7 +5394,7 @@ void CLyTerrain::GenerateMiniMap(LPCTSTR lpszPathName, int size) { TmpTex.Get()->UnlockRect(0); } } - BMF.SaveToFile(lpszPathName); // Ʈ .. + BMF.SaveToFile(lpszPathName); // 비트맵으로 저장.. } void CLyTerrain::ExportHeightBMP(const char * szPathName) { @@ -5407,7 +5407,7 @@ void CLyTerrain::ExportHeightBMP(const char * szPathName) { return; } - CProgressBar ProgressBar; // Ȳ.. + CProgressBar ProgressBar; // 진행 상황.. ProgressBar.Create("Export HeightBMP..", 50, m_iHeightMapSize * m_iHeightMapSize); ProgressBar.SetStep(1); @@ -5457,7 +5457,7 @@ void CLyTerrain::ExportHeightBMP(const char * szPathName) { pPixelDest[2] = gray; } } - BMF.SaveToFile(szPathName); // Ʈ .. + BMF.SaveToFile(szPathName); // 비트맵으로 저장.. char msg[256]; sprintf(msg, "Max : %.2f Min : %.2f", Max, Min); @@ -5469,7 +5469,7 @@ void CLyTerrain::ImportHeightBMP(const char * szPathName) { CBitMapFile BMF; BMF.LoadFromFile(szPathName); - CProgressBar ProgressBar; // Ȳ.. + CProgressBar ProgressBar; // 진행 상황.. ProgressBar.Create("Import HeightBMP..", 50, m_iHeightMapSize * m_iHeightMapSize); ProgressBar.SetStep(1); @@ -5486,7 +5486,7 @@ void CLyTerrain::ImportHeightBMP(const char * szPathName) { } } - //Ʈؽ ְ, ؽĵ .. + //라이트맵텍스쳐 수도 있고, 텍스쳐도 세팅.. m_pRoot->SetWholeClipped(); m_pRoot->ClearMinMaxY(); m_pRoot->SetMinMaxY(); diff --git a/src/tool/N3ME/LyTerrain.h b/src/tool/N3ME/LyTerrain.h index 51f155b1..3fd9f2c4 100644 --- a/src/tool/N3ME/LyTerrain.h +++ b/src/tool/N3ME/LyTerrain.h @@ -1,5 +1,5 @@ // LyTerrain.h: interface for the CLyTerrain class. -// - 2001. 9.24.~ Map Editor ȯ... +// - 2001. 9.24.~ Map Editor용으로 변환... // ////////////////////////////////////////////////////////////////////// @@ -20,9 +20,9 @@ class CDTexGroupMng; class CDlgSetLightMap; //////////////////////////////////////////////// -// multimap -//savegamedataҶ .. -//colormap ..^^ +// multimap사용 +//savegamedata할때 쓸꺼얌.. +//colormap 찍을때도 써..^^ // typedef std::multimap MMap; typedef MMap::value_type MMValue; @@ -42,43 +42,43 @@ class CLyTerrain : public CN3BaseFileAccess { CQTNode * m_pRoot; CQTNode * m_pRefCurrNode; - // edit... - __VertexXyzColor m_vBrushVertices[MAX_BRUSH_SIZE * MAX_BRUSH_SIZE * 9]; // Brush Ÿ vertex buffer - WORD m_wBrushIndices[MAX_BRUSH_SIZE * MAX_BRUSH_SIZE * 6 * 4]; // Brush Ÿ index buffer - int m_iBrushIndexCount; // Brush Ÿ index - int m_iEditMode; // Edit ΰ? + //지형 edit관련... + __VertexXyzColor m_vBrushVertices[MAX_BRUSH_SIZE * MAX_BRUSH_SIZE * 9]; // Brush의 모양을 나타내는 vertex buffer + WORD m_wBrushIndices[MAX_BRUSH_SIZE * MAX_BRUSH_SIZE * 6 * 4]; // Brush의 모양을 나타내는 index buffer + int m_iBrushIndexCount; // Brush의 모양을 나타내는 index의 숫자 + int m_iEditMode; // Edit의 모드인가? CDTexMng * m_pDTexMng; - MMap m_ColorMapTileTree; //÷ Ÿϵ ִ Ʈ.. + MMap m_ColorMapTileTree; //컬러맵 만들기전 타일들 갖고 있는 트리.. int m_iDistanceTable[DISTANCE_TABLE_SIZE][DISTANCE_TABLE_SIZE]; public: - float m_fBrushIntensityMap[MAX_BRUSH_SIZE][MAX_BRUSH_SIZE]; // Brush ȭ ǥ + float m_fBrushIntensityMap[MAX_BRUSH_SIZE][MAX_BRUSH_SIZE]; // Brush의 변화율을 표시한 맵 float m_fHeightScale; float m_fFlatHeight; bool m_bFlaten; int m_iZoneID; - //LightMap... + //LightMap관련... CDlgSetLightMap * m_pDlgSetLightMap; LPDIRECT3DVERTEXBUFFER9 m_LightMapVB; CN3Texture *** m_ppLightMapTexture; bool ** m_ppIsLightMap; int m_iNumLightMap; - bool m_bDrawLineLightMap; //Ʈ ׸ ɼǿ.. · ׸.. - __VertexXyzColor m_vLineLightMap[2]; //· ׸ٸ ȭ鿡 ǥؾߵǰ?..^^ ̾.. + bool m_bDrawLineLightMap; //라이트 맵 그리는 옵션에서.. 라인형태로 그리는지.. + __VertexXyzColor m_vLineLightMap[2]; //라인형태로 그린다면 그 라인을 화면에 표시해야되겠지?..^^ 그점이야.. - //LOD.. + //LOD관련.. int m_iHeightLimit; int m_iDistLimit; std::list m_RenderNodes; - LPDIRECT3DVERTEXBUFFER9 m_ColorMapVB; // ÷ʾ.. - LPDIRECT3DVERTEXBUFFER9 m_TileVB; // ϳ Ÿϰ ϳ Ʈ + LPDIRECT3DVERTEXBUFFER9 m_ColorMapVB; // 컬러맵쓸때.. + LPDIRECT3DVERTEXBUFFER9 m_TileVB; // 하나의 타일과 하나의 라이트맵 //common.. MAPDATA ** m_ppMapData; @@ -87,25 +87,25 @@ class CLyTerrain : public CN3BaseFileAccess { //texture.. CN3Texture ** m_pColorTexture; - RECT m_VisibleRect; //Ÿϴ ÿ.. - POINT m_EyePos; //Ÿϴ.. + RECT m_VisibleRect; //타일단위의 가시영역.. + POINT m_EyePos; //타일단위.. - int m_iHeightMapSize; // Cell Count -> 1 ־ Cell Count ̴. + int m_iHeightMapSize; // Cell Count 와 비슷한 개념 -> 1 을 빼주어야 Cell Count 이다. int m_iMaxLevel; - int m_iNumTileMap; // ִ Ÿϸ .. + int m_iNumTileMap; //현재 가지고 있는 타일맵의 수.. int m_iColorMapTexSize; int m_iColorMapPixelPerUnitDistance; int m_iNumColorMap; - //Ÿ ... + //타일찍는 거 방향과 관련... float m_fTileDirU[8][4]; float m_fTileDirV[8][4]; float m_fTileDirUforColorMap[8][4]; float m_fTileDirVforColorMap[8][4]; - // DTex... + // DTex관련... LPDIRECT3DVERTEXBUFFER9 m_pDTexVB; __VertexT1 * m_pDTexVertices; int m_DTexFaceCnt; @@ -113,12 +113,12 @@ class CLyTerrain : public CN3BaseFileAccess { int m_DTexAttrTable[9][14]; int m_DTexDirTable[9][14]; - // ColorMap ... + // ColorMap 관련... LPDIRECT3DVERTEXBUFFER9 m_pColorMapTmpVB; __VertexTransformedT2 * m_pColorMapTmpVertices; - //Brush .. - BOOL m_bBrushFlat; // ̰ 귯 ϰ Ҳ? + //Brush 관련.. + BOOL m_bBrushFlat; //지형 높이고 내리는 브러쉬를 평평하게 할꺼야? protected: int DetectRealLightMap(int sx, int sz, int range); @@ -126,35 +126,35 @@ class CLyTerrain : public CN3BaseFileAccess { void FillLightMap(int x, int z, int lcx, int lcz, DWORD Color, float alpha); void SetLightMap(int x, int z, int lcx, int lcz); - void PutColorMapTile(int x, int z); //÷ Ÿ ֱ...( ȸ...׷ Ÿϵ ⿭ ִ°..) + void PutColorMapTile(int x, int z); //컬러맵 만들 타일 넣기...(아직 안만들어진...그런 타일들 대기열에 넣는것..) void VerifyTexInfo(LPDTEXINFO pTex); void SetColorMap(int x, int y); void SetPertinentTile(CDTexGroupMng * pDTexGroupMng, LPDTEXINFO pDest1, LPDTEXINFO pDest2); inline int Log2(int x); inline void ClearRenderInfo(); - void SetVisibleRect(); //Ÿϴ.. + void SetVisibleRect(); //타일단위.. - //map editor .. + //map editor 관련.. // - void SetDTexManual(int x, int y); // - void SetDTex(int x, int y); //ڵ. + void SetDTexManual(int x, int y); //수동찍기 + void SetDTex(int x, int y); //자동찍기. BOOL IntersectTriangle(const D3DXVECTOR3 orig, const D3DXVECTOR3 dir, D3DXVECTOR3 & v0, D3DXVECTOR3 & v1, D3DXVECTOR3 & v2, float * t, float * u, float * v); - void Heighten(POINT ptCenter, float fHeight); // ϰų ϴ Լ - void Smooth(POINT ptCenter); // ֺ ̰ ؼ ε巴 Ѵ. + void Heighten(POINT ptCenter, float fHeight); // 지형을 높게하거나 낮게 하는 함수 + void Smooth(POINT ptCenter); // 지형을 주변 맵의 높이값과 비교해서 부드럽게 한다. void Flaten(POINT ptCenter); - void SetApexHeight(int x, int z, float fHeight); // ̸ ̰ - float GetApexHeight(int x, int z) const; // ̸ ̰ - float GetFallOffValue(float fFallOff, float x); // BrushIntensity Ҷ ̴ . + void SetApexHeight(int x, int z, float fHeight); // 높이맵의 높이값 지정 + float GetApexHeight(int x, int z) const; // 높이맵의 높이값 얻기 + float GetFallOffValue(float fFallOff, float x); // BrushIntensity 계산할때 쓰이는 식. - // Ʈʰ..(2002. 11. 13..) + //개선된 라이트맵관련..(2002. 11. 13..) void ConvertLightMapToolDataV2toV3(); // public: - void UpdateBrushArea(POINT ptCenter); // Brush ǥ vertex - void RenderBrushArea(); // Brush ǥ ׸ + void UpdateBrushArea(POINT ptCenter); // Brush 영역 표시 vertex갱신 + void RenderBrushArea(); // Brush 영역 표시 그리기 void ExportHeightBMP(const char * szPathName); void ImportHeightBMP(const char * szPathName); @@ -171,7 +171,7 @@ class CLyTerrain : public CN3BaseFileAccess { void MakeGameLightMap(char * szFullPathName); void MakeGameColorMap(char * szFullPathName); void GeneraterColorMap(bool bIsAll = false); - void TilingAll(); // ü õ ŸϷ .. + void TilingAll(); //지형 전체를 선택된 타일로 깔기.. void UpDateDistLimit(); @@ -179,17 +179,17 @@ class CLyTerrain : public CN3BaseFileAccess { void SetFillMode(D3DFILLMODE fillmode); float GetHeight(float x, float z); - //map editor .. + //map editor 관련.. // SIZE GetPatchNum(float fSize); - BOOL MouseMsgFilter(LPMSG pMsg); // ĥ 콺 ޼ ó + BOOL MouseMsgFilter(LPMSG pMsg); // 지형 고칠때 마우스 메세지 처리 bool Pick(int x, int y, __Vector3 * vec, POINT * pHeightMapPos = NULL); void Import(LPCTSTR pFileName, float fSize); void ImportHeight(LPCTSTR pFileName); void SaveServerData(HANDLE hFile); - void SetEditMode(int iEditMode); // Edit + void SetEditMode(int iEditMode); // 지형 Edit모드로 변경 void UpdateBrushIntensityMap(int iShape, int iSize, - float fFallOff); // 귯  IntensityMap ٽ Ѵ. + float fFallOff); // 브러쉬의 모양과 사이즈에 따라서 IntensityMap을 다시 구성한다. void SaveGameData(HANDLE hFile); void ColorMapImport(LPCTSTR lpszPathName); void ColorMapExport(LPCTSTR lpszPathName); diff --git a/src/tool/N3ME/LyTerrainDef.h b/src/tool/N3ME/LyTerrainDef.h index 7c3034aa..91e85af9 100644 --- a/src/tool/N3ME/LyTerrainDef.h +++ b/src/tool/N3ME/LyTerrainDef.h @@ -1,8 +1,8 @@ //////////////////////////////////////////////////////////////////////////////////////// // // LyTerrainDef.h -// - ̰ Terrain õ ڷ, ... -// - Ʈ ̿ ...^^ +// - 이것저것 Terrain에 관련된 자료형정의, 상수정의... +// - 쿼드트리 이용한 지형...^^ // // By Donghoon.. // @@ -16,34 +16,34 @@ // Constant Definitions.. const int N3ME_DATA_VERSION = 3; //version info... -// ͵ ʴ. -//1 : ʱ Ϳ lightmap .. -//2 : version 1 Ǯ (Ǯ DTex ׷ 迡 ) . -//3 : lightmap..^^ +//이전 데이터들은 버전 정보를 갖고 있지 않다. +//1 : 초기 데이터에 lightmap정보를 더한 것.. +//2 : version 1에 풀 정보(풀과 DTex의 그룹과의 관계에 관한 정보)를 더한 것. +//3 : 개선된 lightmap..^^ const int N3ME_DTEX_DATA_VERSION = 2; // -//1 : dTex ؽ ׷ ؽ̸.difϷ д´.. -//2 : ؽ ׷ dtexinfo.dtxϷκ д´.. +//1 : dTex를 읽을때 각 텍스쳐의 그룹 정보를 각텍스쳐이름.dif파일로 부터 읽는다.. +//2 : 각텍스쳐의 그룹정보를 dtexinfo.dtx파일로부터 읽는다.. const int TERRAIN_CELL_SIZE = 4; -//const int MAX_COLORMAPTEXTURE = 32; // ִ #colormaptexture at one side = 4096/128.. -// m_iNumColorMap üؼ ִ... -const int PATCH_TILE_SIZE = 8; // ġ ϳ Ÿ 8x8 . +//const int MAX_COLORMAPTEXTURE = 32; // 최대 #colormaptexture at one side = 4096/128.. +//현재 m_iNumColorMap으로 대체해서 쓰고 있당... +const int PATCH_TILE_SIZE = 8; // 패치 하나에 타일이 8x8개 들어간다. -const int MAX_COLORMAPVB_SIZE = 1026; //÷ VB ִ . -const int MAX_TILEVB_SIZE = 16; //Ÿ VB ִ . -const int MAX_LIGHTMAPVB_SIZE = 16; //Ʈ VB ִ . +const int MAX_COLORMAPVB_SIZE = 1026; //컬러맵으로 찍는 VB의 최대 사이즈. +const int MAX_TILEVB_SIZE = 16; //타일찍는 VB의 최대 사이즈. +const int MAX_LIGHTMAPVB_SIZE = 16; //라이트맵 쓰는 VB의 최대 사이즈. const int DTEX_SIZE = 1024; // Detail Texture Size -const int NUM_DTEXTILE = 8; // Detail Texture .. +const int NUM_DTEXTILE = 8; // Detail Texture 분할 수.. const int LIGHTMAP_TEX_SIZE = 8; //32; const int DISTANCE_TABLE_SIZE = 64; -const int NOTMOVE_HEIGHT = 10; // Ŀ Ÿ ּҰ.. - // 10ϸ ְ, ̸̻ . +const int NOTMOVE_HEIGHT = 10; // 높이차가 커서 갈 수 없는 타일의 최소값.. + // 10이하면 움직일 수 있고, 이상이면 갈 수 없다. const int MAX_BRUSH_SIZE = 21; const int BRUSH_CENTER = (MAX_BRUSH_SIZE / 2); @@ -81,7 +81,7 @@ enum { // Structure Definitions.. -//ʿ.. +//맵에디터.. typedef struct __DTexAttr { int Group; int Attr; @@ -113,7 +113,7 @@ typedef struct __DTexInfo { } DTEXINFO, *LPDTEXINFO; typedef struct __MapData { - float fHeight; // ̰.. + float fHeight; //지형의 높이값.. //float u1,v1; //__Vector3 Normal; DTEXINFO DTexInfo1; @@ -123,11 +123,11 @@ typedef struct __MapData { } MAPDATA, *LPMAPDATA; typedef struct __GameMapData { - float fHeight; // ̰.. - DWORD bIsTileFull : 1; //Ÿ Full ̸ true ƴϸ false.. - DWORD Tex1Dir : 5; // ϴ ε ƴ.. + float fHeight; //지형의 높이값.. + DWORD bIsTileFull : 1; //타일이 Full 이면 true 아니면 false.. + DWORD Tex1Dir : 5; //툴에서 사용하는 인덱스가 아님.. DWORD Tex2Dir : 5; - DWORD Tex1Idx : 10; // ϴ ε ƴ.. + DWORD Tex1Idx : 10; //툴에서 사용하는 인덱스가 아님.. DWORD Tex2Idx : 10; __GameMapData() { diff --git a/src/tool/N3ME/MainFrm.cpp b/src/tool/N3ME/MainFrm.cpp index 7022ece9..970d3b3c 100644 --- a/src/tool/N3ME/MainFrm.cpp +++ b/src/tool/N3ME/MainFrm.cpp @@ -196,12 +196,12 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { // TODO: Remove this if you don't want tool tips m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); - // .. + // 경로 설정.. char szPathCur[256] = ""; GetCurrentDirectory(256, szPathCur); CN3Base::PathSet(szPathCur); - // ʱȭ + // 엔진 초기화 m_pEng = new CN3EngTool(); //m_pEng->InitEnv(); m_pEng->Init(TRUE, m_hWnd, 32, 32, 0, TRUE); @@ -217,17 +217,17 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { m_pDTexMng = new CDTexMng; m_pDTexMng->Init(this); - // ⺻ ҽ б.. + // 기본 리소스 읽기.. m_pMapMng->LoadSourceObjects(); m_pDTexGroupMng->Init(this); //m_pDTexGroupMng->LoadFromFile(); m_pDTexMng->Init(this); //m_pDTexMng->LoadFromFile(); - // ̾α .. + // 툴바 다이얼로그 정보.. m_wndDlgBar.SetDlgItemText(IDC_E_PATH, m_pEng->PathGet().c_str()); - // Ѹ Ŭ ʱȭ.. + //씨앗 뿌리기 관련 클래스 초기화.. m_pDlgSowSeed = new CDlgSowSeed; m_pDlgSowSeed->Create(IDD_SOW_SEED, this); m_pDlgSowSeed->ShowWindow(FALSE); @@ -361,11 +361,11 @@ void CMainFrame::OnCursorDtex() { hr = pBackBuff->GetDesc(&desc); if(desc.Format!=D3DFMT_X8R8G8B8) { - MessageBox("ȭ 尡 32bit̾ մϴ..","!!"); + MessageBox("화면색상 모드가 32bit모드이어야 합니다..","경고!!"); } */ m_pMapMng->SetCursorMode(CM_SET_DTEX); - // this->OnViewDtex(); // ȭ鿡 Ÿ ؽó ׷ ̾α׸ ش.. + // this->OnViewDtex(); // 화면에 타일 텍스처 그룹 다이얼로그를 열어준다.. } void CMainFrame::OnCursorEditRiver() { ASSERT(m_pMapMng); @@ -552,10 +552,10 @@ void CMainFrame::OnUpdateViewHideObj(CCmdUI * pCmdUI) { ASSERT(m_pMapMng); if (m_pMapMng->m_bHideObj) { - pCmdUI->SetText("Ʈ ̱\tH"); + pCmdUI->SetText("오브젝트 보이기\tH"); } if (!m_pMapMng->m_bHideObj) { - pCmdUI->SetText("Ʈ ߱\tH"); + pCmdUI->SetText("오브젝트 감추기\tH"); } } @@ -663,10 +663,10 @@ void CMainFrame::OnResourcePathSet() { } std::string szPath(dlg.GetPath().GetString()); - CN3Base::PathSet(szPath); // .. + CN3Base::PathSet(szPath); // 경로 설정.. m_wndDlgBar.SetDlgItemText(IDC_E_PATH, szPath.c_str()); - // ⺻ ҽ б.. + // 기본 리소스 읽기.. m_pMapMng->LoadSourceObjects(); } @@ -708,7 +708,7 @@ void CMainFrame::UpdateTransformInfo() { m_wndDlgBar.UpdateInfo(); } -void CMainFrame::OnTipDefaultMaterial() // ⺻ . +void CMainFrame::OnTipDefaultMaterial() // 기본재질로 만들기. { ASSERT(m_pMapMng); @@ -717,12 +717,12 @@ void CMainFrame::UpdateTransformInfo() { CN3TransformCollision * pObj = (CN3TransformCollision *)m_pMapMng->GetSelOutputObj(i); if (pObj->Type() & OBJ_SHAPE) { CN3Shape * pShape = (CN3Shape *)pObj; - pShape->MakeDefaultMaterial(); // ⺻ . + pShape->MakeDefaultMaterial(); // 기본재질로 만들기. } } } -void CMainFrame::OnTipRemoveAlphaflag() // ÷ .. +void CMainFrame::OnTipRemoveAlphaflag() // 알파 블렌딩 플래그 제거.. { ASSERT(m_pMapMng); @@ -731,7 +731,7 @@ void CMainFrame::UpdateTransformInfo() { CN3TransformCollision * pObj = (CN3TransformCollision *)m_pMapMng->GetSelOutputObj(i); if (pObj->Type() & OBJ_SHAPE) { CN3Shape * pShape = (CN3Shape *)pObj; - pShape->RemoveRenderFlags(RF_ALPHABLENDING); // ÷ .. + pShape->RemoveRenderFlags(RF_ALPHABLENDING); // 알파 블렌딩 플래그 제거.. } } } @@ -775,7 +775,7 @@ void CMainFrame::OnTipSowSeed() { } m_pDlgSowSeed->ShowWindow(TRUE); - // Ǯɱ + // 풀심기 if (m_pMapMng) { m_pMapMng->SetCursorMode(CM_EDIT_SEED); if (m_pMapMng->GetTerrain() != NULL) { diff --git a/src/tool/N3ME/MapMng.cpp b/src/tool/N3ME/MapMng.cpp index 3e447af7..db086e5a 100644 --- a/src/tool/N3ME/MapMng.cpp +++ b/src/tool/N3ME/MapMng.cpp @@ -43,7 +43,7 @@ static char THIS_FILE[] = __FILE__; // Construction/Destruction ////////////////////////////////////////////////////////////////////// -// +// 생성자 CMapMng::CMapMng(CMainFrame * pMainFrm) : m_RiverMng(pMainFrm) , m_PondMng(pMainFrm) { @@ -52,7 +52,7 @@ CMapMng::CMapMng(CMainFrame * pMainFrm) m_pMainFrm = pMainFrm; m_pTerrain = NULL; - // Path ϱ + // Path 지정하기 m_pSceneSource = new CN3Scene; m_pSceneSource->m_szName = "SourceList"; m_pSceneSource->FileNameSet("SourceList.N3Scene"); @@ -111,7 +111,7 @@ CMapMng::CMapMng(CMainFrame * pMainFrm) m_bLoadingComplete = false; - // ġ + // 윈도 배치 CRect rc(0, 0, 980, 1000); pMainFrm->MoveWindow(&rc); m_pDlgSourceList->MoveWindow(rc.right, rc.top, 300, 500); @@ -120,7 +120,7 @@ CMapMng::CMapMng(CMainFrame * pMainFrm) Release(); } -// ı +// 파괴자 CMapMng::~CMapMng() { Release(); if (m_pSceneSource) { @@ -181,7 +181,7 @@ CMapMng::~CMapMng() { } } -// ʱȭ +// 초기화 void CMapMng::Release() { if (m_pTerrain) { delete m_pTerrain; @@ -225,13 +225,13 @@ void CMapMng::Release() { m_PondMng.Release(); } -//FarPlane ... +//FarPlane 갱신... void CMapMng::UpDateFP() { m_pSceneOutput->CameraGetActive()->m_Data.fFP = m_pMainFrm->GetFP(); Invalidate(); } -// m_pSceneSource ijͿ Ʈ ߰ϴ Լ +// m_pSceneSource 캐릭터와 오브젝트를 추가하는 함수 void CMapMng::LoadSourceObjects() { ASSERT(m_pSceneSource && m_pDlgSourceList); @@ -239,10 +239,10 @@ void CMapMng::LoadSourceObjects() { WIN32_FIND_DATA FindFileData; - // source\Chr ij ߰ + // source\Chr 폴더의 모든 캐릭터 추가 CString szChrPath; szChrPath.Format("%sChr\\", CN3Base::s_szPath.c_str()); - SetCurrentDirectory(szChrPath); // szFolder\Chr θ ٲٰ.. + SetCurrentDirectory(szChrPath); // szFolder\Chr 폴더로 경로를 바꾸고.. HANDLE hFind = FindFirstFile("*.N3Chr", &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { @@ -253,11 +253,11 @@ void CMapMng::LoadSourceObjects() { FindClose(hFind); } - // source\Data shape ߰ + // source\Data 폴더의 모든 shape 추가 CString szShapePath; szShapePath.Format("%sObject\\", CN3Base::s_szPath.c_str()); - SetCurrentDirectory(szShapePath); // szFolder\Mesh θ ٲٰ.. - hFind = FindFirstFile("*.N3Shape", &FindFileData); // ã. + SetCurrentDirectory(szShapePath); // szFolder\Mesh 폴더로 경로를 바꾸고.. + hFind = FindFirstFile("*.N3Shape", &FindFileData); // 파일 찾기. if (hFind != INVALID_HANDLE_VALUE) { AddShape(m_pSceneSource, std::string(szShapePath + FindFileData.cFileName), FALSE); @@ -267,14 +267,14 @@ void CMapMng::LoadSourceObjects() { FindClose(hFind); } - m_pSceneSource->Tick(); // Object ʱȭ - m_pDlgSourceList->UpdateTree(m_pSceneSource); // + m_pSceneSource->Tick(); // Object 초기화 + m_pDlgSourceList->UpdateTree(m_pSceneSource); // 목록 갱신 } -// Scene ij ߰ϴ Լ +// 지정한 Scene에 캐릭터 추가하는 함수 CN3Transform * CMapMng::AddChr(CN3Scene * pDestScene, const std::string & szFN, BOOL bGenerateChainNumber) { CN3Chr * pChr = new CN3Chr; - if (false == pChr->LoadFromFile(szFN)) // θⰡ ϸ.. + if (false == pChr->LoadFromFile(szFN)) // 부르기가 실패하면.. { delete pChr; return NULL; @@ -291,8 +291,8 @@ CN3Transform * CMapMng::AddChr(CN3Scene * pDestScene, const std::string & szFN, continue; } - szCompare[nL - 5] = NULL; // ڿ ٴ ٿ ڸ ȣ .. - if (pChr->m_szName == szCompare) // ̸ .. + szCompare[nL - 5] = NULL; // 뒤에 붙는 언더바와 네자리 번호는 뺀다.. + if (pChr->m_szName == szCompare) // 이름이 같으면.. { nChainNumber = atoi(&(szCompare[nL - 4])) + 1; } @@ -300,17 +300,17 @@ CN3Transform * CMapMng::AddChr(CN3Scene * pDestScene, const std::string & szFN, char szName[_MAX_PATH]; wsprintf(szName, "%s_%.4d", pChr->m_szName.c_str(), nChainNumber); - pChr->m_szName = szName; // .. ̸ ´.. + pChr->m_szName = szName; // .. 이름을 짓는다.. } pDestScene->ChrAdd(pChr); return pChr; } -// Scene Shape ߰ϴ Լ +// 지정한 Scene에 Shape 추가하는 함수 CN3Transform * CMapMng::AddShape(CN3Scene * pDestScene, const std::string & szFN, BOOL bGenerateChainNumber) { CN3Shape * pShape = new CN3Shape; - if (false == pShape->LoadFromFile(szFN)) // θⰡ ϸ.. + if (false == pShape->LoadFromFile(szFN)) // 부르기가 실패하면.. { delete pShape; return NULL; @@ -327,8 +327,8 @@ CN3Transform * CMapMng::AddShape(CN3Scene * pDestScene, const std::string & szFN int nL = lstrlen(szCompare); if(nL < 5) continue; - szCompare[nL-5] = NULL; // ڿ ٴ ٿ ڸ ȣ .. - if(0 == lstrcmpi(pShape->Name(), szCompare)) // ̸ .. + szCompare[nL-5] = NULL; // 뒤에 붙는 언더바와 네자리 번호는 뺀다.. + if(0 == lstrcmpi(pShape->Name(), szCompare)) // 이름이 같으면.. { nChainNumber = atoi(&(szCompare[nL-4])) + 1; } @@ -336,27 +336,27 @@ CN3Transform * CMapMng::AddShape(CN3Scene * pDestScene, const std::string & szFN char szName[_MAX_PATH]; wsprintf(szName, "%s_%.4d", pShape->Name(), nChainNumber); - pShape->m_szName = szName; // .. ̸ ´.. + pShape->m_szName = szName; // .. 이름을 짓는다.. char szFileName2[_MAX_PATH]; char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath(szFileName, szDrive, szDir, szFName, szExt); _makepath(szFileName2, szDrive, szDir, szName, szExt); - pShape->FileNameSet(szFileName2); // ̸ ... + pShape->FileNameSet(szFileName2); // 파일 이름 짓기... } */ - pDestScene->ShapeAdd(pShape); // ߰ ϰ + pDestScene->ShapeAdd(pShape); // 추가 하고 return pShape; } -// pObj m_pSceneOutput ߰Ѵ. +// pObj를 m_pSceneOutput에 추가한다. CN3Transform * CMapMng::AddObjectToOutputScene(CN3Transform * pObj) { if (pObj == NULL) { return NULL; } ASSERT(m_pSceneOutput && pObj->m_szName.size()); - // m_pSceneOutput ֱ + // m_pSceneOutput에 넣기 CN3Transform * pDestObj = NULL; if (pObj->Type() & OBJ_CHARACTER) { pDestObj = AddChr(m_pSceneOutput, pObj->FileName(), TRUE); @@ -372,9 +372,9 @@ CN3Transform * CMapMng::AddObjectToOutputScene(CN3Transform * pObj) { return NULL; } -// ü +// 선택한 객체를 지움 void CMapMng::DeleteSelObjectFromOutputScene() { - if (GetCursorMode() == CM_EDIT_RIVER) // + if (GetCursorMode() == CM_EDIT_RIVER) // 강물 편집일 경우 선택 점 지우기 { m_RiverMng.DeleteSelectedVertex(); return; @@ -413,18 +413,18 @@ void CMapMng::DeleteSelObjectFromOutputScene() { void CMapMng::SavePartition(float x, float z, float width) { DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; - CFileDialog dlg(FALSE, "n3m", NULL, dwFlags, "N3ME (*.n3m)|*.n3m||", NULL); + CFileDialog dlg(FALSE, "n3m", NULL, dwFlags, "N3ME 파일(*.n3m)|*.n3m||", NULL); if (dlg.DoModal() == IDCANCEL) { return; } CString lpszPathName = dlg.GetPathName(); - // ̸ + // 파일 이름 char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath((LPCTSTR)lpszPathName, szDrive, szDir, szFName, szExt); - //n3m..^^ + //n3m만들기..^^ char szN3M[_MAX_PATH]; _makepath(szN3M, szDrive, szDir, szFName, "n3m"); HANDLE hFile = CreateFile(szN3M, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); @@ -432,30 +432,30 @@ void CMapMng::SavePartition(float x, float z, float width) { MessageBox(::GetActiveWindow(), lpszPathName, "Fail to open map data file for save, Pleas retry.", MB_OK); return; } - char comment[80] = {" ٺ..^^"}; + char comment[80] = {"이파일 여는 사람 바보..^^"}; DWORD dwRWC; WriteFile(hFile, &comment, sizeof(char) * 80, &dwRWC, NULL); CloseHandle(hFile); - // + // 지형 if (m_pTerrain) { char szTerrain[_MAX_PATH]; _makepath(szTerrain, szDrive, szDir, szFName, "trn"); m_pTerrain->SaveToFilePartition(szTerrain, x, z, width); } - // sdt (shape data text) + // sdt파일 저장(shape data text) char szSceneText[_MAX_PATH]; _makepath(szSceneText, szDrive, szDir, szFName, "sdt"); SaveObjectPostDataPartition(szSceneText, x, z, width); /* - // warp load.. + // warp 정보 load.. char szWarp[_MAX_PATH]; _makepath(szWarp, szDrive, szDir, szFName, "wap"); m_pWarpMgr->SaveToFile(szWarp); - //̺Ʈ .. + //이벤트 정보 저장.. //char szEvent[_MAX_PATH]; //_makepath(szEvent, szDrive, szDir, szFName, "evt"); //m_pEventMgr->SaveToFile(szEvent); @@ -467,11 +467,11 @@ void CMapMng::SaveToFile(LPCTSTR lpszPathName) { return; } - // ̸ + // 파일 이름 char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath(lpszPathName, szDrive, szDir, szFName, szExt); - //n3m..^^ + //n3m만들기..^^ char szN3M[_MAX_PATH]; _makepath(szN3M, szDrive, szDir, szFName, "n3m"); HANDLE hFile = CreateFile(szN3M, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); @@ -480,54 +480,54 @@ void CMapMng::SaveToFile(LPCTSTR lpszPathName) { return; } - char comment[80] = {" ٺ..^^"}; + char comment[80] = {"이파일 여는 사람 바보..^^"}; DWORD dwRWC; WriteFile(hFile, &comment, sizeof(char) * 80, &dwRWC, NULL); CloseHandle(hFile); - // + // 지형 if (m_pTerrain) { char szTerrain[_MAX_PATH]; _makepath(szTerrain, szDrive, szDir, szFName, "trn"); m_pTerrain->SaveToFile(szTerrain); } - // sdt (shape data text) + // sdt파일 저장(shape data text) char szSceneText[_MAX_PATH]; _makepath(szSceneText, szDrive, szDir, szFName, "sdt"); SaveObjectPostData(szSceneText); - // .. + // 강물 편집 정보 저장.. char szRiver[_MAX_PATH]; _makepath(szRiver, szDrive, szDir, szFName, "rvr"); m_RiverMng.SaveToFile(szRiver); - // .. + // 연못 편집 정보 저장.. char szPond[_MAX_PATH]; _makepath(szPond, szDrive, szDir, szFName, "pvr"); m_PondMng.SaveToFile(szPond); - // .. + //벽 정보 저장.. char szWall[_MAX_PATH]; _makepath(szWall, szDrive, szDir, szFName, "wal"); m_pWall->SaveToFile(szWall); - // warp load.. + // warp 정보 load.. char szWarp[_MAX_PATH]; _makepath(szWarp, szDrive, szDir, szFName, "wap"); m_pWarpMgr->SaveToFile(szWarp); - // sound Load.. + // sound 정보 Load.. char szSound[_MAX_PATH]; _makepath(szSound, szDrive, szDir, szFName, "tsd"); m_pSoundMgr->SaveToFile(szSound); - // light object .. + // light object 정보.. char szLightObj[_MAX_PATH]; _makepath(szLightObj, szDrive, szDir, szFName, "tld"); m_pLightObjMgr->SaveToFile(szLightObj); - //̺Ʈ .. + //이벤트 정보 저장.. //char szEvent[_MAX_PATH]; //_makepath(szEvent, szDrive, szDir, szFName, "evt"); //m_pEventMgr->SaveToFile(szEvent); @@ -538,11 +538,11 @@ void CMapMng::LoadFromFile(LPCTSTR lpszPathName) { return; } - // ̸ + // 파일 이름 char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_PATH], szExt[_MAX_EXT]; _splitpath(lpszPathName, szDrive, szDir, szFName, szExt); - // + // 지형 delete m_pTerrain; m_pTerrain = new CLyTerrain; m_pTerrain->Init(); @@ -566,27 +566,27 @@ void CMapMng::LoadFromFile(LPCTSTR lpszPathName) { _makepath(szPond, szDrive, szDir, szFName, "pvr"); m_PondMng.LoadFromFile(szPond); - // load.. + //벽 정보 load.. char szWall[_MAX_PATH]; _makepath(szWall, szDrive, szDir, szFName, "wal"); m_pWall->LoadFromFile(szWall); - // warp load.. + // warp 정보 load.. char szWarp[_MAX_PATH]; _makepath(szWarp, szDrive, szDir, szFName, "wap"); m_pWarpMgr->LoadFromFile(szWarp); - // sound Load.. + // sound 정보 Load.. char szSound[_MAX_PATH]; _makepath(szSound, szDrive, szDir, szFName, "tsd"); m_pSoundMgr->LoadFromFile(szSound); - // light object .. + // light object 정보.. char szLightObj[_MAX_PATH]; _makepath(szLightObj, szDrive, szDir, szFName, "tld"); m_pLightObjMgr->LoadFromFile(szLightObj); - //̺Ʈ .. + //이벤트 정보.. //char szEvent[_MAX_PATH]; //_makepath(szEvent, szDrive, szDir, szFName, "evt"); //m_pEventMgr->LoadFromFile(szEvent); @@ -610,7 +610,7 @@ void CMapMng::Tick() { void CMapMng::Render() { if (false == m_bLoadingComplete) { - return; // ε ... + return; // 로딩이 아직 안 끝났다... } CN3EngTool * pEng = m_pMainFrm->m_pEng; @@ -621,19 +621,19 @@ void CMapMng::Render() { pEng->s_lpD3DDev->SetRenderState(D3DRS_FILLMODE, m_FillMode); pEng->s_lpD3DDev->SetRenderState(D3DRS_SHADEMODE, m_ShadeMode); - if (m_bRenderAxisAndGrid) // ׸ ׸... + if (m_bRenderAxisAndGrid) // 축과 그리드 그리기... { pEng->RenderAxis(); __Matrix44 mtxWorld; mtxWorld.Scale(32.0f, 32.0f, 32.0f); if (m_SelOutputObjArray.GetSize() > 0) { CN3Transform * pSelObj = m_SelOutputObjArray.GetAt(0); - if (pSelObj) // õ ü .. + if (pSelObj) // 선택된 객체가 있으면.. { - mtxWorld.PosSet(0, pSelObj->Pos().y, 0); // ̸ ø. + mtxWorld.PosSet(0, pSelObj->Pos().y, 0); // 높이를 올린다. } } - pEng->RenderGrid(mtxWorld); // ׸ ׸... + pEng->RenderGrid(mtxWorld); // 그리드 그리기... } if (m_pTerrain) { @@ -652,8 +652,8 @@ void CMapMng::Render() { if (pSelObj->Type() & OBJ_SHAPE) { ((CN3Shape *)pSelObj)->RenderSelected(m_bViewWireFrame); - ((CN3Shape *)pSelObj)->RenderCollisionMesh(); // 浹 ޽ ׸... - ((CN3Shape *)pSelObj)->RenderClimbMesh(); // ö󰡴 ޽ ׸.. + ((CN3Shape *)pSelObj)->RenderCollisionMesh(); // 충돌 메시 그리기... + ((CN3Shape *)pSelObj)->RenderClimbMesh(); // 올라가는 메시 그리기.. } } @@ -691,7 +691,7 @@ void CMapMng::Render() { m_pLightObjMgr->Render(); } - // Ǯɱ ׽Ʈ + // 풀심기 테스트 if (m_SowSeedMng.bActive == TRUE) { m_SowSeedMng.Render(s_lpD3DDev); } @@ -766,14 +766,14 @@ void CMapMng::FocusSelObj() { } } - if (vMin.x != FLT_MAX && vMax.x != -FLT_MAX) { // ü ũ⿡ ī޶ Ÿ + if (vMin.x != FLT_MAX && vMax.x != -FLT_MAX) { // 물체 크기에 맞춰 카메라 거리 조절 __Vector3 vDir = pCamera->Dir(); __Vector3 vAt = vMin + ((vMax - vMin) / 2); pCamera->AtPosSet(vAt); pCamera->EyePosSet(vAt - vDir * (vMax - vMin).Magnitude()); } // else {ASSERT(0);} - // { // ü ũ⸦ Ƿ Ÿ + // { // 물체 크기를 알 수 없으므로 지금 거리 유지 // CN3TransformCollision* pSelObj = m_SelOutputObjArray.GetAt(0); // pCamera->m_vRot = pSelObj->m_vPos; // __Vector3 vDiff = pSelObj->m_vPos - pCamera->m_vRot; @@ -872,28 +872,28 @@ BOOL CMapMng::CameraMove(LPMSG pMsg) } break; - case '2': // '1' (Լ static ..) + case '2': // '1'과 같은 내용임 (함수로 만들지 않은 이유는 static변수 때문에..) { static BOOL bSet = FALSE; if (pCamera) { static __Vector3 vEye(0, 0, 0); static __Vector3 vAt(0, 0, 1); static __Vector3 vUp(0, 1, 0); if (GetAsyncKeyState(VK_CONTROL) & 0xff00) { vEye = pCamera->EyePos(); vAt = pCamera->AtPos(); vUp = pCamera->UpVector(); pCamera->Apply(); bSet = TRUE; return FALSE; } else if (bSet) { pCamera->EyePosSet(vEye); pCamera->AtPosSet(vAt); pCamera->UpVectorSet(vUp); pCamera->Apply(); return TRUE;} else return FALSE;} } break; - case '3': // '1' (Լ static ..) + case '3': // '1'과 같은 내용임 (함수로 만들지 않은 이유는 static변수 때문에..) { static BOOL bSet = FALSE; if (pCamera) { static __Vector3 vEye(0, 0, 0); static __Vector3 vAt(0, 0, 1); static __Vector3 vUp(0, 1, 0); if (GetAsyncKeyState(VK_CONTROL) & 0xff00) { vEye = pCamera->EyePos(); vAt = pCamera->AtPos(); vUp = pCamera->UpVector(); pCamera->Apply(); bSet = TRUE; return FALSE; } else if (bSet) { pCamera->EyePosSet(vEye); pCamera->AtPosSet(vAt); pCamera->UpVectorSet(vUp); pCamera->Apply(); return TRUE;} else return FALSE;} } break; - case '4': // '1' (Լ static ..) + case '4': // '1'과 같은 내용임 (함수로 만들지 않은 이유는 static변수 때문에..) { static BOOL bSet = FALSE; if (pCamera) { static __Vector3 vEye(0, 0, 0); static __Vector3 vAt(0, 0, 1); static __Vector3 vUp(0, 1, 0); if (GetAsyncKeyState(VK_CONTROL) & 0xff00) { vEye = pCamera->EyePos(); vAt = pCamera->AtPos(); vUp = pCamera->UpVector(); pCamera->Apply(); bSet = TRUE; return FALSE; } else if (bSet) { pCamera->EyePosSet(vEye); pCamera->AtPosSet(vAt); pCamera->UpVectorSet(vUp); pCamera->Apply(); return TRUE;} else return FALSE;} } break; - case '5': // '1' (Լ static ..) + case '5': // '1'과 같은 내용임 (함수로 만들지 않은 이유는 static변수 때문에..) { static BOOL bSet = FALSE; if (pCamera) { static __Vector3 vEye(0, 0, 0); static __Vector3 vAt(0, 0, 1); static __Vector3 vUp(0, 1, 0); if (GetAsyncKeyState(VK_CONTROL) & 0xff00) { vEye = pCamera->EyePos(); vAt = pCamera->AtPos(); vUp = pCamera->UpVector(); pCamera->Apply(); bSet = TRUE; return FALSE; } @@ -902,7 +902,7 @@ BOOL CMapMng::CameraMove(LPMSG pMsg) } break; } } - else if (iButtonDownCount == 0 && !(GetAsyncKeyState(VK_MENU) & 0xff00) ) return FALSE; // alt Ű ȴ ī޶ ƴϴ. + else if (iButtonDownCount == 0 && !(GetAsyncKeyState(VK_MENU) & 0xff00) ) return FALSE; // alt 키가 안눌렸을경우는 카메라 움직임이 아니다. static CPoint ptPrev; switch(pMsg->message) @@ -927,7 +927,7 @@ BOOL CMapMng::CameraMove(LPMSG pMsg) break; case WM_MOUSEMOVE: break; - default: // 콺 ޼ ƴҰ ī޶ ƴϴ. + default: // 마우스 메세지가 아닐경우 카메라 움직임이 아니다. return FALSE; } @@ -1023,12 +1023,12 @@ BOOL CMapMng::MouseMsgFilter(LPMSG pMsg) { } static BOOL bSelectDrag = FALSE; - if (bSelectDrag == FALSE && // Object drag select 尡 ƴϰ - RCM_SELECT != m_RiverMng.GetRCursorMode()) // drag select尡 ƴҶ + if (bSelectDrag == FALSE && // Object drag select 모드가 아니고 + RCM_SELECT != m_RiverMng.GetRCursorMode()) // 강편집의 drag select모드가 아닐때 { CN3Camera * pCamera = m_pSceneOutput->CameraGetActive(); if (pCamera && pCamera->MoveByWindowMessage(pMsg)) { - return TRUE; // ī޶ ̵ ޼ Ÿ + return TRUE; // 카메라 이동 메세지 거르기 } } if (bSelectDrag == FALSE && PCM_SELECT != m_PondMng.GetPCursorMode()) { @@ -1039,16 +1039,16 @@ BOOL CMapMng::MouseMsgFilter(LPMSG pMsg) { } if (m_pTerrain && m_pTerrain->MouseMsgFilter(pMsg)) { - return TRUE; // ޼ Ÿ + return TRUE; // 지형 편집 메세지 거르기 } if (m_RiverMng.MouseMsgFilter(pMsg)) { - return TRUE; // ޼ Ÿ + return TRUE; // 강 편집 메세지 거르기 } if (m_PondMng.MouseMsgFilter(pMsg)) { - return TRUE; // ޽ Ÿ + return TRUE; // 연못 편집 메시지 거르기 } if (m_pNPCPath && m_pNPCPath->MouseMsgFilter(pMsg)) { - return TRUE; // NPC 游 ޼ Ÿ + return TRUE; // NPC 길만들기 메세지 거르기 } if (m_pWall && m_pWall->MouseMsgFilter(pMsg)) { return TRUE; @@ -1066,7 +1066,7 @@ BOOL CMapMng::MouseMsgFilter(LPMSG pMsg) { return TRUE; } - // Dummy Cube̴ ޼ Ÿ + // Dummy Cube움직이는 메세지 거르기 if (m_pDummy && m_pDummy->MouseMsgFilter(pMsg)) { return TRUE; } @@ -1086,7 +1086,7 @@ BOOL CMapMng::MouseMsgFilter(LPMSG pMsg) { } } - // ü ġ + // 나머지 객체 선택 및 배치 switch (pMsg->message) { case WM_MOUSEMOVE: { DWORD nFlags = pMsg->wParam; @@ -1128,7 +1128,7 @@ BOOL CMapMng::MouseMsgFilter(LPMSG pMsg) { */ } } break; - case WM_LBUTTONDOWN: // ü + case WM_LBUTTONDOWN: // 객체 선택 { POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; if (m_CursorMode == CM_OBJECT_BRUSH && m_pSelSourceObj) { @@ -1150,21 +1150,21 @@ BOOL CMapMng::MouseMsgFilter(LPMSG pMsg) { return TRUE; } } break; - case WM_LBUTTONUP: // ü + case WM_LBUTTONUP: // 객체 선택 { if (bSelectDrag) { POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; - if (abs(m_rcSelDrag.left - point.x) < 4 && abs(m_rcSelDrag.top - point.y) < 4) // ŬѰɷ + if (abs(m_rcSelDrag.left - point.x) < 4 && abs(m_rcSelDrag.top - point.y) < 4) // 클릭한걸로 간주 { int nPart = -1; CN3Base * pBaseSel = Pick(point, &nPart); SelectObject(pBaseSel, FALSE, (GetAsyncKeyState(VK_SHIFT) & 0xff00) ? TRUE : FALSE); - if (m_pDlgBase && pBaseSel && pBaseSel->Type() & OBJ_SHAPE) // Ʈ .. + if (m_pDlgBase && pBaseSel && pBaseSel->Type() & OBJ_SHAPE) // 파트 선택.. { m_pDlgBase->m_CBShapePart.SetCurSel(nPart); } - } else { // 巹 + } else { // 드레그 한 것 if (m_rcSelDrag.left > point.x) { m_rcSelDrag.right = m_rcSelDrag.left; m_rcSelDrag.left = point.x; @@ -1183,12 +1183,12 @@ BOOL CMapMng::MouseMsgFilter(LPMSG pMsg) { bSelectDrag = FALSE; m_rcSelDrag.left = m_rcSelDrag.top = m_rcSelDrag.right = m_rcSelDrag.bottom = 0; - m_pMainFrm->UpdateTransformInfo(); // ġ, ȸ ƮѴ. + m_pMainFrm->UpdateTransformInfo(); // 위치, 회전값등을 업데이트한다. return TRUE; } } break; - case WM_RBUTTONUP: // ü + case WM_RBUTTONUP: // 객체 선택 해제 { if (bSelectDrag) { ReleaseCapture(); @@ -1285,17 +1285,17 @@ CN3Base * CMapMng::Pick(POINT point, int * pnPart) // Object Picking... } void CMapMng::SelectObject(CN3Base * pObj, BOOL IsSourceObj, BOOL bAdd) { - if (IsSourceObj) { // source + if (IsSourceObj) { // source 선택 if (pObj && pObj->Type() & (OBJ_CHARACTER | OBJ_SHAPE)) { m_pSelSourceObj = (CN3Transform *)pObj; } else { m_pSelSourceObj = NULL; } - } else { // ̹ ġ ü + } else { // 이미 배치된 객체 선택 CN3Transform * pSelObj = NULL; if (pObj && pObj->Type() & (OBJ_CHARACTER | OBJ_SHAPE)) { pSelObj = (CN3Transform *)pObj; - if (bAdd) // ߰ + if (bAdd) // 추가 { BOOL bAleadySelected = FALSE; int i, iSize = m_SelOutputObjArray.GetSize(); @@ -1306,16 +1306,16 @@ void CMapMng::SelectObject(CN3Base * pObj, BOOL IsSourceObj, BOOL bAdd) { } } if (bAleadySelected) { - m_SelOutputObjArray.RemoveAt(i); // ̹ Ƿ øϿ + m_SelOutputObjArray.RemoveAt(i); // 이미 있으므로 선택목록에서 제거 } else { - m_SelOutputObjArray.InsertAt(0, pSelObj); // ߰ + m_SelOutputObjArray.InsertAt(0, pSelObj); // 추가 } - } else // + } else // 새로 선택 { m_SelOutputObjArray.RemoveAll(); m_SelOutputObjArray.Add(pSelObj); } - } else // ߸ ߰ų ijͳ shape ʾҴ. + } else // 잘못 선택했거나 캐릭터나 shape를 선택하지 않았다. { if (bAdd == FALSE) { m_SelOutputObjArray.RemoveAll(); @@ -1324,7 +1324,7 @@ void CMapMng::SelectObject(CN3Base * pObj, BOOL IsSourceObj, BOOL bAdd) { OnSelChanged(); } - if (m_SelOutputObjArray.GetSize() == 1) // Ѱ ߴٸ.. + if (m_SelOutputObjArray.GetSize() == 1) // 한개를 선택했다면.. { m_pMainFrm->UpdateTransformInfo(); } @@ -1394,9 +1394,9 @@ void CMapMng::SelectObjectByDragRect(RECT * pRect, BOOL bAdd) { } } if (bAleadySelected) { - m_SelOutputObjArray.RemoveAt(j); // ̹ Ƿ øϿ + m_SelOutputObjArray.RemoveAt(j); // 이미 있으므로 선택목록에서 제거 } else { - m_SelOutputObjArray.InsertAt(0, pObj); // ߰ + m_SelOutputObjArray.InsertAt(0, pObj); // 추가 } } } @@ -1429,19 +1429,19 @@ void CMapMng::MakeGameFiles(LPCTSTR lpszPathName, float fSize) { char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath(lpszPathName, szDrive, szDir, szFName, szExt); - // . + // 파일 저장. HANDLE hFile = CreateFile(lpszPathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { MessageBox(::GetActiveWindow(), lpszPathName, "Fail to open map game data file for save, Pleas retry.", MB_OK); return; } - char comment[80] = {" ٺ..^^"}; + char comment[80] = {"이파일 여는 사람 바보..^^"}; DWORD dwRWC; WriteFile(hFile, &m_iZoneID, sizeof(int), &dwRWC, NULL); WriteFile(hFile, &comment, sizeof(char) * 80, &dwRWC, NULL); CloseHandle(hFile); - // + // 지형정보 저장 HANDLE hTerrainGameFile = NULL; char szTerrain[_MAX_PATH] = ""; _makepath(szTerrain, szDrive, szDir, szFName, ".gtd"); @@ -1450,7 +1450,7 @@ void CMapMng::MakeGameFiles(LPCTSTR lpszPathName, float fSize) { if (INVALID_HANDLE_VALUE == hTerrainGameFile) { MessageBox(::GetActiveWindow(), szTerrain, "Failed to open terrain file for save", MB_OK); } else { - m_pTerrain->m_szName = szFName; // ̸ Ѵ.. ̸ ȴ. + m_pTerrain->m_szName = szFName; // 이름을 지정한다.. 이 이름대로 저장된다. m_pTerrain->SaveGameData(hTerrainGameFile); char szColorMapName[_MAX_PATH]; _makepath(szColorMapName, szDrive, szDir, szFName, ".tct"); @@ -1466,15 +1466,15 @@ void CMapMng::MakeGameFiles(LPCTSTR lpszPathName, float fSize) { m_pTerrain->MakeGameLightMap(szLightMapName); } - // Shape Manager ... - // if(true == m_pSceneOutput->CheckOverlappedShapesAndReport()) // ̸̳ ġ ߺ Ȯ.. + // Shape Manager 만들고 저장... + // if(true == m_pSceneOutput->CheckOverlappedShapesAndReport()) // 이름이나 위치 중복 확인.. // { - // int idYesNo = ::MessageBox(::GetActiveWindow(), "ߺ Ʈ Ͻðڽϱ?", "ߺ Ʈ ó", MB_YESNO); + // int idYesNo = ::MessageBox(::GetActiveWindow(), "중복된 오브젝트들을 삭제 하시겠습니까?", "중복된 오브젝트 처리", MB_YESNO); // if(IDYES == idYesNo) // { // m_pSceneOutput->DeleteOverlappedShapes(); - // m_pDlgOutputList->UpdateTree(m_pSceneOutput); // ƿDz Ʈ üũ.. - // m_SelOutputObjArray.RemoveAll(); // ʱȭ.. + // m_pDlgOutputList->UpdateTree(m_pSceneOutput); // 아웃풋 리스트 체크.. + // m_SelOutputObjArray.RemoveAll(); // 셀렉션 초기화.. // } // } @@ -1483,19 +1483,19 @@ void CMapMng::MakeGameFiles(LPCTSTR lpszPathName, float fSize) { (m_pTerrain->m_iHeightMapSize - 1) * TERRAIN_CELL_SIZE); int nSC = m_pSceneOutput->ShapeCount(); for (int i = 0; i < nSC; i++) { - ShapeMgr.Add(m_pSceneOutput->ShapeGet(i)); // Shape ߰. + ShapeMgr.Add(m_pSceneOutput->ShapeGet(i)); // Shape 추가. } if (m_pWall) { m_pWall->AddWall2Coll(&ShapeMgr); } - ShapeMgr.GenerateCollisionData(); // 浹 ޽ ͸ Ѵ... + ShapeMgr.GenerateCollisionData(); // 충돌 메시 데이터를 생성한다... char szObjPosting[_MAX_PATH] = ""; _makepath(szObjPosting, szDrive, szDir, szFName, - ".opd"); // "Object Posting Data" - Shape Manager file ̸ ϰ.. + ".opd"); // "Object Posting Data" - Shape Manager file 이름을 정하고.. ShapeMgr.SaveToFile(szObjPosting); - //̺Ʈ .. + //이벤트 저장.. char szEventName[_MAX_PATH] = ""; _makepath(szEventName, szDrive, szDir, szFName, ".gev"); // if (!m_pEventMgr->MakeGameFile(szEventName, m_pTerrain->m_iHeightMapSize)) { @@ -1510,8 +1510,8 @@ void CMapMng::MakeGameFiles(LPCTSTR lpszPathName, float fSize) { } void CMapMng::MakeTerrainMovableAttr(CN3ShapeMgr * pShapeMgr) { - m_pTerrain->MakeMoveTable(m_pEventMgr->m_ppEvent); // Ӽ ... - pShapeMgr->MakeMoveTable(m_pEventMgr->m_ppEvent); // Ӽ ... + m_pTerrain->MakeMoveTable(m_pEventMgr->m_ppEvent); //움직임 속성 셋팅... + pShapeMgr->MakeMoveTable(m_pEventMgr->m_ppEvent); //움직임 속성 셋팅... } void CMapMng::MakeServerDataFiles(LPCTSTR lpszPathName) { @@ -1526,19 +1526,19 @@ void CMapMng::MakeServerDataFiles(LPCTSTR lpszPathName) { return; } - //terrain .. + //terrain 저장.. m_pTerrain->SaveServerData(hFile); // - // Shape Manager ... - // if(true == m_pSceneOutput->CheckOverlappedShapesAndReport()) // ̸̳ ġ ߺ Ȯ.. + // Shape Manager 만들고 저장... + // if(true == m_pSceneOutput->CheckOverlappedShapesAndReport()) // 이름이나 위치 중복 확인.. // { - // int idYesNo = ::MessageBox(::GetActiveWindow(), "ߺ Ʈ Ͻðڽϱ?", "ߺ Ʈ ó", MB_YESNO); + // int idYesNo = ::MessageBox(::GetActiveWindow(), "중복된 오브젝트들을 삭제 하시겠습니까?", "중복된 오브젝트 처리", MB_YESNO); // if(IDYES == idYesNo) // { // m_pSceneOutput->DeleteOverlappedShapes(); - // m_pDlgOutputList->UpdateTree(m_pSceneOutput); // ƿDz Ʈ üũ.. - // m_SelOutputObjArray.RemoveAll(); // ʱȭ.. + // m_pDlgOutputList->UpdateTree(m_pSceneOutput); // 아웃풋 리스트 체크.. + // m_SelOutputObjArray.RemoveAll(); // 셀렉션 초기화.. // } // } @@ -1547,23 +1547,23 @@ void CMapMng::MakeServerDataFiles(LPCTSTR lpszPathName) { (m_pTerrain->m_iHeightMapSize - 1) * TERRAIN_CELL_SIZE); int nSC = m_pSceneOutput->ShapeCount(); for (int i = 0; i < nSC; i++) { - ShapeMgr.Add(m_pSceneOutput->ShapeGet(i)); // Shape ߰. + ShapeMgr.Add(m_pSceneOutput->ShapeGet(i)); // Shape 추가. } if (m_pWall) { m_pWall->AddWall2Coll(&ShapeMgr); } - ShapeMgr.GenerateCollisionData(); // 浹 ޽ ͸ Ѵ.. + ShapeMgr.GenerateCollisionData(); // 충돌 메시 데이터를 생성한다.. MakeTerrainMovableAttr(&ShapeMgr); - ShapeMgr.SaveCollisionData(hFile); // 浹 ͸ ... + ShapeMgr.SaveCollisionData(hFile); // 충돌 데이터만 저장... - // Object Event . + // Object Event 저장. // DWORD dwNum; - int iEventObjectCount = 0; // .. + int iEventObjectCount = 0; // 먼저 갯수를 세고.. for (int i = 0; i < nSC; i++) { CN3Shape * pShape = m_pSceneOutput->ShapeGet(i); if (pShape->m_iEventID || pShape->m_iEventType || pShape->m_iNPC_ID || - pShape->m_iNPC_Status) { // ̺Ʈ + pShape->m_iNPC_Status) { // 이벤트가 있으면 iEventObjectCount++; } } @@ -1573,7 +1573,7 @@ void CMapMng::MakeServerDataFiles(LPCTSTR lpszPathName) { CN3Shape * pShape = m_pSceneOutput->ShapeGet(i); short sEvent = 0; __Vector3 vPos; - if (pShape->m_iEventID || pShape->m_iEventType || pShape->m_iNPC_ID || pShape->m_iNPC_Status) // ̺Ʈ + if (pShape->m_iEventID || pShape->m_iEventType || pShape->m_iNPC_ID || pShape->m_iNPC_Status) // 이벤트가 있으면 { WriteFile(hFile, &(pShape->m_iBelong), 4, &dwNum, NULL); sEvent = (short)(pShape->m_iEventID); @@ -1592,7 +1592,7 @@ void CMapMng::MakeServerDataFiles(LPCTSTR lpszPathName) { } } - //MapTileӼ ... + //MapTile속성 저장... // m_pEventMgr->MakeEventArray(); /* @@ -1611,19 +1611,19 @@ void CMapMng::MakeServerDataFiles(LPCTSTR lpszPathName) { m_pRegenUser->SaveServerData(hFile); m_pWarpMgr->SaveServerData(hFile); - // ̺Ʈ .. - // ̸ + // 이벤트 정보.. + // 파일 이름 char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_PATH], szExt[_MAX_EXT]; _splitpath(lpszPathName, szDrive, szDir, szFName, szExt); - //̺Ʈ .. + //이벤트 정보 저장.. char szEvent[_MAX_PATH]; char szEvtFName[_MAX_PATH]; sprintf(szEvtFName, "%s_Event", szFName); _makepath(szEvent, szDrive, szDir, szEvtFName, "txt"); - m_pEventMgr->SaveInfoTextFile(szEvent); // ̺Ʈ ̵ ǵ ִ ؽƮ .. + m_pEventMgr->SaveInfoTextFile(szEvent); //서버에서 쓰는 이벤트 아이디 조건들이 들어 있는 텍스트 파일.. - // ؽƮϷ ̾ƺ.. + // 텍스트파일로 함 뽑아보자.. FILE * stream = fopen("c:\\move.txt", "w"); for (int z = m_pTerrain->m_iHeightMapSize - 1; z >= 0; z--) { for (int x = 0; x < m_pTerrain->m_iHeightMapSize; x++) { @@ -1633,16 +1633,16 @@ void CMapMng::MakeServerDataFiles(LPCTSTR lpszPathName) { fprintf(stream, "\n"); } fclose(stream); - //̾Ҵ. + //뽑았다. /* char szCollisionFN[512]; char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath(lpszPathName, szDrive, szDir, szFName, szExt); - _makepath(szCollisionFN, szDrive,szDir, szFName, ".scd"); // ٸ ̸ .. + _makepath(szCollisionFN, szDrive,szDir, szFName, ".scd"); // 다른 이름으로 저장.. CFile file; file.Open(szCollisionFN, CFile::modeCreate | CFile::modeWrite); - ShapeMgr.SaveCollisionData((HANDLE)file.m_hFile); // 浹 ͸ ... + ShapeMgr.SaveCollisionData((HANDLE)file.m_hFile); // 충돌 데이터만 저장... file.Close(); */ CloseHandle(hFile); @@ -1753,7 +1753,7 @@ void CMapMng::RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd) { // begin pD3DDev->BeginScene(); - // Object ġ ũ ľ + // Object의 위치 및 크기 파악 __Vector3 vDir(-1, -1, 3); vDir.Normalize(); __Vector3 vMin = pObj->Min(); @@ -1763,7 +1763,7 @@ void CMapMng::RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd) { vAt = vMin + (vMax - vMin) / 2.0f; vAt.y -= (vMax - vMin).Magnitude() / 8.0f; vEye = vAt - vDir * ((vMax - vMin).Magnitude() * 0.7f); - // pEng->s_CameraData.vEye = vEye; // Shape LOD .. + // pEng->s_CameraData.vEye = vEye; // Shape의 LOD설정 때문에.. // back up __Matrix44 mtxOldView, mtxOldProj; @@ -1772,7 +1772,7 @@ void CMapMng::RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd) { DWORD dwLighting; pD3DDev->GetRenderState(D3DRS_LIGHTING, &dwLighting); - // camera frustum ..(ApplyԼ ο transform ٲٱ⶧ ġ ־ Ѵ.) + // camera frustum 세팅..(Apply함수 내부에서 transform을 바꾸기때문에 이 위치에 넣어야 한다.) // pEng->s_CameraData.vAt = vAt; // TempCamera.s_CameraData = pEng->s_CameraData; CN3Camera TempCamera; @@ -1780,9 +1780,9 @@ void CMapMng::RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd) { TempCamera.AtPosSet(vAt); TempCamera.UpVectorSet(vUp); TempCamera.Tick(); - TempCamera.Apply(); // ӽī޶ ͸ ְ frustum .. + TempCamera.Apply(); // 임시카메라에 데이터를 넣고 frustum 정보를 계산.. - // View Matrix Projection Matrix Setting + // View Matrix 및 Projection Matrix Setting // __Matrix44 viewmtx; // ::D3DXMatrixLookAtLH(&viewmtx, &vEye, &vAt, &vUp); // pD3DDev->SetTransform(D3DTS_VIEW, &viewmtx); @@ -1793,7 +1793,7 @@ void CMapMng::RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd) { // Set Render State pD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE); - // ׸ + // 그리기 if (dwType & OBJ_CHARACTER) { CN3Chr * pChr = (CN3Chr *)pObj; pChr->Tick(-1000); @@ -1804,11 +1804,11 @@ void CMapMng::RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd) { pShape->Render(); } - CN3Base::s_AlphaMgr.Render(); // Alpha primitive ׸... + CN3Base::s_AlphaMgr.Render(); // Alpha primitive 그리기... pD3DDev->EndScene(); // end pEng->Present(hWnd); // present - // restore ( · ǵ picking ʴ´) + // restore (이전 상태로 되돌려주지 않으면 지형에서 picking이 제대로 되지 않는다) pD3DDev->SetTransform(D3DTS_VIEW, &mtxOldView); pD3DDev->SetTransform(D3DTS_PROJECTION, &mtxOldProj); CopyMemory(&CN3Base::s_CameraData, &CameraDataBackUp, sizeof(CameraDataBackUp)); @@ -1829,7 +1829,7 @@ void CMapMng::SetCursorMode(int iMode) { m_pDummy->SetSelObj(NULL); } - m_pBrushDlg->SetTerrain(NULL); // Brush â ʰѴ. + m_pBrushDlg->SetTerrain(NULL); // Brush 창을 보이지 않게한다. if (m_pTerrain) { m_pTerrain->SetEditMode(TEM_NOT); } @@ -1854,7 +1854,7 @@ void CMapMng::SetCursorMode(int iMode) { m_RiverMng.SetEditMode(FALSE); m_PondMng.SetEditMode(FALSE); - // Ǯɱ + // 풀심기 m_SowSeedMng.SetActive(FALSE); switch (iMode) { @@ -1866,14 +1866,14 @@ void CMapMng::SetCursorMode(int iMode) { break; case CM_POS: m_pDummy = &m_PosDummy; - m_pMainFrm->UpdateTransformInfo(); // ġ, ȸ ƮѴ. + m_pMainFrm->UpdateTransformInfo(); // 위치, 회전값등을 업데이트한다. break; case CM_ROTATE: m_pDummy = &m_RotDummy; break; case CM_SCALE: m_pDummy = &m_ScaleDummy; - m_pMainFrm->UpdateTransformInfo(); // ġ, ȸ ƮѴ. + m_pMainFrm->UpdateTransformInfo(); // 위치, 회전값등을 업데이트한다. break; case CM_EDIT_TERRAIN: m_pBrushDlg->SetTerrain(m_pTerrain); @@ -1920,12 +1920,12 @@ void CMapMng::SetCursorMode(int iMode) { (m_pTerrain->m_iHeightMapSize - 1) * TERRAIN_CELL_SIZE); int nSC = m_pSceneOutput->ShapeCount(); for (int i = 0; i < nSC; i++) { - ShapeMgr.Add(m_pSceneOutput->ShapeGet(i)); // Shape ߰. + ShapeMgr.Add(m_pSceneOutput->ShapeGet(i)); // Shape 추가. } if (m_pWall) { m_pWall->AddWall2Coll(&ShapeMgr); } - ShapeMgr.GenerateCollisionData(); // 浹 ޽ ͸ Ѵ.. + ShapeMgr.GenerateCollisionData(); // 충돌 메시 데이터를 생성한다.. MakeTerrainMovableAttr(&ShapeMgr); m_pNPCPath->m_pppRefEvent = m_pEventMgr->m_ppEvent; @@ -1953,7 +1953,7 @@ void CMapMng::SetCursorMode(int iMode) { m_pSoundMgr->SetActive(true); } break; - // Ǯɱ + // 풀심기 case CM_EDIT_SEED: { m_SowSeedMng.SetActive(TRUE); } break; @@ -1978,7 +1978,7 @@ void CMapMng::SetCursorMode(int iMode) { m_pDummy->SetSelObj(NULL); } - m_pDummy->m_pTerrainRef = m_pTerrain; // ̿ ͸ ־ش. + m_pDummy->m_pTerrainRef = m_pTerrain; // 더미에 지형 포인터를 넣어준다. } m_pMainFrm->GetActiveView()->Invalidate(FALSE); } @@ -1992,7 +1992,7 @@ void CMapMng::Invalidate() { } } -void CMapMng::DropSelObjToTerrain() { // ü δ.(Y ) +void CMapMng::DropSelObjToTerrain() { // 선택한 객체를 지형에 붙인다.(Y값만 조정) if (m_pTerrain == NULL) { return; } @@ -2055,7 +2055,7 @@ void CMapMng::ImportTerrainHeight(const char * szMeshFN) { m_bLoadingComplete = true; } -void CMapMng::RenderGrid(float fGridSize, float fMaxDistance) // fGridSizeũ fMaxDistanceŸ ڸ ׷ش +void CMapMng::RenderGrid(float fGridSize, float fMaxDistance) // fGridSize크기로 fMaxDistance거리까지 격자를 그려준다 { if (m_pMainFrm == NULL) { return; @@ -2120,11 +2120,11 @@ void CMapMng::SaveObjectPostData(LPCTSTR lpszFileName) { FILE* stream = fopen(lpszFileName, "w"); if (stream == NULL) { - m_pMainFrm->MessageBox(" ϴ."); + m_pMainFrm->MessageBox("파일을 만들수 없습니다."); return; } - // ̸ иϰ.. + // 폴더 이름을 분리하고.. char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath(lpszFileName, szDrive, szDir, szFName, szExt); @@ -2139,9 +2139,9 @@ void CMapMng::SaveObjectPostData(LPCTSTR lpszFileName) { char szSFN[MAX_PATH]; _makepath(szSFN, szDrive, szDir, pShape->Name(), ".n3shape"); - pShape->SaveToFile(szSFN); // Shape binary file .. + pShape->SaveToFile(szSFN); // Shape 정보 binary file로 저장.. - fprintf(stream, "%s\n", pShape->Name()); // ؽƮ Shape ̸ .. + fprintf(stream, "%s\n", pShape->Name()); // 텍스트에 Shape 파일 이름을 쓴다.. } fclose(stream); // OldData @@ -2154,13 +2154,13 @@ void CMapMng::SaveObjectPostData(LPCTSTR lpszFileName) { FILE * stream = fopen(lpszFileName, "w"); if (stream == NULL) { - m_pMainFrm->MessageBox(" ϴ."); + m_pMainFrm->MessageBox("파일을 만들수 없습니다."); return; } - // ̸ иϰ.. + // 폴더 이름을 분리하고.. char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; - _splitpath(lpszFileName, szDrive, szDir, szFName, szExt); // ̸ Ȯڸ .. + _splitpath(lpszFileName, szDrive, szDir, szFName, szExt); // 파일 이름과 확장자만 갖고.. int iSC = m_pSceneOutput->ShapeCount(); fprintf(stream, "Shape Post Count : %d\n", iSC); @@ -2169,8 +2169,8 @@ void CMapMng::SaveObjectPostData(LPCTSTR lpszFileName) { for (int i = 0; i < iSC; ++i) { CN3Shape * pShape = m_pSceneOutput->ShapeGet(i); - _splitpath(pShape->FileName().c_str(), NULL, NULL, szFName, szExt); // ̸ Ȯڸ .. - _makepath(szSFN, NULL, NULL, szFName, szExt); // ̸ ٽ . + _splitpath(pShape->FileName().c_str(), NULL, NULL, szFName, szExt); // 파일 이름과 확장자만 갖고.. + _makepath(szSFN, NULL, NULL, szFName, szExt); // 파일 이름을 다시 만든다. __Vector3 vPos = pShape->Pos(); __Vector3 vScale = pShape->Scale(); @@ -2199,13 +2199,13 @@ void CMapMng::SaveObjectPostDataPartition(LPCTSTR lpszFileName, float psx, float FILE * stream = fopen(lpszFileName, "w"); if (stream == NULL) { - m_pMainFrm->MessageBox(" ϴ."); + m_pMainFrm->MessageBox("파일을 만들수 없습니다."); return; } - // ̸ иϰ.. + // 폴더 이름을 분리하고.. char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; - _splitpath(lpszFileName, szDrive, szDir, szFName, szExt); // ̸ Ȯڸ .. + _splitpath(lpszFileName, szDrive, szDir, szFName, szExt); // 파일 이름과 확장자만 갖고.. float sx = (int)(psx / TERRAIN_CELL_SIZE) * TERRAIN_CELL_SIZE; float sz = (int)(psz / TERRAIN_CELL_SIZE) * TERRAIN_CELL_SIZE; @@ -2248,8 +2248,8 @@ void CMapMng::SaveObjectPostDataPartition(LPCTSTR lpszFileName, float psx, float int idx = (*it); CN3Shape * pShape = m_pSceneOutput->ShapeGet(idx); - _splitpath(pShape->FileName().c_str(), NULL, NULL, szFName, szExt); // ̸ Ȯڸ .. - _makepath(szSFN, NULL, NULL, szFName, szExt); // ̸ ٽ . + _splitpath(pShape->FileName().c_str(), NULL, NULL, szFName, szExt); // 파일 이름과 확장자만 갖고.. + _makepath(szSFN, NULL, NULL, szFName, szExt); // 파일 이름을 다시 만든다. __Vector3 vPos = pShape->Pos(); vPos.x -= sx; @@ -2279,29 +2279,29 @@ void CMapMng::LoadObjectPostData(LPCTSTR lpszFileName) { return; } - // Scene ִ Ʈ Release... + // Scene 에 있는 오브젝트들 Release... m_pSceneOutput->ShapeRelease(); m_pSceneOutput->ChrRelease(); FILE * stream = fopen(lpszFileName, "r"); if (stream == NULL) { - m_pMainFrm->MessageBox(" ؽƮ ã ϴ."); + m_pMainFrm->MessageBox("지정한 텍스트 파일을 찾을 수 없습니다."); return; } - // ̸ иϰ.. + // 폴더 이름을 분리하고.. char szDrive[_MAX_DRIVE], szDir[_MAX_DIR], szFName[_MAX_FNAME], szExt[_MAX_EXT]; _splitpath(lpszFileName, szDrive, szDir, szFName, szExt); char szFirstLine[256]; - fgets(szFirstLine, 256, stream); // ù° а.. - if (strstr(szFirstLine, "Shape Count : ")) // ڿ ̴.. + fgets(szFirstLine, 256, stream); // 첫째 줄을 읽고.. + if (strstr(szFirstLine, "Shape Count : ")) // 문자열이 있으면 예전 데이터이다.. { int iSC = 0, result = 0; sscanf(szFirstLine, "Shape Count : %d\n", &iSC); for (int i = 0; i < iSC; ++i) { char szDestName[_MAX_PATH]; - result = fscanf(stream, "%s\n", szDestName); // ̸ а.. + result = fscanf(stream, "%s\n", szDestName); // 파일 이름을 읽고.. if (result == EOF) { break; } @@ -2313,17 +2313,17 @@ void CMapMng::LoadObjectPostData(LPCTSTR lpszFileName) { if (false == pShape->LoadFromFile(szSFN)) { delete pShape; pShape = NULL; - continue; // Shape binary file б.. + continue; // Shape 정보 binary file로 읽기.. } - szDestName[lstrlen(szDestName) - 5] = NULL; // _0000 ڿ .. + szDestName[lstrlen(szDestName) - 5] = NULL; // _0000 문자열을 뺀다.. _makepath(szSFN, NULL, NULL, szDestName, ".n3shape"); pShape->m_szName = szDestName; - pShape->FileNameSet(std::string(szSFN)); // ٽ ̸ .. + pShape->FileNameSet(std::string(szSFN)); // 다시 파일 이름 설정.. m_pSceneOutput->ShapeAdd(pShape); } - } else // ̴.. + } else // 새로 만든 데이터이다.. { int iSC = 0; sscanf(szFirstLine, "Shape Post Count : %d\n", &iSC); @@ -2332,7 +2332,7 @@ void CMapMng::LoadObjectPostData(LPCTSTR lpszFileName) { char szLine[1024] = ""; for (int i = 0; i < iSC; ++i) { CN3Shape * pShape = new CN3Shape(); - m_pSceneOutput->ShapeAdd(pShape); // ߰.. + m_pSceneOutput->ShapeAdd(pShape); // 추가.. int iSPC = 0, iBelong = 0, iEventID = 0, iEventType = 0, iNPC_ID = 0, iNPC_Status = 0; __Vector3 vPos(0, 0, 0); @@ -2347,9 +2347,9 @@ void CMapMng::LoadObjectPostData(LPCTSTR lpszFileName) { szSFN, &iSPC, &(vPos.x), &(vPos.y), &(vPos.z), &(qtRot.x), &(qtRot.y), &(qtRot.z), &(qtRot.w), &(vScale.x), &(vScale.y), &(vScale.z), &(iBelong), &(iEventID), &(iEventType), &(iNPC_ID), &(iNPC_Status)); - // ؽƮ Shape ̸ .. + // 텍스트에 Shape 파일 이름을 쓴다.. wsprintf(szSFN2, "Object\\%s", szSFN); - pShape->LoadFromFile(szSFN2); // Ͽ а.. + pShape->LoadFromFile(szSFN2); // 파일에서 읽고.. for (int j = 0; j < iSPC; j++) { fgets(szLine, 1024, stream); @@ -2365,7 +2365,7 @@ void CMapMng::LoadObjectPostData(LPCTSTR lpszFileName) { pShape->PosSet(vPos); pShape->RotSet(qtRot); pShape->ScaleSet(vScale); - pShape->ReCalcMatrix(); // ٽ .. + pShape->ReCalcMatrix(); // 행렬 다시 계산.. pShape->m_iBelong = iBelong; pShape->m_iEventID = iEventID; @@ -2413,14 +2413,14 @@ void CMapMng::ImportPostDataFromScene(const char * szFileName) { float fFrmCur, fFrmStart, fFrmEnd; ReadFile(hFile, &nCameraActive, 4, &dwRWC, NULL); ReadFile(hFile, &fFrmCur, 4, &dwRWC, NULL); // Animation Frame; - ReadFile(hFile, &fFrmStart, 4, &dwRWC, NULL); // ü . - ReadFile(hFile, &fFrmEnd, 4, &dwRWC, NULL); // ü . + ReadFile(hFile, &fFrmStart, 4, &dwRWC, NULL); // 전체 프레임. + ReadFile(hFile, &fFrmEnd, 4, &dwRWC, NULL); // 전체 프레임. int nL = 0; char szName[512] = ""; int nCC = 0; - ReadFile(hFile, &nCC, 4, &dwRWC, NULL); // ī޶.. + ReadFile(hFile, &nCC, 4, &dwRWC, NULL); // 카메라.. for (int i = 0; i < nCC; i++) { ReadFile(hFile, &nL, 4, &dwRWC, NULL); if (nL <= 0) { @@ -2432,7 +2432,7 @@ void CMapMng::ImportPostDataFromScene(const char * szFileName) { } int nLC = 0; - ReadFile(hFile, &nLC, 4, &dwRWC, NULL); // ī޶.. + ReadFile(hFile, &nLC, 4, &dwRWC, NULL); // 카메라.. for (int i = 0; i < nLC; i++) { ReadFile(hFile, &nL, 4, &dwRWC, NULL); if (nL <= 0) { @@ -2459,7 +2459,7 @@ void CMapMng::ImportPostDataFromScene(const char * szFileName) { } int nChrC = 0; - ReadFile(hFile, &nChrC, 4, &dwRWC, NULL); // ij + ReadFile(hFile, &nChrC, 4, &dwRWC, NULL); // 캐릭터 for (int i = 0; i < nChrC; i++) { ReadFile(hFile, &nL, 4, &dwRWC, NULL); if (nL <= 0) { @@ -2470,7 +2470,7 @@ void CMapMng::ImportPostDataFromScene(const char * szFileName) { szName[nL] = NULL; } - m_pDlgOutputList->UpdateTree(m_pSceneOutput); // Ʈ Ʈ... + m_pDlgOutputList->UpdateTree(m_pSceneOutput); // 트리 업데이트... CloseHandle(hFile); } @@ -2489,7 +2489,7 @@ void CMapMng::DeleteUnusedFiles() { std::vector unusedFNs; std::string szFN; - // ϴ ʿ ִ´.. + // 일단 몽땅 다 맵에 넣는다.. mapBase mBases; int iSC = m_pSceneOutput->ShapeCount(); @@ -2522,7 +2522,7 @@ void CMapMng::DeleteUnusedFiles() { pPart = pShape->Part(j); if (NULL == pPart) { CString szErr; - szErr.Format("NULL Part : %s - %d° Part", pShape->FileName().c_str(), j); + szErr.Format("NULL Part : %s - %d번째 Part", pShape->FileName().c_str(), j); invalidFNs.push_back(szErr.operator LPCTSTR()); continue; } @@ -2534,7 +2534,7 @@ void CMapMng::DeleteUnusedFiles() { mBases.insert(valBase(szFN, pPMesh)); } else { CString szErr; - szErr.Format("NULL PMesh : %s - %d° Part", pShape->FileName().c_str(), j); + szErr.Format("NULL PMesh : %s - %d번째 Part", pShape->FileName().c_str(), j); invalidFNs.push_back(szErr.operator LPCTSTR()); } @@ -2547,7 +2547,7 @@ void CMapMng::DeleteUnusedFiles() { mBases.insert(valBase(szFN, pTex)); } else { CString szErr; - szErr.Format("NULL Texture : %s - %d° Part, %d° Texture", pShape->FileName().c_str(), j, k); + szErr.Format("NULL Texture : %s - %d번째 Part, %d번째 Texture", pShape->FileName().c_str(), j, k); invalidFNs.push_back(szErr.operator LPCTSTR()); continue; } @@ -2555,7 +2555,7 @@ void CMapMng::DeleteUnusedFiles() { } } - // ã.. + // 파일을 찾고.. std::string szPath = CN3Base::PathGet() + "object\\"; ::SetCurrentDirectory(szPath.c_str()); CFileFind ff; @@ -2577,7 +2577,7 @@ void CMapMng::DeleteUnusedFiles() { szFN = szFNTmp; it_Base it = mBases.find(szFN); if (it != mBases.end()) { - continue; // ã Ŵ.. + continue; // 찾았으면 쓴거다.. } unusedFNs.push_back(szFN); @@ -2596,7 +2596,7 @@ void CMapMng::DeleteUnusedFiles() { } } - // ȭ .. + // 파일 지우기 대화상자 띄우기.. CDlgUnusedFiles dlg; int iUFC = unusedFNs.size(); for (int i = 0; i < iUFC; i++) { @@ -2610,14 +2610,14 @@ void CMapMng::DeleteUnusedFiles() { dlg.DoModal(); - // Ʈ.. - m_pSelSourceObj = NULL; // ̷ ־ ȳ. + // 모두 업데이트.. + m_pSelSourceObj = NULL; // 이렇게 해주어야 뻑이 안난다. m_SelOutputObjArray.RemoveAll(); - this->LoadSourceObjects(); // Source Object ٽ а.. - this->UpdateAll(); // Ʈ... + this->LoadSourceObjects(); // Source Object 를 다시 읽고.. + this->UpdateAll(); // 몽땅 업데이트... } -void CMapMng::DeleteOverlappedObjects() // ġ ģ Ʈ ã´. +void CMapMng::DeleteOverlappedObjects() // 위치가 겹친 젝트를 찾는다. { std::vector OverlappedObjects; int iSC = m_pSceneOutput->ShapeCount(); @@ -2644,14 +2644,14 @@ void CMapMng::DeleteUnusedFiles() { iSC = OverlappedObjects.size(); for (int i = 0; i < iSC; i++) { - m_pSceneOutput->ShapeDelete(OverlappedObjects[i]); // ģ .. + m_pSceneOutput->ShapeDelete(OverlappedObjects[i]); // 겹친거 지우기.. } - // Ʈ... - m_pSelSourceObj = NULL; // ̷ ־ ȳ. + // 업데이트... + m_pSelSourceObj = NULL; // 이렇게 해주어야 뻑이 안난다. m_SelOutputObjArray.RemoveAll(); if (m_pDlgOutputList) { - m_pDlgOutputList->UpdateTree(m_pSceneOutput); // Ʈ... + m_pDlgOutputList->UpdateTree(m_pSceneOutput); // 몽땅 업데이트... } } @@ -2673,14 +2673,14 @@ void CMapMng::DeleteSelectedSourceObjects() { iSC = SameObjects.size(); for (int i = 0; i < iSC; i++) { - m_pSceneOutput->ShapeDelete(SameObjects[i]); // ģ .. + m_pSceneOutput->ShapeDelete(SameObjects[i]); // 겹친거 지우기.. } - // Ʈ... + // 업데이트... m_pSceneSource->ShapeDelete((CN3Shape *)m_pSelSourceObj); - m_pSelSourceObj = NULL; // ̷ ־ ȳ. + m_pSelSourceObj = NULL; // 이렇게 해주어야 뻑이 안난다. m_SelOutputObjArray.RemoveAll(); - this->UpdateAll(); // Ʈ... + this->UpdateAll(); // 몽땅 업데이트... } CN3Camera * CMapMng::CameraGet() { @@ -2734,11 +2734,11 @@ void CMapMng::SetEditState(ENUM_EDIT_STATE eEditStat) { } break; case eEDIT_COPY: { - // Ѱ + // 기존백업한거 지우고 m_SelOutputObjBack.RemoveAll(); vOldPos.Zero(); - // ͵ ϰ + // 선택한 것들을 백업하고 CN3Transform * pDestObj = NULL; int iSize = m_SelOutputObjArray.GetSize(); for (int j = 0; j < iSize; ++j) { @@ -2765,7 +2765,7 @@ void CMapMng::SetEditState(ENUM_EDIT_STATE eEditStat) { return; } - // οġ Է + // 찍을 새로운위치를 입력 ASSERT(m_pTerrain); CPoint point = ((CN3MEView *)m_pMainFrm->GetActiveView())->m_CurrMousePos; m_pTerrain->Pick(point.x, point.y, &vNewPos); @@ -2774,35 +2774,35 @@ void CMapMng::SetEditState(ENUM_EDIT_STATE eEditStat) { return; } - vNewPos -= vOldPos; // ̻簥 ͸ + vNewPos -= vOldPos; // 새로 이사갈 백터를 구함 - if (m_pDummy) // ο ǥ Է + if (m_pDummy) // 더미의 새로운 좌표 입력 { m_pDummy->PosSet(m_pDummy->Pos() + vNewPos); } - m_SelOutputObjArray.RemoveAll(); // õ + m_SelOutputObjArray.RemoveAll(); // 기존 선택된 정보를 지우고 for (int j = 0; j < iSize; ++j) { - pDestObj = m_SelOutputObjBack.GetAt(j); // ͸ ã´ + pDestObj = m_SelOutputObjBack.GetAt(j); // 백업된 데이터를 찾는다 if (pDestObj == NULL) { continue; } - pNewObj = AddObjectToOutputScene(pDestObj); // ּ θ ο ͸ + pNewObj = AddObjectToOutputScene(pDestObj); // 주소의 정보로만 새로운 데이터를 만든다 if (pNewObj == NULL) { continue; } - m_SelOutputObjArray.InsertAt(0, pNewObj); // ԷѴ + m_SelOutputObjArray.InsertAt(0, pNewObj); // 기존 정보에 새로 입력한다 - pNewObj->ScaleSet(pDestObj->Scale()); // ũ Է - pNewObj->RotSet(pDestObj->Rot()); // ȸ Է + pNewObj->ScaleSet(pDestObj->Scale()); // 크기 입력 + pNewObj->RotSet(pDestObj->Rot()); // 회전각 입력 vObjPos = pDestObj->Pos() + vNewPos; vObjPos.y = m_pTerrain->GetHeight(vObjPos.x, vObjPos.z); - pNewObj->PosSet(vObjPos); // ο ġ Է + pNewObj->PosSet(vObjPos); // 새로운 위치점 입력 } - OnSelChanged(); // Էµ οͷ + OnSelChanged(); // 데이터입력등 새로운데이터로 갱신 } } break; } diff --git a/src/tool/N3ME/MapMng.h b/src/tool/N3ME/MapMng.h index bcc23deb..5bf47105 100644 --- a/src/tool/N3ME/MapMng.h +++ b/src/tool/N3ME/MapMng.h @@ -81,16 +81,16 @@ class CMapMng : public CN3Base { CN3Scene * GetSceneOutput() { return m_pSceneOutput; } D3DSHADEMODE m_ShadeMode; D3DFILLMODE m_FillMode; - bool m_bViewWireFrame; // õ Ʈ ̾ Ѵ.. - bool m_bRenderAxisAndGrid; // ׸带 ׸ ȱ׸ .. + bool m_bViewWireFrame; // 선택된 오브젝트를 와이어 프레임으로 보게 한다.. + bool m_bRenderAxisAndGrid; // 축과 그리드를 그릴지 안그릴지 결정.. - int m_iZoneID; // ̵... + int m_iZoneID; // 존 아이디... bool m_bHideObj; - bool m_bLoadingComplete; // ̰ ̾߸ Ѵ.. + bool m_bLoadingComplete; // 이게 참이어야만 렌더링을 한다.. - CMainFrame * m_pMainFrm; // Main + CMainFrame * m_pMainFrm; // Main 윈도우 CSowSeedMng m_SowSeedMng; - CDlgShapeList * m_pDlgSourceList; // Object ̾˷α + CDlgShapeList * m_pDlgSourceList; // Object 목록을 보여줄 다이알로그 CN3Transform * GetSelSourceObj() { return m_pSelSourceObj; } protected: @@ -105,39 +105,39 @@ class CMapMng : public CN3Base { CSoundMgr * m_pSoundMgr; CWarpMgr * m_pWarpMgr; CRegenUser * m_pRegenUser; - CEventMgr * m_pEventMgr; // ̺Ʈ ... - CWallMgr * m_pWall; // ܰ ϴ .. - CNPCPathMgr * m_pNPCPath; // NPC Ŭ.. - CLyTerrain * m_pTerrain; // - CN3Scene * m_pSceneSource; // source object Ͽ ͵ Scene - CN3Scene * m_pSceneOutput; // ʿ ġ Object Scene - - //CDlgSceneGraph* m_pDlgSourceList; // Object ̾˷α - //CDlgSceneGraph* m_pDlgOutputList; // ʿ ġ Object ̾˷α - CDlgShapeList * m_pDlgOutputList; // ʿ ġ Object ̾˷α - CDlgBase * m_pDlgBase; // ü ȭ.. - CBrushDlg * m_pBrushDlg; // 귯 ɼִ ȭ - - CN3Transform * m_pSelSourceObj; // source object Ͽ - // CTypedPtrArray m_SelOutputObjArray; // ʿ ġ Object ͵ - CTypedPtrArray m_SelOutputObjArray; // ʿ ġ Object ͵ - - ENUM_EDIT_STATE m_eSelObjBackState; // ӽú(ctrl+c) ǥ - CTypedPtrArray m_SelOutputObjBack; // ʿ ġ Object ͵ - - int m_CursorMode; // 콺 - BOOL m_bRenderSelObj; // source object Ͽ õ ׸ ȱ׸ - - CTransDummy * m_pDummy; // ü ̵ ȸ Ȯ/ ϴ ϴ Ŭ - CPosDummy m_PosDummy; // ̵ - CRotDummy m_RotDummy; // ȸ - CScaleDummy m_ScaleDummy; // Ȯ/ - CRiverMng m_RiverMng; // - CPondMng m_PondMng; // - - RECT m_rcSelDrag; // 巡 - - struct __Sort // Object pickingҶ ϴ ü + CEventMgr * m_pEventMgr; //존 이벤트 관리... + CWallMgr * m_pWall; //존 외각 가지 못하는 벽관리.. + CNPCPathMgr * m_pNPCPath; // NPC 길 만드는 클래스.. + CLyTerrain * m_pTerrain; // 지형 + CN3Scene * m_pSceneSource; // source object 목록에 보여줄 것들을 담은 Scene + CN3Scene * m_pSceneOutput; // 맵에 배치한 Object를 포함한 Scene + + //CDlgSceneGraph* m_pDlgSourceList; // Object 목록을 보여줄 다이알로그 + //CDlgSceneGraph* m_pDlgOutputList; // 맵에 배치한 Object를 보여줄 다이알로그 + CDlgShapeList * m_pDlgOutputList; // 맵에 배치한 Object를 보여줄 다이알로그 + CDlgBase * m_pDlgBase; // 객체 등록정보 편집 대화상자.. + CBrushDlg * m_pBrushDlg; // 지형 편집 브러쉬 옵션지정해주는 대화상자 + + CN3Transform * m_pSelSourceObj; // source object 목록에서 선택한 것 + // CTypedPtrArray m_SelOutputObjArray; // 맵에 배치한 Object 중 선택한 것들 + CTypedPtrArray m_SelOutputObjArray; // 맵에 배치한 Object 중 선택한 것들 + + ENUM_EDIT_STATE m_eSelObjBackState; // 임시복사(ctrl+c)의 상태표시 + CTypedPtrArray m_SelOutputObjBack; // 맵에 배치한 Object 중 선택한 것들 가지고 있음 + + int m_CursorMode; // 마우스의 기능 모드 구분 + BOOL m_bRenderSelObj; // source object 목록에서 선택된 것을 그릴지 안그릴지 결정 + + CTransDummy * m_pDummy; // 물체를 이동 회전 확대/축소 하는 기능을 담당하는 클래스 + CPosDummy m_PosDummy; // 이동 + CRotDummy m_RotDummy; // 회전 + CScaleDummy m_ScaleDummy; // 확대/축소 + CRiverMng m_RiverMng; // 강물 정보관리 + CPondMng m_PondMng; // 연못 정보관리 + + RECT m_rcSelDrag; // 드래그 영역 + + struct __Sort // Object picking할때 정렬하는 구조체 { CN3TransformCollision * pObj; float fCamDist; @@ -157,57 +157,57 @@ class CMapMng : public CN3Base { if (m_pTerrain) { m_pTerrain->m_iZoneID = id; } - } // ̵ . + } //지형 존 아이디 셋팅. void ImportShape(const char * szFullPath); - void MakeTerrainMovableAttr(CN3ShapeMgr * pShapeMgr); // ִ Ÿϰ Ÿ ض.. - void ImportPostDataFromScene(const char * szFileName); // Scene Ʈ ġȰ ҷ´.. + void MakeTerrainMovableAttr(CN3ShapeMgr * pShapeMgr); //지형에서 갈수 있는 타일과 갈 수 없는 타일을 정리해라.. + void ImportPostDataFromScene(const char * szFileName); // Scene 에서 오브젝트 배치된걸 불러온다.. void UpDateFP(); void Tick(); void Render(); void Release(); void SavePartition(float x, float z, float width); - void SaveToFile(LPCTSTR lpszPathName); // Map - void LoadFromFile(LPCTSTR lpszPathName); // Map ҷ - BOOL MouseMsgFilter(LPMSG pMsg); // 콺 - void ImportTerrain(const char * szMeshFN); // VMesh Ͽ о - void ImportTerrainHeight(const char * szMeshFN); // VMesh Ͽ ̰ о.. - void MakeGameFiles(LPCTSTR lpszPathName, float fSize = 128.0f); // ͷ ȯϱ + void SaveToFile(LPCTSTR lpszPathName); // Map 파일 저장 + void LoadFromFile(LPCTSTR lpszPathName); // Map 파일 불러오기 + BOOL MouseMsgFilter(LPMSG pMsg); // 마우스의 기능 + void ImportTerrain(const char * szMeshFN); // VMesh 파일에서 지형 데이터 읽어오기 + void ImportTerrainHeight(const char * szMeshFN); // VMesh 파일에서 지형의 높이값만 읽어오기.. + void MakeGameFiles(LPCTSTR lpszPathName, float fSize = 128.0f); // 게임 데이터로 변환하기 void MakeServerDataFiles(LPCTSTR lpszPathName); - void SelectObject(CN3Base * pObj, BOOL IsSourceObj, BOOL bAdd = FALSE); // ü Ѵ. - void RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd); // Ư 쿡 Object ׷ش. - void SetCursorMode(int iMode); // 콺Ŀ ̿ ٲ۴. - int GetCursorMode() const { return m_CursorMode; } // 콺 Ŀ ̿ ´. - void Invalidate(); // View ȭ - void FocusSelObj(); // õ ü ͽ ű. - void FocusAll(); // ü ֵ Ѵ. - void FocusAt(__Vector3 v); // Ŀ Ű. - void DropSelObjToTerrain(); // ü δ.(Y ) - void DeleteSelObjectFromOutputScene(); // OutputScene ü . - void RenderDragRect(RECT * rc); // 巡 ׸. - void UpdateAll(); // source output dialog updateŲ. - - void LoadObjectPostData(LPCTSTR lpszFileName); // Shape ġ textϿ о´. - void SaveObjectPostData(LPCTSTR lpszFileName); // Shape ġ textϷ Ѵ. + void SelectObject(CN3Base * pObj, BOOL IsSourceObj, BOOL bAdd = FALSE); // 객체를 선택한다. + void RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd); // 특정 윈도우에 Object를 그려준다. + void SetCursorMode(int iMode); // 마우스커서의 이용방법을 바꾼다. + int GetCursorMode() const { return m_CursorMode; } // 마우스 커서의 이용방법을 얻는다. + void Invalidate(); // View 화면 갱신 + void FocusSelObj(); // 선택된 객체로 포터스를 옮긴다. + void FocusAll(); // 전체 맵을 볼수 있도록 한다. + void FocusAt(__Vector3 v); // 지정된 점으로 포커스 옮겨. + void DropSelObjToTerrain(); // 선택한 객체를 지형에 붙인다.(Y값만 조정) + void DeleteSelObjectFromOutputScene(); // OutputScene에서 선택한 객체를 지운다. + void RenderDragRect(RECT * rc); // 드래그 영역을 그린다. + void UpdateAll(); // source 와 output dialog를 update시킨다. + + void LoadObjectPostData(LPCTSTR lpszFileName); // Shape 배치정보를 text파일에서 읽어온다. + void SaveObjectPostData(LPCTSTR lpszFileName); // Shape 배치정보를 text파일로 저장한다. void SaveObjectPostDataPartition(LPCTSTR lpszFileName, float psx, float psz, float width); - void RenderGrid(float fGridSize, float fMaxDistance); // ʿ Grid ׷ش - void OnSelChanged(); // ü ٲ ٰ͵ - void SelectObjectByDragRect(RECT * pRect, BOOL bAdd); // 巡 ؼ ü ϱ - void LoadSourceObjects(); // Folder Source Object о´. + void RenderGrid(float fGridSize, float fMaxDistance); // 맵에 일정간격으로Grid를 그려준다 + void OnSelChanged(); // 선택한 객체가 바뀌었을때 해줄것들 + void SelectObjectByDragRect(RECT * pRect, BOOL bAdd); // 드래그 해서 객체 선택하기 + void LoadSourceObjects(); // Folder 에서 Source Object 를 읽어온다. CN3Transform * AddChr(CN3Scene * pDestScene, const std::string & szFN, - BOOL bGenerateChainNumber); // ƯScene ij ü ߰ + BOOL bGenerateChainNumber); // 특정Scene에 캐릭터 객체를 복사해 추가 CN3Transform * AddShape(CN3Scene * pDestScene, const std::string & szFN, - BOOL bGenerateChainNumber); // ƯScene Shape ü ߰ + BOOL bGenerateChainNumber); // 특정Scene에 Shape 객체를 복사해 추가 CN3Transform * AddObjectToOutputScene( - CN3Transform * pObj); // ҽϿ Object OutputScene ؼ ־ش. + CN3Transform * pObj); // 소스목록에서 선택한 Object를 넣으면 OutputScene으로 복사해서 넣어준다. CN3Camera * CameraGet(); - CN3Base * Pick(POINT point, int * pnPart); // ü picking Լ - static int SortByCameraDistance(const void * pArg1, const void * pArg2); // ī޶ Ÿ Լ qsort ̿ + CN3Base * Pick(POINT point, int * pnPart); // 객체 picking 함수 + static int SortByCameraDistance(const void * pArg1, const void * pArg2); // 카메라 거리에 따른 정렬함수 qsort에 이용 - // BOOL CameraMove(LPMSG pMsg); // ī޶ ̵ ޼ ó - BOOL GetObjectMinMax(CN3Transform * pObj, __Vector3 & vMin, __Vector3 & vMax); // ü ִּ ã + // BOOL CameraMove(LPMSG pMsg); // 카메라 이동에 관한 메세지 처리 + BOOL GetObjectMinMax(CN3Transform * pObj, __Vector3 & vMin, __Vector3 & vMax); // 객체의 최대최소점 찾기 CStatusBar * GetStatusBar(); - void SetEditState(ENUM_EDIT_STATE eEditStat); // οؼ Ʈ edit + void SetEditState(ENUM_EDIT_STATE eEditStat); // 드로우해서 선택한 오브젝트를 edit }; diff --git a/src/tool/N3ME/N3ME.rc b/src/tool/N3ME/N3ME.rc index 55941474bff3a49e21328b691be09f002199ce9d..67921366bc32be1547e697620ff5f6fe3d5a7a99 100644 GIT binary patch literal 135826 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 bmH{fuAYwR<@ukx`(KecGcY4B*z7zis!Ai-X diff --git a/src/tool/N3ME/N3ME.vcxproj.filters b/src/tool/N3ME/N3ME.vcxproj.filters index a94b52f7..cbe550d1 100644 --- a/src/tool/N3ME/N3ME.vcxproj.filters +++ b/src/tool/N3ME/N3ME.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/tool/N3ME/N3ME.vcxproj.user b/src/tool/N3ME/N3ME.vcxproj.user index 7912fcf6..1aa1e2ae 100644 --- a/src/tool/N3ME/N3ME.vcxproj.user +++ b/src/tool/N3ME/N3ME.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\game diff --git a/src/tool/N3ME/N3MEDoc.cpp b/src/tool/N3ME/N3MEDoc.cpp index 69fb3d0b..6aaf6e80 100644 --- a/src/tool/N3ME/N3MEDoc.cpp +++ b/src/tool/N3ME/N3MEDoc.cpp @@ -43,8 +43,8 @@ BOOL CN3MEDoc::OnNewDocument() { // TODO: add reinitialization code here // (SDI documents will reuse this document) - // ó Ҷ AfxGetMainWnd()Լ CMainFrame* Ѱ ʰ - // ActiveWindow() Ѱֱ Ʒ + // 맨 처음 실행할때 AfxGetMainWnd()함수가 CMainFrame* 을 넘겨주지 않고 + // ActiveWindow()를 넘겨주기 때문에 아래 방식을 사용 CWinThread * pThread = AfxGetThread(); if (pThread) { CMainFrame * pFrm = (CMainFrame *)pThread->m_pMainWnd; diff --git a/src/tool/N3ME/N3MEView.cpp b/src/tool/N3ME/N3MEView.cpp index 336023f8..8c84f6c1 100644 --- a/src/tool/N3ME/N3MEView.cpp +++ b/src/tool/N3ME/N3MEView.cpp @@ -92,12 +92,12 @@ void CN3MEView::Render() { pEng->s_lpD3DDev->BeginScene(); - // ׸... + // 그리기... if (m_pMapMng) { m_pMapMng->Render(); } - CN3Base::s_AlphaMgr.Render(); // Alpha Primitive Manager Rendering.. ϸ . + CN3Base::s_AlphaMgr.Render(); // Alpha Primitive Manager Rendering.. 안하면 언젠가 뻑난다. pEng->s_lpD3DDev->EndScene(); pEng->Present(m_hWnd); } diff --git a/src/tool/N3ME/NPCPath.h b/src/tool/N3ME/NPCPath.h index 8071242e..8163276c 100644 --- a/src/tool/N3ME/NPCPath.h +++ b/src/tool/N3ME/NPCPath.h @@ -11,27 +11,27 @@ class CLyTerrain; class CNPCPath : public CN3Base { public: - char m_strPathName[256]; // ̸.. - char m_strNPCName[80]; // NPC ̸. - int m_iNPCID; // NPC .. - int m_iNumNPC; // ?.. + char m_strPathName[256]; // 길이름.. + char m_strNPCName[80]; // NPC 이름. + int m_iNPCID; // NPC 종류.. + int m_iNumNPC; // 몇마리?.. - __Vector3 m_LTStartVertex; // ۿ 𼭸 .. + __Vector3 m_LTStartVertex; // 시작영역의 모서리 두점.. __Vector3 m_RBStartVertex; - //CRect m_rcStartRect; // NPC . - int m_iRegenTime; // NPC ׾ٰ ٽ Ƴµ ɸ ð. + //CRect m_rcStartRect; // NPC생기는 영역. + int m_iRegenTime; // NPC가 죽었다가 다시 살아나는데 걸리는 시간. int m_iActType; int m_iZoneID; - std::list<__Vector3> m_Path; //pathϴ ....~.. + std::list<__Vector3> m_Path; //path지정하는 점들....시작점~끝점.. CLyTerrain * m_pRefTerrain; DWORD m_dwColor; int m_iVersion; - __Vector3 m_LTActVertex; // ۿ 𼭸 .. + __Vector3 m_LTActVertex; // 시작영역의 모서리 두점.. __Vector3 m_RBActVertex; unsigned char m_cAttr_Create; @@ -45,8 +45,8 @@ class CNPCPath : public CN3Base { void Load(HANDLE hFile); void Save(HANDLE hFile); int GetSize() { return m_Path.size(); } - bool GetPath(int idx, __Vector3 * pPos); // idx° .. - void AddPos(__Vector3 Path); //pathϱ. + bool GetPath(int idx, __Vector3 * pPos); // idx째 점 가져오기.. + void AddPos(__Vector3 Path); //path더하기. void DelPrevPos(); CNPCPath(); virtual ~CNPCPath(); diff --git a/src/tool/N3ME/NPCPathMgr.cpp b/src/tool/N3ME/NPCPathMgr.cpp index 3afaa39f..ce4716e5 100644 --- a/src/tool/N3ME/NPCPathMgr.cpp +++ b/src/tool/N3ME/NPCPathMgr.cpp @@ -36,14 +36,14 @@ CNPCPathMgr::CNPCPathMgr() { m_pppRefEvent = NULL; m_bRenderMovableRegion = false; - m_BaseCube[0].Set(0, 1, 0); // LT - m_BaseCube[1].Set(1, 1, 0); // RT - m_BaseCube[2].Set(0, 0, 0); // LB - m_BaseCube[3].Set(1, 0, 0); // RB - m_BaseCube[4].Set(0, 1, 1); // LT - m_BaseCube[5].Set(1, 1, 1); // RT - m_BaseCube[6].Set(0, 0, 1); // LB - m_BaseCube[7].Set(1, 0, 1); // RB + m_BaseCube[0].Set(0, 1, 0); // 앞쪽 LT + m_BaseCube[1].Set(1, 1, 0); // 앞쪽 RT + m_BaseCube[2].Set(0, 0, 0); // 앞쪽 LB + m_BaseCube[3].Set(1, 0, 0); // 앞쪽 RB + m_BaseCube[4].Set(0, 1, 1); // 뒤쪽 LT + m_BaseCube[5].Set(1, 1, 1); // 뒤쪽 RT + m_BaseCube[6].Set(0, 0, 1); // 뒤쪽 LB + m_BaseCube[7].Set(1, 0, 1); // 뒤쪽 RB m_LTStartVertex.Set(0, 0, 0); m_RBStartVertex.Set(0, 0, 0); @@ -66,14 +66,14 @@ CNPCPathMgr::CNPCPathMgr(CMapMng * pMapMng) { m_pppRefEvent = NULL; m_bRenderMovableRegion = false; - m_BaseCube[0].Set(0, 1, 0); // LT - m_BaseCube[1].Set(1, 1, 0); // RT - m_BaseCube[2].Set(0, 0, 0); // LB - m_BaseCube[3].Set(1, 0, 0); // RB - m_BaseCube[4].Set(0, 1, 1); // LT - m_BaseCube[5].Set(1, 1, 1); // RT - m_BaseCube[6].Set(0, 0, 1); // LB - m_BaseCube[7].Set(1, 0, 1); // RB + m_BaseCube[0].Set(0, 1, 0); // 앞쪽 LT + m_BaseCube[1].Set(1, 1, 0); // 앞쪽 RT + m_BaseCube[2].Set(0, 0, 0); // 앞쪽 LB + m_BaseCube[3].Set(1, 0, 0); // 앞쪽 RB + m_BaseCube[4].Set(0, 1, 1); // 뒤쪽 LT + m_BaseCube[5].Set(1, 1, 1); // 뒤쪽 RT + m_BaseCube[6].Set(0, 0, 1); // 뒤쪽 LB + m_BaseCube[7].Set(1, 0, 1); // 뒤쪽 RB m_LTStartVertex.Set(0, 0, 0); m_RBStartVertex.Set(0, 0, 0); @@ -106,7 +106,7 @@ CNPCPathMgr::~CNPCPathMgr() { } // -// FileName θ ϳ ȵ ̸ Ȯ.. +// FileName은 경로명 하나도 안들어간 순수한 파일이름과 확장자.. // void CNPCPathMgr::LoadFromFile(const char * FileName) { if (m_pCurrPath) { @@ -144,7 +144,7 @@ void CNPCPathMgr::SaveToFile(const char * FileName) { GetCurrentDirectory(_MAX_PATH, szOldPath); SetCurrentDirectory(s_szPath.c_str()); - CreateDirectory("npcpath", NULL); // .. + CreateDirectory("npcpath", NULL); // 경로 만들고.. char szNPCPathFileName[_MAX_PATH]; wsprintf(szNPCPathFileName, "%snpcpath\\%s.npi", s_szPath.c_str(), FileName); @@ -166,7 +166,7 @@ void CNPCPathMgr::SaveToFile(const char * FileName) { } void CNPCPathMgr::MakeServerDataFile(const char * FullFileName) { - // text ... + // text 파일 버전... FILE * stream = fopen(FullFileName, "w"); if (!stream) { return; @@ -295,7 +295,7 @@ BOOL CNPCPathMgr::MouseMsgFilter(LPMSG pMsg) { break; } - if (m_pDlgMakePath->m_State == 0) // RECT ׸. + if (m_pDlgMakePath->m_State == 0) // 시작 RECT 그림. { m_pCurrPath->m_LTStartVertex = m_LTStartVertex; m_pCurrPath->m_RBStartVertex = m_RBStartVertex; @@ -303,7 +303,7 @@ BOOL CNPCPathMgr::MouseMsgFilter(LPMSG pMsg) { //MakeStartRectVB(m_LTStartVertex, m_RBStartVertex, 0xff00ffff); } - if (m_pDlgMakePath->m_State == 1) // + if (m_pDlgMakePath->m_State == 1) // 길 만듦 { __Vector3 PrevPos; if (false == m_pCurrPath->GetPath(m_pCurrPath->GetSize() - 1, &PrevPos)) // @@ -334,7 +334,7 @@ BOOL CNPCPathMgr::MouseMsgFilter(LPMSG pMsg) { } } - if (m_pDlgMakePath->m_State == 2) // RECT ׸. + if (m_pDlgMakePath->m_State == 2) // 시작 RECT 그림. { m_pCurrPath->m_LTActVertex = m_LTActVertex; m_pCurrPath->m_RBActVertex = m_RBActVertex; @@ -465,7 +465,7 @@ void CNPCPathMgr::Render() { D3DXMATRIX mtx; D3DXMatrixIdentity(&mtx); - hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // .. + hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // 월드 행렬 적용.. // set texture hr = s_lpD3DDev->SetTexture(0, NULL); @@ -483,14 +483,14 @@ void CNPCPathMgr::Render() { hr = s_lpD3DDev->SetFVF(FVF_XYZCOLOR); - // ĥϱ.. + //갈 수 없는 곳 빨간색으로 칠하기.. hr = s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); if (m_bRenderMovableRegion) { RenderMovableRegion(); } hr = s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - //̹ ׸... + //이미 만들어진 길 그리기... std::list::iterator itPath; std::list<__Vector3>::iterator itVertex; CNPCPath * pPath; @@ -529,7 +529,7 @@ void CNPCPathMgr::Render() { } } - //̾α â õ ׸.. + //다이얼로그 창에서 선택된 길 그리기.. CNPCPath * pSelPath = m_pDlgMakePath->m_pSelPath; if (pSelPath) { MakeRectVB(m_StartRectVB, pSelPath->m_LTStartVertex, pSelPath->m_RBStartVertex, 0xff00ff00); @@ -556,7 +556,7 @@ void CNPCPathMgr::Render() { } } - // ִ & ׸.. + //만들고 있는 길 & 영역 그리기.. MakeRectVB(m_StartRectVB, m_pCurrPath->m_LTStartVertex, m_pCurrPath->m_RBStartVertex, 0xffff0000); hr = s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 12, m_StartRectVB, sizeof(__VertexXyzColor)); @@ -688,7 +688,7 @@ void CNPCPathMgr::SetLTRB(__Vector3 * pLT, __Vector3 * pRB) { } void CNPCPathMgr::MakeRectVB(__VertexXyzColor * pVB, __Vector3 lt, __Vector3 rb, DWORD color) { - // ... + // 상판... pVB[0].Set(lt.x, lt.y, lt.z, color); pVB[1].Set(lt.x, lt.y, rb.z, color); @@ -701,7 +701,7 @@ void CNPCPathMgr::MakeRectVB(__VertexXyzColor * pVB, __Vector3 lt, __Vector3 rb, pVB[6] = pVB[5]; pVB[7] = pVB[0]; - // ٸ.. + // 다리.. pVB[8] = pVB[0]; pVB[9].Set(lt.x, rb.y, lt.z, color); @@ -714,7 +714,7 @@ void CNPCPathMgr::MakeRectVB(__VertexXyzColor * pVB, __Vector3 lt, __Vector3 rb, pVB[14] = pVB[5]; pVB[15].Set(rb.x, rb.y, lt.z, color); - // ٴ... + // 바닥... pVB[16] = pVB[9]; pVB[17] = pVB[11]; @@ -805,7 +805,7 @@ void CNPCPathMgr::RenderMovableRegion() { continue; } - if ((x + z) % 2 == 0) // Ÿ.. + if ((x + z) % 2 == 0) // 슬래쉬 모양의 타일.. { __Vector3 v; v.x = x * TERRAIN_CELL_SIZE; @@ -825,7 +825,7 @@ void CNPCPathMgr::RenderMovableRegion() { v.y = pRefTerrain->GetHeight(v.x, v.z) + 0.3f; TileVB[3].Set(v.x, v.y, v.z, color); } - if ((x + z) % 2 == 1) //齽 Ÿ.. + if ((x + z) % 2 == 1) //백슬레쉬 모양의 타일.. { __Vector3 v; v.x = x * TERRAIN_CELL_SIZE; diff --git a/src/tool/N3ME/NPCPathMgr.h b/src/tool/N3ME/NPCPathMgr.h index 8e2b5205..94b332ab 100644 --- a/src/tool/N3ME/NPCPathMgr.h +++ b/src/tool/N3ME/NPCPathMgr.h @@ -30,11 +30,11 @@ class CNPCPathMgr : public CN3Base { __Vector3 m_RBActVertex; public: - CMapMng * m_pRefMapMng; // .. - std::list m_pPaths; // npc path... + CMapMng * m_pRefMapMng; // 지형 참조 포인터.. + std::list m_pPaths; // npc path들... CDlgMakeNPCPath * m_pDlgMakePath; // path make dialog.. - bool m_bActive; // ̱ Ȱȭ Ǿ ִ...1:Ȱȭ, 0:Ȱȭ.. - CNPCPath * m_pCurrPath; // ִ ..or غ .. + bool m_bActive; // 이기능이 활성화 되어 있는지...1:활성화, 0:비활성화.. + CNPCPath * m_pCurrPath; // 현재 만들고 있는 길..or 만들려고 준비한 버퍼.. short ** m_pppRefEvent; bool m_bRenderMovableRegion; diff --git a/src/tool/N3ME/PondMesh.cpp b/src/tool/N3ME/PondMesh.cpp index fa6795a7..88462287 100644 --- a/src/tool/N3ME/PondMesh.cpp +++ b/src/tool/N3ME/PondMesh.cpp @@ -25,12 +25,12 @@ CPondMesh::~CPondMesh() { void CPondMesh::Release() { m_iPondID = -1; - m_fWaterHeight = 0.0f; // - m_iWaterScaleWidth = 4; // ι - m_iWaterScaleHeight = 6; // ι + m_fWaterHeight = 0.0f; // 물높이 + m_iWaterScaleWidth = 4; // 가로방향의 점의 갯수 + m_iWaterScaleHeight = 6; // 세로방향의 점의 갯수 m_iBackUpWidht = 0; m_iBackUpHeight = 0; - m_dwPondAlpha = 0x88ffffff; // + m_dwPondAlpha = 0x88ffffff; // 물의 알파 m_fTU = 50.0f; m_fTV = 50.0f; @@ -68,7 +68,7 @@ void CPondMesh::Render() { matWorld.Identity(); s_lpD3DDev->SetTransform(D3DTS_WORLD, &matWorld); - // ׸ + // 영역 상자 그리기 { s_lpD3DDev->SetTexture(0, NULL); s_lpD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); @@ -91,14 +91,14 @@ void CPondMesh::Render() { s_lpD3DDev->GetTextureStageState(0, D3DTSS_ALPHAOP, &dwAlphaOP); s_lpD3DDev->GetTextureStageState(0, D3DTSS_ALPHAARG1, &dwAlphaArg1); - if ((m_dwPondAlpha & 0xff000000) != 0xff000000) // alpha factor ϱ + if ((m_dwPondAlpha & 0xff000000) != 0xff000000) // alpha factor 설정하기 { - // render state + // render state 세팅 s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); s_lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); s_lpD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - s_lpD3DDev->SetRenderState(D3DRS_TEXTUREFACTOR, m_dwPondAlpha); // alpha factor - // texture state (alpha) + s_lpD3DDev->SetRenderState(D3DRS_TEXTUREFACTOR, m_dwPondAlpha); // alpha factor 설정 + // texture state 세팅(alpha) s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR); s_lpD3DDev->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); @@ -151,7 +151,7 @@ void CPondMesh::Render() { } } -void CPondMesh::RenderVertexPoint() // ߺ̰ ٽ ׸ +void CPondMesh::RenderVertexPoint() // 잘보이게 점만 다시 그리기 { if (m_iVC == 0 && m_iRectVC == 0) { return; @@ -175,7 +175,7 @@ void CPondMesh::Render() { s_lpD3DDev->SetFVF(FVF_TRANSFORMEDCOLOR); D3DXVECTOR4 v; - // ȭ + // 화면상에 빨간점 for (int i = 0; i <= m_iVC; ++i) { D3DXVec3Transform(&v, (D3DXVECTOR3 *)(&(m_pViewVts[i])), &matVP); @@ -187,7 +187,7 @@ void CPondMesh::Render() { int iScreenX = int(((v.x / v.w) + 1.0f) * (vp.Width) / 2.0f); int iScreenY = int((1.0f - (v.y / v.w)) * (vp.Height) / 2.0f); if (iScreenX >= (int)vp.X && iScreenX <= (int)vp.Width && iScreenY >= (int)vp.Y && iScreenY <= (int)vp.Height) { - // set X ( 1ȼۿ Ƿ Xǥø ׸. + // set X (점을 찍으면 1픽셀밖에 안찍으므로 X표시를 그린다. Vertices[0].Set(float(iScreenX - 2), float(iScreenY - 2), 0.5f, 0.5f, clr); Vertices[1].Set(float(iScreenX + 2), float(iScreenY + 2), 0.5f, 0.5f, clr); Vertices[2].Set(float(iScreenX + 2), float(iScreenY - 2), 0.5f, 0.5f, clr); @@ -197,7 +197,7 @@ void CPondMesh::Render() { } } - // Ÿ + // 영역을 나타내는 점 for (int i = 0; i < m_iRectVC; ++i) { D3DXVec3Transform(&v, (D3DXVECTOR3 *)(&(m_pRectVts[i])), &matVP); @@ -209,7 +209,7 @@ void CPondMesh::Render() { int iScreenX = int(((v.x / v.w) + 1.0f) * (vp.Width) / 2.0f); int iScreenY = int((1.0f - (v.y / v.w)) * (vp.Height) / 2.0f); if (iScreenX >= (int)vp.X && iScreenX <= (int)vp.Width && iScreenY >= (int)vp.Y && iScreenY <= (int)vp.Height) { - // set X ( 1ȼۿ Ƿ Xǥø ׸. + // set X (점을 찍으면 1픽셀밖에 안찍으므로 X표시를 그린다. Vertices[0].Set(float(iScreenX - 2), float(iScreenY - 2), 0.5f, 0.5f, clr); Vertices[1].Set(float(iScreenX + 2), float(iScreenY + 2), 0.5f, 0.5f, clr); Vertices[2].Set(float(iScreenX + 2), float(iScreenY - 2), 0.5f, 0.5f, clr); @@ -230,8 +230,8 @@ void CPondMesh::SetWaterHeight(float fHeight) { m_vDrawBox[i].y = fHeight; } - MakeDrawRect(m_vDrawBox); // ܰ ٽ - UpdateWaterHeight(); // ̷ ø + MakeDrawRect(m_vDrawBox); // 외곽선 다시 만듬 + UpdateWaterHeight(); // 각점들을 지정한 높이로 올림 } void CPondMesh::UpdateWaterHeight() { @@ -249,22 +249,22 @@ void CPondMesh::UpdateMovePos(__Vector3 vMovingPos) { } } -void CPondMesh::MakeDrawRect(__Vector3 * p4vPos) // ȭ鿡 ׵θ +void CPondMesh::MakeDrawRect(__Vector3 * p4vPos) // 화면에 보일 연못의 영역테두리 만든다 { if (p4vPos == NULL) { return; } memcpy(m_vDrawBox, p4vPos, sizeof(__Vector3) * 4); - m_fWaterHeight = p4vPos[0].y; // ̸ ޴´ - p4vPos = NULL; // ޸𸮿 ̻ ñ.. + m_fWaterHeight = p4vPos[0].y; // 물의 높이를 받는다 + p4vPos = NULL; // 메모리에서 이상한 결과과 나올까봐.. //---------------------------------------------------------------------------- DWORD color = 0xffffff00; - m_ViewRect[0].Set(m_vDrawBox[0], color); // - m_ViewRect[1].Set(m_vDrawBox[1], color); // - m_ViewRect[2].Set(m_vDrawBox[2], color); // Ʒ - m_ViewRect[3].Set(m_vDrawBox[3], color); // Ʒ + m_ViewRect[0].Set(m_vDrawBox[0], color); // 위점 + m_ViewRect[1].Set(m_vDrawBox[1], color); // 위점 + m_ViewRect[2].Set(m_vDrawBox[2], color); // 아래점 + m_ViewRect[3].Set(m_vDrawBox[3], color); // 아래점 m_ViewRect[4] = m_ViewRect[0]; //---------------------------------------------------------------------------- @@ -273,9 +273,9 @@ void CPondMesh::UpdateMovePos(__Vector3 vMovingPos) { void CPondMesh::UpdateDrawPos() { m_iRectVC = 0; - // ,Ʒ + // 위,아래점들 세팅 m_fWaterScaleX = SettingDrawPos(m_vDrawBox[0], m_vDrawBox[1], m_vDrawBox[3], m_vDrawBox[2], m_iWaterScaleWidth); - // ¿ + // 좌우점들 세팅 m_fWaterScaleZ = SettingDrawPos(m_vDrawBox[0], m_vDrawBox[3], m_vDrawBox[1], m_vDrawBox[2], m_iWaterScaleHeight); } @@ -289,11 +289,11 @@ float CPondMesh::SettingDrawPos(__Vector3 vPos1, __Vector3 vPos2, __Vector3 vPos LinePos = vPos2 - vPos1; fLength = LinePos.Magnitude(); - fLength /= (iLinePosNum + 1); // ̱ϰ, ġ + fLength /= (iLinePosNum + 1); // 길이구하고,끝에넣을 점빼고 위치할 점들 계산 LinePos.Normalize(); - LinePos *= fLength; // 1m ͸ ϰ, Ÿ Է + LinePos *= fLength; // 길이1m인 백터를 구하고,점간의 거리를 입력 - // Է½ + // 입력시작 for (int i = 1; i < iLinePosNum + 1; ++i) { vPos2 = vPos1 + LinePos * (float)i; m_pRectVts[m_iRectVC + i - 1].Set(vPos2, 0, 0, 0, 0); @@ -320,10 +320,10 @@ void CPondMesh::MakePondPos() { } ASSERT(MAX_PONDMESH_VERTEX > - m_iWaterScaleWidth * m_iWaterScaleHeight); // Ǽڰ max ϴ Ȯ + m_iWaterScaleWidth * m_iWaterScaleHeight); // 앞으로 만들어질 점의숫자가 max에 달하는지 확인 int ix, iz, itemp; - // ġ + // 방향의 점들의 위치를 받은뒤 float *fX, fY, *fZ; fX = new float[m_iWaterScaleWidth]; for (ix = 0; ix < m_iWaterScaleWidth; ++ix) { @@ -340,8 +340,8 @@ void CPondMesh::MakePondPos() { fY = m_fWaterHeight; __Vector3 vPos; - m_iVC = 0, m_iIC = 0; // ʱȭ - // ϴ Ѹ + m_iVC = 0, m_iIC = 0; // 초기화 + // 일단 점들을 쫙 뿌린다 for (iz = 0; iz < m_iWaterScaleHeight; ++iz) { for (ix = 0; ix < m_iWaterScaleWidth; ++ix) { vPos.Set(fX[ix], fY, fZ[iz]); @@ -378,9 +378,9 @@ void CPondMesh::MakeIndex() { m_pdwIndex = new WORD[m_iWaterScaleWidth * m_iWaterScaleHeight * 6]; } - int m = m_iWaterScaleWidth; // + int m = m_iWaterScaleWidth; // 다음줄 int x = 0, y = m; - WORD * indexPtr = m_pdwIndex; // ﰢ θ ġ + WORD * indexPtr = m_pdwIndex; // 삼각형을 부를 위치 설정 --m; for (int j = 0; j < m_iWaterScaleHeight; j++) { @@ -411,7 +411,7 @@ void CPondMesh::ReCalcUV() { __Vector3 * pVertices = m_pVertices; __VertexXyzT2 * ptmpVertices = m_pViewVts; - // ٿ (x,z ) + // 줄에 대한 변경(x,z에 대해) for (int i = 0; i < m_iWaterScaleHeight; ++i) { ptmpVertices->tu = ptmpVertices->x / fTu; ptmpVertices->tv = ptmpVertices->z / fTv; @@ -430,8 +430,8 @@ void CPondMesh::ReCalcUV() { } void CPondMesh::ReCalcVexUV() { - __Vector3 pBakVertices[MAX_PONDMESH_VERTEX]; // , ̴ - __VertexXyzT2 pBakViewVts[MAX_PONDMESH_VERTEX]; // ȭ鿡 ѷ + __Vector3 pBakVertices[MAX_PONDMESH_VERTEX]; // 저장,백업용으로 쓰이는 값 + __VertexXyzT2 pBakViewVts[MAX_PONDMESH_VERTEX]; // 화면에 뿌려지는 값 for (int i = 0; i < m_iVC; ++i) { pBakVertices[i].x = m_pVertices[i].x; @@ -478,7 +478,7 @@ void CPondMesh::InputSelectPos(float fX, float fY, float fZ, int iVC) { m_vSelectBox[0].x = fX, m_vSelectBox[0].y = fY, m_vSelectBox[0].z = fZ; m_vSelectBox[1].x = fX, m_vSelectBox[1].y = fY, m_vSelectBox[1].z = fZ; } else { - // ִ뿵 + // 선택한 점들의 최대영역을 잡고 if (m_vSelectBox[0].x > fX) { m_vSelectBox[0].x = fX; } @@ -493,13 +493,13 @@ void CPondMesh::InputSelectPos(float fX, float fY, float fZ, int iVC) { } } - // ̰ Ʋ ̸ + // 높이가 틀려지면 높이를 재 설정 if (m_vSelectBox[0].y != fY) { SetWaterHeight(fY); m_vSelectBox[0].y = fY; } - if (iVC > -1) // ü ƴ Ϻμý + if (iVC > -1) // 전체 선택이 아닌 일부선택시 { int iHeight = iVC / m_iWaterScaleWidth; int iWidth = iVC % m_iWaterScaleWidth; @@ -515,7 +515,7 @@ void CPondMesh::InputSelectPos(float fX, float fY, float fZ, int iVC) { } } - // ӽ÷ + // 선택한 점들을 임시로 가지고 있음 pSelpo = new __SELECT_PO; pSelpo->ix = iWidth; pSelpo->iz = iHeight; @@ -525,27 +525,27 @@ void CPondMesh::InputSelectPos(float fX, float fY, float fZ, int iVC) { } BOOL CPondMesh::InputDummyMovingPos(__Vector3 vDummyMovingPos, BOOL bMovePond) { - // + // 움직여야할 이유가 없다 if (vDummyMovingPos.x == 0.0f && vDummyMovingPos.y == 0.0f && vDummyMovingPos.z == 0.0f) { return FALSE; } BOOL bDrawBoxMove = FALSE; - // 鿵 + // 선택한 점들영역의 움직임 m_vSelectBox[0] += vDummyMovingPos; m_vSelectBox[1] += vDummyMovingPos; if (vDummyMovingPos.y != 0) { - SetWaterHeight(m_vSelectBox[0].y); // ̸ üũ + SetWaterHeight(m_vSelectBox[0].y); // 높이를 체크 } - // ó + // 연못 영역줄 처리 if (bMovePond) { for (int i = 0; i < 4; ++i) { m_vDrawBox[i] += vDummyMovingPos; } - MakeDrawRect(m_vDrawBox); // ڸ - UpdateMovePos(vDummyMovingPos); // + MakeDrawRect(m_vDrawBox); // 가장자리 점들 재 계산 + UpdateMovePos(vDummyMovingPos); // 백업용 계산 점들 재 계산 } else { if (m_vSelectBox[0].x < m_vDrawBox[2].x) { SetLeft(m_vSelectBox[0].x); @@ -564,7 +564,7 @@ BOOL CPondMesh::InputDummyMovingPos(__Vector3 vDummyMovingPos, BOOL bMovePond) { } if (vDummyMovingPos.x != 0 || vDummyMovingPos.z != 0) { - MovingPos(); // ӿ + MovingPos(); // 더미의 움직임에 따라 점들 움직임 } } @@ -588,7 +588,7 @@ void CPondMesh::SetBottom(float fBottom) { MakeDrawRect(m_vDrawBox); } -// ⺻ õ ̹ · ̶ Ҽִ m_pVerticesؼ +// 기본적으로 선택된 점들은 이미 움직인 상태로 원본이라 할수있는 m_pVertices참조해서 움직일 예상점을 계산 void CPondMesh::MovingPos() { int iSize = m_vSelect.size(); it_SelVtx it = m_vSelect.begin(); @@ -611,56 +611,56 @@ void CPondMesh::CalcuWidth(int iSx, int iSy, int iEx, int iEy) { int iHeightNum = iSy * m_iWaterScaleWidth; // ---------------------------------------------------------------------------------- - // ؾ ù Ѵ - __Vector3 vBakPick = *(m_pVertices + iHeightNum + iSx); // ǥ(Ͽ ο ǥ ) - __Vector3 vNowPick = *(m_pViewVts + iHeightNum + iSx); // (߿ ǰ) - __Vector3 * pLRVertices = m_pVertices + iHeightNum; // ù () - __VertexXyzT2 * pLRViewVer = m_pViewVts + iHeightNum; // ù () + // 계산해야할 첫점을 구한다 + __Vector3 vBakPick = *(m_pVertices + iHeightNum + iSx); // 백업된 전의 좌표(참조하여 새로운 좌표 계산) + __Vector3 vNowPick = *(m_pViewVts + iHeightNum + iSx); // 현재 지정된 점(나중에 여러개 지정되게) + __Vector3 * pLRVertices = m_pVertices + iHeightNum; // 계산할 첫 점(백업용) + __VertexXyzT2 * pLRViewVer = m_pViewVts + iHeightNum; // 계산할 첫 점(현재용) // ---------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------- - // ġ شϴ¾ + // 위치에 해당하는양쪽 끝의점을 가진다 __Vector3 *pvLeft, *pvRight, *pvTop, *pvBottom; - pvRight = pLRVertices; // ó ʺ̴ + pvRight = pLRVertices; // 처음시작이 오른쪽부터이다 pvLeft = pvRight + m_iWaterScaleWidth - 1; pvTop = m_pVertices + iSx; pvBottom = m_pVertices + m_iVC - m_iWaterScaleWidth + 1; // ---------------------------------------------------------------------------------- - // ο ǥ + // 새로운 좌표 계산 float fx1, fx2, fnx1, fnx2; float fny1, fny2; float ftemp; // ---------------------------------------------------------------------------------- - int iIntervalNum = iSx - 1; // ¿ ⿡ + int iIntervalNum = iSx - 1; // 좌우 각 한점씩 빼기에 if (iIntervalNum > 0) { - ++pLRVertices, ++pLRViewVer; // + ++pLRVertices, ++pLRViewVer; // 오른쪽 fny2 = vNowPick.z - vBakPick.z; for (int j = 0; j < iIntervalNum; ++j, ++pLRVertices, ++pLRViewVer, ++pvTop, ++pvBottom) { - // Ÿ ο ġ Ѵ - fx2 = pvRight->x - vBakPick.x; // ¿ + // 사이의 점마다 거리비율을 구해 새로운 위치를 구한다 + fx2 = pvRight->x - vBakPick.x; // 좌우의 비율구함 if (fx2 != 0) { fx1 = pvRight->x - pLRVertices->x; ftemp = fx1 / fx2; - // x-x : x-ϴx = x-οx : x + // 오른끝점x-백업점x : 오른끝점x-현재계산하는점x = 오른끝점x-새로운점x : 구할점x fnx2 = pvRight->x - vNowPick.x; fnx1 = fnx2 * ftemp; - pLRViewVer->x = pvRight->x - fnx1; // x ο Է + pLRViewVer->x = pvRight->x - fnx1; // x의 새로운점 입력 - // x-x : x-ϴx = οz-z : Һȭz + // 오른끝점x-백업점x : 오른끝점x-현재계산하는점x = 새로운점z-백업점z : 구할변화량z fny1 = fny2 * ftemp; - pLRViewVer->z += fny1; // z ȭ + pLRViewVer->z += fny1; // z의 변화량 더함 } } } // ---------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------- - iIntervalNum = m_iWaterScaleWidth - iSx - 2; // ¿ ⿡ + iIntervalNum = m_iWaterScaleWidth - iSx - 2; // 좌우 각 한점씩 빼기에 if (iIntervalNum > 0) { - ++pLRVertices, ++pLRViewVer; // + ++pLRVertices, ++pLRViewVer; // 왼쪽 fny2 = vNowPick.z - vBakPick.z; for (int j = 0; j < iIntervalNum; ++j, ++pLRVertices, ++pLRViewVer, ++pvTop, ++pvBottom) { fx2 = vBakPick.x - pvLeft->x; @@ -670,10 +670,10 @@ void CPondMesh::CalcuWidth(int iSx, int iSy, int iEx, int iEy) { fnx2 = vNowPick.x - pvLeft->x; fnx1 = fnx2 * ftemp; - pLRViewVer->x = pvLeft->x + fnx1; // x ο Է + pLRViewVer->x = pvLeft->x + fnx1; // x의 새로운점 입력 fny1 = fny2 * ftemp; - pLRViewVer->z += fny1; // z ȭ + pLRViewVer->z += fny1; // z의 변화량 더함 } } } @@ -689,18 +689,18 @@ void CPondMesh::SetAllPos(int iSx, int iSy, int iEx, int iEy) { return; } - // ؾ ù Ѵ + // 계산해야할 첫점을 구한다 __Vector3 * pTBVertices = m_pVertices + iSx; __VertexXyzT2 * pTBViewVer = m_pViewVts + iSx; - // ġ شϴ¾ + // 위치에 해당하는양쪽 끝의점을 가진다 __Vector3 vTop, vBottom, vCenter, vNowCenter; vTop = *pTBVertices; vBottom = *(m_pVertices + m_iVC - m_iWaterScaleWidth + iSx); - vCenter = *(m_pVertices + m_iWaterScaleWidth * iSy + iSx); // (߿ ǰ) - vNowCenter = *(m_pViewVts + m_iWaterScaleWidth * iSy + iSx); // ǥ(Ͽ ο ǥ ) + vCenter = *(m_pVertices + m_iWaterScaleWidth * iSy + iSx); // 현재 지정된 점(나중에 여러개 지정되게) + vNowCenter = *(m_pViewVts + m_iWaterScaleWidth * iSy + iSx); // 백업된 전의 좌표(참조하여 새로운 좌표 계산) - // ο ǥ + // 새로운 좌표 계산 float fy1, fy2, fny1, fny2; float fnx1, fnx2; float ftemp; @@ -714,14 +714,14 @@ void CPondMesh::SetAllPos(int iSx, int iSy, int iEx, int iEy) { fny2 = vTop.z - vNowCenter.z; for (int j = 0; j < iIntervalNum; ++j, pTBVertices += m_iWaterScaleWidth, pTBViewVer += m_iWaterScaleWidth) { - fy1 = pTBVertices->z - vTop.z; // ¿ + fy1 = pTBVertices->z - vTop.z; // 좌우의 비율구함 ftemp = fy1 / fy2; fnx1 = fnx2 * ftemp; - pTBViewVer->x += fnx1; // x ȭ + pTBViewVer->x += fnx1; // x의 변화량 더함 fny1 = fny2 * ftemp; - pTBViewVer->z = vTop.z - fny1; // z ο Է + pTBViewVer->z = vTop.z - fny1; // z의 새로운점 입력 } } } @@ -739,10 +739,10 @@ void CPondMesh::SetAllPos(int iSx, int iSy, int iEx, int iEy) { ftemp = fy1 / fy2; fnx1 = fnx2 * ftemp; - pTBViewVer->x += fnx1; // x ȭ + pTBViewVer->x += fnx1; // x의 변화량 더함 fny1 = fny2 * ftemp; - pTBViewVer->z = vBottom.z + fny1; // z ο Է + pTBViewVer->z = vBottom.z + fny1; // z의 새로운점 입력 } } } @@ -773,8 +773,8 @@ bool CPondMesh::Load1001(HANDLE hFile) { int iLen; char szTextueFName[_MAX_PATH]; - ReadFile(hFile, &m_iPondID, sizeof(m_iPondID), &dwNum, NULL); // ȣ - ReadFile(hFile, &m_dwPondAlpha, sizeof(m_dwPondAlpha), &dwNum, NULL); // + ReadFile(hFile, &m_iPondID, sizeof(m_iPondID), &dwNum, NULL); // 연못 번호 + ReadFile(hFile, &m_dwPondAlpha, sizeof(m_dwPondAlpha), &dwNum, NULL); // 연못 알파 ReadFile(hFile, &m_fWaterHeight, sizeof(m_fWaterHeight), &dwNum, NULL); ReadFile(hFile, &m_iWaterScaleWidth, sizeof(m_iWaterScaleWidth), &dwNum, NULL); ReadFile(hFile, &m_iWaterScaleHeight, sizeof(m_iWaterScaleHeight), &dwNum, NULL); @@ -784,12 +784,12 @@ bool CPondMesh::Load1001(HANDLE hFile) { ReadFile(hFile, &m_fWaterScaleZ, sizeof(m_fWaterScaleZ), &dwNum, NULL); ReadFile(hFile, &m_bUVState, sizeof(m_bUVState), &dwNum, NULL); - ReadFile(hFile, m_vDrawBox, sizeof(m_vDrawBox), &dwNum, NULL); // ٿ ִ + ReadFile(hFile, m_vDrawBox, sizeof(m_vDrawBox), &dwNum, NULL); // 한줄에 있는 점 갯수 - ReadFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // + ReadFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // 점 갯수 if (m_iVC > 0) { ReadFile(hFile, m_pViewVts, m_iVC * sizeof(__VertexXyzT2), &dwNum, NULL); // vertex buffer - ReInputBackPos(); // 뿡 ǥԷ + ReInputBackPos(); // 백업용에 새로좌표입력 } ReadFile(hFile, &m_iIC, sizeof(m_iIC), &dwNum, NULL); // IndexBuffer Count. @@ -800,8 +800,8 @@ bool CPondMesh::Load1001(HANDLE hFile) { m_pTexture = s_MngTex.Get(szTextueFName, TRUE); // load texture } - MakeIndex(); // ε ٽ - MakeDrawRect(m_vDrawBox); // + MakeIndex(); // 인덱스를 다시 계산 + MakeDrawRect(m_vDrawBox); // 영역라인 설정 m_iBackUpWidht = m_iWaterScaleWidth; m_iBackUpHeight = m_iWaterScaleHeight; @@ -816,15 +816,15 @@ bool CPondMesh::Load1000(HANDLE hFile) { char szTextueFName[_MAX_PATH]; float fScaleTemp; - ReadFile(hFile, &m_iPondID, sizeof(m_iPondID), &dwNum, NULL); // ȣ - ReadFile(hFile, &m_dwPondAlpha, sizeof(m_dwPondAlpha), &dwNum, NULL); // + ReadFile(hFile, &m_iPondID, sizeof(m_iPondID), &dwNum, NULL); // 연못 번호 + ReadFile(hFile, &m_dwPondAlpha, sizeof(m_dwPondAlpha), &dwNum, NULL); // 연못 알파 - ReadFile(hFile, &m_iWaterScaleWidth, sizeof(m_iWaterScaleWidth), &dwNum, NULL); // ٿ ִ + ReadFile(hFile, &m_iWaterScaleWidth, sizeof(m_iWaterScaleWidth), &dwNum, NULL); // 한줄에 있는 점 갯수 ReadFile(hFile, &fScaleTemp, sizeof(fScaleTemp), &dwNum, NULL); ReadFile(hFile, &fScaleTemp, sizeof(fScaleTemp), &dwNum, NULL); - ReadFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // + ReadFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // 점 갯수 if (m_iVC > 0) { ReadFile(hFile, m_pVertices, m_iVC * sizeof(__Vector3), &dwNum, NULL); // vertex buffer } @@ -870,7 +870,7 @@ bool CPondMesh::Load1000(HANDLE hFile) { m_vDrawBox[0].x += 1.0f, m_vDrawBox[3].x += 1.0f, m_vDrawBox[1].x -= 1.0f, m_vDrawBox[2].x -= 1.0f; m_vDrawBox[0].z -= 1.0f, m_vDrawBox[3].z -= 1.0f, m_vDrawBox[1].z += 1.0f, m_vDrawBox[2].z += 1.0f; - MakeDrawRect(m_vDrawBox); // ܰ ٽ + MakeDrawRect(m_vDrawBox); // 외곽선 다시 만듬 // --------------------------------------------------------------------------------------------------------- return 0; @@ -883,19 +883,19 @@ bool CPondMesh::Load(HANDLE hFile) { char szTextueFName[_MAX_PATH]; float fScaleTemp; - ReadFile(hFile, &m_iPondID, sizeof(m_iPondID), &dwNum, NULL); // ȣ + ReadFile(hFile, &m_iPondID, sizeof(m_iPondID), &dwNum, NULL); // 연못 번호 m_dwPondAlpha = 0xddffffff; - ReadFile(hFile, &m_iWaterScaleWidth, sizeof(int), &dwNum, NULL); // ٿ ִ + ReadFile(hFile, &m_iWaterScaleWidth, sizeof(int), &dwNum, NULL); // 한줄에 있는 점 갯수 ReadFile(hFile, &fScaleTemp, sizeof(fScaleTemp), &dwNum, NULL); ReadFile(hFile, &fScaleTemp, sizeof(fScaleTemp), &dwNum, NULL); - ReadFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // + ReadFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // 점 갯수 if (m_iVC > 0) { ReadFile(hFile, m_pViewVts, m_iVC * sizeof(__VertexXyzT2), &dwNum, NULL); // vertex buffer - ReInputBackPos(); // 뿡 ǥԷ + ReInputBackPos(); // 백업용에 새로좌표입력 } ReadFile(hFile, &m_iIC, sizeof(m_iIC), &dwNum, NULL); // IndexBufferCount. ReadFile(hFile, &iLen, sizeof(iLen), &dwNum, NULL); // texture name length @@ -936,7 +936,7 @@ bool CPondMesh::Load(HANDLE hFile) { m_vDrawBox[0].x += 1.0f, m_vDrawBox[3].x += 1.0f, m_vDrawBox[1].x -= 1.0f, m_vDrawBox[2].x -= 1.0f; m_vDrawBox[0].z -= 1.0f, m_vDrawBox[3].z -= 1.0f, m_vDrawBox[1].z += 1.0f, m_vDrawBox[2].z += 1.0f; - MakeDrawRect(m_vDrawBox); // ܰ ٽ + MakeDrawRect(m_vDrawBox); // 외곽선 다시 만듬 // --------------------------------------------------------------------------------------------------------- return 0; @@ -945,8 +945,8 @@ bool CPondMesh::Load(HANDLE hFile) { bool CPondMesh::Save(HANDLE hFile) { DWORD dwNum = 0; - WriteFile(hFile, &m_iPondID, sizeof(m_iPondID), &dwNum, NULL); // ȣ - WriteFile(hFile, &m_dwPondAlpha, sizeof(m_dwPondAlpha), &dwNum, NULL); // + WriteFile(hFile, &m_iPondID, sizeof(m_iPondID), &dwNum, NULL); // 연못 번호 + WriteFile(hFile, &m_dwPondAlpha, sizeof(m_dwPondAlpha), &dwNum, NULL); // 연못 알파 WriteFile(hFile, &m_fWaterHeight, sizeof(m_fWaterHeight), &dwNum, NULL); WriteFile(hFile, &m_iWaterScaleWidth, sizeof(m_iWaterScaleWidth), &dwNum, NULL); WriteFile(hFile, &m_iWaterScaleHeight, sizeof(m_iWaterScaleHeight), &dwNum, NULL); @@ -956,9 +956,9 @@ bool CPondMesh::Save(HANDLE hFile) { WriteFile(hFile, &m_fWaterScaleZ, sizeof(m_fWaterScaleZ), &dwNum, NULL); WriteFile(hFile, &m_bUVState, sizeof(m_bUVState), &dwNum, NULL); - WriteFile(hFile, m_vDrawBox, sizeof(m_vDrawBox), &dwNum, NULL); // ٿ ִ + WriteFile(hFile, m_vDrawBox, sizeof(m_vDrawBox), &dwNum, NULL); // 한줄에 있는 점 갯수 - WriteFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // + WriteFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // 점 갯수 if (m_iVC > 0) { WriteFile(hFile, m_pViewVts, m_iVC * sizeof(__VertexXyzT2), &dwNum, NULL); // vertex buffer } @@ -978,15 +978,15 @@ bool CPondMesh::Save(HANDLE hFile) { // ================================================================================== void CPondMesh::Rotation(__Matrix44 mRot, __Vector3 vCenter) { - // (ǵư) ִ. + // 백업(되돌아감)을 할 수있다. // if(m_bThisBackup==FALSE) m_bThisBackup = TRUE; - // ߰ ߽ ȸŲ + // 중간값을 중심으로 회전시킨다 int nCount; __VertexXyzT2 * pViewVts = m_pViewVts; __Vector3 vPos, vStPos; - // vStPos = pViewVts[(m_iVC+m_iLastVertexNum)/2].v; // ߰ ġ + // vStPos = pViewVts[(m_iVC+m_iLastVertexNum)/2].v; // 현재 연못의 중간 위치구함 vStPos = vCenter; for (nCount = 0; nCount < m_iVC; nCount++) { vPos = *pViewVts; @@ -1010,7 +1010,7 @@ void CPondMesh::SetVtx() int iNumVertex = m_iVC/m_iWaterScaleWidth; - // ó ٿ x⸸ + // 처음 한 줄에 대해 x방향만 변함 pVtx->Set(pViewVtx->x,pViewVtx->y,pViewVtx->z); for (int j=1;jx = (pVtx-m_iWaterScaleWidth)->x + (pViewVtx->x-(pViewVtx-m_iWaterScaleWidth)->x) / tempX; @@ -1040,7 +1040,7 @@ void CPondMesh::SetVtx() } - // (ȭ鿡 Ȯ ϱ ) + // 재 조정(화면에 정확히 나오게 하기 위해) ReCalcUV(); m_bThisFixPosion = TRUE; @@ -1085,9 +1085,9 @@ int CPondMesh::AddVertex(__Vector3* pvPos) { // ASSERT(MAX_PONDMESH_VERTEX>m_iVC+2 && (m_iVC%2) == 0); // ASSERT(m_iVC<2); - ASSERT(MAX_PONDMESH_VERTEX>m_iVC+m_iWaterScaleWidth*m_iWaterScaleHeight); // Ǽڰ max ϴ Ȯ + ASSERT(MAX_PONDMESH_VERTEX>m_iVC+m_iWaterScaleWidth*m_iWaterScaleHeight); // 앞으로 만들어질 점의숫자가 max에 달하는지 확인 - // ù ι° 4m + // 첫 시작점과 두번째점으로 4m씩 끊어 넣음 m_pVertices[m_iVC] = vPos1; m_pViewVts[m_iVC].Set(vPos1,0,0,0,0); @@ -1132,7 +1132,7 @@ int CPondMesh::AddVertex() return m_iVC; } - // ϱ(4m Ÿ δ) + // 기존 마지막 두점과 직각인 방향 구하기(4m의 거리로 찍인다) __Vector3 v1, v2, v3, vDir, vDiff, vScaleDiff; v1 = m_pVertices[m_iVC-2]; v2 = m_pVertices[m_iVC-1]; diff --git a/src/tool/N3ME/PondMesh.h b/src/tool/N3ME/PondMesh.h index 00f6468d..7215a9d1 100644 --- a/src/tool/N3ME/PondMesh.h +++ b/src/tool/N3ME/PondMesh.h @@ -1,7 +1,7 @@ // PondMesh.h: interface for the CPondMesh class. // -// ū 簢 ̵ (4m Ÿ) -// client +// 단지 가장큰 사각형의 영역과 땅의 지형이될 영역만 있음 (4m 씩의 점간의 거리) +// client에서 구현 ////////////////////////////////////////////////////////////////////// #pragma once @@ -18,7 +18,7 @@ class CLyTerrain; class CPondMesh : public CN3BaseFileAccess { public: - // Լ + // 기존함수 CN3Texture * TexGet() const { return m_pTexture; } int VertexCount() const { return m_iVC; } int RectVCount() const { return m_iRectVC; } @@ -28,46 +28,46 @@ class CPondMesh : public CN3BaseFileAccess { void Rotation(__Matrix44 mRot, __Vector3 vCenter); protected: - // õ + // 선택된 점제어 typedef struct __SELECT_PO { - int ix; // m_iWaterScaleWidth - int iz; // m_iWaterScaleHeight + int ix; // m_iWaterScaleWidth 상의 숫자 + int iz; // m_iWaterScaleHeight 상의 숫자 }; typedef typename std::list<__SELECT_PO *>::iterator it_SelVtx; - std::list<__SELECT_PO *> m_vSelect; // õ + std::list<__SELECT_PO *> m_vSelect; // 선택된 점들의 관리 - // ⺻ Ÿ + // 기본 데이타 int m_iPondID; - float m_fWaterHeight; // - int m_iWaterScaleWidth; // ι - int m_iWaterScaleHeight; // ι - DWORD m_dwPondAlpha; // + float m_fWaterHeight; // 물높이 + int m_iWaterScaleWidth; // 가로방향의 점의 갯수 + int m_iWaterScaleHeight; // 세로방향의 점의 갯수 + DWORD m_dwPondAlpha; // 물의 알파 float m_fTU; float m_fTV; - float m_fWaterScaleX, m_fWaterScaleZ; // Ÿ + float m_fWaterScaleX, m_fWaterScaleZ; // 정렬했을시 점간의 거리 int m_iBackUpWidht; int m_iBackUpHeight; - __Vector3 m_pVertices[MAX_PONDMESH_VERTEX]; // , ̴ - __VertexXyzT2 m_pViewVts[MAX_PONDMESH_VERTEX]; // ȭ鿡 ѷ + __Vector3 m_pVertices[MAX_PONDMESH_VERTEX]; // 저장,백업용으로 쓰이는 값 + __VertexXyzT2 m_pViewVts[MAX_PONDMESH_VERTEX]; // 화면에 뿌려지는 값 WORD * m_pdwIndex; //[MAX_PONDMESH_LINE*MAX_PONDMESH_LINE*6]; int m_iIC; // Index Buffer Count. int m_iVC; // Vertex Count. CN3Texture * m_pTexture; - BOOL m_bUVState; // TRUE Ͽ, FALSE ϰ (uv) + BOOL m_bUVState; // TRUE 점에 관여하여, FALSE 평편하게 (uv잡음) - // Ÿ - __Vector3 m_vDrawBox[4]; // ȭ ( ð) - __VertexXyzColor m_ViewRect[5]; // ȭ鿡 ׸ + // 연못영역에 관한 데이타 + __Vector3 m_vDrawBox[4]; // 화면상에 나올 영역(왼쪽위부터 시계방향으로) + __VertexXyzColor m_ViewRect[5]; // 화면에 그릴선 int m_iRectVC; - __VertexXyzT2 m_pRectVts[100]; // ٿ ׷ + __VertexXyzT2 m_pRectVts[100]; // 영역줄에 그려질 점들 - __Vector3 m_vSelectBox[2]; // ( ȭ鿵 ) + __Vector3 m_vSelectBox[2]; // 점들을 선택했을시 점들의 영역(점들이 화면영역을 벋어났을시) - // + // 지형정보 참고 CLyTerrain * m_pTerrain; public: @@ -80,7 +80,7 @@ class CPondMesh : public CN3BaseFileAccess { virtual bool Load1001(HANDLE hFile); virtual bool Save(HANDLE hFile); void Render(); - void RenderVertexPoint(); // ߺ̰ ٽ ׸ + void RenderVertexPoint(); // 잘보이게 점만 다시 그리기 __Vector3 GetCenter(); float SettingDrawPos(__Vector3 vPos1, __Vector3 vPos2, __Vector3 vPos3, __Vector3 vPos4, int iLinePosNum); @@ -100,33 +100,33 @@ class CPondMesh : public CN3BaseFileAccess { BOOL SetTextureName(LPCTSTR pszFName); public: - // ߰Ѱų ģ + // 새로 추가한거나 고친거 void SetTerrain(CLyTerrain * pCTerrain) { m_pTerrain = pCTerrain; } - void MakeDrawRect(__Vector3 * pvPos); // ȭ鿡 ׵θ - void UpdateDrawPos(); // ٿ ׷ + void MakeDrawRect(__Vector3 * pvPos); // 화면에 보일 연못의 영역테두리 만든다 + void UpdateDrawPos(); // 영역줄에 그려질 점들 - void UpdateWaterHeight(); // ̷ - void UpdateMovePos(__Vector3 vMovingPos); // ̵ + void UpdateWaterHeight(); // 현재의 물의 높이로 세팅 + void UpdateMovePos(__Vector3 vMovingPos); // 이동 - void MakePondPos(); // ڽ + void MakePondPos(); // 현재 박스에서 연못을 만든다 void MakeIndex(); - void ReCalcUV(); // ϰ Ѹ - void ReCalcVexUV(); // Ͽ Ѹ + void ReCalcUV(); // 점에 상관없이 평편하게 뿌린다 + void ReCalcVexUV(); // 점에 관여하여 뿌린다 - void EstimatePos(); // ũ⿡ Ƿ //// + void EstimatePos(); // 줄의 크기에 따라 점들의 갯수를 임의로 지정//// - void ClearSelectPos(); // ʱȭ - void InputSelectPos(float fX, float fY, float fZ, int iVC = -1); // 鿡 ڷԷ - BOOL InputDummyMovingPos(__Vector3 vDummyMovingPos, BOOL bMovePond); // ̰ óϱ + void ClearSelectPos(); // 선택점에 관한 데이터 초기화 + void InputSelectPos(float fX, float fY, float fZ, int iVC = -1); // 선택한 점들에 대한 자료입력 + BOOL InputDummyMovingPos(__Vector3 vDummyMovingPos, BOOL bMovePond); // 더미가 움직였을시 나머지점을 처리하기 위해 protected: void MovingPos(); - void CalcuWidth(int iSx, int iSy, int iEx = -1, int iEy = -1); // ó ¿ Ѵ - void SetAllPos(int iSx, int iSy, int iEx = -1, int iEy = -1); // ó ܿ ǥ - void ReInputBackPos(); // űǥ ־ + void CalcuWidth(int iSx, int iSy, int iEx = -1, int iEy = -1); // 처음 좌우로의 계산을 한다 + void SetAllPos(int iSx, int iSy, int iEx = -1, int iEy = -1); // 처음 계산한점들외에 점들 좌표 계산 + void ReInputBackPos(); // 새로 옮긴좌표를 백업에 넣어줌 - public: // ̾α ڿ ̴ Լ + public: // 다이얼로그 상자에서 쓰이는 함수 void SetPondID(int iPondID) { m_iPondID = iPondID; } void SetWaterHeight(float fHeight); void SetWaterScaleWidht(int iWidhtNum) { diff --git a/src/tool/N3ME/PondMng.cpp b/src/tool/N3ME/PondMng.cpp index 50f2908a..602b1fd1 100644 --- a/src/tool/N3ME/PondMng.cpp +++ b/src/tool/N3ME/PondMng.cpp @@ -149,7 +149,7 @@ bool CPondMng::Save(HANDLE hFile) { // version 1000 - alpha input int nFileVersion = 1001; - WriteFile(hFile, &nFileVersion, sizeof(nFileVersion), &dwNum, NULL); // ȣ + WriteFile(hFile, &nFileVersion, sizeof(nFileVersion), &dwNum, NULL); // 연못 번호 int iSize = m_PondMeshes.size(); WriteFile(hFile, &iSize, 4, &dwNum, NULL); @@ -185,7 +185,7 @@ void CPondMng::Render() { hr = s_lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); } - // ִ ׸ + // 기존에 있던 연못 그리기 it_PondMesh it = m_PondMeshes.begin(); int iSize = m_PondMeshes.size(); for (int i = 0; i < iSize; i++, it++) { @@ -194,7 +194,7 @@ void CPondMng::Render() { } if (m_bEditMode) { - // ̸ 巡 ׸ + // 연못 새로 만드는 중이면 드래그 선 그리기 if (m_PCursorMode == PCM_CREATE) { __Matrix44 matWorld; matWorld.Identity(); @@ -210,7 +210,7 @@ void CPondMng::Render() { s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINESTRIP, 4, m_CreateLine, sizeof(__VertexXyzColor)); } - // dummy ׸ + // dummy 상자 그리기 m_VtxPosDummy.Render(); BOOL bisFix = FALSE; @@ -221,12 +221,12 @@ void CPondMng::Render() { for (int i = 0; i < iSize; i++, it++) { pSelPond = *it; if (pSelPond) { - // õ ׸ () + // 선택된 연못의 점그리기 (삘깅) pSelPond->RenderVertexPoint(); } } - // õ ׸ (ʷ) + // 선택된 점 그리기 (초록) iSize = m_SelVtxArray.GetSize(); if (iSize > 0) { // transform @@ -262,7 +262,7 @@ void CPondMng::Render() { int iScreenY = int((1.0f - (v.y / v.w)) * (vp.Height) / 2.0f); if (iScreenX >= (int)vp.X && iScreenX <= (int)vp.Width && iScreenY >= (int)vp.Y && iScreenY <= (int)vp.Height) { - // set X ( 1ȼۿ Ƿ Xǥø ׸. + // set X (점을 찍으면 1픽셀밖에 안찍으므로 X표시를 그린다. Vertices[0].Set(float(iScreenX - 2), float(iScreenY - 2), 0.5f, 0.5f, clr); Vertices[1].Set(float(iScreenX + 2), float(iScreenY + 2), 0.5f, 0.5f, clr); Vertices[2].Set(float(iScreenX + 2), float(iScreenY - 2), 0.5f, 0.5f, clr); @@ -273,7 +273,7 @@ void CPondMng::Render() { } } - // 巡 ׸ + // 드래그 영역 그리기 if (PCM_SELECTING == m_PCursorMode) { m_pMainFrm->GetMapMng()->RenderDragRect(&m_rcSelDrag); } @@ -295,43 +295,43 @@ CPondMesh * CPondMng::CreateNewPondMesh() { CPondMesh * pRM = new CPondMesh; __Vector3 vPos[4]; - vPos[0].Set(m_CreateLine[0].x, m_CreateLine[0].y, m_CreateLine[0].z); // - vPos[1].Set(m_CreateLine[1].x, m_CreateLine[1].y, m_CreateLine[1].z); // - vPos[2].Set(m_CreateLine[2].x, m_CreateLine[2].y, m_CreateLine[2].z); // Ʒ - vPos[3].Set(m_CreateLine[3].x, m_CreateLine[3].y, m_CreateLine[3].z); // ʾƷ + vPos[0].Set(m_CreateLine[0].x, m_CreateLine[0].y, m_CreateLine[0].z); // 왼쪽위 + vPos[1].Set(m_CreateLine[1].x, m_CreateLine[1].y, m_CreateLine[1].z); // 오른쪽위 + vPos[2].Set(m_CreateLine[2].x, m_CreateLine[2].y, m_CreateLine[2].z); // 오른쪽 아래 + vPos[3].Set(m_CreateLine[3].x, m_CreateLine[3].y, m_CreateLine[3].z); // 왼쪽아래 CLyTerrain * pTerrain = m_pMainFrm->GetMapMng()->GetTerrain(); - pRM->SetTerrain(pTerrain); // Է - pRM->MakeDrawRect(vPos); // Է + pRM->SetTerrain(pTerrain); // 지형포인터 입력 + pRM->MakeDrawRect(vPos); // 영역입력 pRM->MakePondPos(); - SelPondRelease(); // ݱ Ѱ ϴ + SelPondRelease(); // 지금까정 선택한거 일단 지우기 int iID = 0; - m_pSelPonds.push_back(pRM); // ϴ ֱ(Ƶڰ˻) + m_pSelPonds.push_back(pRM); // 일단 넣기(아뒤검사위해) while (SetPondID(pRM, iID) == FALSE) { - iID++; // ο Ƶã + iID++; // 새로운 아뒤찾음 } CDlgPondProperty dlg(this); dlg.m_IsModalDialog = TRUE; - if (dlg.DoModal() == IDCANCEL) // 翬 + if (dlg.DoModal() == IDCANCEL) // 지금 만든연못지우기 { SelPondDelete(pRM); pRM = NULL; } - if (pRM) // + if (pRM) // 만들려는 연못 { m_PondMeshes.push_back(pRM); SelPondRelease(); - // ܰ  Ͽ Ÿ ġѴ//// + // 외곽점들을 바탕으로 가운데 점을 향하여 일정거리마다 점들을 배치한다//// } return pRM; } -void CPondMng::RemovePondMesh(int iPondID) // ų Ͽ ư +void CPondMng::RemovePondMesh(int iPondID) // 연못을 만들거나 선택하여 지우고자 버튼 눌렀을시 { it_PondMesh it = m_PondMeshes.begin(); int iSize = m_PondMeshes.size(); @@ -397,26 +397,26 @@ BOOL CPondMng::MouseMsgFilter(LPMSG pMsg) { switch (pMsg->message) { case WM_MOUSEMOVE: { POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; - if (bCtrlKeyState == 2) // ȸϴ + if (bCtrlKeyState == 2) // 연못을 회전하는 중 { SetRotatePonds(ptDownBuff.x - point.x); ptDownBuff = point; return TRUE; } - if (PCM_CREATE == m_PCursorMode) { // ο ߰Ҷ 巡 ϴ - __Vector3 vRayDir, vRayOrig; // ȭ ߾() 콺 ͸ - __Vector3 vPN, vPV; // Ե - __Vector3 vPos; // ( ) + if (PCM_CREATE == m_PCursorMode) { // 새로운 연못 추가할때 드래그 하는 선 설정 + __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 + __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 + __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) vPN.Set(0, 1, 0); vPV = vMouseStrPos; - m_VtxPosDummy.GetPickRay(point, vRayDir, vRayOrig); // Լ . + m_VtxPosDummy.GetPickRay(point, vRayDir, vRayOrig); // 이함수 잠시 빌려씀. __Vector3 vPR = vPV - vRayOrig; float fT = D3DXVec3Dot(&vPN, &vPR) / D3DXVec3Dot(&vPN, &vRayDir); - vPos = vRayOrig + vRayDir * fT; // 콺 + vPos = vRayOrig + vRayDir * fT; // 시작점과 마우스점을 구했음 - ReSetDrawRect(vMouseStrPos, vPos); // ʻ 簢· ȯ + ReSetDrawRect(vMouseStrPos, vPos); // 받은 두점을 맵상의 사각형태로 변환 return TRUE; } else if (PCM_SELECTING == m_PCursorMode) { m_rcSelDrag.right = point.x; @@ -433,7 +433,7 @@ BOOL CPondMng::MouseMsgFilter(LPMSG pMsg) { } ptDownBuff = point; - if (bCtrlKeyState > 0) // ȸϴ + if (bCtrlKeyState > 0) // 연못을 회전하는 중 { if (bCtrlKeyState < 2) { bCtrlKeyState++; @@ -442,7 +442,7 @@ BOOL CPondMng::MouseMsgFilter(LPMSG pMsg) { return TRUE; } - if (PCM_CREATE == m_PCursorMode) { // ο ߰ + if (PCM_CREATE == m_PCursorMode) { // 새로운 연못 추가 취소 m_PCursorMode = PCM_NONE; ReleaseCapture(); return TRUE; @@ -455,7 +455,7 @@ BOOL CPondMng::MouseMsgFilter(LPMSG pMsg) { } } break; case WM_LBUTTONUP: { - if (bCtrlKeyState > 0) // ȸϴ + if (bCtrlKeyState > 0) // 연못을 회전하는 중 { bCtrlKeyState--; return TRUE; @@ -479,36 +479,36 @@ BOOL CPondMng::MouseMsgFilter(LPMSG pMsg) { m_rcSelDrag.bottom = point.y; } - // 巹װ ƴϰ ׳ Ŭϰ 巡 3x3 ش. + // 드레그가 아니고 그냥 클릭일경우 드래그 영역을 3x3정도로 잡아준다. if (m_rcSelDrag.right - m_rcSelDrag.left < 3 && m_rcSelDrag.bottom - m_rcSelDrag.top < 3) { m_rcSelDrag.left = point.x - 1; m_rcSelDrag.right = point.x + 1; m_rcSelDrag.top = point.y - 1; m_rcSelDrag.bottom = point.y + 1; } - // shiftŰ л () ý + // shift키는 여러개의 분산된 점(들)을 선택시 if (SelectVtxByDragRect(&m_rcSelDrag, (pMsg->wParam & MK_SHIFT) ? TRUE : FALSE)) { - vMouseStrPos = m_VtxPosDummy.m_vPos; // ġ Է + vMouseStrPos = m_VtxPosDummy.m_vPos; // 더미의 위치 입력 } else { - m_PCursorMode = PCM_NONE; // õ Ƿ + m_PCursorMode = PCM_NONE; // 선택된 점이 없으므로 } return TRUE; } } break; case WM_RBUTTONDOWN: { - if (bCtrlKeyState) { // õ ȸ + if (bCtrlKeyState) { // 연못의 선택된 점에서 회전을 함 return TRUE; } if (m_bMovePond == TRUE) { m_bMovePond = FALSE; } - if (PCM_SELECT == m_PCursorMode) { // Select + if (PCM_SELECT == m_PCursorMode) { // Select 취소 m_PCursorMode = PCM_NONE; ReleaseCapture(); return TRUE; - } else if (PCM_NONE == m_PCursorMode) { // ο ߰ + } else if (PCM_NONE == m_PCursorMode) { // 새로운 연못 추가 POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; CLyTerrain * pTerrain = m_pMainFrm->GetMapMng()->GetTerrain(); @@ -516,11 +516,11 @@ BOOL CPondMng::MouseMsgFilter(LPMSG pMsg) { if (pTerrain && pTerrain->Pick(point.x, point.y, &vPos)) { m_PCursorMode = PCM_CREATE; - vMouseStrPos = vPos; // ó Է + vMouseStrPos = vPos; // 처음지점 입력 - DWORD color = 0xffffff00; // ׷ + DWORD color = 0xffffff00; // 그려질 선색 for (int i = 0; i < 5; ++i) { - m_CreateLine[i].Set(vPos, color); // ʱȭ + m_CreateLine[i].Set(vPos, color); // 초기화 } return TRUE; @@ -528,29 +528,29 @@ BOOL CPondMng::MouseMsgFilter(LPMSG pMsg) { } } break; case WM_RBUTTONUP: { - if (bCtrlKeyState) { // õ ȸ + if (bCtrlKeyState) { // 연못의 선택된 점에서 회전을 함 return TRUE; } POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; - if (PCM_CREATE == m_PCursorMode) { // ο ߰ + if (PCM_CREATE == m_PCursorMode) { // 새로운 연못 추가 m_PCursorMode = PCM_NONE; ReleaseCapture(); - __Vector3 vRayDir, vRayOrig; // ȭ ߾() 콺 ͸ - __Vector3 vPN, vPV; // Ե - __Vector3 vPos; // ( ) + __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 + __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 + __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) vPN.Set(0, 1, 0); vPV = vMouseStrPos; - m_VtxPosDummy.GetPickRay(point, vRayDir, vRayOrig); // Լ . + m_VtxPosDummy.GetPickRay(point, vRayDir, vRayOrig); // 이함수 잠시 빌려씀. __Vector3 vPR = vPV - vRayOrig; float fT = D3DXVec3Dot(&vPN, &vPR) / D3DXVec3Dot(&vPN, &vRayDir); vPos = vRayOrig + vRayDir * fT; ReSetDrawRect(vMouseStrPos, vPos); - CPondMesh * pRM = CreateNewPondMesh(); // ο + CPondMesh * pRM = CreateNewPondMesh(); // 새로운 연못 SetSelPond(pRM); return TRUE; } @@ -580,7 +580,7 @@ BOOL CPondMng::MouseMsgFilter(LPMSG pMsg) { default: { if (bCtrlKeyState > 0) { - if (!(GetAsyncKeyState(VK_CONTROL) & 0xff00)) // üũϿ ¸ 󺹱 + if (!(GetAsyncKeyState(VK_CONTROL) & 0xff00)) // 체크하여 떼어진 상태면 원상복귀 { if (bCtrlKeyState != 0) { bCtrlKeyState = 0; @@ -588,7 +588,7 @@ BOOL CPondMng::MouseMsgFilter(LPMSG pMsg) { return FALSE; } - if (GetAsyncKeyState('A') & 0xff00) { // õ () Ѵ + if (GetAsyncKeyState('A') & 0xff00) { // 현재 선택된 연못(들)의 모든점을 대상으로 한다 MovePond(); } return TRUE; @@ -604,7 +604,7 @@ BOOL CPondMng::MouseMsgFilter(LPMSG pMsg) { return FALSE; } -void CPondMng::ReSetDrawRect(__Vector3 vStrPos, __Vector3 vEndPos) // ʻ 簢 +void CPondMng::ReSetDrawRect(__Vector3 vStrPos, __Vector3 vEndPos) // 받은 두 점으로 맵상의 사각형태의 점 만듬 { if (vStrPos.x > vEndPos.x) { m_CreateLine[0].x = vStrPos.x; @@ -732,7 +732,7 @@ BOOL CPondMng::SelectVtxByDragRect(RECT * pRect, BOOL bAdd, BOOL bSelectPond) { } if (bAdd == FALSE) { m_SelVtxArray.RemoveAll(); - SetSelPond(NULL); // ѿ .. + SetSelPond(NULL); // 선택한연못 해제.. } } @@ -749,16 +749,16 @@ BOOL CPondMng::SelectVtxByDragRect(RECT * pRect, BOOL bAdd, BOOL bSelectPond) { CPondMesh * pSelPond = NULL; int iSize = m_pSelPonds.size(); it_PondMesh it = m_pSelPonds.begin(); - for (int i = 0; i < iSize; ++i, ++it) // ̹ õ ִٸ.. + for (int i = 0; i < iSize; ++i, ++it) // 이미 선택된 연못이 있다면.. { pSelPond = *it; if (pSelPond == NULL) { continue; } - int iVC = pSelPond->VertexCount(); // ׿ ڸ ϱ + int iVC = pSelPond->VertexCount(); // 그연못의 점 숫자를 구하기 for (int k = 0; k < iVC; ++k) { - __VertexXyzT2 * pVtx = pSelPond->GetVertex(k); // ϳ ϱ + __VertexXyzT2 * pVtx = pSelPond->GetVertex(k); // 점 하나 구하기 if (pVtx == NULL) { continue; } @@ -784,12 +784,12 @@ BOOL CPondMng::SelectVtxByDragRect(RECT * pRect, BOOL bAdd, BOOL bSelectPond) { } } if (bAleadySelected) { - m_SelVtxArray.RemoveAt(j); // ̹ Ƿ øϿ + m_SelVtxArray.RemoveAt(j); // 이미 있으므로 선택목록에서 제거 } else { - m_SelVtxArray.InsertAt(0, pVtx); // ߰ + m_SelVtxArray.InsertAt(0, pVtx); // 추가 } - pSelPond->InputSelectPos(pVtx->x, pVtx->y, pVtx->z, k); // ǥԷϿ + pSelPond->InputSelectPos(pVtx->x, pVtx->y, pVtx->z, k); // 좌표입력하여 가상의 영역잡음 } } else { BOOL bAleadySelected = FALSE; @@ -801,17 +801,17 @@ BOOL CPondMng::SelectVtxByDragRect(RECT * pRect, BOOL bAdd, BOOL bSelectPond) { } } if (bAleadySelected) { - m_SelVtxArray.RemoveAt(j); // ̹ Ƿ øϿ + m_SelVtxArray.RemoveAt(j); // 이미 있으므로 선택목록에서 제거 } else { - m_SelVtxArray.InsertAt(0, pVtx); // ߰ + m_SelVtxArray.InsertAt(0, pVtx); // 추가 } - pSelPond->InputSelectPos(pVtx->x, pVtx->y, pVtx->z); // ǥԷϿ + pSelPond->InputSelectPos(pVtx->x, pVtx->y, pVtx->z); // 좌표입력하여 가상의 영역잡음 } } } - if (iSize == 0) // õ ƹ͵ ٸ (翬 ˻ؼ 鸸 ..) + if (iSize == 0) // 선택된 연못이 아무것도 없다면 (모든연못 검색해서 연못 선택후 그 연못 점들만 선택..) { ASSERT(m_SelVtxArray.GetSize() == 0); @@ -824,11 +824,11 @@ BOOL CPondMng::SelectVtxByDragRect(RECT * pRect, BOOL bAdd, BOOL bSelectPond) { continue; } - int iVC = pRM->VertexCount(); // ̿ + int iVC = pRM->VertexCount(); // 이연못의 점 갯수 pSelPond = NULL; bChkSamePond = TRUE; for (int j = 0; j < iVC; ++j) { - __VertexXyzT2 * pVtx = pRM->GetVertex(j); // ϳ ϱ + __VertexXyzT2 * pVtx = pRM->GetVertex(j); // 점 하나 구하기 if (pVtx == NULL) { continue; } @@ -844,8 +844,8 @@ BOOL CPondMng::SelectVtxByDragRect(RECT * pRect, BOOL bAdd, BOOL bSelectPond) { float fScreenY = (1.0f - (v.y / v.w)) * (vp.Height) / 2.0f; if (fScreenX >= pRect->left && fScreenX <= pRect->right && fScreenY >= pRect->top && fScreenY <= pRect->bottom) { - m_SelVtxArray.Add(pVtx); // ߰ - pRM->InputSelectPos(pVtx->x, pVtx->y, pVtx->z, j); // ǥԷϿ + m_SelVtxArray.Add(pVtx); // 추가 + pRM->InputSelectPos(pVtx->x, pVtx->y, pVtx->z, j); // 좌표입력하여 가상의 영역잡음 if (bChkSamePond == TRUE) { pSelPond = pRM; SetSelPond(pSelPond, m_bChooseGroup); @@ -901,14 +901,14 @@ void CPondMng::MakeGameFiles(HANDLE hFile, float fSize) { int iVC = pRM->VertexCount(); __VertexXyzT2 *pVtx0 = pRM->GetVertex(0), *pSrcVtx = NULL; ASSERT(pVtx0); - WriteFile(hFile, &iVC, sizeof(iVC), &dwNum, NULL); // + WriteFile(hFile, &iVC, sizeof(iVC), &dwNum, NULL); // 점 갯수 if (iVC <= 0) { continue; } int iWidthVtxNum = pRM->GetWaterScaleWidht(); - WriteFile(hFile, &iWidthVtxNum, sizeof(int), &dwNum, NULL); // + WriteFile(hFile, &iWidthVtxNum, sizeof(int), &dwNum, NULL); // 점 갯수 CN3Texture * pPondTex = pRM->TexGet(); int iLen = 0; @@ -984,7 +984,7 @@ void CPondMng::ReCalcSelectedVertex() { m_pMainFrm->Invalidate(FALSE); } -void CPondMng::SetVtxCenter() // () ߰ ã , ϵ +void CPondMng::SetVtxCenter() // 연못(들)의 중간점을 찾아 세팅,예전 스케일도 백업 { int iSize = m_pSelPonds.size(); m_vPondsCenter.Zero(); @@ -1003,7 +1003,7 @@ void CPondMng::ReCalcSelectedVertex() { for (int i = 0; i < iSize; i++, it++) { CPondMesh * pRM = *it; if (pRM) { - pvCenter[i] = pRM->GetCenter(); // () ߰ , ϵ + pvCenter[i] = pRM->GetCenter(); // 연못(들)의 중간점을 받음, 현재의 스케일도 백업 nCenterCnt++; } } @@ -1136,7 +1136,7 @@ void CPondMng::InputDummyMovePos(__Vector3 vMovePos) { } } - if (m_pDlgProperty && (vMovePos.y != 0.0f || m_bMovePond == TRUE)) // ̳ + if (m_pDlgProperty && (vMovePos.y != 0.0f || m_bMovePond == TRUE)) // 높이나 움직여서 정보를 갱신 { m_pDlgProperty->UpdateInfo(); MainInvalidate(); @@ -1158,7 +1158,7 @@ void CPondMng::StationPond() { } void CPondMng::MovePond() { - SelectVtxByDragRect(NULL, FALSE, TRUE); // ϴ õ + SelectVtxByDragRect(NULL, FALSE, TRUE); // 일단 현재 선택된 모든 연못의 점들 전부 선택 m_bMovePond = TRUE; MainInvalidate(); } \ No newline at end of file diff --git a/src/tool/N3ME/PondMng.h b/src/tool/N3ME/PondMng.h index 218dc704..656a91b0 100644 --- a/src/tool/N3ME/PondMng.h +++ b/src/tool/N3ME/PondMng.h @@ -55,23 +55,23 @@ class CPondMng : public CN3BaseFileAccess { protected: std::list m_PondMeshes; // Pond Mesh list - std::list m_pSelPonds; // õ PondMesh - CTypedPtrArray m_SelVtxArray; // õ + std::list m_pSelPonds; // 선택된 PondMesh + CTypedPtrArray m_SelVtxArray; // 선택된 점들 std::list<__Vector3 *> m_SelVtxBakArray; - CVtxPosDummy m_VtxPosDummy; // ϼ ִ dummy object - BOOL m_bEditMode; // ΰ? - BOOL m_bChooseGroup; // ׷ ϴ° - BOOL m_bChooseEditPond; // Ұΰ - BOOL m_bMovePond; // ° ΰ - int m_PCursorMode; // ߰?ϴ ΰ ϴ ΰ? + CVtxPosDummy m_VtxPosDummy; // 점을 움직일수 있는 dummy object + BOOL m_bEditMode; // 연못물 편집모드인가? + BOOL m_bChooseGroup; // 연못물 그룹으로 편집하는가 + BOOL m_bChooseEditPond; // 현재 쓰는 연못내에서만 편집할것인가 + BOOL m_bMovePond; // 선택한 연못을 통째로 움직일 것인가 + int m_PCursorMode; // 연못을 추가?하는 것인가 점을 선택하는 것인가? CMainFrame * m_pMainFrm; // mainframe pointer CDlgPondProperty * m_pDlgProperty; // property dialog - RECT m_rcSelDrag; // 巡 - __VertexXyzColor m_CreateLine[5]; // ó Ҷ ̴ + RECT m_rcSelDrag; // 드래그 영역 + __VertexXyzColor m_CreateLine[5]; // 연못 처음 생성할때 보이는 선 - __Vector3 m_vPondsCenter; // () ߰ + __Vector3 m_vPondsCenter; // 연못(들)의 중간점 BOOL m_bShift; @@ -83,35 +83,35 @@ class CPondMng : public CN3BaseFileAccess { virtual bool Load(HANDLE hFile); virtual bool Save(HANDLE hFile); - BOOL MouseMsgFilter(LPMSG pMsg); // Mouse ޼ ó - void MakeGameFiles(HANDLE hFile, float fSize); // Game file + BOOL MouseMsgFilter(LPMSG pMsg); // Mouse 메세지 처리 + void MakeGameFiles(HANDLE hFile, float fSize); // Game file로 저장 - CPondMesh * CreateNewPondMesh(); // (簢) ο ߰Ѵ. + CPondMesh * CreateNewPondMesh(); // 시작점과 끝난점(사각형)으로 새로운 연못을 추가한다. - BOOL SetPondID(CPondMesh * pPondMesh, int iPondID); // ID - void SetEditMode(BOOL bEditMode); // EditMode - CPondMesh * GetPondMesh(int iPondID); // PondMesh + BOOL SetPondID(CPondMesh * pPondMesh, int iPondID); // 연못의 ID를 설정 + void SetEditMode(BOOL bEditMode); // 연못 EditMode설정 + CPondMesh * GetPondMesh(int iPondID); // PondMesh 얻기 - void MainInvalidate(); // ȭ ٽ + void MainInvalidate(); // 화면 강재로 다시 찍기 - // CDlgPondProperty Լ - void RemovePondMesh(int iPondID); // õ Ѵ. - void GoPond(int iPondID); // õ ϴ. - void StationPond(); // õ ٽ ġ - void MovePond(); // õ ° ű Ѵ + // CDlgPondProperty에서 쓰인 함수들 + void RemovePondMesh(int iPondID); // 선택된 연못을 삭제한다. + void GoPond(int iPondID); // 선택된 연못으로 갑니다. + void StationPond(); // 선택된 연못의 점들을 다시 배치 + void MovePond(); // 선택된 연못을 통째 옮기려 한다 BOOL GetChooseGroup() { return m_bChooseGroup; } BOOL GetChooseEditPond() { return m_bChooseEditPond; } void ChooseGroupPond() { m_bChooseGroup ^= 1; } void ChooseEditPond() { m_bChooseEditPond ^= 1; } - // ߿ - void ReCalcSelectedVertex(); // Ͽ ٽ - void ReCalcUV(); // õ UVǥ ٽ . + // 나중에 지울지도 + void ReCalcSelectedVertex(); // 지정된 스케일에 따라 다시 정렬 + void ReCalcUV(); // 선택된 연못의 UV좌표 다시 계산. protected: - void SetSelPond(CPondMesh * pPondMesh, BOOL bChooseGroup = FALSE); // PondMesh ϱ + void SetSelPond(CPondMesh * pPondMesh, BOOL bChooseGroup = FALSE); // PondMesh 선택하기 BOOL SelectVtxByDragRect(RECT * pRect, BOOL bAdd, BOOL bSelectPond = FALSE); - void ClearSelectRcAllPond(); // ӽÿ ʱȭ ϱ + void ClearSelectRcAllPond(); // 모든 연못의 선택한 점들의 임시영역 초기화 하기 void SelPondRelease(); void SelPondDelete(CPondMesh * pPondMesh); @@ -124,6 +124,6 @@ class CPondMng : public CN3BaseFileAccess { void SetVtxBackup(); void ReSetVtxBackup(); - void ReSetDrawRect(__Vector3 vStrPos, __Vector3 vEndPos); // ׸ - void InputDummyMovePos(__Vector3 vMovePos); // ̰ ŭ Է + void ReSetDrawRect(__Vector3 vStrPos, __Vector3 vEndPos); // 연못을 그리기위한 영역 재정리 + void InputDummyMovePos(__Vector3 vMovePos); // 더미가 움직인 만큼 선택한 연못에 입력 }; diff --git a/src/tool/N3ME/PosDummy.cpp b/src/tool/N3ME/PosDummy.cpp index 1739b8fa..a0a89cf9 100644 --- a/src/tool/N3ME/PosDummy.cpp +++ b/src/tool/N3ME/PosDummy.cpp @@ -40,9 +40,9 @@ BOOL CPosDummy::MouseMsgFilter(LPMSG pMsg) { POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; DWORD nFlags = pMsg->wParam; if (m_pSelectedCube && (nFlags & MK_LBUTTON)) { - __Vector3 vRayDir, vRayOrig; // ȭ ߾() 콺 ͸ - __Vector3 vPN, vPV; // Ե - __Vector3 vPos; // ( ) + __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 + __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 + __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) __Vector3 vCameraDir = s_CameraData.vAt - s_CameraData.vEye; vCameraDir.Normalize(); GetPickRay(point, vRayDir, vRayOrig); @@ -57,7 +57,7 @@ BOOL CPosDummy::MouseMsgFilter(LPMSG pMsg) { float fT = D3DXVec3Dot(&vPN, &vPR) / D3DXVec3Dot(&vPN, &vRayDir); vPos = vRayOrig + vRayDir * fT; - // ̸ Ѵ. + // 평면상의 점에서 지형의 높이를 구한다. if (m_pTerrainRef) { m_pTerrainRef->Pick(point.x, point.y, &vPos); } diff --git a/src/tool/N3ME/ProgressBar.cpp b/src/tool/N3ME/ProgressBar.cpp index 926019c4..53b47055 100644 --- a/src/tool/N3ME/ProgressBar.cpp +++ b/src/tool/N3ME/ProgressBar.cpp @@ -33,26 +33,26 @@ END_MESSAGE_MAP() BOOL CProgressBar::Create(LPCTSTR strMessage, int nSize, int MaxValue) { if (NULL == m_hWnd) { - // ¹ٸ + // 상태바를 얻음 CStatusBar * pStatusBar = GetStatusBar(); if (pStatusBar == NULL) { return FALSE; } - // ¹ α׷ Ʈѻ + // 상태바 위에 프로그레스 컨트롤생성 if (!CProgressCtrl::Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), pStatusBar, 1)) { return FALSE; } } - // α׷ Ʈ + // 프로그레스 컨트롤의 범위와 스텝 설정 SetRange(0, MaxValue); SetStep(1); m_strMessage = strMessage; m_nSize = nSize; - // ġ ũ + // 위치와 크기 조정 Resize(); return TRUE; } @@ -77,20 +77,20 @@ void CProgressBar::Resize() { return; } - // ؽƮ + // 텍스트 출력 if (::IsWindow(m_hWnd) && IsWindowVisible()) { pStatusBar->SetWindowText(m_strMessage); pStatusBar->UpdateWindow(); } - // ؽƮ ϴ + // 텍스트가 차지하는 영역 계산 CClientDC dc(pStatusBar); CFont * pOldFont = dc.SelectObject(pStatusBar->GetFont()); CSize size = dc.GetTextExtent(m_strMessage); int margin = dc.GetTextExtent(_T(" ")).cx * 2; dc.SelectObject(pOldFont); - // α׷ Ʈ ׷ + // 프로그레스 컨트롤이 그려질 영역 계산 CRect rc; pStatusBar->GetItemRect(0, rc); rc.left = size.cx + 2 * margin; @@ -99,12 +99,12 @@ void CProgressBar::Resize() { rc.right = rc.left; } - // ¹ Ϸ 10% + // 상태바 상하로 10%의 여백을 둠 int Height = rc.bottom - rc.top; rc.bottom -= Height / 10; rc.top += Height / 10; - // α׷ Ʈ ġ ũ⸦ + // 프로그레스 컨트롤의 위치와 크기를 재조정 if (::IsWindow(m_hWnd) && (rc != m_Rect)) { MoveWindow(&rc); } diff --git a/src/tool/N3ME/ProgressBar.h b/src/tool/N3ME/ProgressBar.h index e121741b..88fa0de8 100644 --- a/src/tool/N3ME/ProgressBar.h +++ b/src/tool/N3ME/ProgressBar.h @@ -21,12 +21,12 @@ class CProgressBar : public CProgressCtrl { // Operations public: BOOL Create(LPCTSTR strMessage, int nSize, int MaxValue); - // nSize : progress bar pixel ũ - // MaxValue : progress bar step ִ밪 + // nSize : progress bar의 가로 pixel 크기 + // MaxValue : progress bar의 step의 최대값 - CStatusBar * GetStatusBar(); // MainFrame StatusBar - void Resize(); // ġ ũ - void Clear(); // ʱȭ + CStatusBar * GetStatusBar(); // MainFrame에서 StatusBar 포인터 얻어오기 + void Resize(); // 위치와 크기 조정 + void Clear(); // 초기화 // Overrides // ClassWizard generated virtual function overrides diff --git a/src/tool/N3ME/QTNode.cpp b/src/tool/N3ME/QTNode.cpp index d501a82c..70b9c462 100644 --- a/src/tool/N3ME/QTNode.cpp +++ b/src/tool/N3ME/QTNode.cpp @@ -54,7 +54,7 @@ void CQTNode::Init(int level, CLyTerrain * pTerrain) { m_Level = level; m_State = QTNODESTATE_NOTRENDER; - // ڽij常.. + // 자식노드만들기.. if (level != m_pRefTerrain->m_iMaxLevel) { for (int i = 0; i < DIR_NUM; i++) { m_pChild[i] = new CQTNode; @@ -69,11 +69,11 @@ void CQTNode::Init(int level, CLyTerrain * pTerrain) { // // LinkFriend.. -// ģ ϱ.. -// - InitԼ ߾µ, -// ģ ó -// õϴ 찡 ֱⶫ -// ģ õؾѴ. +// 친구들 연결하기.. +// - 원래는 Init함수에 넣을려고 했었는데, +// 친구들이 미처 만들어지기 전에 연결을 +// 시도하는 경우가 있기땜에 모든 노드들을 +// 다 생성한 다음에 친구연결을 시도해야한다. // void CQTNode::LinkFriend() { if (m_Level == m_pRefTerrain->m_iMaxLevel) { @@ -172,7 +172,7 @@ void CQTNode::Release() { } // -// Center point ϱ.. +// Center point를 설정하기.. // void CQTNode::SetCenterPoint(int x, int z) { m_CenterX = x; @@ -208,7 +208,7 @@ void CQTNode::SetCenterPoint(int x, int z) { // SetMinMaxY.. // void CQTNode::SetMinMaxY() { - if (m_Level == m_pRefTerrain->m_iMaxLevel) // ϶.. + if (m_Level == m_pRefTerrain->m_iMaxLevel) //젤 마지막 노드일때.. { for (int x = -1; x < 2; x++) { for (int z = -1; z < 2; z++) { @@ -223,7 +223,7 @@ void CQTNode::SetMinMaxY() { return; } - // 尡 ƴҶ... + //젤 마지막 노드가 아닐때... for (int i = 0; i < DIR_NUM; i++) { if (!m_pChild[i]) { continue; @@ -268,31 +268,31 @@ void CQTNode::SetWholeClipped() { // // tick... -// Ʈ ü...^^ -// ϴ ÿȿ ˻(IntersectRect()..) ϰ.. -// ÿȿ ׸ ˻.. +// 쿼드트리의 실체...^^ +// 일단 가시영역안에 드는지 검사(IntersectRect()..)를 하고.. +// 가시영역안에 들면 그릴것인지 더 내려갈 것인지 검사.. // void CQTNode::Tick() { - m_State = QTNODESTATE_CLIPPED; // ʱȭ.. + m_State = QTNODESTATE_CLIPPED; //상태 초기화.. - //ÿȿ˻. + //가시영역안에드는지검사. RECT rt; - int Range = 1 << (m_pRefTerrain->m_iMaxLevel - m_Level); // ߽ ڸ Ÿ. + int Range = 1 << (m_pRefTerrain->m_iMaxLevel - m_Level); // 중심점부터 가장자리까지 거리. SetRect(&rt, m_CenterX - Range, m_CenterZ - Range, m_CenterX + Range, m_CenterZ + Range); RECT rt1; if (IntersectRect(&rt1, &rt, &(m_pRefTerrain->m_VisibleRect)) == 0) { - return; //ÿȿ .. + return; //가시영역안에 들지 않으면 나가.. } - //׸ ˻.. + //그릴것인지 더 내려 갈 것인지 검사.. if (IsRender(&(m_pRefTerrain->m_EyePos))) { - // ׸ .. + // 그만 내려가는 경우.. m_pRefTerrain->m_RenderNodes.push_back(this); return; } - // .. + //내려가는 경우.. for (int i = 0; i < DIR_NUM; i++) { if (!m_pChild[i]) { continue; @@ -303,10 +303,10 @@ void CQTNode::Tick() { // // IsRender.. -// ׸ΰ ׸, ƴϸ ˻... -// return true -> ׸ Render; -// return false -> ... -// ⿡ ° ٽ...^^ +// 내려가는 걸 그만두고 그릴것인지, 아니면 더 내려갈것인지 검사... +// return true -> 그만 내려가고 Render; +// return false -> 더 내려감... +// 여기에 들어가는게 지형 디테일 방법의 핵심...^^ // bool CQTNode::IsRender(POINT * pEye) { if (m_pRefTerrain->m_iMaxLevel == m_Level) { @@ -329,7 +329,7 @@ bool CQTNode::IsRender(POINT * pEye) { return false; } - // ̰ ̸̻ . + // 높이가 어느수준이상이면 나눈다. float height = m_MaxY - m_MinY; //if( height > (1<<(DiffLevel+1)) ) if (height > m_pRefTerrain->m_iHeightLimit) { @@ -337,7 +337,7 @@ bool CQTNode::IsRender(POINT * pEye) { return false; } - //Ÿ .. + //거리에 따라.. int Dist = Distance(pEye->x, pEye->y, m_CenterX, m_CenterZ); if (Dist < (m_pRefTerrain->m_iDistLimit + (1 << (DiffLevel + 1)))) { m_State = QTNODESTATE_NOTRENDER; @@ -354,7 +354,7 @@ bool CQTNode::IsRender(POINT * pEye) { } // -// Ÿ .. +// 간단한 거리계산 방법.. // inline int CQTNode::Distance(int sx, int sz, int tx, int tz) { int iX = tx - sx; @@ -381,7 +381,7 @@ void CQTNode::Render() { } // -// Ÿ ׸ Լ.. +// 가장 디테일한 타일을 그리는 함수.. // void CQTNode::RenderMaxLevel() { HRESULT hr; @@ -407,7 +407,7 @@ void CQTNode::RenderMaxLevel() { cx = m_CenterX - 1; cz = m_CenterZ - 1; - //lightmap ׸ غ.. + //lightmap을 그리기 위한 준비.. // CN3Texture * pRefLightMapTex[4]; int NumLightMapUse = 0; @@ -448,7 +448,7 @@ void CQTNode::RenderMaxLevel() { tmpTIdx = m_pRefTerrain->m_ppMapData[cx][cz].DTexInfo1.TexIdx.TexID; if ((m_pRefTerrain->m_ppMapData[cx][cz].DTexInfo1.Attr.Group <= 0) || - m_pRefTerrain->GetTileTex(tmpTIdx) == NULL) //Ÿ ... + m_pRefTerrain->GetTileTex(tmpTIdx) == NULL) //타일이 없을때... { int NumTileInColorTex = m_pRefTerrain->m_iColorMapTexSize / m_pRefTerrain->m_iColorMapPixelPerUnitDistance; u1 = (float)(cx % NumTileInColorTex); @@ -506,7 +506,7 @@ void CQTNode::RenderMaxLevel() { (u2 + 1.0f) / (float)NumTileInColorTex, v2 / (float)NumTileInColorTex, 0, 0); } - else //ϰ Ÿϸ .. + else //순수하게 타일만 찍는 경우.. { dir1 = m_pRefTerrain->m_ppMapData[cx][cz].DTexInfo1.Dir; dir2 = m_pRefTerrain->m_ppMapData[cx][cz].DTexInfo2.Dir; @@ -579,7 +579,7 @@ void CQTNode::RenderMaxLevel() { tmpTIdx = m_pRefTerrain->m_ppMapData[cx][cz].DTexInfo1.TexIdx.TexID; if ((m_pRefTerrain->m_ppMapData[cx][cz].DTexInfo1.Attr.Group <= 0) || - m_pRefTerrain->GetTileTex(tmpTIdx) == NULL) //Ÿ ... + m_pRefTerrain->GetTileTex(tmpTIdx) == NULL) //타일이 없을때... { int NumTileInColorTex = m_pRefTerrain->m_iColorMapTexSize / m_pRefTerrain->m_iColorMapPixelPerUnitDistance; u1 = (float)(cx % NumTileInColorTex); @@ -959,7 +959,7 @@ void CQTNode::RenderMaxLevel() */ // -// m_pRefTerrain->m_iMaxLevel ƴ Level Render.. +// m_pRefTerrain->m_iMaxLevel이 아닌 Level들 Render.. // void CQTNode::RenderNormalLevel() { int LeftLevel = 0; @@ -985,7 +985,7 @@ void CQTNode::RenderNormalLevel() { __VertexT1 * pVertices; m_pRefTerrain->m_ColorMapVB->Lock(0, 0, (VOID **)&pVertices, 0); - //.. + //점만들기.. int NumTileInColorTex = m_pRefTerrain->m_iColorMapTexSize / m_pRefTerrain->m_iColorMapPixelPerUnitDistance; //float cx = (float)((m_CenterX % NumTileInColorTex) * m_pRefTerrain->m_iColorMapPixelPerUnitDistance); //float cz = (float)(((NumTileInColorTex-m_CenterZ) % NumTileInColorTex) * m_pRefTerrain->m_iColorMapPixelPerUnitDistance); @@ -1004,9 +1004,9 @@ void CQTNode::RenderNormalLevel() { (cx - (float)half) / (float)NumTileInColorTex, (cz + (float)half) / (float)NumTileInColorTex); VC++; - //ʺ.. + //왼쪽변.. int interval = 1; - int sp; //.. + int sp; //시작점.. float UVInterval; if (m_Level < LeftLevel) { if (LeftLevel == m_pRefTerrain->m_iMaxLevel) { @@ -1035,7 +1035,7 @@ void CQTNode::RenderNormalLevel() { (float)(cx - half) / (float)NumTileInColorTex, (float)(cz - half) / (float)NumTileInColorTex); VC++; - //ʺ.. + //윗쪽변.. if (m_Level < TopLevel) { if (TopLevel == m_pRefTerrain->m_iMaxLevel) { interval = 1; @@ -1061,7 +1061,7 @@ void CQTNode::RenderNormalLevel() { (float)(cx + half) / (float)NumTileInColorTex, (float)(cz - half) / (float)NumTileInColorTex); VC++; - //ʺ.. + //오른쪽변.. if (m_Level < RightLevel) { if (RightLevel == m_pRefTerrain->m_iMaxLevel) { interval = 1; @@ -1089,7 +1089,7 @@ void CQTNode::RenderNormalLevel() { (float)(cx + half) / (float)NumTileInColorTex, (float)(cz + half) / (float)NumTileInColorTex); VC++; - //Ʒ.. + //아랫변.. if (m_Level < BottomLevel) { if (BottomLevel == m_pRefTerrain->m_iMaxLevel) { interval = 1; diff --git a/src/tool/N3ME/QTNode.h b/src/tool/N3ME/QTNode.h index ee0f0212..d3049ff2 100644 --- a/src/tool/N3ME/QTNode.h +++ b/src/tool/N3ME/QTNode.h @@ -9,7 +9,7 @@ enum eQTNODESTATE { QTNODESTATE_NOTRENDER, QTNODESTATE_RENDER, QTNODESTATE_UNKNOWN -}; // Ʈ ¼Ӽ.. +}; // 쿼드트리 노드들의 상태속성.. enum eDIR { DIR_LEFT = 0, DIR_TOP, @@ -22,10 +22,10 @@ class CLyTerrain; class CQTNode { protected: - int m_CenterX; //߽ ʵ迭 ǥ. - int m_CenterZ; //߽ ʵ迭 ǥ. + int m_CenterX; //중심점의 높이필드배열상의 좌표. + int m_CenterZ; //중심점의 높이필드배열상의 좌표. - int m_Level; //Ʈ󿡼 ̰.. + int m_Level; //쿼드트리상에서 깊이값.. eQTNODESTATE m_State; // CQTNode * m_pFriend[DIR_NUM]; @@ -34,8 +34,8 @@ class CQTNode { CLyTerrain * m_pRefTerrain; public: - float m_MinY; // - float m_MaxY; //ְ + float m_MinY; //최저점 + float m_MaxY; //최고점 int GetCenterX() { return m_CenterX; } int GetCenterZ() { return m_CenterZ; } diff --git a/src/tool/N3ME/ReadMe.txt b/src/tool/N3ME/ReadMe.txt index cc8293e6..34a0c89e 100644 --- a/src/tool/N3ME/ReadMe.txt +++ b/src/tool/N3ME/ReadMe.txt @@ -105,21 +105,21 @@ language of the operating system. ///////////////////////////////////////////////////////////////////////////// -* shape Ʈ ٲܶ - - ̹ ġس Ʈ 𵨸 (shape) ٲ ʿ䰡 - save mesh ִ shape ٲپֱ⸸ ϸ - ʻ ġ shape ͵ ٲ. - source shape ٲپ־ Ѵ.(ݵ..) - -* game data Ȯ - - *.gmd : game map data, ƹ - - *.gtd : game terrain data, Ÿ - - *.god : game object data, ġ object(object̸ ġ ȸ ϰ ) - - *.grm : game river main, ʻ ̴ - - *.grp : game river patch, ( 128m) ȿ ִ - -* map editor save Ȯ +* 맵툴에서 shape 오브젝트를 바꿀때 주의점 + - 이미 배치해놓은 오브젝트의 모델링 파일(shape)을 바꿀 필요가 있을때 + save한 폴더의 하위폴더인 mesh폴더에 있는 shape파일을 바꾸어주기만 하면 + 맵상에 배치된 같은 shape파일을 쓰는 것들은 모두 바뀐다. + 하지만 source폴더의 shape도 바꾸어주어야 한다.(반드시..) + +* game data 파일 확장자 설명 + - *.gmd : game map data, 아직 아무 내용없음 + - *.gtd : game terrain data, 지형 데이타파일 + - *.god : game object data, 지형에 배치된 object정보(object이름과 위치 회전 스케일값이 저장된 형식) + - *.grm : game river main, 맵상에 보이는 모든 강의 정보 + - *.grp : game river patch, 맵의 한 구역(현재 128m) 안에 있는 강의 점정보들 + +* map editor save 파일 확장자 설명 - *.n3m : n3 map eiditor file, - - *.rvr : river data, - - *.sdt : shape data text, object(shape) ġ ȸ text Ǿ ־ - - *.trn : terrain data, ִ. + - *.rvr : river data, 강 정보들 + - *.sdt : shape data text, object(shape)의 위치 회전 스케일 정보가 text형식으로 되어 있어서 직접 손으로 수정 가능 + - *.trn : terrain data, 지형정보가 들어있다. diff --git a/src/tool/N3ME/RegenUser.cpp b/src/tool/N3ME/RegenUser.cpp index 652beb33..02d89724 100644 --- a/src/tool/N3ME/RegenUser.cpp +++ b/src/tool/N3ME/RegenUser.cpp @@ -22,7 +22,7 @@ static char THIS_FILE[] = __FILE__; ////////////////////////////////////////////////////////////////////// CRegenUser::CRegenUser() { - m_pRefMapMng = NULL; // .. + m_pRefMapMng = NULL; // 지형 참조 포인터.. m_bActive = false; m_vrListRegion.clear(); @@ -55,7 +55,7 @@ void CRegenUser::Render() { D3DXMATRIX mtx; D3DXMatrixIdentity(&mtx); - hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // .. + hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // 월드 행렬 적용.. // set texture hr = s_lpD3DDev->SetTexture(0, NULL); @@ -75,7 +75,7 @@ void CRegenUser::Render() { __VertexXyzColor v[4]; - //̹ .. + //이미 만들어진 영역.. std::list::iterator it, ite; ite = m_vrListRegion.end(); for (it = m_vrListRegion.begin(); it != ite; it++) { @@ -92,7 +92,7 @@ void CRegenUser::Render() { hr = s_lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(__VertexXyzColor)); } - // ִ .. + //지금 만들고 있는 영역.. v[0] = m_vrCurrRegion.m_vLB; v[0].color = 0xffff0000; v[1] = m_vrCurrRegion.m_vLT; diff --git a/src/tool/N3ME/RegenUser.h b/src/tool/N3ME/RegenUser.h index 8d238a89..e2e78d44 100644 --- a/src/tool/N3ME/RegenUser.h +++ b/src/tool/N3ME/RegenUser.h @@ -21,7 +21,7 @@ class CRegenUser : public CN3Base { public: CDlgRegenUser * m_pDlg; - CMapMng * m_pRefMapMng; // .. + CMapMng * m_pRefMapMng; // 지형 참조 포인터.. bool m_bActive; std::list m_vrListRegion; diff --git a/src/tool/N3ME/RiverMesh.cpp b/src/tool/N3ME/RiverMesh.cpp index 1c55c00d..acfa3d31 100644 --- a/src/tool/N3ME/RiverMesh.cpp +++ b/src/tool/N3ME/RiverMesh.cpp @@ -78,16 +78,16 @@ bool CRiverMesh::Load(HANDLE hFile) { int iLen; char szTextueFName[_MAX_PATH]; - ReadFile(hFile, &m_iRiverID, sizeof(m_iRiverID), &dwNum, NULL); // ȣ - ReadFile(hFile, &m_fSpeed1, sizeof(m_fSpeed1), &dwNum, NULL); // - ReadFile(hFile, &m_fSpeed2, sizeof(m_fSpeed2), &dwNum, NULL); // 2 - ReadFile(hFile, &m_fMeterPerV, sizeof(m_fMeterPerV), &dwNum, NULL); // Uǥ 1.0 شϴ - ReadFile(hFile, &m_fMeterPerU, sizeof(m_fMeterPerU), &dwNum, NULL); // Vǥ 1.0 شϴ - ReadFile(hFile, &m_fMeterPerV2, sizeof(m_fMeterPerV2), &dwNum, NULL); // U2ǥ 1.0 شϴ - ReadFile(hFile, &m_fMeterPerU2, sizeof(m_fMeterPerU2), &dwNum, NULL); // V2ǥ 1.0 شϴ - ReadFile(hFile, &m_dwAlphaFactor, sizeof(m_dwAlphaFactor), &dwNum, NULL); // ϰ ϱ İ - - ReadFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // + ReadFile(hFile, &m_iRiverID, sizeof(m_iRiverID), &dwNum, NULL); // 강 번호 + ReadFile(hFile, &m_fSpeed1, sizeof(m_fSpeed1), &dwNum, NULL); // 유속 + ReadFile(hFile, &m_fSpeed2, sizeof(m_fSpeed2), &dwNum, NULL); // 유속2 + ReadFile(hFile, &m_fMeterPerV, sizeof(m_fMeterPerV), &dwNum, NULL); // U좌표 1.0에 해당하는 강의 길이 + ReadFile(hFile, &m_fMeterPerU, sizeof(m_fMeterPerU), &dwNum, NULL); // V좌표 1.0에 해당하는 강의 길이 + ReadFile(hFile, &m_fMeterPerV2, sizeof(m_fMeterPerV2), &dwNum, NULL); // U2좌표 1.0에 해당하는 강의 길이 + ReadFile(hFile, &m_fMeterPerU2, sizeof(m_fMeterPerU2), &dwNum, NULL); // V2좌표 1.0에 해당하는 강의 길이 + ReadFile(hFile, &m_dwAlphaFactor, sizeof(m_dwAlphaFactor), &dwNum, NULL); // 강을 투명하게 하기 위한 알파값 + + ReadFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // 점 갯수 if (m_iVC > 0) { ReadFile(hFile, m_pVertices, m_iVC * sizeof(__VertexXyzT2), &dwNum, NULL); // vertex buffer } @@ -103,7 +103,7 @@ bool CRiverMesh::Load(HANDLE hFile) { ReadFile(hFile, &m_fAnimTexFPS, sizeof(m_fAnimTexFPS), &dwNum, NULL); // Anim Tex frame/sec ReadFile(hFile, &m_iAnimTextureCount, sizeof(m_iAnimTextureCount), &dwNum, NULL); // AnimTexture Count - __ASSERT(m_pAnimTextures == NULL, " ؽ Ͱ NULL̾߾ մϴ."); + __ASSERT(m_pAnimTextures == NULL, "강물 텍스쳐 포인터가 NULL이야야 합니다."); if (m_iAnimTextureCount > 0) { m_pAnimTextures = new CN3Texture *[m_iAnimTextureCount]; @@ -113,7 +113,7 @@ bool CRiverMesh::Load(HANDLE hFile) { ReadFile(hFile, &iLen, sizeof(iLen), &dwNum, NULL); // texture name length if (iLen <= 0) { m_pAnimTextures[i] = NULL; - __ASSERT(0, "ؽİ "); + __ASSERT(0, "텍스쳐가 없다"); continue; } ReadFile(hFile, szTextueFName, iLen, &dwNum, NULL); // texture name @@ -126,16 +126,16 @@ bool CRiverMesh::Load(HANDLE hFile) { bool CRiverMesh::Save(HANDLE hFile) { DWORD dwNum; - WriteFile(hFile, &m_iRiverID, sizeof(m_iRiverID), &dwNum, NULL); // ȣ - WriteFile(hFile, &m_fSpeed1, sizeof(m_fSpeed1), &dwNum, NULL); // 1 - WriteFile(hFile, &m_fSpeed2, sizeof(m_fSpeed2), &dwNum, NULL); // 2 - WriteFile(hFile, &m_fMeterPerV, sizeof(m_fMeterPerV), &dwNum, NULL); // Uǥ 1.0 شϴ - WriteFile(hFile, &m_fMeterPerU, sizeof(m_fMeterPerU), &dwNum, NULL); // Vǥ 1.0 شϴ - WriteFile(hFile, &m_fMeterPerV2, sizeof(m_fMeterPerV2), &dwNum, NULL); // U2ǥ 1.0 شϴ - WriteFile(hFile, &m_fMeterPerU2, sizeof(m_fMeterPerU2), &dwNum, NULL); // V2ǥ 1.0 شϴ - WriteFile(hFile, &m_dwAlphaFactor, sizeof(m_dwAlphaFactor), &dwNum, NULL); // ϰ ϱ İ + WriteFile(hFile, &m_iRiverID, sizeof(m_iRiverID), &dwNum, NULL); // 강 번호 + WriteFile(hFile, &m_fSpeed1, sizeof(m_fSpeed1), &dwNum, NULL); // 유속1 + WriteFile(hFile, &m_fSpeed2, sizeof(m_fSpeed2), &dwNum, NULL); // 유속2 + WriteFile(hFile, &m_fMeterPerV, sizeof(m_fMeterPerV), &dwNum, NULL); // U좌표 1.0에 해당하는 강의 길이 + WriteFile(hFile, &m_fMeterPerU, sizeof(m_fMeterPerU), &dwNum, NULL); // V좌표 1.0에 해당하는 강의 길이 + WriteFile(hFile, &m_fMeterPerV2, sizeof(m_fMeterPerV2), &dwNum, NULL); // U2좌표 1.0에 해당하는 강의 길이 + WriteFile(hFile, &m_fMeterPerU2, sizeof(m_fMeterPerU2), &dwNum, NULL); // V2좌표 1.0에 해당하는 강의 길이 + WriteFile(hFile, &m_dwAlphaFactor, sizeof(m_dwAlphaFactor), &dwNum, NULL); // 강을 투명하게 하기 위한 알파값 - WriteFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // + WriteFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // 점 갯수 if (m_iVC > 0) { WriteFile(hFile, m_pVertices, m_iVC * sizeof(__VertexXyzT2), &dwNum, NULL); // vertex buffer } @@ -155,7 +155,7 @@ bool CRiverMesh::Save(HANDLE hFile) { WriteFile(hFile, &m_iAnimTextureCount, sizeof(m_iAnimTextureCount), &dwNum, NULL); // AnimTexture Count for (int i = 0; i < m_iAnimTextureCount; ++i) { - __ASSERT(m_pAnimTextures[i], " ؽ Ͱ NULLԴϴ."); + __ASSERT(m_pAnimTextures[i], "강물 텍스쳐 포인터가 NULL입니다."); int iLen = m_pAnimTextures[i]->FileName().size(); WriteFile(hFile, &iLen, sizeof(iLen), &dwNum, NULL); // texture name length if (iLen > 0) { @@ -187,14 +187,14 @@ void CRiverMesh::Render() { s_lpD3DDev->GetTextureStageState(0, D3DTSS_ALPHAOP, &dwAlphaOP); s_lpD3DDev->GetTextureStageState(0, D3DTSS_ALPHAARG1, &dwAlphaArg1); - if ((m_dwAlphaFactor & 0xff000000) != 0xff000000) // alpha factor ϱ + if ((m_dwAlphaFactor & 0xff000000) != 0xff000000) // alpha factor 설정하기 { - // render state + // render state 세팅 s_lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); s_lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); s_lpD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - s_lpD3DDev->SetRenderState(D3DRS_TEXTUREFACTOR, m_dwAlphaFactor); // alpha factor - // texture state (alpha) + s_lpD3DDev->SetRenderState(D3DRS_TEXTUREFACTOR, m_dwAlphaFactor); // alpha factor 설정 + // texture state 세팅(alpha) s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); s_lpD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR); s_lpD3DDev->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); @@ -253,7 +253,7 @@ void CRiverMesh::Render() { } } -void CRiverMesh::RenderVertexPoint() // ߺ̰ ٽ ׸ +void CRiverMesh::RenderVertexPoint() // 잘보이게 점만 다시 그리기 { if (m_iVC == 0 || m_pVertices == NULL) { return; @@ -295,7 +295,7 @@ void CRiverMesh::Render() { int iScreenX = int(((v.x / v.w) + 1.0f) * (vp.Width) / 2.0f); int iScreenY = int((1.0f - (v.y / v.w)) * (vp.Height) / 2.0f); if (iScreenX >= (int)vp.X && iScreenX <= (int)vp.Width && iScreenY >= (int)vp.Y && iScreenY <= (int)vp.Height) { - // set X ( 1ȼۿ Ƿ Xǥø ׸. + // set X (점을 찍으면 1픽셀밖에 안찍으므로 X표시를 그린다. Vertices[0].Set(float(iScreenX - 2), float(iScreenY - 2), 0.5f, 0.5f, clr); Vertices[1].Set(float(iScreenX + 2), float(iScreenY + 2), 0.5f, 0.5f, clr); Vertices[2].Set(float(iScreenX + 2), float(iScreenY - 2), 0.5f, 0.5f, clr); @@ -338,7 +338,7 @@ int CRiverMesh::AddVertex() { return m_iVC; } - // ϱ(ī޶ Ÿ offset ޶.) + // 기존 마지막 두점과 직각인 방향 구하기(카메라와의 거리에 따라서 offset값이 달라짐.) __Vector3 v1, v2, v3, vDir, vDiff, v4, v5; v1 = m_pVertices[m_iVC - 4]; v2 = m_pVertices[m_iVC - 3]; @@ -399,7 +399,7 @@ BOOL CRiverMesh::SetAnimTextureName(LPCTSTR pszFName, LPCTSTR pszExt, int iCount if (lstrlen(pszFName) == 0 || iCount <= 0) { return FALSE; } - __ASSERT(iCount < 100, " ϸ̼ ؽİ ʹ ϴ."); + __ASSERT(iCount < 100, "강물 에니메이션 텍스쳐가 너무 많습니다."); m_iAnimTextureCount = iCount; m_pAnimTextures = new CN3Texture *[m_iAnimTextureCount]; @@ -437,7 +437,7 @@ void CRiverMesh::ReCalcUV() { float fUPerMeter2 = 1.0f/m_fMeterPerU2; float fVPerMeter2 = 1.0f/m_fMeterPerV2; - // ó ϱ + // 처음 두점 설정하기 __Vector3 vDiff; float fDiff; vDiff = (__Vector3)m_pVertices[0].v - (__Vector3)m_pVertices[1].v; fDiff = vDiff.Magnitude()*fUPerMeter/2; @@ -447,7 +447,7 @@ void CRiverMesh::ReCalcUV() { m_pVertices[0].tu2 = 0.5f - fDiff; m_pVertices[1].tu2 = 0.5f + fDiff; m_pVertices[0].tv2 = 0.0f; m_pVertices[1].tv2 = 0.0f; - // ϱ + // 나머지 점 계산하기 for (int i=1; i= m_iVC) { return NULL; diff --git a/src/tool/N3ME/RiverMng.cpp b/src/tool/N3ME/RiverMng.cpp index 7f97b25b..128a939f 100644 --- a/src/tool/N3ME/RiverMng.cpp +++ b/src/tool/N3ME/RiverMng.cpp @@ -97,7 +97,7 @@ void CRiverMng::Render() { hr = s_lpD3DDev->GetRenderState(D3DRS_ZENABLE, &dwZEnable); hr = s_lpD3DDev->GetRenderState(D3DRS_LIGHTING, &dwLighting); - // ִ ׸ + // 기존에 있던 강 그리기 it_RiverMesh it = m_RiverMeshes.begin(); int iSize = m_RiverMeshes.size(); for (int i = 0; i < iSize; i++, it++) { @@ -106,7 +106,7 @@ void CRiverMng::Render() { } if (m_bEditMode) { - // ̸ 巡 ׸ + // 강 새로 만드는 중이면 드래그 선 그리기 if (m_RCursorMode == RCM_CREATE) { // set state hr = s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); @@ -126,16 +126,16 @@ void CRiverMng::Render() { s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 1, m_CreateLine, sizeof(__VertexXyzColor)); } - // dummy ׸ + // dummy 상자 그리기 m_VtxPosDummy.Render(); if (m_pSelRiver) { - // õ ׸ () + // 선택된 강의 점그리기 (빨강) m_pSelRiver->RenderVertexPoint(); int iVC = m_pSelRiver->VertexCount(); if (iVC > 4) { - // õ Extrude ǥϱ + // 선택된 강의 Extrude될 변 표시하기 // backup state __Material BackupMtrl; s_lpD3DDev->GetMaterial(&BackupMtrl); @@ -174,7 +174,7 @@ void CRiverMng::Render() { } } - // õ ׸ (ʷ) + // 선택된 점 그리기 (초록) int iSize = m_SelVtxArray.GetSize(); if (iSize > 0) { // transform @@ -205,7 +205,7 @@ void CRiverMng::Render() { int iScreenY = int((1.0f - (v.y / v.w)) * (vp.Height) / 2.0f); if (iScreenX >= (int)vp.X && iScreenX <= (int)vp.Width && iScreenY >= (int)vp.Y && iScreenY <= (int)vp.Height) { - // set X ( 1ȼۿ Ƿ Xǥø ׸. + // set X (점을 찍으면 1픽셀밖에 안찍으므로 X표시를 그린다. Vertices[0].Set(float(iScreenX - 2), float(iScreenY - 2), 0.5f, 0.5f, clr); Vertices[1].Set(float(iScreenX + 2), float(iScreenY + 2), 0.5f, 0.5f, clr); Vertices[2].Set(float(iScreenX + 2), float(iScreenY - 2), 0.5f, 0.5f, clr); @@ -216,7 +216,7 @@ void CRiverMng::Render() { } } - // 巡 ׸ + // 드래그 영역 그리기 if (RCM_SELECT == m_RCursorMode) { m_pMainFrm->GetMapMng()->RenderDragRect(&m_rcSelDrag); } @@ -282,14 +282,14 @@ BOOL CRiverMng::MouseMsgFilter(LPMSG pMsg) { case WM_MOUSEMOVE: { DWORD nFlags = pMsg->wParam; POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; - if (RCM_CREATE == m_RCursorMode) { // ο ߰Ҷ 巡 ϴ - __Vector3 vRayDir, vRayOrig; // ȭ ߾() 콺 ͸ - __Vector3 vPN, vPV; // Ե - __Vector3 vPos; // ( ) + if (RCM_CREATE == m_RCursorMode) { // 새로운 강 추가할때 드래그 하는 선 설정 + __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 + __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 + __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) vPN.Set(0, 1, 0); vPV = m_CreateLine[0]; - m_VtxPosDummy.GetPickRay(point, vRayDir, vRayOrig); // Լ . + m_VtxPosDummy.GetPickRay(point, vRayDir, vRayOrig); // 이함수 잠시 빌려씀. __Vector3 vPR = vPV - vRayOrig; float fT = D3DXVec3Dot(&vPN, &vPR) / D3DXVec3Dot(&vPN, &vRayDir); vPos = vRayOrig + vRayDir * fT; @@ -303,7 +303,7 @@ BOOL CRiverMng::MouseMsgFilter(LPMSG pMsg) { } break; case WM_LBUTTONDOWN: { POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; - if (RCM_CREATE == m_RCursorMode) { // ο ߰ + if (RCM_CREATE == m_RCursorMode) { // 새로운 강 추가 취소 m_RCursorMode = RCM_NONE; ReleaseCapture(); return TRUE; @@ -335,7 +335,7 @@ BOOL CRiverMng::MouseMsgFilter(LPMSG pMsg) { m_rcSelDrag.bottom = point.y; } - // 巹װ ƴϰ ׳ Ŭϰ 巡 3x3 ش. + // 드레그가 아니고 그냥 클릭일경우 드래그 영역을 3x3정도로 잡아준다. if (m_rcSelDrag.right - m_rcSelDrag.left < 3 && m_rcSelDrag.bottom - m_rcSelDrag.top < 3) { m_rcSelDrag.left = point.x - 1; m_rcSelDrag.right = point.x + 1; @@ -349,11 +349,11 @@ BOOL CRiverMng::MouseMsgFilter(LPMSG pMsg) { } break; case WM_RBUTTONDOWN: { POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; - if (RCM_SELECT == m_RCursorMode) { // Select + if (RCM_SELECT == m_RCursorMode) { // Select 취소 m_RCursorMode = RCM_NONE; ReleaseCapture(); return TRUE; - } else if (RCM_NONE == m_RCursorMode) { // ο ߰ + } else if (RCM_NONE == m_RCursorMode) { // 새로운 강 추가 CLyTerrain * pTerrain = m_pMainFrm->GetMapMng()->GetTerrain(); __Vector3 vPos; @@ -371,17 +371,17 @@ BOOL CRiverMng::MouseMsgFilter(LPMSG pMsg) { } break; case WM_RBUTTONUP: { POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; - if (RCM_CREATE == m_RCursorMode) { // ο ߰ + if (RCM_CREATE == m_RCursorMode) { // 새로운 강 추가 m_RCursorMode = RCM_NONE; ReleaseCapture(); - __Vector3 vRayDir, vRayOrig; // ȭ ߾() 콺 ͸ - __Vector3 vPN, vPV; // Ե - __Vector3 vPos; // ( ) + __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 + __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 + __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) vPN.Set(0, 1, 0); vPV = m_CreateLine[0]; - m_VtxPosDummy.GetPickRay(point, vRayDir, vRayOrig); // Լ . + m_VtxPosDummy.GetPickRay(point, vRayDir, vRayOrig); // 이함수 잠시 빌려씀. __Vector3 vPR = vPV - vRayOrig; float fT = D3DXVec3Dot(&vPN, &vPR) / D3DXVec3Dot(&vPN, &vRayDir); vPos = vRayOrig + vRayDir * fT; @@ -457,7 +457,7 @@ void CRiverMng::SelectVtxByDragRect(RECT * pRect, BOOL bAdd) { } if (bAdd == FALSE) { m_SelVtxArray.RemoveAll(); - SetSelRiver(NULL); // Ѱ .. + SetSelRiver(NULL); // 선택한강 해제.. } CN3EngTool * pEng = m_pMainFrm->m_pEng; @@ -470,11 +470,11 @@ void CRiverMng::SelectVtxByDragRect(RECT * pRect, BOOL bAdd) { D3DVIEWPORT9 vp = pEng->s_CameraData.vp; - if (m_pSelRiver) // ̹ õ ִٸ.. + if (m_pSelRiver) // 이미 선택된 강이 있다면.. { - int iVC = m_pSelRiver->VertexCount(); // װ ڸ ϱ + int iVC = m_pSelRiver->VertexCount(); // 그강의 점 숫자를 구하기 for (int i = 0; i < iVC; ++i) { - __VertexXyzT2 * pVtx = m_pSelRiver->GetVertex(i); // ϳ ϱ + __VertexXyzT2 * pVtx = m_pSelRiver->GetVertex(i); // 점 하나 구하기 if (pVtx == NULL) { continue; } @@ -499,17 +499,17 @@ void CRiverMng::SelectVtxByDragRect(RECT * pRect, BOOL bAdd) { } } if (bAleadySelected) { - m_SelVtxArray.RemoveAt(j); // ̹ Ƿ øϿ + m_SelVtxArray.RemoveAt(j); // 이미 있으므로 선택목록에서 제거 } else { - m_SelVtxArray.InsertAt(0, pVtx); // ߰ + m_SelVtxArray.InsertAt(0, pVtx); // 추가 } } } - } else // õ ƹ͵ ٸ (簭 ˻ؼ ó 鸸 ..) + } else // 선택된 강이 아무것도 없다면 (모든강 검색해서 맨처음 골라지는 강 선택후 그 강 점들만 선택..) { ASSERT(m_SelVtxArray.GetSize() == 0); - CRiverMesh * pSelRiver = NULL; // õ + CRiverMesh * pSelRiver = NULL; // 선택된 강 it_RiverMesh it = m_RiverMeshes.begin(); int iSize = m_RiverMeshes.size(); for (int i = 0; i < iSize; i++, it++) { @@ -518,9 +518,9 @@ void CRiverMng::SelectVtxByDragRect(RECT * pRect, BOOL bAdd) { continue; } - int iVC = pRM->VertexCount(); // ̰ + int iVC = pRM->VertexCount(); // 이강의 점 갯수 for (int j = 0; j < iVC; ++j) { - __VertexXyzT2 * pVtx = pRM->GetVertex(j); // ϳ ϱ + __VertexXyzT2 * pVtx = pRM->GetVertex(j); // 점 하나 구하기 if (pVtx == NULL) { continue; } @@ -536,7 +536,7 @@ void CRiverMng::SelectVtxByDragRect(RECT * pRect, BOOL bAdd) { float fScreenY = (1.0f - (v.y / v.w)) * (vp.Height) / 2.0f; if (fScreenX >= pRect->left && fScreenX <= pRect->right && fScreenY >= pRect->top && fScreenY <= pRect->bottom) { - m_SelVtxArray.Add(pVtx); // ߰ + m_SelVtxArray.Add(pVtx); // 추가 pSelRiver = pRM; SetSelRiver(pSelRiver); } @@ -564,7 +564,7 @@ void CRiverMng::ExtrudeRiverEdge() { } int iVC = m_pSelRiver->AddVertex(); - m_SelVtxArray.RemoveAll(); // + m_SelVtxArray.RemoveAll(); // 기존에 선택한 점 해제 if (iVC >= 4) { __VertexXyzT2 * pVtx = m_pSelRiver->GetVertex(iVC - 4); @@ -583,7 +583,7 @@ void CRiverMng::ExtrudeRiverEdge() { m_pMainFrm->Invalidate(FALSE); } -void CRiverMng::DeleteSelectedVertex() // õ +void CRiverMng::DeleteSelectedVertex() // 선택된 점들 지우기 { if (m_pSelRiver == NULL) { return; @@ -604,7 +604,7 @@ void CRiverMng::ExtrudeRiverEdge() { iVC = m_pSelRiver->DeleteVertex(iIndex); } - m_SelVtxArray.RemoveAll(); // + m_SelVtxArray.RemoveAll(); // 기존에 선택한 점 해제 m_VtxPosDummy.SetSelVtx(NULL); m_pMainFrm->Invalidate(FALSE); } @@ -630,7 +630,7 @@ void CRiverMng::MakeGameFiles(HANDLE hFile, float fSize) { int iVC = pRM->VertexCount(); __VertexXyzT2 *pVtx0 = pRM->GetVertex(0), *pSrcVtx = NULL; ASSERT(pVtx0); - WriteFile(hFile, &iVC, sizeof(iVC), &dwNum, NULL); // + WriteFile(hFile, &iVC, sizeof(iVC), &dwNum, NULL); // 점 갯수 // XyxT2 -> XyzColorT2 Converting. __VertexRiver * pTemp = new __VertexRiver[iVC]; @@ -677,7 +677,7 @@ void CRiverMng::MakeGameFiles(HANDLE hFile, float fSize) { } /* - // (*.grm) game river main + // 모든 강 정보 저장 (*.grm) game river main int iRiverCount = m_RiverMeshes.size(); CLyTerrain* pTerrain = m_pMainFrm->GetMapMng()->GetTerrain(); @@ -714,9 +714,9 @@ void CRiverMng::MakeGameFiles(HANDLE hFile, float fSize) { if (iRiverCount <=0) return; - // ġ (*.grp) game river patch + // 각각의 패치 정보 저장 (*.grp) game river patch int iPatchCount = size.cx * size.cy; - // ġ зϱ + // 각 패치별로 정보 분류하기 __TempPatch* TempPatches = new __TempPatch[iPatchCount]; it = m_RiverMeshes.begin(); @@ -742,7 +742,7 @@ void CRiverMng::MakeGameFiles(HANDLE hFile, float fSize) { } } - // CN3RiverPatch ˸° ֱ. + // CN3RiverPatch구조에 알맞게 넣기. CN3RiverPatch* RiverPatches = new CN3RiverPatch[iPatchCount]; for (int i=0; iGetMapMng()->GetTerrain(); @@ -822,9 +822,9 @@ void CRiverMng::MakeGameFiles(LPCTSTR lpszFName, float fSize) if (iRiverCount <=0) return; - // ġ (*.grp) game river patch + // 각각의 패치 정보 저장 (*.grp) game river patch int iPatchCount = size.cx * size.cy; - // ġ зϱ + // 각 패치별로 정보 분류하기 __TempPatch* TempPatches = new __TempPatch[iPatchCount]; for (int i=0; i m_RiverMeshes; // River Mesh list - CRiverMesh * m_pSelRiver; // õ RiverMesh - CTypedPtrArray m_SelVtxArray; // õ - CVtxPosDummy m_VtxPosDummy; // ϼ ִ dummy object - BOOL m_bEditMode; // ΰ? - int m_RCursorMode; // ߰?ϴ ΰ ϴ ΰ? + CRiverMesh * m_pSelRiver; // 선택된 RiverMesh + CTypedPtrArray m_SelVtxArray; // 선택된 점들 + CVtxPosDummy m_VtxPosDummy; // 점을 움직일수 있는 dummy object + BOOL m_bEditMode; // 강물 편집모드인가? + int m_RCursorMode; // 강을 추가?하는 것인가 점을 선택하는 것인가? CMainFrame * m_pMainFrm; // mainframe pointer CDlgRiverProperty * m_pDlgProperty; // property dialog - RECT m_rcSelDrag; // 巡 - __VertexXyzColor m_CreateLine[2]; // ó Ҷ ̴ + RECT m_rcSelDrag; // 드래그 영역 + __VertexXyzColor m_CreateLine[2]; // 강 처음 생성할때 보이는 선 // Operations public: @@ -71,21 +71,21 @@ class CRiverMng : public CN3BaseFileAccess { virtual bool Load(HANDLE hFile); virtual bool Save(HANDLE hFile); - void MakeGameFiles(HANDLE hFile, float fSize); // Game file + void MakeGameFiles(HANDLE hFile, float fSize); // Game file로 저장 CRiverMesh * CreateNewRiverMesh(__Vector3 & vPos1, __Vector3 & vPos2, __Vector3 & vPos3, - __Vector3 & vPos4); // ο ߰Ѵ. - void RemoveRiverMesh(int iRiverID); // õ Ѵ. - BOOL MouseMsgFilter(LPMSG pMsg); // Mouse ޼ ó - BOOL SetRiverID(CRiverMesh * pRiverMesh, int iRiverID); // ID - void SetEditMode(BOOL bEditMode); // EditMode + __Vector3 & vPos4); // 새로운 강을 추가한다. + void RemoveRiverMesh(int iRiverID); // 선택된 강을 삭제한다. + BOOL MouseMsgFilter(LPMSG pMsg); // Mouse 메세지 처리 + BOOL SetRiverID(CRiverMesh * pRiverMesh, int iRiverID); // 강의 ID를 설정 + void SetEditMode(BOOL bEditMode); // 강 EditMode설정 void ExtrudeRiverEdge(); - CRiverMesh * GetRiverMesh(int iRiverID); // RiverMesh - void DeleteSelectedVertex(); // õ - void ReCalcUV(); // õ UVǥ ٽ . + CRiverMesh * GetRiverMesh(int iRiverID); // RiverMesh 얻기 + void DeleteSelectedVertex(); // 선택된 점들 지우기 + void ReCalcUV(); // 선택된 강의 UV좌표 다시 계산. void ReCalcSelectedVertex(); - void GoRiver(int iRiverID); // õ ϴ. + void GoRiver(int iRiverID); // 선택된 강으로 갑니다. protected: - void SetSelRiver(CRiverMesh * pRiverMesh); // RiverMesh ϱ + void SetSelRiver(CRiverMesh * pRiverMesh); // RiverMesh 선택하기 void SelectVtxByDragRect(RECT * pRect, BOOL bAdd); }; diff --git a/src/tool/N3ME/RiverMng2.cpp b/src/tool/N3ME/RiverMng2.cpp index cdafd3e1..34917e4a 100644 --- a/src/tool/N3ME/RiverMng2.cpp +++ b/src/tool/N3ME/RiverMng2.cpp @@ -85,7 +85,7 @@ void CRiverMng2::Render() { D3DXMATRIX mtx; D3DXMatrixIdentity(&mtx); - hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // .. + hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // 월드 행렬 적용.. // backup state DWORD dwAlphaEnable, dwSrcBlend, dwDestBlend; @@ -359,7 +359,7 @@ void CRiverMng2::MakeTileVB(__VertexRiver * pVtx, int x, int z) { //DWORD color = 0xa0ffffff; DWORD color = 0x80ffffff; - //if((x+z)%2==0) // Ÿ.. + //if((x+z)%2==0) // 슬래쉬 모양의 타일.. { __Vector3 v; v.x = x * TERRAIN_CELL_SIZE; @@ -389,7 +389,7 @@ void CRiverMng2::MakeTileVB(__VertexRiver * pVtx, int x, int z) { return; } - // if((x+z)%2==1) //齽 Ÿ.. + // if((x+z)%2==1) //백슬레쉬 모양의 타일.. // { // __Vector3 v; // v.x = x*TERRAIN_CELL_SIZE; diff --git a/src/tool/N3ME/RotDummy.cpp b/src/tool/N3ME/RotDummy.cpp index f3fd7bde..4843b29e 100644 --- a/src/tool/N3ME/RotDummy.cpp +++ b/src/tool/N3ME/RotDummy.cpp @@ -80,6 +80,6 @@ void CRotDummy::SetSelObj(CN3Transform * pObj) { m_vPos = pObj->Pos(); // m_qRot = pObj->Rot(); - m_qRot.Identity(); // Quaternion ȸ̱ ... ʱȭ ش.. + m_qRot.Identity(); // Quaternion 회전이기 땜시... 초기화를 해준다.. } } diff --git a/src/tool/N3ME/SoundCell.cpp b/src/tool/N3ME/SoundCell.cpp index 28529372..8329aaaf 100644 --- a/src/tool/N3ME/SoundCell.cpp +++ b/src/tool/N3ME/SoundCell.cpp @@ -72,7 +72,7 @@ void CSoundCell::MakeTileVB(int x, int z, DWORD color) { return; } - if ((x + z) % 2 == 0) // Ÿ.. + if ((x + z) % 2 == 0) // 슬래쉬 모양의 타일.. { __Vector3 v; v.x = x * TERRAIN_CELL_SIZE; @@ -94,7 +94,7 @@ void CSoundCell::MakeTileVB(int x, int z, DWORD color) { return; } - if ((x + z) % 2 == 1) //齽 Ÿ.. + if ((x + z) % 2 == 1) //백슬레쉬 모양의 타일.. { __Vector3 v; v.x = x * TERRAIN_CELL_SIZE; diff --git a/src/tool/N3ME/SoundMgr.cpp b/src/tool/N3ME/SoundMgr.cpp index ae9f2733..f1390370 100644 --- a/src/tool/N3ME/SoundMgr.cpp +++ b/src/tool/N3ME/SoundMgr.cpp @@ -178,7 +178,7 @@ void CSoundMgr::Render() { D3DXMATRIX mtx; D3DXMatrixIdentity(&mtx); - hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // .. + hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // 월드 행렬 적용.. // set texture hr = s_lpD3DDev->SetTexture(0, NULL); @@ -198,7 +198,7 @@ void CSoundMgr::Render() { hr = s_lpD3DDev->SetFVF(FVF_XYZCOLOR); - //̹ ׸... + //이미 만들어진 길 그리기... std::list::iterator itSound; CSoundCell * pSound; @@ -211,12 +211,12 @@ void CSoundMgr::Render() { pSound->Render(0xff0000ff); } - //ȭڿ õ ׸. + //대화상자에서 선택된 길 그리기. if (m_pDlgSound->m_pSelSound) { m_pDlgSound->m_pSelSound->Render(0xff00ff00); } - // ִ & ׸.. + //만들고 있는 길 & 영역 그리기.. m_pCurrSound->Render(0xffff0000); // restore @@ -226,7 +226,7 @@ void CSoundMgr::Render() { } bool CSoundMgr::Load(HANDLE hFile) { - //dlg Ŭ.. + //dlg 클리어.. m_pDlgSound->Clear(); DWORD dwRWC; @@ -235,7 +235,7 @@ bool CSoundMgr::Load(HANDLE hFile) { return false; } - //m_pSoundŬ... + //m_pSound클리어... std::list::iterator it; for (it = m_pSound.begin(); it != m_pSound.end(); it++) { CSoundCell * pSoundCell = (*it); @@ -251,7 +251,7 @@ bool CSoundMgr::Load(HANDLE hFile) { pSoundCell->Load(hFile); m_pSound.push_back(pSoundCell); - //dlg ߰... + //dlg에 추가... m_pDlgSound->AddSoundInfo(pSoundCell); } m_pRefMapMng->Invalidate(); @@ -284,8 +284,8 @@ void CSoundMgr::SaveGameData(HANDLE hFile) { char * pSound = (char *)GlobalAlloc(GMEM_FIXED, sizeof(char) * m_MapSize * m_MapSize); memset(pSound, -1, sizeof(char) * m_MapSize * m_MapSize); - //sound cell (ū ..)ϰ... - // ϸ鼭 ̵ĵ ϰ... + //sound cell들을 면적순으로(큰게 앞으로 오게..)정렬하고... + //면적순으로 정리하면서 아이디정렬도 하고... // // SCSort(); @@ -310,10 +310,10 @@ void CSoundMgr::SaveGameData(HANDLE hFile) { LPSOUNDINFO pSI = m_pDlgSound->GetSoundGroup(dwID); if (!pSI) { - AfxMessageBox("Sound Group ȿ ʽϴ.."); + AfxMessageBox("Sound Group이 유효하지 않습니다.ㅠ.ㅠ"); return; } - //sound group Ѵ? + //sound group을 어케 저장한담? for (int j = 0; j < 4; j++) { int str_size = 0; std::string str; @@ -332,7 +332,7 @@ void CSoundMgr::SaveGameData(HANDLE hFile) { } } - // ŸϿ Sound Info ϰ ... + // 타일에 Sound Info 셋팅하고 저장... for (it = m_pSound.begin(); it != m_pSound.end(); it++) { CSoundCell * pSoundCell = (*it); @@ -351,8 +351,8 @@ void CSoundMgr::SaveGameData(HANDLE hFile) { // /////////////////////////////////////////////////////////////////////////////////////////////// // related sort list... -// list sortԼ ..-.- -// ϴ... +// list의 sort함수 베꼈당..-.- +// 제대로 동작 안하더라..ㅠ.ㅠ // void CSoundMgr::SCSort() { diff --git a/src/tool/N3ME/SoundMgr.h b/src/tool/N3ME/SoundMgr.h index 537e485a..eb7a4504 100644 --- a/src/tool/N3ME/SoundMgr.h +++ b/src/tool/N3ME/SoundMgr.h @@ -42,7 +42,7 @@ class CSoundMgr : public CN3BaseFileAccess { int m_MapSize; CMapMng * m_pRefMapMng; - bool m_bActive; // ̱ Ȱȭ Ǿ ִ...1:Ȱȭ, 0:Ȱȭ.. + bool m_bActive; // 이기능이 활성화 되어 있는지...1:활성화, 0:비활성화.. CDlgSetSound * m_pDlgSound; public: @@ -55,7 +55,7 @@ class CSoundMgr : public CN3BaseFileAccess { void Render(); ////////////////////////////////////////////// - //m_pSound Ʈϱ̾.. + //m_pSound를 소트하기위함이야.. void SCSort(); void SCMerge(std::list & l1, std::list & l2); bool SCComp(CSoundCell * pP1, CSoundCell * pP2); diff --git a/src/tool/N3ME/SowSeedMng.cpp b/src/tool/N3ME/SowSeedMng.cpp index 35c646cb..44ade37a 100644 --- a/src/tool/N3ME/SowSeedMng.cpp +++ b/src/tool/N3ME/SowSeedMng.cpp @@ -72,7 +72,7 @@ BOOL CSowSeedMng::MouseMessage(LPMSG pMsg) { static int iPrevScreenY = 0; const float fDelta = 0.10f; - static int iSumOfEditedHeight = 0; // ̹ 巡׷ ȭ + static int iSumOfEditedHeight = 0; // 이번 드래그로 변화된 지형높이의 합 CMainFrame * pFrame = (CMainFrame *)AfxGetMainWnd(); switch (pMsg->message) { @@ -81,7 +81,7 @@ BOOL CSowSeedMng::MouseMessage(LPMSG pMsg) { POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; if (pFrame->m_pDlgSowSeed->Sow_Select_Flage == CS_SOW) { - // 귯 Ʈ + // 브러시 업데이트 if (pFrame->GetMapMng()->GetTerrain()->Pick(point.x, point.y, NULL, &ptSelHeightMapPos)) { pFrame->GetMapMng()->GetTerrain()->UpdateBrushArea(ptSelHeightMapPos); } @@ -182,7 +182,7 @@ void CSowSeedMng::Render(LPDIRECT3DDEVICE9 lpD3DDevice) { CMainFrame * pFrame = (CMainFrame *)AfxGetMainWnd(); if (pFrame->m_pDlgSowSeed->Sow_Select_Flage == CS_SOW) { - // 귯ÿ õ Ǯ + // 브러시에 선택된 풀 if (Render_Grass == TRUE) { pFrame->GetMapMng()->GetTerrain()->RenderBrushArea(); for (int i = 0, Num = 0; i < MAX_BRUSH_SIZE; ++i) { @@ -247,7 +247,7 @@ void CSowSeedMng::Render(LPDIRECT3DDEVICE9 lpD3DDevice) { } } - // ʿ Ǯ ׸ + // 맵에 찍힌 풀 그리기 if (Render_Grass == TRUE) { it_Grass_Group it = Grass_Group.begin(); for (int i = 0; i < Grass_Group.size(); i++, it++) { @@ -268,7 +268,7 @@ void CSowSeedMng::Render(LPDIRECT3DDEVICE9 lpD3DDevice) { } } } - } else if (Select_Group_Id == i) // õ ׷ + } else if (Select_Group_Id == i) // 선택된 그룹 { Render_Box(lpD3DDevice, group->Pos); for (int j = 0; j < group->grass.size(); j++, it_grass++) { @@ -453,7 +453,7 @@ void CSowSeedMng::Add_Grass(void) { pFrame->GetMapMng()->m_pDlgSourceList->m_ListShape.GetText(temp->Obj_ID, Name); char text[256]; - sprintf(text, "Ǯ ID: %d , ϸ:%s", Grass_ID, Name); + sprintf(text, "풀 ID: %d , 파일명:%s", Grass_ID, Name); int CurPos = pFrame->m_pDlgSowSeed->m_CB_TileGroup.GetCount(); pFrame->m_pDlgSowSeed->m_CB_TileGroup.AddString(text); @@ -560,7 +560,7 @@ void CSowSeedMng::Render_Box(LPDIRECT3DDEVICE9 lpD3DDevice, __Vector3 Pos) { }; void CSowSeedMng::SaveData(void) { - // Seed List о .. + // Seed List 읽어 오기.. DWORD dwFlags = OFN_EXPLORER | OFN_CREATEPROMPT | OFN_LONGNAMES | OFN_OVERWRITEPROMPT; CFileDialog dlg(FALSE, "tgi", NULL, dwFlags, "Grass Info File(*.tgi)|*.tgi||", NULL); @@ -571,24 +571,24 @@ void CSowSeedMng::SaveData(void) { int size = Grass_Group.size(); if (size > 0) { FILE * fp = fopen((LPCTSTR)dlg.GetPathName(), "w"); - // ׷ Ѱټ + // 그룹의 총겟수 fwrite(&size, sizeof(int), 1, fp); it_Grass_Group it = Grass_Group.begin(); for (int i = 0; i < size; i++, it++) { LPGRASS_GROUP group = *it; - // 귯 ũ + // 브러시 크기 fwrite(&group->b_size, sizeof(group->b_size), 1, fp); - // ׷ ̵ + // 그룹 아이디 fwrite(&group->Group_id, sizeof(group->Group_id), 1, fp); - // Ʈ ̵ + // 오브젝트 아이디 fwrite(&group->Obj_ID, sizeof(group->Obj_ID), 1, fp); - // ׷ ġ + // 그룹 위치 fwrite(group->Pos, sizeof(group->Pos), 1, fp); - // ׷ ũ + // 서브 그룹 크기 int grass_size = group->grass.size(); fwrite(&grass_size, sizeof(grass_size), 1, fp); - // ϸ + // 파일명 쓰기 int len = strlen(group->FileName); fwrite(&len, sizeof(int), 1, fp); fwrite(group->FileName, len, 1, fp); @@ -596,9 +596,9 @@ void CSowSeedMng::SaveData(void) { it_Grass it_grass = group->grass.begin(); for (int j = 0; j < grass_size; j++, it_grass++) { LPGRASS grass = *it_grass; - // Ǯ ġ + // 풀의 위치 fwrite(grass->Pos, sizeof(grass->Pos), 1, fp); - // Ǯ Ÿ ȣ + // 풀의 타일 번호 fwrite(&grass->Tile_x, sizeof(grass->Tile_x), 1, fp); fwrite(&grass->Tile_z, sizeof(grass->Tile_z), 1, fp); } @@ -612,7 +612,7 @@ void CSowSeedMng::LoadData(void) { char szOldPath[_MAX_PATH]; GetCurrentDirectory(_MAX_PATH, szOldPath); - // Seed List о .. + // Seed List 읽어 오기.. DWORD dwFlags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY; CFileDialog dlg(TRUE, "tgi", NULL, dwFlags, "Grass Info File(*.tgi)|*.tgi||", NULL); @@ -620,7 +620,7 @@ void CSowSeedMng::LoadData(void) { return; } - // Ʈ ʱȭ + // 리스트 초기화 if (Grass_Group.size() > 0) { Render_Grass = FALSE; it_Grass_Group it = Grass_Group.begin(); @@ -640,7 +640,7 @@ void CSowSeedMng::LoadData(void) { } Grass_Group.clear(); } - // ε + // 로딩 시작 FILE * fp = fopen((LPCTSTR)dlg.GetPathName(), "r"); int size = 0; @@ -656,16 +656,16 @@ void CSowSeedMng::LoadData(void) { int grass_sub_size = 0; fread(&grass_sub_size, sizeof(grass_sub_size), 1, fp); - // ϸ б + // 파일명 읽기 int len = 0; fread(&len, sizeof(int), 1, fp); fread(group->FileName, len, 1, fp); for (int j = 0; j < grass_sub_size; j++) { LPGRASS grass = new GRASS; - // Ǯ ġ + // 풀의 위치 fread(grass->Pos, sizeof(grass->Pos), 1, fp); - // Ǯ Ÿ ȣ + // 풀의 타일 번호 fread(&grass->Tile_x, sizeof(grass->Tile_x), 1, fp); fread(&grass->Tile_z, sizeof(grass->Tile_z), 1, fp); group->grass.push_back(grass); @@ -685,7 +685,7 @@ void CSowSeedMng::SaveDataGame(void) { CMainFrame * m_pRefFrm = (CMainFrame *)AfxGetMainWnd(); if (m_pRefFrm->m_SeedFileName[0] == NULL) { - ::MessageBox(NULL, " ӿ ϼ", "Ȯ", MB_OK); + ::MessageBox(NULL, "맵 파일 부터 게임용으로 저장하세요", "확인", MB_OK); return; } @@ -718,7 +718,7 @@ void CSowSeedMng::SaveDataGame(void) { sprintf(Buff, "GrassInfoFile"); WriteFile(hFile, Buff, 80, &dwRWC, NULL); - // ׷ ũ + // 그룹 크기 Obj_Name.clear(); it_Grass_Group it = Grass_Group.begin(); for (int i = 0, Object_ID = 0; i < Grass_Group.size(); i++, it++) { @@ -769,7 +769,7 @@ void CSowSeedMng::Test_GameDataSave(void) { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); int Map_Size = pFrm->GetMapMng()->GetTerrain()->m_iHeightMapSize; - //ŸϿ Ǯ Ӽ .. + //타일에 풀 속성 저장.. LPSEEDGROUP SeedAttr = new SEEDGROUP[Map_Size * Map_Size]; ZeroMemory(SeedAttr, sizeof(unsigned char) * Map_Size * Map_Size); @@ -838,7 +838,7 @@ void CSowSeedMng::Test_GameDataLoad(void) { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); int Map_Size = pFrm->GetMapMng()->GetTerrain()->m_iHeightMapSize; - //ŸϿ Ǯ Ӽ .. + //타일에 풀 속성 저장.. LPSEEDGROUP SeedAttr = new SEEDGROUP[Map_Size * Map_Size]; ZeroMemory(SeedAttr, sizeof(unsigned char) * Map_Size * Map_Size); @@ -859,7 +859,7 @@ void CSowSeedMng::Test_GameDataLoad(void) { } } - // ؽƮϷ ̾ƺ.. + // 텍스트파일로 함 뽑아보자.. FILE * stream = fopen("c:\\grass.txt", "w"); for (int z = 0; z < Map_Size; z++) { for (int x = 0; x < Map_Size; x++) { @@ -867,7 +867,7 @@ void CSowSeedMng::Test_GameDataLoad(void) { fprintf(stream, "%d,%d\t", v.Obj_Id, v.Seed_Count); if (v.SeedGroup_Sub != NULL) { - fprintf(stream, " %d,%d\t", v.SeedGroup_Sub->Obj_Id, v.SeedGroup_Sub->Seed_Count); + fprintf(stream, "서브 %d,%d\t", v.SeedGroup_Sub->Obj_Id, v.SeedGroup_Sub->Seed_Count); } fprintf(stream, "\n"); diff --git a/src/tool/N3ME/SowSeedMng.h b/src/tool/N3ME/SowSeedMng.h index ee0af4bd..9b8d6c7d 100644 --- a/src/tool/N3ME/SowSeedMng.h +++ b/src/tool/N3ME/SowSeedMng.h @@ -62,8 +62,8 @@ class CSowSeedMng { int Add_List_Count; - __VertexColor * m_pVertices; // - int m_nVC; // + __VertexColor * m_pVertices; // 점 버퍼 + int m_nVC; // 점 갯수 bool bActive; BOOL Render_Grass; @@ -75,7 +75,7 @@ class CSowSeedMng { void SetActive(BOOL flage); void Render(LPDIRECT3DDEVICE9 lpD3DDevice); - // Mouse ޼ ó + // Mouse 메세지 처리 BOOL MouseMessage(LPMSG pMsg); void Release(); void Create_Grass(int NUm); diff --git a/src/tool/N3ME/StdAfx.h b/src/tool/N3ME/StdAfx.h index 71e96539..a9bde62c 100644 --- a/src/tool/N3ME/StdAfx.h +++ b/src/tool/N3ME/StdAfx.h @@ -3,7 +3,7 @@ // are changed infrequently // -// stl ... +// stl 쓸려고... #pragma warning(disable : 4786) #pragma once diff --git a/src/tool/N3ME/TransDummy.cpp b/src/tool/N3ME/TransDummy.cpp index f1f76f10..1d3b9389 100644 --- a/src/tool/N3ME/TransDummy.cpp +++ b/src/tool/N3ME/TransDummy.cpp @@ -133,7 +133,7 @@ void CTransDummy::Tick() { if (m_SelObjArray.GetSize() == 0) { return; } - // Scale + // Scale 조정 __Vector3 vL = s_CameraData.vEye - m_vPos; float fL = vL.Magnitude() * 0.01f; m_vScale.Set(fL, fL, fL); @@ -141,7 +141,7 @@ void CTransDummy::Tick() { CN3Transform::Tick(-1000.0f); ReCalcMatrix(); - // Ÿ + // 거리에 따라 정렬 for (int i = 0; i < NUM_DUMMY; ++i) { __Vector3 vPos = m_DummyCubes[i].vCenterPos * m_Matrix; m_DummyCubes[i].fDistance = (vPos - s_CameraData.vEye).Magnitude(); @@ -173,7 +173,7 @@ void CTransDummy::Render() { HRESULT hr; // set transform - hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); // .. + hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); // 월드 행렬 적용.. // set texture hr = s_lpD3DDev->SetTexture(0, NULL); @@ -189,11 +189,11 @@ void CTransDummy::Render() { hr = s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); hr = s_lpD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE); - // ̾ ׸ + // 이어지 선 그리기 hr = s_lpD3DDev->SetFVF(FVF_XYZCOLOR); hr = s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 3, m_LineVertices, sizeof(__VertexXyzColor)); - // Cube ׸ + // Cube 그리기 hr = s_lpD3DDev->SetFVF(FVF_XYZNORMALCOLOR); for (int i = 0; i < NUM_DUMMY; ++i) { ASSERT(m_pSortedCubes[i]); @@ -272,7 +272,7 @@ BOOL CTransDummy::MouseMsgFilter(LPMSG pMsg) { m_vPrevScaleArray = NULL; } m_vPrevScaleArray = new __Vector3[iSize]; - for (int i = 0; i < iSize; ++i) // õ ü + for (int i = 0; i < iSize; ++i) // 모든 선택된 객체의 스케일 저장 { CN3Transform * pSelObj = m_SelObjArray.GetAt(i); _ASSERT(pSelObj); @@ -290,7 +290,7 @@ BOOL CTransDummy::MouseMsgFilter(LPMSG pMsg) { return TRUE; } } break; - case WM_RBUTTONUP: // ť ̹ 巡׷ ΰ ǵ + case WM_RBUTTONUP: // 큐브 선택 취소 및 이번 드래그로 움직인것 되돌려 놓기 { if (m_pSelectedCube) { __Vector3 vDiffPos = m_vPrevPos - m_vPos; @@ -369,7 +369,7 @@ void CTransDummy::TransDiff(__Vector3 * pvDiffPos, __Quaternion * pqDiffRot, __V qtRot *= (*pqDiffRot); pSelObj->RotSet(qtRot); - vPos = pSelObj->Pos(); // ʻ󿡼 ġ + vPos = pSelObj->Pos(); // 맵상에서의 위치 vPos -= vCenter; vPos *= mtx44Rotate; vPos += vCenter; diff --git a/src/tool/N3ME/TransDummy.h b/src/tool/N3ME/TransDummy.h index c0a41520..fcde59cb 100644 --- a/src/tool/N3ME/TransDummy.h +++ b/src/tool/N3ME/TransDummy.h @@ -18,10 +18,10 @@ enum { const int NUM_CUBEVERTEX = 36; struct __DUMMYCUBE { - int iType; // Center , X, Y, Z . - __VertexXyzNormalColor Vertices[NUM_CUBEVERTEX]; // ť - __Vector3 vCenterPos; // ť  - float fDistance; // ī޶ Ÿ + int iType; // Center , X, Y, Z 종류 구분. + __VertexXyzNormalColor Vertices[NUM_CUBEVERTEX]; // 큐브의 구성 점들 + __Vector3 vCenterPos; // 큐브의 가운데 점 + float fDistance; // 카메라와의 거리 }; class CLyTerrain; @@ -36,30 +36,30 @@ class CTransDummy : public CN3Transform { // Attributes public: protected: - __DUMMYCUBE m_DummyCubes[NUM_DUMMY]; // 4 ť(center, x, y, z); - __VertexXyzColor m_LineVertices[6]; // 4 ť긦 ִ̾ ϴ - CTypedPtrArray m_SelObjArray; // MapMng õ ü - __DUMMYCUBE * m_pSortedCubes[NUM_DUMMY]; // Cube Ÿ ĵ - __DUMMYCUBE * m_pSelectedCube; // õ ť - __Vector3 m_vPrevPos; // ̹ 콺 巡 ġ ȸ Ȯ/Ұ - __Quaternion m_qPrevRot; // ̹ 콺 巡 ġ ȸ Ȯ/Ұ + __DUMMYCUBE m_DummyCubes[NUM_DUMMY]; // 4개의 큐브(center, x, y, z); + __VertexXyzColor m_LineVertices[6]; // 4개의 큐브를 이어주는 선을 구성하는 점 + CTypedPtrArray m_SelObjArray; // MapMng에서 선택된 객체들 + __DUMMYCUBE * m_pSortedCubes[NUM_DUMMY]; // Cube 거리에 따라 정렬된 포인터 + __DUMMYCUBE * m_pSelectedCube; // 선택된 큐브 + __Vector3 m_vPrevPos; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 + __Quaternion m_qPrevRot; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 __Vector3 * - m_vPrevScaleArray; // ̹ 콺 巡 Ȯ/Ұ (õ ü ־ ϱ 迭) + m_vPrevScaleArray; // 이번 마우스 드래그 이전에 확대/축소값들 (선택된 객체들 모두의 값을 가지고 있어야 하기 때문에 배열) // Operations public: virtual void Tick(); virtual void Render(); virtual void Release(); - virtual void SetSelObj(CN3Transform * pObj); // õ ü ٲٱ - virtual void AddSelObj(CN3Transform * pObj); // õ ü ߰ - virtual BOOL MouseMsgFilter(LPMSG pMsg); // 콺 ޼ ó + virtual void SetSelObj(CN3Transform * pObj); // 선택된 객체 바꾸기 + virtual void AddSelObj(CN3Transform * pObj); // 선택된 객체 추가 + virtual BOOL MouseMsgFilter(LPMSG pMsg); // 마우스 메세지 처리 void GetPickRay(POINT point, __Vector3 & vDir, - __Vector3 & vOrig); // 콺 Ͱ Ű  Լ + __Vector3 & vOrig); // 마우스 포인터가 가리키는 쪽으로 뻗어나가는 선 얻는 함수 protected: - __DUMMYCUBE * Pick(int x, int y); // ť picking - void InitDummyCube(int iType, __DUMMYCUBE * pDummyCube, __Vector3 & vOffset, D3DCOLOR color); // ť ʱȭ - static int SortCube(const void * pArg1, const void * pArg2); // ť ī޶ Ÿ Լ + __DUMMYCUBE * Pick(int x, int y); // 큐브 picking + void InitDummyCube(int iType, __DUMMYCUBE * pDummyCube, __Vector3 & vOffset, D3DCOLOR color); // 큐브 초기화 + static int SortCube(const void * pArg1, const void * pArg2); // 큐브 카메라 거리에 대한 정렬함수 virtual void TransDiff(__Vector3 * pvDiffPos, __Quaternion * pvDiffRot, - __Vector3 * pvDiffScale); // ̸ŭ õ Ʈ Ų. + __Vector3 * pvDiffScale); // 차이만큼 선택된 오므젝트들을 변형시킨다. }; diff --git a/src/tool/N3ME/VtxPosDummy.cpp b/src/tool/N3ME/VtxPosDummy.cpp index a3c654c2..acf4c988 100644 --- a/src/tool/N3ME/VtxPosDummy.cpp +++ b/src/tool/N3ME/VtxPosDummy.cpp @@ -30,7 +30,7 @@ void CVtxPosDummy::Tick() { return; } - // Scale + // Scale 조정 __Vector3 vL = s_CameraData.vEye - m_vPos; float fL = vL.Magnitude() * 0.01f; m_vScale.Set(fL, fL, fL); @@ -38,7 +38,7 @@ void CVtxPosDummy::Tick() { CN3Transform::Tick(-1000.0f); ReCalcMatrix(); - // Ÿ + // 거리에 따라 정렬 for (int i = 0; i < NUM_DUMMY; ++i) { __Vector3 vPos = m_DummyCubes[i].vCenterPos * m_Matrix; m_DummyCubes[i].fDistance = (vPos - s_CameraData.vEye).Magnitude(); @@ -57,7 +57,7 @@ void CVtxPosDummy::Render() { HRESULT hr; // set transform - hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); // .. + hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &m_Matrix); // 월드 행렬 적용.. // set texture hr = s_lpD3DDev->SetTexture(0, NULL); @@ -73,16 +73,16 @@ void CVtxPosDummy::Render() { hr = s_lpD3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); hr = s_lpD3DDev->SetRenderState(D3DRS_LIGHTING, FALSE); - // ̾ ׸ + // 이어지 선 그리기 hr = s_lpD3DDev->SetFVF(FVF_XYZCOLOR); hr = s_lpD3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 3, m_LineVertices, sizeof(__VertexXyzColor)); - // Cube ׸ + // Cube 그리기 hr = s_lpD3DDev->SetFVF(FVF_XYZNORMALCOLOR); for (int i = 0; i < NUM_DUMMY; ++i) { ASSERT(m_pSortedCubes[i]); if (m_pSortedCubes[i]->iType == DUMMY_CENTER) { - continue; //  ť ׸ ʴ´. + continue; // 가운데 큐브는 그리지 않는다. } hr = s_lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 12, m_pSortedCubes[i]->Vertices, sizeof(__VertexXyzNormalColor)); @@ -101,7 +101,7 @@ void CVtxPosDummy::AddSelObj(CN3Transform * pObj) { ASSERT(0); } -void CVtxPosDummy::SetSelVtx(__VertexXyzT1 * pVtx) // õ ٲٱ +void CVtxPosDummy::SetSelVtx(__VertexXyzT1 * pVtx) // 선택된 점 바꾸기 { m_SelVtxArray.RemoveAll(); if (pVtx) { @@ -111,13 +111,13 @@ void CVtxPosDummy::AddSelObj(CN3Transform * pObj) { } } -void CVtxPosDummy::AddSelVtx(__VertexXyzT1 * pVtx) // õ ߰ +void CVtxPosDummy::AddSelVtx(__VertexXyzT1 * pVtx) // 선택된 점 추가 { _ASSERT(pVtx); m_SelVtxArray.Add(pVtx); } -BOOL CVtxPosDummy::MouseMsgFilter(LPMSG pMsg) // 콺 ޼ ó +BOOL CVtxPosDummy::MouseMsgFilter(LPMSG pMsg) // 마우스 메세지 처리 { int iSize = m_SelVtxArray.GetSize(); if (iSize == 0) { @@ -129,9 +129,9 @@ void CVtxPosDummy::AddSelObj(CN3Transform * pObj) { POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; DWORD nFlags = pMsg->wParam; if (m_pSelectedCube && (nFlags & MK_LBUTTON)) { - __Vector3 vRayDir, vRayOrig; // ȭ ߾() 콺 ͸ - __Vector3 vPN, vPV; // Ե - __Vector3 vPos; // ( ) + __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 + __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 + __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) __Vector3 vCameraDir = s_CameraData.vAt - s_CameraData.vEye; vCameraDir.Normalize(); GetPickRay(point, vRayDir, vRayOrig); @@ -141,7 +141,7 @@ void CVtxPosDummy::AddSelObj(CN3Transform * pObj) { switch (m_pSelectedCube->iType) { case DUMMY_CENTER: { - // XZ ̰.. + // XZ평면 위로 움직이게.. vPN.Set(0, 1, 0); __Vector3 vPR = vPV - vRayOrig; float fT = D3DXVec3Dot(&vPN, &vPR) / D3DXVec3Dot(&vPN, &vRayDir); @@ -214,7 +214,7 @@ void CVtxPosDummy::AddSelObj(CN3Transform * pObj) { return TRUE; } } break; - case WM_RBUTTONDOWN: // ť ̹ 巡׷ ΰ ǵ + case WM_RBUTTONDOWN: // 큐브 선택 취소 및 이번 드래그로 움직인것 되돌려 놓기 { if (m_pSelectedCube) { __Vector3 vDiffPos = m_vPrevPos - m_vPos; @@ -232,7 +232,7 @@ void CVtxPosDummy::AddSelObj(CN3Transform * pObj) { } void CVtxPosDummy::TransDiff(__Vector3 * pvDiffPos, __Quaternion * pqDiffRot, - __Vector3 * pvDiffScale) // ̸ŭ õ Ʈ Ų. + __Vector3 * pvDiffScale) // 차이만큼 선택된 오브젝트들을 변형시킨다. { int iSize = m_SelVtxArray.GetSize(); if (iSize <= 0) { diff --git a/src/tool/N3ME/VtxPosDummy.h b/src/tool/N3ME/VtxPosDummy.h index 06b76823..bc4c47fa 100644 --- a/src/tool/N3ME/VtxPosDummy.h +++ b/src/tool/N3ME/VtxPosDummy.h @@ -6,7 +6,7 @@ #include "TransDummy.h" -// ̵Ű . +// 점을 이동시키는 기능을 가졌다. class CVtxPosDummy : public CTransDummy { public: CVtxPosDummy(); @@ -15,24 +15,24 @@ class CVtxPosDummy : public CTransDummy { // Attributes public: protected: - CTypedPtrArray m_SelVtxArray; // õ + CTypedPtrArray m_SelVtxArray; // 선택된 점들 // Operations public: virtual void Tick(); virtual void Render(); virtual void Release(); - virtual void SetSelObj(CN3Transform * pObj); // õ ü ٲٱ - virtual void AddSelObj(CN3Transform * pObj); // õ ü ߰ - virtual BOOL MouseMsgFilter(LPMSG pMsg); // 콺 ޼ ó + virtual void SetSelObj(CN3Transform * pObj); // 선택된 객체 바꾸기 + virtual void AddSelObj(CN3Transform * pObj); // 선택된 객체 추가 + virtual BOOL MouseMsgFilter(LPMSG pMsg); // 마우스 메세지 처리 - void SetSelVtx(__VertexXyzT1 * pVtx); // õ ٲٱ - void AddSelVtx(__VertexXyzT1 * pVtx); // õ ߰ + void SetSelVtx(__VertexXyzT1 * pVtx); // 선택된 점 바꾸기 + void AddSelVtx(__VertexXyzT1 * pVtx); // 선택된 점 추가 void AddPos(__Vector3 vAddPos) { m_vPos += vAddPos; } void PosRotate(__Matrix44 vRotate, __Vector3 vCenterPos); protected: virtual void TransDiff(__Vector3 * pvDiffPos, __Quaternion * pqDiffRot, - __Vector3 * pvDiffScale); // ̸ŭ õ Ʈ Ų. + __Vector3 * pvDiffScale); // 차이만큼 선택된 오므젝트들을 변형시킨다. }; diff --git a/src/tool/N3ME/Wall.h b/src/tool/N3ME/Wall.h index 8ff555cb..2607a80d 100644 --- a/src/tool/N3ME/Wall.h +++ b/src/tool/N3ME/Wall.h @@ -16,8 +16,8 @@ class CWall : public CN3Base { void Load(HANDLE hFile); void Save(HANDLE hFile); int GetSize() { return m_Wall.size(); } - bool GetVertex(int idx, __Vector3 * pPos); // idx° .. - void AddVertex(__Vector3 Vertex); //pathϱ. + bool GetVertex(int idx, __Vector3 * pPos); // idx째 점 가져오기.. + void AddVertex(__Vector3 Vertex); //path더하기. void DelPrevVertex(); CWall(); diff --git a/src/tool/N3ME/WallMgr.cpp b/src/tool/N3ME/WallMgr.cpp index acc68cf9..2e82a7fa 100644 --- a/src/tool/N3ME/WallMgr.cpp +++ b/src/tool/N3ME/WallMgr.cpp @@ -23,24 +23,24 @@ static char THIS_FILE[] = __FILE__; ////////////////////////////////////////////////////////////////////// CWallMgr::CWallMgr() { - m_BaseCube[0].Set(0, 1, 0); // LT - m_BaseCube[1].Set(1, 1, 0); // RT - m_BaseCube[2].Set(0, 0, 0); // LB - m_BaseCube[3].Set(1, 0, 0); // RB - m_BaseCube[4].Set(0, 1, 1); // LT - m_BaseCube[5].Set(1, 1, 1); // RT - m_BaseCube[6].Set(0, 0, 1); // LB - m_BaseCube[7].Set(1, 0, 1); // RB - - m_pRefMapMng = NULL; // .. - m_pWalls.clear(); // ... + m_BaseCube[0].Set(0, 1, 0); // 앞쪽 LT + m_BaseCube[1].Set(1, 1, 0); // 앞쪽 RT + m_BaseCube[2].Set(0, 0, 0); // 앞쪽 LB + m_BaseCube[3].Set(1, 0, 0); // 앞쪽 RB + m_BaseCube[4].Set(0, 1, 1); // 뒤쪽 LT + m_BaseCube[5].Set(1, 1, 1); // 뒤쪽 RT + m_BaseCube[6].Set(0, 0, 1); // 뒤쪽 LB + m_BaseCube[7].Set(1, 0, 1); // 뒤쪽 RB + + m_pRefMapMng = NULL; // 지형 참조 포인터.. + m_pWalls.clear(); // 벽들... m_pDlg = new CDlgMakeWall; m_pDlg->Create(IDD_MAKE_WALL); m_pDlg->ShowWindow(FALSE); m_pDlg->m_pRefWallMgr = this; - m_bActive = false; // ̱ Ȱȭ Ǿ ִ...1:Ȱȭ, 0:Ȱȭ.. + m_bActive = false; // 이기능이 활성화 되어 있는지...1:활성화, 0:비활성화.. m_pCurrWall = NULL; } @@ -217,7 +217,7 @@ void CWallMgr::Render() { D3DXMATRIX mtx; D3DXMatrixIdentity(&mtx); - hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // .. + hr = s_lpD3DDev->SetTransform(D3DTS_WORLD, &mtx); // 월드 행렬 적용.. // set texture hr = s_lpD3DDev->SetTexture(0, NULL); @@ -237,7 +237,7 @@ void CWallMgr::Render() { hr = s_lpD3DDev->SetFVF(FVF_XYZCOLOR); - //̹ ׸... + //이미 만들어진 길 그리기... std::list::iterator itWall; std::list<__Vector3>::iterator itVertex; @@ -270,7 +270,7 @@ void CWallMgr::Render() { } } - //̾α â õ ׸.. + //다이얼로그 창에서 선택된 길 그리기.. CWall * pSelWall = m_pDlg->m_pSelWall; if (pSelWall) { for (itVertex = pSelWall->m_Wall.begin(); itVertex != pSelWall->m_Wall.end(); itVertex++) { @@ -293,7 +293,7 @@ void CWallMgr::Render() { } } - // ִ & ׸.. + //만들고 있는 길 & 영역 그리기.. if (m_pCurrWall) { for (itVertex = m_pCurrWall->m_Wall.begin(); itVertex != m_pCurrWall->m_Wall.end(); itVertex++) { Vertex = (*itVertex); @@ -435,14 +435,14 @@ void CWallMgr::AddWall2Coll(CN3ShapeMgr * pShapeMgr) { __Vector3 PrevVertex(0, 0, 0), Vertex(0, 0, 0); __Vector3 v1, v2, v3; - // ؽƮϷ ̾ƺ.. + // 텍스트파일로 함 뽑아보자.. FILE * stream = fopen("c:\\Wall_info.txt", "w"); fprintf(stream, "Walls = %d\n", m_pWalls.size()); for (itWall = m_pWalls.begin(); itWall != m_pWalls.end(); itWall++) { pWall = (*itWall); if (!pWall) { - fprintf(stream, "ƽ.. µ õϳ....\n"); + fprintf(stream, "아싸..벽도 없는데 시도하네...ㅡ.ㅡ\n"); continue; } @@ -464,10 +464,10 @@ void CWallMgr::AddWall2Coll(CN3ShapeMgr * pShapeMgr) { v3.Set(Vertex.x, -5000.0f, Vertex.z); if (!pShapeMgr->AddCollisionTriangle(v1, v2, v3)) { - fprintf(stream, " ־...\n"); + fprintf(stream, "벽 못 넣었어..ㅡ.ㅡ\n"); } if (!pShapeMgr->AddCollisionTriangle(v1, v3, v2)) { - fprintf(stream, " ־...\n"); + fprintf(stream, "벽 못 넣었어..ㅡ.ㅡ\n"); } v1.Set(PrevVertex.x, 5000.0f, PrevVertex.z); @@ -475,10 +475,10 @@ void CWallMgr::AddWall2Coll(CN3ShapeMgr * pShapeMgr) { v3.Set(PrevVertex.x, -5000.0f, PrevVertex.z); if (!pShapeMgr->AddCollisionTriangle(v1, v2, v3)) { - fprintf(stream, " ־...\n"); + fprintf(stream, "벽 못 넣었어..ㅡ.ㅡ\n"); } if (!pShapeMgr->AddCollisionTriangle(v1, v3, v2)) { - fprintf(stream, " ־...\n"); + fprintf(stream, "벽 못 넣었어..ㅡ.ㅡ\n"); } PrevVertex = Vertex; diff --git a/src/tool/N3ME/WallMgr.h b/src/tool/N3ME/WallMgr.h index 6669da6e..343ae18d 100644 --- a/src/tool/N3ME/WallMgr.h +++ b/src/tool/N3ME/WallMgr.h @@ -20,11 +20,11 @@ class CWallMgr : public CN3BaseFileAccess { __VertexXyzColor m_BoardVB[4]; public: - CMapMng * m_pRefMapMng; // .. - std::list m_pWalls; // ... + CMapMng * m_pRefMapMng; // 지형 참조 포인터.. + std::list m_pWalls; // 벽들... CDlgMakeWall * m_pDlg; // path make dialog.. - bool m_bActive; // ̱ Ȱȭ Ǿ ִ...1:Ȱȭ, 0:Ȱȭ.. - CWall * m_pCurrWall; // ִ ..or غ .. + bool m_bActive; // 이기능이 활성화 되어 있는지...1:활성화, 0:비활성화.. + CWall * m_pCurrWall; // 현재 만들고 있는 벽..or 만들려고 준비한 버퍼.. protected: void MakeLine(__Vector3 sv, __Vector3 ev, D3DCOLOR color); diff --git a/src/tool/N3ME/WarpMgr.cpp b/src/tool/N3ME/WarpMgr.cpp index d23da094..05ddd2e7 100644 --- a/src/tool/N3ME/WarpMgr.cpp +++ b/src/tool/N3ME/WarpMgr.cpp @@ -22,7 +22,7 @@ static char THIS_FILE[] = __FILE__; ////////////////////////////////////////////////////////////////////// CWarpMgr::CWarpMgr() { - m_pRefMapMng = NULL; // .. + m_pRefMapMng = NULL; // 지형 참조 포인터.. m_bActive = false; m_ListWarpInfo.clear(); diff --git a/src/tool/N3ME/WarpMgr.h b/src/tool/N3ME/WarpMgr.h index ff81fdd6..7af8d1be 100644 --- a/src/tool/N3ME/WarpMgr.h +++ b/src/tool/N3ME/WarpMgr.h @@ -35,7 +35,7 @@ class CWarpMgr : public CN3BaseFileAccess { public: CDlgEditWarp * m_pDlg; - CMapMng * m_pRefMapMng; // .. + CMapMng * m_pRefMapMng; // 지형 참조 포인터.. bool m_bActive; std::list m_ListWarpInfo; diff --git a/src/tool/N3ME/res/N3ME.rc2 b/src/tool/N3ME/res/N3ME.rc2 index 5886ed2ffae202566374a1d87b87f796e7fc00be..bd07836d596f134dcd8368b9acbd760a730e5e07 100644 GIT binary patch literal 768 zcmd6l%W48a5Jk^6eno@JU0b=9q! zd#CF1QBcrw7bGTh88hUL8GY{cbler0BL~h}%i2z&O6^K-MAn?dz3MxPnzQxQ=hl^2 z8ISzLUMp}}Us+pmNA;zzE$aEV#=H6#P3acknKSHjTzZm z!KgCh#HMDG%rC8-^#!}1Eaohl_(BH%R~8(znnFWxj6e7{&(Idg>s()R&{Ne)O*?zJ ZZ#o+N`R-lx@b}5s)P2a#P^@d$`w8i?W<-9R2H9-Q@72WZ*Poq;?}0d4$DHUJ?9Kz1|)vqXjv32P(`+39k< z6^G`2sN3dP7Gjf-bJjr^*@I?75cdbs_3`ePzcP`~gsefSAEt=L73bAKh6s;tib2it PPDl7v#z>B&lxusRd8%YZ diff --git a/src/tool/N3TexViewer/DlgFormat.cpp b/src/tool/N3TexViewer/DlgFormat.cpp index f3e5baa7..80f76a02 100644 --- a/src/tool/N3TexViewer/DlgFormat.cpp +++ b/src/tool/N3TexViewer/DlgFormat.cpp @@ -130,6 +130,6 @@ void CDlgFormat::OnOK() { if (D3DFMT_UNKNOWN != m_Fmt && m_nWidth / 2 * 2 == m_nWidth && m_nHeight / 2 * 2 == m_nHeight) { CDialog::OnOK(); } else { - MessageBox("߸ ̰ų ؽó ũⰡ 2 ¼ ƴմϴ."); + MessageBox("잘못된 포맷이거나 텍스처의 크기가 2의 승수가 아닙니다."); } } diff --git a/src/tool/N3TexViewer/MainFrm.cpp b/src/tool/N3TexViewer/MainFrm.cpp index 58a5b882..42471dff 100644 --- a/src/tool/N3TexViewer/MainFrm.cpp +++ b/src/tool/N3TexViewer/MainFrm.cpp @@ -116,7 +116,7 @@ void CMainFrame::OnAdjustWindowSize() { } void CMainFrame::AdjustWindowSize() { - // ׸ũ⿡ ߱.. + // 그림크기에 윈도우 사이즈 맞추기.. DWORD dwStyle = this->GetStyle(); CRect rcFrm, rcView; this->GetWindowRect(rcFrm); @@ -158,7 +158,7 @@ void CMainFrame::OnFileConvert() { } pDoc->m_pTex->Convert(dlg.m_Fmt, dlg.m_nWidth, dlg.m_nHeight, dlg.m_bMipMap); - pDoc->SetTitle(""); // ŸƲ ٲٱ.. + pDoc->SetTitle(""); // 타이틀 바꾸기.. } void CMainFrame::OnToolConvertFilesAutomaticaly() { @@ -217,9 +217,9 @@ void CMainFrame::OnToolConvertFilesManually() { CN3Texture Tex; std::string szFN; szFN = dlg.GetPathName(); - Tex.LoadFromFile(szFN); // ÷ ϳ о.. + Tex.LoadFromFile(szFN); // 첨 하나 읽어보고.. - CDlgFormat dlgFormat; // ... + CDlgFormat dlgFormat; // 포맷 정학... dlgFormat.m_nWidth = Tex.Width(); dlgFormat.m_nHeight = Tex.Height(); dlgFormat.m_bMipMap = Tex.MipMapCount() > 1 ? TRUE : FALSE; @@ -239,7 +239,7 @@ void CMainFrame::OnToolConvertFilesManually() { char szFN2[_MAX_PATH] = "", szDrv[_MAX_DRIVE], szDir[_MAX_DIR], szFN[_MAX_FNAME], szExt[_MAX_EXT]; ::_splitpath(FileName, szDrv, szDir, szFN, szExt); lstrcpy(szExt, ".DXT"); - ::_makepath(szFN2, szDrv, szDir, szFN, szExt); // ̸ Ȯڸ DXT ٲ... + ::_makepath(szFN2, szDrv, szDir, szFN, szExt); // 파일 이름의 확장자를 DXT 로 바꿈... Tex.Convert(dlgFormat.m_Fmt, dlgFormat.m_nWidth, dlgFormat.m_nHeight, dlgFormat.m_bMipMap); Tex.m_szName = szFN2; @@ -255,16 +255,16 @@ void CMainFrame::OnToolCutBmp() { return; } - CDlgFormat dlgFmt; // ũ . + CDlgFormat dlgFmt; // 크기 및 저장 형식 지정. if (IDCANCEL == dlgFmt.DoModal()) { return; } - int nW = dlgFmt.m_nWidth; // ʺ - int nH = dlgFmt.m_nHeight; // - D3DFORMAT fmtSave = dlgFmt.m_Fmt; // - BitMap ϶ .. + int nW = dlgFmt.m_nWidth; // 너비 + int nH = dlgFmt.m_nHeight; // 높이 + D3DFORMAT fmtSave = dlgFmt.m_Fmt; // 포맷 - BitMap 일때는 무시.. - int nYesNo = MessageBox("DXT File Ͻðڽϱ?", " ", MB_YESNO); + int nYesNo = MessageBox("DXT File 로 저장하시겠습니까?", "저장 형식", MB_YESNO); bool bSaveToDXT = false; if (IDYES == nYesNo) { bSaveToDXT = true; @@ -279,12 +279,12 @@ BOOL CMainFrame::BMPCutter(LPCTSTR lpszFileName, int iWidth, int iHeight, bool b return FALSE; } - // file ̸ + // 저장할 file 이름 char szDrive[_MAX_DRIVE]; char szDir[_MAX_DIR]; char szFName[_MAX_FNAME]; _splitpath(lpszFileName, szDrive, szDir, szFName, NULL); - CreateDirectory(szFName, NULL); // + CreateDirectory(szFName, NULL); // 하위 폴더 만들기 int xx = BMF.Width() / iWidth; int yy = BMF.Height() / iHeight; @@ -326,86 +326,86 @@ BOOL CMainFrame::BMPCutter(LPCTSTR lpszFileName, int iWidth, int iHeight, bool b /* if (lstrlen(lpszFileName) == 0 || iWidth<=0 || iHeight<=0) { - MessageBox(" ΰ 0 bitmap ϴ.", "error"); + MessageBox("가로 세로가 0이하인 bitmap으로 나눌 수 없습니다.", "error"); return FALSE; } CFile file; CFileException fe; - // б + // 읽기 모드로 파일 열기 if (!file.Open(lpszFileName, CFile::modeRead|CFile::shareDenyWrite, &fe)) { - MessageBox(" bitmap ϴ.", "error"); + MessageBox("원본 bitmap을 열 수 없습니다.", "error"); return FALSE; } - // + // 파일 길이 DWORD dwBitsSize; dwBitsSize = file.GetLength(); - // б + // 파일 헤더 읽기 BITMAPFILEHEADER bmfHeader; if (file.Read(&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader)) { - MessageBox(" bitmap ̻մϴ.", "error"); + MessageBox("원본 bitmap이 이상합니다.", "error"); return FALSE; } - // bmp Ÿ "BM"Ŀ Ȯ + // bmp 파일임을 나타내는 "BM"마커 확인 if (bmfHeader.bfType != 0x4D42) { - MessageBox(" bitmap ƴմϴ.", "error"); + MessageBox("원본 파일이 bitmap파일이 아닙니다.", "error"); return FALSE; } - // BITMAPINFOHEADER + // BITMAPINFOHEADER 얻기 BITMAPINFOHEADER bmInfoHeader; if (file.Read(&bmInfoHeader, sizeof(bmInfoHeader)) != sizeof(bmInfoHeader)) return FALSE; - // ȼ Ʈ Ȯ + // 픽셀당 비트 수 확인 WORD wBitCount = bmInfoHeader.biBitCount; - if (24 != wBitCount) // 24Ʈ bmp ƴϸ return . + if (24 != wBitCount) // 24비트 bmp가 아니면 return해 버린다. { - MessageBox(" bitmap 24bit ƴմϴ.", "error"); + MessageBox("원본 bitmap이 24bit파일이 아닙니다.", "error"); return FALSE; } - // , η + // 가로, 세로로 나누어야 할 수 계산 int iCX, iCY; iCX = (bmInfoHeader.biWidth+iWidth-1) / iWidth; iCY = (bmInfoHeader.biHeight+iHeight-1) / iHeight; if (iCX <= 0 || iCY <= 0) { - MessageBox(" ϴ.", "error"); + MessageBox("나눌 수 없습니다.", "error"); return FALSE; } - // ̹ Ʈ ּ + // 실제 이미지 비트 주소 // LPVOID pSrcImageBit; // pSrcImageBit = (LPVOID)((BYTE*)pSrcDIB + (bmfHeader.bfOffBits - sizeof(bmfHeader))); - // ̹ ޸𸮻 (24bit) + // 실제 이미지의 메모리상에 잡힌 가로 길이 (24bit) int iRealWidthSrc = ((int)((bmInfoHeader.biWidth*3 + 3)/4))*4; - // ̹ ޸ Ҵ + // 새로 만들 이미지 메모리 할당 int iRealWidthDest = ((int)((iWidth*3 + 3)/4))*4; int iDestDIBSize = sizeof(BITMAPINFOHEADER) + iRealWidthDest * iHeight; LPVOID pDestDIB; if ((pDestDIB = ::GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, iDestDIBSize )) == NULL ) { - MessageBox("޸𸮸 Ҵ ߽ϴ.", "error"); + MessageBox("메모리를 할당하지 못했습니다.", "error"); return FALSE; } - // ̹ file header ä + // 새로 만들 이미지 file header 정보 채우기 BITMAPFILEHEADER bmfHeaderDest; memset(&bmfHeaderDest, 0, sizeof(bmfHeaderDest)); bmfHeaderDest.bfType = 0x4D42; // "BM" bmfHeaderDest.bfSize = sizeof(bmfHeaderDest) + iDestDIBSize; bmfHeaderDest.bfOffBits = sizeof(bmfHeaderDest) + sizeof(BITMAPINFOHEADER); - // ̹ bitmap info header ä + // 새로 만들 이미지 bitmap info header 정보 채우기 BITMAPINFOHEADER bmInfoHeaderDest; memset(&bmInfoHeaderDest, 0, sizeof(bmInfoHeaderDest)); bmInfoHeaderDest.biSize = sizeof(bmInfoHeaderDest); @@ -416,15 +416,15 @@ BOOL CMainFrame::BMPCutter(LPCTSTR lpszFileName, int iWidth, int iHeight, bool b bmInfoHeaderDest.biSizeImage = iRealWidthDest * iHeight; memcpy(pDestDIB, &bmInfoHeaderDest, sizeof(bmInfoHeaderDest)); - // file ̸ + // 저장할 file 이름 char szDrive[_MAX_DRIVE]; char szDir[_MAX_DIR]; char szFName[_MAX_FNAME]; char szFNameDest[_MAX_FNAME]; _splitpath(lpszFileName, szDrive, szDir, szFName, NULL); - CreateDirectory(szFName, NULL); // + CreateDirectory(szFName, NULL); // 하위 폴더 만들기 - // ɰ tcdϿ ־ + // 쪼갠 정보를 tcd파일에 넣어서 저장 DWORD dwNum; wsprintf(szFNameDest, "%s\\%s.tcd", szFName, szFName); HANDLE hFile = CreateFile(szFNameDest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); @@ -440,7 +440,7 @@ BOOL CMainFrame::BMPCutter(LPCTSTR lpszFileName, int iWidth, int iHeight, bool b ProgressBar.Create("cutting bitmap..", 50, iCY*iCX); ProgressBar.SetStep(1); - // ɰ ϱ + // 새로 쪼개서 저장하기 BYTE *pTmpBitDest; pTmpBitDest = ((BYTE*)pDestDIB) + sizeof(BITMAPINFOHEADER); for (int j=0; j= bmInfoHeader.biHeight) break; // Ʒ © 찡 ִ + if ( (iHeight*j + y) >= bmInfoHeader.biHeight) break; // 맨 아래가 짤릴 경우가 있다 - // о κ file position ° Ѵ. + // 원본파일의 읽어올 부분의 file position을 맞게 세팅한다. file.Seek(bmfHeader.bfOffBits + iRealWidthSrc*(bmInfoHeader.biHeight - 1 - (iHeight*j + y)) + 3*(iWidth*i), CFile::begin); if (i == (iCX-1)) - { // © ɼ ִ. + { // 맨 오른쪽 끝은 짤릴 가능성이 있다. file.Read(pTmpBitDest + iRealWidthDest*(iHeight-1-y), bmInfoHeader.biWidth*3 - iRealWidthDest*(iCX-1)); } else @@ -468,7 +468,7 @@ BOOL CMainFrame::BMPCutter(LPCTSTR lpszFileName, int iWidth, int iHeight, bool b } } - // ϱ + // 저장하기 if(bSaveToDXT) { wsprintf(szFNameDest, "%s%s%s\\ConversionTmp.bmp", szDrive, szDir, szFName, szFName, i, iCY-1-j); @@ -488,24 +488,24 @@ BOOL CMainFrame::BMPCutter(LPCTSTR lpszFileName, int iWidth, int iHeight, bool b ProgressBar.StepIt(); this->UpdateWindow(); - if(bSaveToDXT) // DXT Ϸ.. + if(bSaveToDXT) // DXT 를 저장하려면.. { char szDXT_FName[_MAX_PATH]; wsprintf(szDXT_FName, "%s%s%s\\%s_%02d%02d.DXT", szDrive, szDir, szFName, szFName, i, iCY-1-j); CN3Texture TexTmp; - TexTmp.LoadFromFile(szFNameDest); // ε - if(true == TexTmp.Convert(fmtDXT)) // ȯ + TexTmp.LoadFromFile(szFNameDest); // 로딩 + if(true == TexTmp.Convert(fmtDXT)) // 변환 { TexTmp.SaveToFile(szDXT_FName); } - DeleteFile(szFNameDest); // ӽ Ʈ .. + DeleteFile(szFNameDest); // 임시 비트맵 파일 지우기.. } } } - // ޸ Ǯ + // 메모리 풀어줌 ::GlobalFree(pDestDIB); file.Close(); diff --git a/src/tool/N3TexViewer/N3TexViewer.rc b/src/tool/N3TexViewer/N3TexViewer.rc index ed6f1e5ae53c917d7bc6dca7ee966aae14066ccc..ddb59d86fb6e8d96333ff3920ea7a27ee5247c7e 100644 GIT binary patch literal 25782 zcmdU&Pi)m!cE^7UR#q2X3{n$7U1z*v-IwU?7OtyLD`M!M*x6mkE?LvYq0zDAji)o0Hjb-JO+8kidlaozm}!_#G05NMgIL zZ`5D04cbfnpyYb4^-h%d>XVXFgzlV`giIrrrVFcI8yeXgYH?cfpm;5}>6w;Y998Qz zvOj7`1DnDQUy?2Ckban5jLQc0%R+{vAv4mG-P&H(TkmRX)V?_(82hA+Gooa#j$RIS z2tJqmOm-mX-zI5YpI{D37k3KNpnlOszv2+E&^_6D-5J+Y+mid}?hf7EuWJ(l&nfYK zP#)&EejD-=Cj-_Qc@eH27Kg8AoAqZ@VKI0mWPzUKDKl>q=`MQ@tY}hPz9Bk>h2M2; z_3iV%qS_1iGkw{B8w9^=GRLR?C)PEmTG31$A zNmbE&OjLa@^qtV1_ZCp=w7Q@0z0ppDOOJafF4)G;T&h zv~i+Eu~XiVCnpLa7W+Za)$i(vu@RPVMlHz`!}|Sx(CxFjO8Xqs8RH-{iSf(n*0ZyE z6TLqXtbsVMp(js;HyDdCqGFTL;$sT`%(FR`uZI@8`K#wK-D%PYh`rh_v+#Yzu%4bFwW?;of`8qjBO@EpF!{8 z5Yv6{sTr2U-j-w{P0x?cZWGnBAyz(>=&j4N+ZNuYR+tF-FcxG!s`j3g{9|l57RC|Y zB54axNO~uwX>Um{=@;G-HK#&6_WVdO&x3n~sGC)CoREx&$F@mI`y{n`t6-GG*vCdo zRWbH9Ntb9bwK8;`cASxYjDA-MF};WPz_T>7KltUl^Dkw8BAtFY z_y}+PDy#5&P6k* zhVs3_wjpeJoO`>(S+>P?ShIy62YHQ`cpR_6XV8kAmhHG5*2kC5T~o$!{=I8|K0kf6 zkvSEE&v=jWt;59FmF%nI@qLwSheFIk&iS<35GfCp_?@WXw}{_j6?_(B&+hOK|Lp27 zzPg5Prrd554Utc$zlhHzYy8g0OT@mk8|>};p5v^N*}3`8Zz8F&XKj+#$FU09fmfuz z$`^OS+sJb$=$x2BXlzMzKEzjbfwi{_RGx%;~e|&T80^F0GG;1uklylLJ zXR5OZtyR)wWh!L-ACrJ+R+&)=BOySQE|IJi3bLPkK3uMgUYd3{xT1t5u$p$ zc=Vl1<=`I|?p;OVQ*GM1h&^)QeKhesv_x5ZPwMaH`-{AW#kUsQUwnS~nB@P#r@MnU zo#=`OlfP>xaX=dJMOvKlDl5HtfYA#9ouPO=*FFpKU23!-uW?6pb)`)|~)pCC=J?jqppnBp{nzJH{ zKNR*SG-_p5u?oA((Dp?c3@Z8XQX)<`tNSCBDqJYLz!?W-r`YIohBJ?*~PTp=n5YO7c4C=-RS4$E3jx zMJOAyE!nHeiQ1kyHDnqihOz{a681aVWlz)09$$KNE5=^*bam|&L>5XYjq{hc5b@VKk zn!32OS~f8{t)^$W)GTcjRZUAn9&&jtRX4_|mQCI(muXraHIve}8EG7OjxucT-^zM3 zBaLL_H&J-2OijJc8txtPuvM5HH`y>MVHii?=eO59UDYnj#cer}$tB?)S4=XZ42Vgn z6D7N3zeJX0Nz_@c_0M>-d>bsj1zf_5!Cn2%;&Geh-qLp$-mJJ?&q=p8&>Y0 zS)P-c9nAN7WR1z)TQ-#al==uV)I>siRpU{g#cQat1NqtSMrEzHg!3)h_XVALGxVB3 zApWC&q>5yBZXSvHq66W6I-ZMHi4w=8pVaU%vlQ=8y*C~-p2)2)#FOch^sZGi(iV|3 zqqHNyoDkI41Le(Z_M^FL+^LHFi}OjvJ{WDQo-JE1>W4)iBO@E50c*W#Zy1>mWUuLW zV~``iG3KJu$vjsPmz~#h_}<)_g@zz+5Ip+yYW$l6&VknNK#&5J2a$qmyz%OIXgNHS zSrlG=DtW&%2W0e4Y37mH?jsug5lz1&=@2O+jec>_i34J5lP2xBHNkIHV`P=_rR7r!57`K3X?BE8SoOzNQLsAf zXuK6Wza3h~YCNd&wK?e>A)02kc~&j8SgRs7u^L?WK2f_ka?Kr5>(O6D`K}MW{y?kk z`@jUyohos|F zoVVu+zBbB^@g;C)UK05;lgYSiB=`twU?T;K;d__f98vGQOYrb`_@|ZQe3$Isy>mO> zQ~58J`}{~X?*lk%id*Vdd<0K+g*6GM^h;GtN*6sXvL(W_F*~|4Dv6B+xsOR&O<63t z8*%|ug)XMoGw<8rXf1kOdMz|R_9I@09BbFD`esN^ zteGoW8K1r(3i_47+ob9&X7sJbG}d?G<%ukI z>RzNZLb108TJMsDIwJ|Sd$#}CvtFZ_KD}2o8O+V$xrmbrTC0YFUc(sgT19>S8N*Z+ z?NWQcH)u7sN6n+vBOXy}91WSY5!uZnCUsiy3WdD|aQz-F`a+SH? z^ZlgSh_x+L9MSu+2IhG16jWhi*If5nMSrWfuY$rlf)k2N_h=8qrNMG(4GTiL&dIF9 zVaAb4jH}Wr+QrfDIP;e1xUd>(jQBOnX{ZgboyB3H{i!89tv#d5qMRa6OXp;_;2#Ol z%i{#+r+lY8f><195$lAwJE&g&urz?GweKxir}hT>IU?IJX?YuQmTFhE)HX=Jr}Vct zKE?u0s!eGp`a3N5&=NHnXsoe0tLSpJvb9+`LH&0xbU2S~Wi@$R@xx(pWm%H$<>dXg zdz0dM-iJ;G4f1whtoO`&DAP-7d#N7wI$*O1e82ftEZlr-npJQreNT@TYrUNpdURHe z#rWfSn(?7eCX(1GJ&losMJdG|ymM_jE7lliFn$6Wuo>N#anxta>T*h!Hz?-dXt^{C z*If_G92MDO;uhBBK`W5RBY3;|o-v4xABs=YC!{$Pf5S$%#iy%a69-$B>S&3U%{kan z2OSG?E@o1GpVA;7Gf*MF-biDsdfnJIE)Cz;+hu2+eV(i}jV|d!4k{vKt~TbX$*ou= z@J=12)#l5oI7Qd0Gq$dc`F&l!m34*urF}Q&7LBqRhuDv(pEVx&KJumPPnD$|4)aq~ zr=ECrR)m*Se^1&T0%4J2l|$gB8D;s`UlJN&cmxUH+iulLn9UgbS6t?MZ_ zP+twh<~itB(v1-fw%#2K=0T`>&TmMW>)pYyZ0PP148PtT6jp_>)*-(&)h}?pI~Z8@ zPyqsCIlB&w&icHR7WO>AOz7zklqiTiS#|l=&tAOwu4-K0pC7n+^ufZV$Ct21uRAaE z8sU2dMTD3?YG(Z(&uSjWG5pVMhfa-oJIH+RfjmLc;v9Z6Tl4V3ylVY!UlipI|I17N zddo3cgXqIBUm+*HykHI`K^$D@YIN}hO4=!Ho|M_3sX|!sZ zt8vA8=kBmY4Czs|Oo1J_;;cIy#ma5N)Xb2}nuRO(up4S#^RUyZaqz5+o#R*YtASEE zq{ptla3+Lu<+-+pv`YhTs@2s3WqhBl6pBMR=6$kEh z%&V2aUJ$M9b3F}$rkhWC1p;W2m9OZ{Vn z*;{yd3t6r{4=7vQTl(@AvV8jT7P5SJc?+q7w=(^b*TuzZ#Z>m`F_quD<@vsS&sN{9 zS(thlds4qw_N-q0)(wW)`8A3_t1q`84IjI!vI3Krs`yPGd`HO2Wc|3dm z;+j@OyE3ijv-hllV0>z8y~}jcyEJb8T5Em&{`z~@L&SLZ<{hW<#@&l|s^ab{=tRX< zvyx(IYVFc*uF(G%VSn)Hn67t&fpN*3Ig8I@$kYGT+=Uxc51!oCI?(&quRWc6bmhK| z*Znlc9XwIi!jvc0Jft}C$3=;qpMUq0D;KY{!Dvskmn888HOqNi@vJFXtzDQ7vDJ^} zpWa5E-?zupB{v&&ZT$>6vc~Ki zb9aB@I{%Hit3PSa9it*_irM@st#5`{GL9(F&&Uts4AG`*?YP<>bb&gA>Mbw9RC@pQ z#SfFQ5wdM$Tx*978Bjmsj?H4E4gkWy^6*5?Ibi5%KBFoSbt{2R5={*{Atbz_-> zW){~_qFqntX6H{`IDfH`{o#clf8nhjpP}8R9+ssQF=9nz+tQVdDc)w5uAT%ZW6G%q zWvuCQ5pS<0R?JzFJM%S>DcyeDRR4+(UTQQ%`io3!5q(wa{)e79>IB>4 zr!;nO4m@IF>{%7nbb{@XQ#EXhhn5PvUCyp5y7}_bZ!W}9bbj1Vd;7>Ap1uwZ$ER5h zEJrSJ+oOwUO@5{ES9AC8m>26LckG`^tXRPt;Ww3ey)94q;irFdHQ4^cftwSpIQZ+} z-F3qKW3e4QLm0n=!20q>S7@U&K9rx@|RlYXu`S|`wKG&P-lF`6C4eKA5wmzBfotCNX?n*Oz za{I|AFJ8dAGtXz=ydq=B*=(q7^0Pysa>iC)KfaQ;mh3W76Yr!?ag9~l7JbLu`UZ_L zBF#k^#H_kSa<slGYqRJZ~vX* zs6(suYwNzUjC!VZs(I|)_tUYR>i^Zy`MbdQE7Q~7e-#)$%aokx@vc zQs-~~c8ir3fV%jN--yqS3~PLjrx*W)U+9Syp6DrXSLc?e)#YJwKtE=sEuB4cU-thR C7Pkce literal 13815 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 Ad;kCd diff --git a/src/tool/N3TexViewer/N3TexViewer.vcxproj.filters b/src/tool/N3TexViewer/N3TexViewer.vcxproj.filters index b30b3d2b..86777f19 100644 --- a/src/tool/N3TexViewer/N3TexViewer.vcxproj.filters +++ b/src/tool/N3TexViewer/N3TexViewer.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/tool/N3TexViewer/N3TexViewer.vcxproj.user b/src/tool/N3TexViewer/N3TexViewer.vcxproj.user index 7912fcf6..1aa1e2ae 100644 --- a/src/tool/N3TexViewer/N3TexViewer.vcxproj.user +++ b/src/tool/N3TexViewer/N3TexViewer.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\game diff --git a/src/tool/N3TexViewer/N3TexViewerDoc.cpp b/src/tool/N3TexViewer/N3TexViewerDoc.cpp index d20d9c43..1988d5ea 100644 --- a/src/tool/N3TexViewer/N3TexViewerDoc.cpp +++ b/src/tool/N3TexViewer/N3TexViewerDoc.cpp @@ -86,7 +86,7 @@ BOOL CN3TexViewerDoc::OnOpenDocument(LPCTSTR lpszPathName) { return FALSE; } - this->FindFiles(); // ã.. + this->FindFiles(); // 파일을 찾고.. // TODO: Add your specialized creation code here m_pTexAlpha->Release(); @@ -95,7 +95,7 @@ BOOL CN3TexViewerDoc::OnOpenDocument(LPCTSTR lpszPathName) { } //////////////////////////////////////////////////////////////////////////////// - // Alpha Texture ... + // Alpha Texture 생성... m_pTexAlpha->Create(m_pTex->Width(), m_pTex->Height(), D3DFMT_A8R8G8B8, FALSE); LPDIRECT3DSURFACE9 lpSurf, lpSurf2; if (m_pTexAlpha->Get()) { @@ -121,7 +121,7 @@ BOOL CN3TexViewerDoc::OnOpenDocument(LPCTSTR lpszPathName) { lpSurf->Release(); lpSurf = NULL; } - // Alpha Texture ... + // Alpha Texture 생성... //////////////////////////////////////////////////////////////////////////////// char szDrv[_MAX_DRIVE], szDir[_MAX_DIR], szFN[_MAX_FNAME], szExt[_MAX_EXT]; @@ -139,7 +139,7 @@ BOOL CN3TexViewerDoc::OnSaveDocument(LPCTSTR lpszPathName) { char szDrv[_MAX_DRIVE], szDir[_MAX_DIR], szFN[_MAX_FNAME], szExt[_MAX_EXT]; ::_splitpath(lpszPathName, szDrv, szDir, szFN, szExt); - if (lstrcmpi(szExt, ".DXT") == 0) // Ȯڰ DXT ׳ .. + if (lstrcmpi(szExt, ".DXT") == 0) // 확장자가 DXT 면 그냥 저장.. { CDocument::OnSaveDocument(lpszPathName); @@ -149,7 +149,7 @@ BOOL CN3TexViewerDoc::OnSaveDocument(LPCTSTR lpszPathName) { return TRUE; } else { - MessageBox(::GetActiveWindow(), "Ȯڸ DXT ٲپ մϴ. Save As ּ.", " ", + MessageBox(::GetActiveWindow(), "확장자를 DXT 로 바꾸어야 합니다. Save As 로 저장해주세요.", "저장 실패", MB_OK); return FALSE; diff --git a/src/tool/N3TexViewer/ProgressBar.cpp b/src/tool/N3TexViewer/ProgressBar.cpp index ddb48d34..98fee450 100644 --- a/src/tool/N3TexViewer/ProgressBar.cpp +++ b/src/tool/N3TexViewer/ProgressBar.cpp @@ -33,25 +33,25 @@ END_MESSAGE_MAP() // CProgressBar message handlers BOOL CProgressBar::Create(LPCTSTR strMessage, int nSize, int MaxValue) { - // ¹ٸ + // 상태바를 얻음 CStatusBar * pStatusBar = GetStatusBar(); if (pStatusBar == NULL) { return FALSE; } - // ¹ α׷ Ʈѻ + // 상태바 위에 프로그레스 컨트롤생성 if (!CProgressCtrl::Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), pStatusBar, 1)) { return FALSE; } - // α׷ Ʈ + // 프로그레스 컨트롤의 범위와 스텝 설정 SetRange(0, MaxValue); SetStep(1); m_strMessage = strMessage; m_nSize = nSize; - // ġ ũ + // 위치와 크기 조정 Resize(); return TRUE; } @@ -76,20 +76,20 @@ void CProgressBar::Resize() { return; } - // ؽƮ + // 텍스트 출력 if (::IsWindow(m_hWnd) && IsWindowVisible()) { pStatusBar->SetWindowText(m_strMessage); pStatusBar->UpdateWindow(); } - // ؽƮ ϴ + // 텍스트가 차지하는 영역 계산 CClientDC dc(pStatusBar); CFont * pOldFont = dc.SelectObject(pStatusBar->GetFont()); CSize size = dc.GetTextExtent(m_strMessage); int margin = dc.GetTextExtent(_T(" ")).cx * 2; dc.SelectObject(pOldFont); - // α׷ Ʈ ׷ + // 프로그레스 컨트롤이 그려질 영역 계산 CRect rc; pStatusBar->GetItemRect(0, rc); rc.left = size.cx + 2 * margin; @@ -98,12 +98,12 @@ void CProgressBar::Resize() { rc.right = rc.left; } - // ¹ Ϸ 10% + // 상태바 상하로 10%의 여백을 둠 int Height = rc.bottom - rc.top; rc.bottom -= Height / 10; rc.top += Height / 10; - // α׷ Ʈ ġ ũ⸦ + // 프로그레스 컨트롤의 위치와 크기를 재조정 if (::IsWindow(m_hWnd) && (rc != m_Rect)) { MoveWindow(&rc); } diff --git a/src/tool/N3TexViewer/res/N3TexViewer.rc2 b/src/tool/N3TexViewer/res/N3TexViewer.rc2 index 7b94041645de48d12d79577f8e65a91faaf7c4a4..508ed1f851ba6fd159e09bd3ef271297c4b418b1 100644 GIT binary patch literal 782 zcmd6lNeaS15Jmr1Pto8~G@vICbs^$_^G-BrG2j46TzGl)RfxDy(4{ohRb5m5Pu2Yv zC{P&*w*>Lw$nf{c7oR;J7wf8@TFvJbl}xi zmE#l{qk4FBAQT1;QWWlf^o%pRgogX Wqnkody}Z*Aew8tjr6ft#_C5i^A7*v{ diff --git a/src/tool/N3Viewer/DlgBrowsePath.cpp b/src/tool/N3Viewer/DlgBrowsePath.cpp index 24207535..977db3a6 100644 --- a/src/tool/N3Viewer/DlgBrowsePath.cpp +++ b/src/tool/N3Viewer/DlgBrowsePath.cpp @@ -64,7 +64,7 @@ END_MESSAGE_MAP() BOOL CDlgBrowsePath::OnInitDialog() { CDialog::OnInitDialog(); - // ֱٿ ´... + // 최근에 쓴 폴더를 가져온다... char szInitDir[256]; DWORD dwLength = 256; memset(szInitDir, 0, 256); @@ -163,12 +163,12 @@ void CDlgBrowsePath::OnSynchFolders() { } void CDlgBrowsePath::OnOK() { - m_CBPath.GetWindowText(m_szPath); // .. + m_CBPath.GetWindowText(m_szPath); // 경로 기억.. if (m_szPath.GetLength() > 0) { - m_CBPath.InsertString(0, m_szPath); // ְ... + m_CBPath.InsertString(0, m_szPath); // 경로 넣고... } - // ֱٿ صд.... + // 최근에 쓴 폴더를 저장해둔다.... char szInitDir[256] = ""; CString szKey; HKEY hKey; diff --git a/src/tool/N3Viewer/DlgPMeshEdit.cpp b/src/tool/N3Viewer/DlgPMeshEdit.cpp index 9f431f85..2b2ba639 100644 --- a/src/tool/N3Viewer/DlgPMeshEdit.cpp +++ b/src/tool/N3Viewer/DlgPMeshEdit.cpp @@ -175,12 +175,12 @@ void CDlgPMeshEdit::OnButtonMakePmesh() { PMC.m_PMCOption.fWeight = OptDlg.m_fWeight; PMC.ReGenerate(pPMesh); - pPMesh->SaveToFile(); // + pPMesh->SaveToFile(); // 저장 pPMI->Create(pPMesh); int nVC = pPMesh->GetMaxNumVertices(); - int nFC = pPMI->GetNumIndices() / 3; // Face Count + int nFC = pPMI->GetNumIndices() / 3; // 현재 Face Count pPMI->SetLODByNumVertices(nVC); m_ScrollBar.SetScrollRange(0, nVC); @@ -219,15 +219,15 @@ void CDlgPMeshEdit::UpdateInfo() { int nVC = pPMesh->GetMaxNumVertices(); int nVCCur = pPMI->GetNumVertices(); - int nFC = pPMI->GetNumIndices() / 3; // Face Count + int nFC = pPMI->GetNumIndices() / 3; // 현재 Face Count m_ScrollBar.SetScrollRange(0, nVC); // m_ScrollBar.SetScrollPos(nVC); if (TRUE == pPMI->IsLOD()) { m_ScrollBar.EnableWindow(TRUE); - szTmp = "LOD ó "; + szTmp = "LOD 처리 됨"; } else { m_ScrollBar.EnableWindow(FALSE); - szTmp = "LOD ó ȵ"; + szTmp = "LOD 처리 안됨"; } SetDlgItemText(IDC_STATIC_LOD, szTmp); @@ -307,7 +307,7 @@ void CDlgPMeshEdit::OnBMakePmeshAll() { PMC.ReGenerate(pPMesh); - pPMesh->SaveToFile(); // + pPMesh->SaveToFile(); // 저장 pPMI->Create(pPMesh); } @@ -364,18 +364,18 @@ void CDlgPMeshEdit::LOD_Add() { return; } - CN3PMesh::__LODCtrlValue LODs[32]; // LOD Control Value .. + CN3PMesh::__LODCtrlValue LODs[32]; // LOD Control Value 복사.. int nLODCount = pPMesh->LODCtrlCount(); for (int i = 0; i < nLODCount; i++) { LODs[i] = *(pPMesh->LODCtrlGet(i)); } - __Vector3 vDist = pPD->m_Matrix.Pos() - pPMesh->s_CameraData.vEye; // ߰.. + __Vector3 vDist = pPD->m_Matrix.Pos() - pPMesh->s_CameraData.vEye; // 추가.. LODs[nLODCount].fDist = vDist.Magnitude() * pPMesh->s_CameraData.fFOV; LODs[nLODCount].iNumVertices = GetDlgItemInt(IDC_EDIT_NUMVERTICES); pPMesh->LODCtrlSet(LODs, nLODCount + 1); - pPMesh->SaveToFile(); // .. + pPMesh->SaveToFile(); // 저장.. this->UpdateInfo(); } @@ -394,7 +394,7 @@ void CDlgPMeshEdit::LOD_Delete() { return; } - CN3PMesh::__LODCtrlValue LODs[32]; // LOD Control Value .. + CN3PMesh::__LODCtrlValue LODs[32]; // LOD Control Value 복사.. int nLOD = 0; for (int i = 0; i < nSel; i++) { LODs[nLOD++] = *(pPMesh->LODCtrlGet(i)); @@ -403,7 +403,7 @@ void CDlgPMeshEdit::LOD_Delete() { LODs[nLOD++] = *(pPMesh->LODCtrlGet(i)); } pPMesh->LODCtrlSet(LODs, nLOD); - pPMesh->SaveToFile(); // .. + pPMesh->SaveToFile(); // 저장.. this->UpdateInfo(); } diff --git a/src/tool/N3Viewer/MainFrm.cpp b/src/tool/N3Viewer/MainFrm.cpp index 58e71209..b1a5e7a8 100644 --- a/src/tool/N3Viewer/MainFrm.cpp +++ b/src/tool/N3Viewer/MainFrm.cpp @@ -80,12 +80,12 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); - // Engine + // Engine 생성 // m_Eng.InitEnv(); if (!m_Eng.Init(TRUE, m_hWnd, 64, 64, 0, TRUE)) { return -1; } - m_Eng.GridCreate(1000, 1000); // ׸ .. + m_Eng.GridCreate(1000, 1000); // 그리드 만들기.. return 0; } @@ -252,7 +252,7 @@ void CMainFrame::OnToolFixProgressiveMesh() { } CFile file; - file.Open("α׷ú ޽ ó ȵ Ʈ.txt", CFile::modeWrite | CFile::modeCreate); + file.Open("프로그레시브 메쉬 처리 안된 리스트.txt", CFile::modeWrite | CFile::modeCreate); CN3PMesh PM; POSITION pos = dlg.GetStartPosition(); @@ -265,13 +265,13 @@ void CMainFrame::OnToolFixProgressiveMesh() { if (PM.LODCtrlCount() <= 0 || PM.CollapsesCount() <= 0) { CString szWarning; - szWarning.Format("LOD ó ȵ : %s\r\n", PM.FileName().c_str()); + szWarning.Format("LOD 처리 안됨 : %s\r\n", PM.FileName().c_str()); file.Write(szWarning, szWarning.GetLength()); } } MessageBox( - "α׷ú ó ȵ ϸƮ \"α׷ú ޽ ó ȵ Ʈ.txt\" Ͽ ϵǾϴ."); + "프로그레시브 처리가 안된 파일리스트는 \"프로그레시브 메쉬 처리 안된 리스트.txt\" 파일에 기록되었습니다."); file.Close(); delete[] pBuff; diff --git a/src/tool/N3Viewer/N3Viewer.rc b/src/tool/N3Viewer/N3Viewer.rc index e7f4ecfe44ae74a330b8e005ca316f4ca6b61006..f7665245e801618d18be35247a8e255336b531b6 100644 GIT binary patch literal 49106 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 C4`+Y? literal 25733 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 diff --git a/src/tool/N3Viewer/N3Viewer.vcxproj.filters b/src/tool/N3Viewer/N3Viewer.vcxproj.filters index d9f2831e..a2c8d9cb 100644 --- a/src/tool/N3Viewer/N3Viewer.vcxproj.filters +++ b/src/tool/N3Viewer/N3Viewer.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/tool/N3Viewer/N3Viewer.vcxproj.user b/src/tool/N3Viewer/N3Viewer.vcxproj.user index 7912fcf6..1aa1e2ae 100644 --- a/src/tool/N3Viewer/N3Viewer.vcxproj.user +++ b/src/tool/N3Viewer/N3Viewer.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\game diff --git a/src/tool/N3Viewer/N3ViewerDoc.cpp b/src/tool/N3Viewer/N3ViewerDoc.cpp index 279c5aa6..bca560b9 100644 --- a/src/tool/N3Viewer/N3ViewerDoc.cpp +++ b/src/tool/N3Viewer/N3ViewerDoc.cpp @@ -131,10 +131,10 @@ BOOL CN3ViewerDoc::OnSaveDocument(LPCTSTR lpszPathName) { void CN3ViewerDoc::OnFileImport() { CString szExt = ""; - // CString szFilter = "N3D Object File|*.*|ī޶ Data(*.N3Camera)|*.N3Camera|Light Data(*.N3Light)|*.N3Light|Shape Data(*.N3Shape)|*.N3Shape|\ + // CString szFilter = "N3D Object File|*.*|카메라 Data(*.N3Camera)|*.N3Camera|Light Data(*.N3Light)|*.N3Light|Shape Data(*.N3Shape)|*.N3Shape|\ // Progressive Mesh Data(*.N3PMesh)|*.N3Mesh|Indexed Mesh Data(*.N3IMesh)|*.N3IMesh|Joint Data(*.N3Joint)|*.N3Joint|Skinning Data(*.N3Skin)|*.N3Skin|Character Data(*.N3Chr)|*.N3Chr||"; CString szFilter = - "N3D Object File|*.*|ī޶(*.N3Camera)|*.N3Camera|Light(*.N3Light)|*.N3Light|Progressive " + "N3D Object File|*.*|카메라(*.N3Camera)|*.N3Camera|Light(*.N3Light)|*.N3Light|Progressive " "Mesh(*.N3PMesh)|*.N3PMesh|Shape(*.N3Shape)|*.N3Shape|Character(*.N3Chr)|*.N3Chr|Plug(*.N3CPlug)|*.N3CPlug||"; CString FileName; @@ -202,14 +202,14 @@ void CN3ViewerDoc::OnFileImport() { pPart->TexAlloc(1); pPart->TexSet(0, pTex->FileName()); - pShape->FindMinMax(); // ū, ã.. + pShape->FindMinMax(); // 큰값, 작은값 찾기.. continue; } else { continue; } - pBase->LoadFromFile(std::string(FileName)); // Ͽ д´.. + pBase->LoadFromFile(std::string(FileName)); // 파일에서 읽는다.. m_pSelectedObj = pBase; if (lstrcmpi(szExt, "N3PMesh") == 0) { @@ -242,7 +242,7 @@ void CN3ViewerDoc::OnFileExport() { if (dwType & OBJ_CAMERA) { szExt = "Camera"; - szFilter = "ī޶ Data(*.N3Camera)|*.N3Camera||"; + szFilter = "카메라 Data(*.N3Camera)|*.N3Camera||"; } else if (dwType & OBJ_LIGHT) { szExt = "N3Light"; szFilter = "Light Data(*.N3Light)|*.N3Light||"; diff --git a/src/tool/N3Viewer/N3ViewerView.cpp b/src/tool/N3Viewer/N3ViewerView.cpp index 2e1b9719..adf6d66e 100644 --- a/src/tool/N3Viewer/N3ViewerView.cpp +++ b/src/tool/N3Viewer/N3ViewerView.cpp @@ -70,7 +70,7 @@ CN3ViewerView::CN3ViewerView() { m_bViewClimbMesh = false; m_bViewSelectedMeshWireFrame = false; - m_crBkg = 0xff606060; // ⺻ ȸ. + m_crBkg = 0xff606060; // 기본 배경색은 회색. } CN3ViewerView::~CN3ViewerView() {} @@ -96,7 +96,7 @@ void CN3ViewerView::OnDraw(CDC * pDC) { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - if (pCamera->m_bFogUse) // Ȱ ̸.. + if (pCamera->m_bFogUse) // 안개 사용이면.. { D3DCOLOR crFog = pCamera->m_FogColor; pFrm->m_Eng.Clear(crFog); @@ -127,8 +127,8 @@ void CN3ViewerView::OnDraw(CDC * pDC) { } if (MODE_NORMAL == pFrm->m_eMode) { - pDoc->m_Scene.Render(); // Scene .. - if (pDoc->m_pSelectedObj) // õȰ .. + pDoc->m_Scene.Render(); // Scene 렌더링.. + if (pDoc->m_pSelectedObj) // 선택된것 렌더링.. { DWORD dwType = pDoc->m_pSelectedObj->Type(); @@ -147,12 +147,12 @@ void CN3ViewerView::OnDraw(CDC * pDC) { int nPart = pFrm->GetViewProperty()->m_CBShapePart.GetCurSel(); CN3SPart * pPD = pShape->Part(nPart); if (pPD) { - pPD->RenderSelected(m_bViewSelectedMeshWireFrame); // õ κи .. + pPD->RenderSelected(m_bViewSelectedMeshWireFrame); // 선택된 부분만 렌더링.. } else { pShape->RenderSelected(m_bViewSelectedMeshWireFrame); } - if (m_bViewObjectAxis && pFrm->GetViewProperty()->m_CBShapePart.GetSafeHwnd()) // ̱.. + if (m_bViewObjectAxis && pFrm->GetViewProperty()->m_CBShapePart.GetSafeHwnd()) // 축 보이기.. { int nPart = pFrm->GetViewProperty()->m_CBShapePart.GetCurSel(); CN3SPart * pPart = pShape->Part(nPart); @@ -169,10 +169,10 @@ void CN3ViewerView::OnDraw(CDC * pDC) { int nPart = -1; int nPC = -1; - if (pFrm->m_DlgPMeshEdit.m_bPreview) // Preview + if (pFrm->m_DlgPMeshEdit.m_bPreview) // Preview 모드 { float fFrm = pDoc->m_Scene.m_fFrmCur; - pShape->Tick(fFrm); // ڵ LOD .. + pShape->Tick(fFrm); // 자동으로 LOD 계산.. } else { nPart = pFrm->m_DlgPMeshEdit.m_CBPart.GetCurSel(); nPC = pShape->PartCount(); @@ -186,7 +186,7 @@ void CN3ViewerView::OnDraw(CDC * pDC) { int nVC = pFrm->m_DlgPMeshEdit.GetDlgItemInt(IDC_EDIT_NUMVERTICES); pPD->MeshInstance()->SetLODByNumVertices(nVC); } else { - pPD->MeshInstance()->SetLOD(0); // Բ.. + pPD->MeshInstance()->SetLOD(0); // 몽땅 보게끔.. } } } @@ -203,7 +203,7 @@ void CN3ViewerView::OnDraw(CDC * pDC) { pFrm->m_Eng.s_lpD3DDev->EndScene(); pFrm->m_Eng.Present(m_hWnd); - // ǥ + // 프레임 표시 #ifdef _DEBUG static CString szInfo0, szInfo1, szInfo2; szInfo0.Format("FPS : %6.2f", pFrm->m_Eng.s_fFrmPerSec); @@ -269,7 +269,7 @@ void CN3ViewerView::OnLButtonDown(UINT nFlags, CPoint point) { pFrm->GetViewSceneTree()->SelectObject(TVI_ROOT, GetDocument()->m_pSelectedObj); // Tree Select if (pDoc->m_pSelectedObj && pDoc->m_pSelectedObj->Type() & OBJ_SHAPE) { - pFrm->GetViewProperty()->m_CBShapePart.SetCurSel(nPart); // Ʈ .. + pFrm->GetViewProperty()->m_CBShapePart.SetCurSel(nPart); // 파트 선택.. } pFrm->GetViewProperty()->UpdateInfo(); this->InvalidateRect(NULL, FALSE); @@ -324,7 +324,7 @@ CN3Base * CN3ViewerView::Pick(POINT point, int * pnPart) { if (nPart >= 0) { m_pSelObjs[0] = sort[i].pObj; if (pnPart) { - *pnPart = nPart; // ° Ʈ ... + *pnPart = nPart; // 몇번째 파트가 찍혔나... } return m_pSelObjs[0]; } diff --git a/src/tool/N3Viewer/N3ViewerView.h b/src/tool/N3Viewer/N3ViewerView.h index 4a073cf0..0eb771fa 100644 --- a/src/tool/N3Viewer/N3ViewerView.h +++ b/src/tool/N3Viewer/N3ViewerView.h @@ -25,7 +25,7 @@ class CN3ViewerView : public CView { __Vector3 vMin, vMax; }; CN3Base * m_pSelObjs[MAX_SELECT]; - D3DCOLOR m_crBkg; // Ȱ + D3DCOLOR m_crBkg; // 안개가 꺼졌을때 배경색 protected: // create from serialization only CN3ViewerView(); diff --git a/src/tool/N3Viewer/ViewProperty.cpp b/src/tool/N3Viewer/ViewProperty.cpp index cc1ac521..bf7110d5 100644 --- a/src/tool/N3Viewer/ViewProperty.cpp +++ b/src/tool/N3Viewer/ViewProperty.cpp @@ -180,7 +180,7 @@ void CViewProperty::UpdateInfo() { if (pItem) { pItem->m_curValue.Format("%f", pC->m_Data.fFP); } - pItem = m_LPCamera.GetPropItem("Ȱ "); + pItem = m_LPCamera.GetPropItem("안개 사용"); if (pItem) { if (pC->m_bFogUse) { pItem->m_curValue = "On"; @@ -188,15 +188,15 @@ void CViewProperty::UpdateInfo() { pItem->m_curValue = "Off"; } } - // pItem = m_LPCamera.GetPropItem("Ȱ е"); + // pItem = m_LPCamera.GetPropItem("안개 밀도"); // if(pItem) pItem->m_curValue.Format("%f", pC->m_fFogDensity); - pItem = m_LPCamera.GetPropItem("Ȱ "); + pItem = m_LPCamera.GetPropItem("안개 색"); if (pItem) { pItem->D3DColorSet(pC->m_FogColor); } - // pItem = m_LPCamera.GetPropItem("Ȱ "); + // pItem = m_LPCamera.GetPropItem("안개 시작"); // if(pItem) pItem->m_curValue.Format("%f", pC->m_fFogStart); - // pItem = m_LPCamera.GetPropItem("Ȱ "); + // pItem = m_LPCamera.GetPropItem("안개 끝"); // if(pItem) pItem->m_curValue.Format("%f", pC->m_fFogEnd); m_LPCamera.Invalidate(); @@ -284,7 +284,7 @@ void CViewProperty::UpdateInfo() { CN3Shape * pS = (CN3Shape *)pBase; CPropertyItem * pItem; - pItem = m_LPShape.GetPropItem("Ҽ"); + pItem = m_LPShape.GetPropItem("소속"); if (pItem) { pItem->m_curValue.Format("%d", pS->m_iBelong); } @@ -302,7 +302,7 @@ void CViewProperty::UpdateInfo() { } pItem = m_LPShape.GetPropItem("NPC Status"); if (pItem) { - pItem->m_curValue.Format("%d", pS->m_iNPC_Status); // NPC Ʈ NPC Type + pItem->m_curValue.Format("%d", pS->m_iNPC_Status); // NPC 로 쓰는 오브젝트일 경우 NPC Type } int nPartCount = pS->PartCount(); @@ -488,7 +488,7 @@ void CViewProperty::UpdateInfo() { } } - // ̴ Ʈ(, ű ...) ǥ + // 붙이는 오브젝트(무기, 장신구 등...) 정보 표시 int nPlug = m_CBChrPlug.GetCurSel(); int nPlugCount = pC->PlugCount(); m_CBChrPlug.ResetContent(); @@ -659,19 +659,19 @@ BOOL CViewProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { pC->m_Data.fNP = (float)atof(pItem->m_curValue); } else if (pItem->m_propName == "Far Plane") { pC->m_Data.fFP = (float)atof(pItem->m_curValue); - } else if (pItem->m_propName == "Ȱ ") { + } else if (pItem->m_propName == "안개 사용") { if (lstrcmpi(pItem->m_curValue, "on") == 0) { pC->m_bFogUse = TRUE; } else { pC->m_bFogUse = FALSE; } } - // else if(pItem->m_propName == "Ȱ е") pC->m_fFogDensity = (float)atof(pItem->m_curValue); - else if (pItem->m_propName == "Ȱ ") { + // else if(pItem->m_propName == "안개 밀도") pC->m_fFogDensity = (float)atof(pItem->m_curValue); + else if (pItem->m_propName == "안개 색") { pC->m_FogColor = pItem->D3DColorGet(); } - // else if(pItem->m_propName == "Ȱ ") pC->m_fFogStart = (float)atof(pItem->m_curValue); - // else if(pItem->m_propName == "Ȱ ") pC->m_fFogEnd = (float)atof(pItem->m_curValue); + // else if(pItem->m_propName == "안개 시작") pC->m_fFogStart = (float)atof(pItem->m_curValue); + // else if(pItem->m_propName == "안개 끝") pC->m_fFogEnd = (float)atof(pItem->m_curValue); } if ((void *)wParam == &m_LPLight && (pBase->Type() & OBJ_LIGHT)) { @@ -721,7 +721,7 @@ BOOL CViewProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { CN3SPart * pPD = pS->Part(nPart); CPropertyItem * pItem = (CPropertyItem *)lParam; - if (pItem->m_propName == "Ҽ" && pItem->m_curValue.GetLength() > 0) { + if (pItem->m_propName == "소속" && pItem->m_curValue.GetLength() > 0) { pS->m_iBelong = atoi(pItem->m_curValue); } else if (pItem->m_propName == "Event ID" && pItem->m_curValue.GetLength() > 0) { pS->m_iEventID = atoi(pItem->m_curValue); @@ -730,7 +730,7 @@ BOOL CViewProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { } else if (pItem->m_propName == "NPC ID" && pItem->m_curValue.GetLength() > 0) { pS->m_iNPC_ID = atoi(pItem->m_curValue); } else if (pItem->m_propName == "NPC Status" && pItem->m_curValue.GetLength() > 0) { - pS->m_iNPC_Status = atoi(pItem->m_curValue); // NPC Ʈ NPC Type + pS->m_iNPC_Status = atoi(pItem->m_curValue); // NPC 로 쓰는 오브젝트일 경우 NPC Type } else if (pItem->m_propName == "Collision Mesh File" && pItem->m_curValue.GetLength() > 0) { @@ -876,12 +876,12 @@ BOOL CViewProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { // CN3CPart* pPD = pC->Part(nPart); // if(pPD) // { - // if(pItem->m_curValue == "Ӹī") pPD->m_Type = PART_HAIR; - // else if(pItem->m_curValue == "") pPD->m_Type = PART_FACE; - // else if(pItem->m_curValue == "ü") pPD->m_Type = PART_UPPER; - // else if(pItem->m_curValue == "ü") pPD->m_Type = PART_LOWER; - // else if(pItem->m_curValue == "") pPD->m_Type = PART_HAND; - // else if(pItem->m_curValue == "") pPD->m_Type = PART_FOOT; + // if(pItem->m_curValue == "머리카락") pPD->m_Type = PART_HAIR; + // else if(pItem->m_curValue == "얼굴") pPD->m_Type = PART_FACE; + // else if(pItem->m_curValue == "상체") pPD->m_Type = PART_UPPER; + // else if(pItem->m_curValue == "하체") pPD->m_Type = PART_LOWER; + // else if(pItem->m_curValue == "손") pPD->m_Type = PART_HAND; + // else if(pItem->m_curValue == "발") pPD->m_Type = PART_FOOT; // else if(pItem->m_curValue == "??") pPD->m_Type = PART_UNKNOWN; // } // this->UpdateInfo(); @@ -909,7 +909,7 @@ BOOL CViewProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { } // else if(pItem->m_propName == "Plug Type") pPlug->m_Type = (e_PlugType)pItem->m_crColor; else if (pItem->m_propName == "Plug Joint") { - int nJI = atoi(pItem->m_curValue); // Joint Index  ϵ... + int nJI = atoi(pItem->m_curValue); // Joint Index 가 영역을 벗어나지 못하도록... int nJC = 0; CN3Joint * pJ = pC->Joint(); if (pJ) { @@ -1005,31 +1005,31 @@ void CViewProperty::OnInitialUpdate() { int nH = 0; ///////////////////////////////////// - // Transform + // Transform 등록 정보 m_LPTransform.AddPropItem("Position", "", PIT_EDIT, ""); m_LPTransform.AddPropItem("Rotation", "", PIT_EDIT, ""); m_LPTransform.AddPropItem("Scale", "", PIT_EDIT, ""); - // Transform + // Transform 등록 정보 ///////////////////////////////////// ///////////////////////////////////// - // Camera + // Camera 등록 정보 m_LPCamera.AddPropItem("Eye", "", PIT_EDIT, ""); m_LPCamera.AddPropItem("At", "", PIT_EDIT, ""); m_LPCamera.AddPropItem("Up", "", PIT_EDIT, ""); m_LPCamera.AddPropItem("Field Of View", "", PIT_EDIT, ""); m_LPCamera.AddPropItem("Near Plane", "", PIT_EDIT, ""); m_LPCamera.AddPropItem("Far Plane", "", PIT_EDIT, ""); - m_LPCamera.AddPropItem("Ȱ ", "", PIT_EDIT, ""); - // m_LPCamera.AddPropItem("Ȱ е", "", PIT_EDIT, ""); - m_LPCamera.AddPropItem("Ȱ ", "", PIT_COLOR, ""); - // m_LPCamera.AddPropItem("Ȱ ", "", PIT_EDIT, ""); - // m_LPCamera.AddPropItem("Ȱ ", "", PIT_EDIT, ""); - // Camera + m_LPCamera.AddPropItem("안개 사용", "", PIT_EDIT, ""); + // m_LPCamera.AddPropItem("안개 밀도", "", PIT_EDIT, ""); + m_LPCamera.AddPropItem("안개 색", "", PIT_COLOR, ""); + // m_LPCamera.AddPropItem("안개 시작", "", PIT_EDIT, ""); + // m_LPCamera.AddPropItem("안개 끝", "", PIT_EDIT, ""); + // Camera 등록 정보 ///////////////////////////////////// ///////////////////////////////////// - // Light + // Light 등록 정보 m_LPLight.AddPropItem("On", "", PIT_EDIT, ""); m_LPLight.AddPropItem("Number", "", PIT_EDIT, ""); m_LPLight.AddPropItem("Type", "", PIT_COMBO, "Null|Point|Spot|Directional|"); @@ -1041,13 +1041,13 @@ void CViewProperty::OnInitialUpdate() { m_LPLight.AddPropItem("Attenuation0", "", PIT_EDIT, ""); m_LPLight.AddPropItem("Attenuation1", "", PIT_EDIT, ""); m_LPLight.AddPropItem("Attenuation2", "", PIT_EDIT, ""); - // Light + // Light 등록 정보 ///////////////////////////////////// CString str, strTmp; ///////////////////////////////////// - // Material + // Material 등록 정보 m_LPMaterial.AddPropItem("Render Flags", "0", PIT_EDIT, "", 0); strTmp = "Null|D3DBLEND_ZERO|D3DBLEND_ONE|D3DBLEND_SRCCOLOR|D3DBLEND_INVSRCCOLOR|D3DBLEND_SRCALPHA|D3DBLEND_INVSRCALPHA|D3DBLEND_DESTALPHA|\ @@ -1070,7 +1070,7 @@ void CViewProperty::OnInitialUpdate() { m_LPMaterial.AddPropItem("Diffuse Color", "", PIT_COLOR, ""); m_LPMaterial.AddPropItem("Specular Color", "", PIT_COLOR, ""); m_LPMaterial.AddPropItem("Emissive Color", "", PIT_COLOR, ""); - // Material + // Material 등록 정보 ///////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1080,39 +1080,39 @@ void CViewProperty::OnInitialUpdate() { // for(int i = 0; i < nPartCount; i++) { strTmp.Format("%d", i); m_CBShapePart.AddString(strTmp); } // m_CBShapePart.SetCurSel(0); - m_LPShape.AddPropItem("Ҽ", "", PIT_EDIT, ""); + m_LPShape.AddPropItem("소속", "", PIT_EDIT, ""); m_LPShape.AddPropItem("Event ID", "", PIT_EDIT, ""); m_LPShape.AddPropItem("Event Type", "", PIT_EDIT, ""); m_LPShape.AddPropItem("NPC ID", "", PIT_EDIT, ""); m_LPShape.AddPropItem("NPC Status", "", PIT_EDIT, ""); - m_LPShape.AddPropItem("Part Add", "Part ߰", PIT_BUTTON, ""); - m_LPShape.AddPropItem("Part Delete", "Part ", PIT_BUTTON, ""); + m_LPShape.AddPropItem("Part Add", "Part 추가", PIT_BUTTON, ""); + m_LPShape.AddPropItem("Part Delete", "Part 삭제", PIT_BUTTON, ""); m_LPShape.AddPropItem("Face, Vertex Count", "", PIT_EDIT, ""); m_LPShape.AddPropItem("Texture File", "", PIT_FILE_MULTI, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); m_LPShape.AddPropItem("Texture Animaion Speed", "", PIT_EDIT, ""); m_LPShape.AddPropItem("Mesh File", "", PIT_FILE, "N3 Progressive Mesh File(*.N3PMesh)|*.N3PMesh||"); m_LPShape.AddPropItem("Make Smooth", "", PIT_BUTTON, ""); m_LPShape.AddPropItem("Make Sharp", "", PIT_BUTTON, ""); m_LPShape.AddPropItem("Collision Mesh File", "", PIT_FILE, "N3 Vector Mesh(*.N3VMesh)|*.N3VMesh||"); - m_LPShape.AddPropItem("Collision Mesh Delete", "Collision Mesh ", PIT_BUTTON, ""); + m_LPShape.AddPropItem("Collision Mesh Delete", "Collision Mesh 삭제", PIT_BUTTON, ""); // Shape ///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// - // ij + // 캐릭터 m_LPChr.AddPropItem("Joint File", "", PIT_FILE, "N3 Joint File(*.N3Joint)|*.N3Joint||"); m_LPChr.AddPropItem("Collision Mesh File", "", PIT_FILE, "N3 Vector Mesh(*.N3VMesh)|*.N3VMesh||"); - m_LPChr.AddPropItem("Collision Mesh Delete", "Collision Mesh ", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Collision Mesh Delete", "Collision Mesh 삭제", PIT_BUTTON, ""); // m_LPChr.AddPropItem("Collision Skin File", "", PIT_FILE, "N3 Skin File(*.N3Skin)|*.N3Skin||"); - // m_LPChr.AddPropItem("Collision Skin Delete", "Collision Skin ", PIT_BUTTON, ""); + // m_LPChr.AddPropItem("Collision Skin Delete", "Collision Skin 삭제", PIT_BUTTON, ""); - m_LPChr.AddPropItem("Part Add", "Part ߰", PIT_BUTTON, ""); - m_LPChr.AddPropItem("Part Delete", "Part ", PIT_BUTTON, ""); - m_LPChr.AddPropItem("Plug Add", "Plug ߰", PIT_BUTTON, ""); - m_LPChr.AddPropItem("Plug Delete", "Plug ", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Part Add", "Part 추가", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Part Delete", "Part 삭제", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Plug Add", "Plug 추가", PIT_BUTTON, ""); + m_LPChr.AddPropItem("Plug Delete", "Plug 삭제", PIT_BUTTON, ""); m_CBChrPart.ResetContent(); m_CBChrPart.SetCurSel(0); @@ -1125,20 +1125,20 @@ void CViewProperty::OnInitialUpdate() { m_CBChrLOD.SetCurSel(0); m_LPCPart.AddPropItem("Part File", "", PIT_FILE, "N3 Character part file(*.N3CPart)|*.N3CPart||"); - // m_LPCPart.AddPropItem("Part Type", "", PIT_COMBO, "Ӹī||ü|ü|||??|"); + // m_LPCPart.AddPropItem("Part Type", "", PIT_COMBO, "머리카락|얼굴|상체|하체|손|발|??|"); m_LPCPart.AddPropItem("Texture File", "", PIT_FILE, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); m_LPCPlug.AddPropItem("Plug Name", "", PIT_EDIT, ""); - // m_LPCPlug.AddPropItem("Plug Type", "", PIT_COMBO, "|޼|"); + // m_LPCPlug.AddPropItem("Plug Type", "", PIT_COMBO, "오른손장착|왼손장착|양손장착"); m_LPCPlug.AddPropItem("Plug Joint", "", PIT_EDIT, ""); m_LPCPlug.AddPropItem("Plug Mesh File", "", PIT_FILE, "N3 Progressive Mesh File(*.N3PMesh)|*.N3PMesh||"); m_LPCPlug.AddPropItem("Plug Texture File", "", PIT_FILE, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA|"); m_LPCPlug.AddPropItem("Plug Offset", "", PIT_EDIT, ""); m_LPCPlug.AddPropItem("Plug Rotation", "Reset", PIT_BUTTON, ""); m_LPCPlug.AddPropItem("Plug Scale", "", PIT_EDIT, ""); - // ij + // 캐릭터 ///////////////////////////////////////////////////////////////////////////////////////////////////////// int nW = 100; diff --git a/src/tool/N3Viewer/ViewSceneTree.cpp b/src/tool/N3Viewer/ViewSceneTree.cpp index 83fe05cb..bda41950 100644 --- a/src/tool/N3Viewer/ViewSceneTree.cpp +++ b/src/tool/N3Viewer/ViewSceneTree.cpp @@ -109,7 +109,7 @@ void CViewSceneTree::UpdateTreeItem(HTREEITEM hParent, CN3Base * pBase) { } else if (dwType & OBJ_SHAPE) { CN3Shape * pShape = (CN3Shape *)pBase; if (pShape->IsPMeshProcessed()) { - nItem = 6; // PMesh ó Ǿ ִ°...?? + nItem = 6; // PMesh 처리가 되어 있는가...?? } else { nItem = 7; } @@ -331,7 +331,7 @@ void CViewSceneTree::OnRclick(NMHDR * pNMHDR, LRESULT * pResult) { CMenu popup; popup.LoadMenu(IDR_POPUP_SCENE); CMenu * pSubMenu = popup.GetSubMenu(0); - pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); // ޴ ģ.. + pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); // 편집 메뉴를 펼친다.. } *pResult = 0; @@ -395,7 +395,7 @@ void CViewSceneTree::OnEndlabeledit(NMHDR * pNMHDR, LRESULT * pResult) { CN3BaseFileAccess * pBFA = (CN3BaseFileAccess *)pBase; if (pTDI->item.pszText) { - pBFA->FileNameSet(pTDI->item.pszText); // ̸ ϱ.. + pBFA->FileNameSet(pTDI->item.pszText); // 파일 이름 정하기.. } *pResult = 1; diff --git a/src/tool/N3Viewer/res/N3Viewer.rc2 b/src/tool/N3Viewer/res/N3Viewer.rc2 index c2e8b828fe05c26314c50dbef85f2614e175823c..7240cf5bbce6b0b2db46b9bccb9b011f9365c892 100644 GIT binary patch literal 776 zcmd6l%T5A85Jk@xzM>PBMkdiOAmD-!!6@R=@Myv$h{=Epe;znB8RJ3|U6M+5SJ!Lq zovPEZprEZ5B*xq_W5^vZ>LXpX&yA65wIZ|Uoe!;LZ71$2wJW_5S#vONrf+Z7oUN}u zS4v`KJn9oWt;oyz%G!!Mx-Wfg`E2mCy*ozM=4H=Bj|ZNZ^2|V#6J9;Xes97^yaV%F zR%CkxqRNT`n;K2BzO;AN7wCSXn6qf&3laRESzyd^3J!rW{^Z{{gIi=?rhM%~PgW~A cy*bNWGtrpO_v~VZzi-B-om|YLPeOnL&b#yMnFz|i+zfwXe zDECc~-||}4=?=EQ3q3nMRhOAraI)A*hIu^8T?=zXfqOo{Xw){xVz=AOhh!H(V)~1Qv~CR^Xef%ghxAt SpyTpRNBC97Kul7~wY^VQFJ*-Q diff --git a/src/tool/Option/Option.rc b/src/tool/Option/Option.rc index 25e8716ca9a5de630419f2991b737d8aac8497f6..d58f3b39b39e54c97dd5a33fe529bb5fd1c86a36 100644 GIT binary patch literal 16984 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 b#XK;w{kWtvg@(0=um+10DTBv9OYZvrusDwG literal 8491 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 diff --git a/src/tool/Option/Option.vcxproj.filters b/src/tool/Option/Option.vcxproj.filters index 84453acf..2e80affe 100644 --- a/src/tool/Option/Option.vcxproj.filters +++ b/src/tool/Option/Option.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/tool/Option/Option.vcxproj.user b/src/tool/Option/Option.vcxproj.user index e9ad9292..7f1034ae 100644 --- a/src/tool/Option/Option.vcxproj.user +++ b/src/tool/Option/Option.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\game diff --git a/src/tool/Option/OptionDlg.cpp b/src/tool/Option/OptionDlg.cpp index 65e69466..9dd5deb6 100644 --- a/src/tool/Option/OptionDlg.cpp +++ b/src/tool/Option/OptionDlg.cpp @@ -120,7 +120,7 @@ BOOL COptionDlg::OnInitDialog() { SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon - // Ʈ ʱȭ.. + // 각종 컨트롤 초기화.. m_SldEffectCount.SetRange(1000, 2000); m_SldViewDist.SetRange(256, 512); m_SldEffectSoundDist.SetRange(20, 48); diff --git a/src/tool/Option/res/Option.rc2 b/src/tool/Option/res/Option.rc2 index 5d1af6ad82113e5f8dcb1c71e69ef2711cce1816..4528afa395bd15e805509c08626269c9378c33c3 100644 GIT binary patch literal 772 zcmd6lNeaS15JmsioT9;{XuunU=t9H+r>$sgG2j4E7hYa{)kIt<=rR=DRb5m5Pu1fd zD^|pbI8&K?jheBsjn`+NHr=vy$n%7 z#YMY-#!;Ws+v78IpD0#Zm+>_S{%2+wJ)De#VYI*a8>exz%xcPO7ZO-);B;V?$8w@J VpZDx+hTk`17v|vEA(N`}eF8oWX9xfQ literal 385 zcmb`D!3u*g42I9^Qv^K9EbI+LcaSkFoAWxo+tFM?2z(#^FQt$Y zRMS?f&Mw6P_Q2@f!XtV()5y*{6QCo%^cIRV1?}Qzb^%aR08NZzuxq3Uk&w}7AaAbi zt*q3&sylT$mSUG6vttMoc`#%V;{G7|A>PCKS0)miH5ridhbf|Q!+EukYYmTnjzR7E QPKWxdj0qXDEZf@q1fSMr3jhEB diff --git a/src/tool/PlugIn_Max/My_3DStruct.h b/src/tool/PlugIn_Max/My_3DStruct.h index 92ecfbd6..140d2bca 100644 --- a/src/tool/PlugIn_Max/My_3DStruct.h +++ b/src/tool/PlugIn_Max/My_3DStruct.h @@ -2,41 +2,41 @@ struct __EXPORT_HEADER { char szID[8]; // ID "N3Scene1" - char szRemark[64]; // .. - - int nNodeCount; // ü īƮ - int nStaticFrame; // .. - BOOL bExportCurrentFrame; // ü ϸ̼ - int nFrmStart; // ϸ̼ - int nFrmEnd; // ϸ̼ - - D3DCOLORVALUE dcvBackground; // - D3DCOLORVALUE dcvAmbientLight; // ⺻ - - int nCameraCount; // scene ī޶ - int nMaterialCount; // scene - int nTextureCount; // scene ؽó - int nLightCount; // scene - - BOOL bObjGeometry; // Ʈ ͸ ִ. - BOOL bObjShape; // 2D ͸ ִ. - BOOL bObjCamera; // ī޶ ͸ ִ. - BOOL bObjLight; // Ʈ ͸ ִ. + char szRemark[64]; // 설명.. + + int nNodeCount; // 전체 노드 카운트 + int nStaticFrame; // 정지장면 한프레임.. + BOOL bExportCurrentFrame; // 전체 에니메이션을 + int nFrmStart; // 에니메이션 시작 프레임 + int nFrmEnd; // 에니메이션 끝 프레임 + + D3DCOLORVALUE dcvBackground; // 배경 색 + D3DCOLORVALUE dcvAmbientLight; // 기본 조명 색 + + int nCameraCount; // scene 내의 카메라 갯수 + int nMaterialCount; // scene 내의 재질 갯수 + int nTextureCount; // scene 내의 텍스처 갯수 + int nLightCount; // scene 내의 조명 갯수 + + BOOL bObjGeometry; // 지오메트리 데이터를 갖고 있다. + BOOL bObjShape; // 2D 폴리곤 데이터를 갖고 있다. + BOOL bObjCamera; // 카메라 데이터를 갖고 있다. + BOOL bObjLight; // 라이트 데이터를 갖고 있다. BOOL - bObjDummy; // Ʈ(??? - ׿ ʿ ߽ÿ ʿ Ʈ Ѵ)͸ ִ. + bObjDummy; // 도우미 오브젝트(??? - 실제 겜에서는 필요없고 개발시에만 필요한 오브젝트를 말한다)데이터를 갖고 있다. - BOOL bMesh; // ͸ ִ. - BOOL bMaterial; // ͸ ִ. + BOOL bMesh; // 폴리곤 데이터를 갖고 있다. + BOOL bMaterial; // 재질 데이터를 갖고 있다. - BOOL bAnimationKey; // ϸ̼ Ű ִ. - BOOL bMeshAnimation; // ϸ̼ Ű ִ. - BOOL bCameraAndLightAnimation; // ī޶, ϸ̼ ִ. - BOOL bInverseKinematicsJoint; // IK ִ.. + BOOL bAnimationKey; // 에니메이션 키를 갖고 있다. + BOOL bMeshAnimation; // 폴리곤 에니메이션 키를 갖고 있다. + BOOL bCameraAndLightAnimation; // 카메라, 조명 에니메이션을 갖고 있다. + BOOL bInverseKinematicsJoint; // IK 관절들을 갖고 있다.. BOOL - bGenerateTexture; // ؽó ڵ ȭ Ѽ Direct3D ˿ ° 2 ߾ "OBM" Ʈ Ϸ . - BOOL bGenerateIndexedVertex; // ε ڵ .. ޸𸮿 ȿ̴.. - BOOL bGenerateSmoothNormal; // ε巴 ̵ ͵ Ѵ. + bGenerateTexture; // 텍스처 파일을 자동으로 최적화 시켜서 생성 Direct3D 의 포맷에 맞게 2의 제곱수 단위로 맞추어서 "OBM" 비트맵 파일로 저장. + BOOL bGenerateIndexedVertex; // 색인된 점으로 인코딩후 저장.. 메모리에 좀더 효율적이다.. + BOOL bGenerateSmoothNormal; // 부드럽게 보이도록 법선 벡터들을 재 계산한다. }; struct __UVWH { diff --git a/src/tool/PlugIn_Max/N3DExp.cpp b/src/tool/PlugIn_Max/N3DExp.cpp index 8d3c2df9..b73a81e5 100644 --- a/src/tool/PlugIn_Max/N3DExp.cpp +++ b/src/tool/PlugIn_Max/N3DExp.cpp @@ -149,32 +149,32 @@ int CN3DExp::DoExport(const TCHAR * szFileName, ExpInterface * pExpIntf, Interfa // Option Dialog int rval = DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_EXPORT_OPTION), pIntf->GetMAXHWnd(), DlgProcExportOption, - 0); // Ʈ г ȭ.. + 0); // 컨트롤 패널 대화상자.. if (rval != 1) { return TRUE; } m_bCancelExport = FALSE; // Export possible - m_pScene->Release(); // ϰ.. + m_pScene->Release(); // 모두 해제하고.. - m_pScene->m_fFrmCur = m_Option.nFrmStart; //𸣰ڴ. ׳ ù Ѵ. + m_pScene->m_fFrmCur = m_Option.nFrmStart; //모르겠다. 그냥 첫프레임으로 한다. m_pScene->m_fFrmStart = m_Option.nFrmStart; m_pScene->m_fFrmEnd = m_Option.nFrmEnd; INode * pNodeRoot = g_pIntf->GetRootNode(); // Root Node Pointer - // ProgressBar ʱȭ.. + // ProgressBar 초기화.. m_nNodeCount = 0; this->CountAllNodes(pNodeRoot, m_nNodeCount); - g_pIntf->ProgressStart(GetString(IDS_PROGRESS_MSG), TRUE, DlgProcProgress, NULL); // α׷ - this->ProcessRecursive(pNodeRoot); // ϵ 带 ȯϸ鼭 Export..... + g_pIntf->ProgressStart(GetString(IDS_PROGRESS_MSG), TRUE, DlgProcProgress, NULL); // 프로그레스 바 설정 + this->ProcessRecursive(pNodeRoot); // 차일드 노드를 순환하면서 Export..... g_pIntf->ProgressEnd(); ///////////////////////////////// // Scene Save - // sub directory ִٸ sub directory + // sub directory가 있다면 sub directory 만들기 char szDir[_MAX_DIR] = ""; ::CreateDirectory(m_Option.szSubDir, NULL); wsprintf(szDir, "%sData", m_Option.szSubDir); @@ -186,14 +186,14 @@ int CN3DExp::DoExport(const TCHAR * szFileName, ExpInterface * pExpIntf, Interfa wsprintf(szDir, "%sItem", m_Option.szSubDir); ::CreateDirectory(szDir, NULL); - // ī޶ ϳ ٸ.. + // 만약 카메라가 하나도 없다면.. if (m_pScene->CameraCount() <= 0) { m_pScene->DefaultCameraAdd(); } if (m_pScene->LightCount() <= 0) { m_pScene->DefaultLightAdd(); } - m_pScene->SaveDataAndResourcesToFile(szFileName); // Scene ҽ .. + m_pScene->SaveDataAndResourcesToFile(szFileName); // Scene 파일 저장 및 리소스 도 모두 저장.. m_pScene->Release(); m_pScene->ReleaseResrc(); @@ -210,13 +210,13 @@ bool CN3DExp::ProcessRecursive(INode * pNode) { if (NULL == pNode) { return false; } - const char * szName = pNode->GetName(); // ̸.. + const char * szName = pNode->GetName(); // 이름.. - // μ Ʈ (!?) + // 프로세스 업데이트 (!?) // g_pIntf->ProgressUpdate((m_nNodeCur)*100/m_nNodeCount, TRUE, pNode->GetName()); m_nNodeCur++; - //  ü о´. (camera? light? geom object?..) + // 어떤 객체인지 읽어온다. (camera? light? geom object?..) Object * pObj = pNode->EvalWorldState(m_Option.nFrmStart * 160).obj; if (pObj) { @@ -225,32 +225,32 @@ bool CN3DExp::ProcessRecursive(INode * pNode) { if (GEOMOBJECT_CLASS_ID == dwSCID && TRUE == m_Option.bExportGeometry) // Geometry Object { - // Export Routine + // 실제 Export Routine bool bRootBiped = false; - if (m_Option.bExportCharacter && IsBone(pNode)) // ij ɼ õǾ ְ.. ̸... + if (m_Option.bExportCharacter && IsBone(pNode)) // 캐릭터 출력 옵션이 선택되어 있고.. 본이면... { Control * pCtrl = pNode->GetTMController(); - if (pCtrl) // Ʈ е ˻ϰ... + if (pCtrl) // 먼저 루트 바이패드인지 검사하고... { if (pCtrl->ClassID() == BIPBODY_CONTROL_CLASS_ID) { bRootBiped = true; } - // else if(pCtrl->ClassID() == BIPSLAVE_CONTROL_CLASS_ID) // Ѵ. + // else if(pCtrl->ClassID() == BIPSLAVE_CONTROL_CLASS_ID) // 나머지는 무시한다. // else if(pCtrl->ClassID() == FOOTPRINT_CLASS_ID) } if (false == bRootBiped) { INode * pParentNode = pNode->GetParentNode(); if (pParentNode && FALSE == IsBone(pParentNode)) { - bRootBiped = true; // ߿ ̸ + bRootBiped = true; // 본중에서 맨 상위 본이면 } } } - if (bRootBiped) // Ʈѷ ü̸.. + if (bRootBiped) // 컨트롤러가 바이페드 객체이면.. { - return this->ProcessChr(pNode); // ó... + return this->ProcessChr(pNode); // 뼈대 처리... } else { - return this->ProcessShape(pNode); // ׳ Ʈ .. + return this->ProcessShape(pNode); // 그냥 오브젝트로 출력.. } } else if (CAMERA_CLASS_ID == dwSCID && TRUE == m_Option.bExportCamera) { return this->ProcessCamera(pNode); @@ -261,12 +261,12 @@ bool CN3DExp::ProcessRecursive(INode * pNode) { // return this->ProcessShape(pNode); else { char szDebug[512]; - wsprintf(szDebug, "Node : %s, մϴ.\n", pNode->GetName()); + wsprintf(szDebug, "Node : %s, 무시합니다.\n", pNode->GetName()); OutputDebugString(szDebug); } } else { char szDebug[512]; - wsprintf(szDebug, "Node : %s, Type ȯ Ұ Node Դϴ. մϴ.\n", pNode->GetName()); + wsprintf(szDebug, "Node : %s, Type 변환이 불가능한 Node 입니다. 무시합니다.\n", pNode->GetName()); OutputDebugString(szDebug); } @@ -285,7 +285,7 @@ bool CN3DExp::ProcessRecursive(INode * pNode) { } bool CN3DExp::ProcessCamera(INode * pNode) { - // Object pipeline о´. ObjectState Ŭ Ѵ. + // Object의 pipeline 정보를 읽어온다. ObjectState 클래스에 저장한다. ObjectState os = pNode->EvalWorldState(m_Option.nFrmStart * 160); if (CAMERA_CLASS_ID != os.obj->SuperClassID()) { return false; @@ -293,22 +293,22 @@ bool CN3DExp::ProcessCamera(INode * pNode) { CN3Camera * pCamera = new CN3Camera; m_pScene->CameraAdd(pCamera); - this->ProcessTransform(pNode, pCamera, false); // ġ ϸ̼ Ű.. + this->ProcessTransform(pNode, pCamera, false); // 위치 에니메이션 키.. pCamera->m_KeyRot.Release(); // At Vector Key pCamera->AtPosSet(0, 0, 0); pCamera->m_KeyScale.Release(); // Up Vector Key pCamera->UpVectorSet(0, 1, 0); - INode * pTN = pNode->GetTarget(); // At Vector Key ó.. + INode * pTN = pNode->GetTarget(); // At Vector Key 및 처리.. if (pTN) { CN3Transform TTrans; this->ProcessTransform(pTN, &TTrans, false); pCamera->AtPosSet(TTrans.Pos()); - pCamera->m_KeyRot.Add(TTrans.m_KeyPos, 0, TTrans.m_KeyPos.Count()); // Animation Key ó.. + pCamera->m_KeyRot.Add(TTrans.m_KeyPos, 0, TTrans.m_KeyPos.Count()); // Animation Key 처리.. } - // Camera Object о ObjectState Ʈ (?) + // Camera Object 에 읽어온 ObjectState의 오브젝트를 대입(?) CameraObject * pCmObj = (CameraObject *)os.obj; CameraState CS; @@ -341,7 +341,7 @@ bool CN3DExp::ProcessLight(INode * pNode) { ObjectState os = pNode->EvalWorldState(m_Option.nFrmStart * 160); - // Ʈ Ʈ ´. + // 라이트 오브젝트를 가져온다. GenLight * pLightObj = (GenLight *)os.obj; struct LightState ls; Interval valid = FOREVER; @@ -360,25 +360,25 @@ bool CN3DExp::ProcessLight(INode * pNode) { __dcv.b = ls.color.b; __dcv.a = 0; - // ϱ + // 방향 구하기 INode * pTN = pNode->GetTarget(); __Vector3 vDir(0, -1, 0); - if (pTN) { // Ÿ Ÿ ǥ light ǥ Ѵ. + if (pTN) { // 타겟이 있을경우 타겟의 좌표와 light의 좌표 차를 가지고 방향을 정한다. CN3Transform TTrans; this->ProcessTransform(pTN, &TTrans, false); vDir = TTrans.Pos() - D3DXVECTOR3(ptLight.x, ptLight.z, ptLight.y); - } else if (OMNI_LGT != ls.type) { // Ÿ light rotation Ѵ. + } else if (OMNI_LGT != ls.type) { // 타겟이 없을 경우 light의 rotation값을 가지고 방향을 정한다. Matrix3 mtxLight = - pNode->GetObjTMAfterWSM(m_Option.nFrmStart * 160); // worldǥ transform matrix Ѵ. + pNode->GetObjTMAfterWSM(m_Option.nFrmStart * 160); // world좌표상의 transform matrix를 구한다. mtxLight.NoTrans(); - mtxLight.NoScale(); // ġ ȭ ش. + mtxLight.NoScale(); // 위치와 스케일 변화를 없앤다. Point3 ptAt = - mtxLight.PointTransform(Point3(0, 0, -1)); // ⺻ ͸ matrix ϸ light Ͱ ´. - vDir.Set(ptAt.x, ptAt.z, ptAt.y); // z y ٲپش. + mtxLight.PointTransform(Point3(0, 0, -1)); // 기본 벡터를 matrix와 곱하면 light의 방향 벡터가 나온다. + vDir.Set(ptAt.x, ptAt.z, ptAt.y); // z와 y를 바꾸어준다. } vDir.Normalize(); - // Ʈ + // 라이트 종류 memset(&pLight->m_Data, 0, sizeof(pLight->m_Data)); switch (ls.type) { //case OMNI_LIGHT: @@ -410,7 +410,7 @@ bool CN3DExp::ProcessLight(INode * pNode) { break; } - // ֳ ֳ ش. + // 켜있나 꺼져있나 정해준다. pLight->m_Data.bOn = ls.on; return true; @@ -447,7 +447,7 @@ bool CN3DExp::ProcessShape(INode * pNode) { cPID = pPObj->ClassID(); } - if (pPN && cPID == Class_ID(DUMMY_CLASS_ID, 0)) // Parent Node .. + if (pPN && cPID == Class_ID(DUMMY_CLASS_ID, 0)) // Parent Node 가 있으면.. { CN3Shape ShpTmp; ProcessName(pPN, &ShpTmp); @@ -455,15 +455,15 @@ bool CN3DExp::ProcessShape(INode * pNode) { int nSC = m_pScene->ShapeCount(); for (int i = 0; i < nSC; i++) { CN3Shape * pShpTmp = m_pScene->ShapeGet(i); - if (ShpTmp.m_szName == pShpTmp->m_szName) // ׷ ̸ .. + if (ShpTmp.m_szName == pShpTmp->m_szName) // 그룹노드의 이름이 같은 것이 있으면.. { - pShape = pShpTmp; // ٷ Shape ̴.. + pShape = pShpTmp; // 바로 이 Shape 이다.. break; } } } - if (NULL == pShape) // Scene ׷쿡 شǴ Shape ų Ȥ ܵ ִ ޽̸.. + if (NULL == pShape) // Scene 에 이 노드의 그룹에 해당되는 Shape 가 없거나 혹은 단독으로 있는 메시이면.. { pShape = new CN3Shape(); Point3 ptPivot; @@ -474,55 +474,55 @@ bool CN3DExp::ProcessShape(INode * pNode) { this->ProcessName(pNode, pShape); ptPivot = pNode->GetNodeTM(m_Option.nFrmStart * 160).GetTrans(); } - // pShape->PosSet(ptPivot.x * 0.0254f, ptPivot.z * 0.0254f, ptPivot.y * 0.0254f); // Pivot .. y z ݴ. - pShape->PosSet(ptPivot.x, ptPivot.z, ptPivot.y); // Pivot .. y z ݴ. + // pShape->PosSet(ptPivot.x * 0.0254f, ptPivot.z * 0.0254f, ptPivot.y * 0.0254f); // Pivot 세팅.. y 와 z 를 반대로. + pShape->PosSet(ptPivot.x, ptPivot.z, ptPivot.y); // Pivot 세팅.. y 와 z 를 반대로. int nSI = m_pScene->ShapeAdd(pShape); } bool bCollision = false; - ::CharLower(N3IMesh.m_szName.begin()); // ҹڷ .. + ::CharLower(N3IMesh.m_szName.begin()); // 소문자로 만들고.. if (N3IMesh.m_szName.find("coll") != - -1) { // "collision" ̶ ڿ Ȯ .. ׷ Ÿ ؼ "coll" Ȯ + -1) { // "collision" 이라는 문자열 확인 .. 그러나 오타에 대비해서 "coll" 까지만 확인 bCollision = true; } if (true == bCollision) { - // Pivot, Offset + // Pivot, Offset 적용 __Vector3 vOffset = pShape->Pos(); - N3IMesh.ApplyOffset(vOffset * -1.0f); // Offset ŭ ش.. + N3IMesh.ApplyOffset(vOffset * -1.0f); // Offset 만큼 빼준다.. CN3VMesh * pVMesh = new CN3VMesh(); - pVMesh->Import(&N3IMesh); // ޽ .. Indexed ޽÷κ Import.. + pVMesh->Import(&N3IMesh); // 메시 만들고.. Indexed 메시로부터 Import.. - std::string szVMeshFN = "Object\\" + pShape->m_szName + ".n3vmesh"; // ̸.. + std::string szVMeshFN = "Object\\" + pShape->m_szName + ".n3vmesh"; // 이름짓기.. if (lstrlen(m_Option.szSubDir) > 0) { - szVMeshFN = std::string(m_Option.szSubDir) + szVMeshFN; // sub directory ߰ + szVMeshFN = std::string(m_Option.szSubDir) + szVMeshFN; // sub directory 있으면 추가 } - pVMesh->FileNameSet(szVMeshFN); // ̸.. - CN3Base::s_MngVMesh.Add(pVMesh); // Ŵ ְ.. + pVMesh->FileNameSet(szVMeshFN); // 이름짓기.. + CN3Base::s_MngVMesh.Add(pVMesh); // 매니저에 넣고.. - pShape->CollisionMeshSet(szVMeshFN); // 浹޽ .. - } else // 浹 üũ ޽ð ƴϸ Ʈ ߰.. + pShape->CollisionMeshSet(szVMeshFN); // 충돌메시 세팅.. + } else // 충돌 체크 메시가 아니면 파트 추가.. { - // Part ߰.. Part Data .. + // Part 추가.. Part Data 세팅.. CN3SPart * pPD = pShape->PartAdd(); - this->ProcessName(pNode, pPD); // Ʈ ̸.. + this->ProcessName(pNode, pPD); // 파트 이름.. - // Pivot, Offset + // Pivot, Offset 적용 Point3 ptPivot = pNode->GetNodeTM(m_Option.nFrmStart * 160).GetTrans(); // __Vector3 vOffset(ptPivot.x * 0.0254f, ptPivot.z * 0.0254f, ptPivot.y * 0.0254f); __Vector3 vOffset(ptPivot.x, ptPivot.z, ptPivot.y); - N3IMesh.ApplyOffset(vOffset * -1.0f); // Offset ŭ ش.. + N3IMesh.ApplyOffset(vOffset * -1.0f); // Offset 만큼 빼준다.. CN3Mesh MeshTmp; - MeshTmp.Import(&N3IMesh); // ӽ÷ ޽ .. Indexed ޽÷κ Import.. + MeshTmp.Import(&N3IMesh); // 임시로 메시 만들고.. Indexed 메시로부터 Import.. if (m_Option.bGenerateSmoothNormal) { - MeshTmp.ReGenerateSmoothNormal(); // Normal .. + MeshTmp.ReGenerateSmoothNormal(); // Normal 값 생성.. } - MeshTmp.MakeIndexed(); // Indexed Mesh .. + MeshTmp.MakeIndexed(); // Indexed Mesh 로 만든다.. - // PMesh .. + // PMesh 생성.. CN3PMeshCreate PMCreate; PMCreate.ConvertFromN3Mesh(&MeshTmp); CN3PMesh * pPMesh = PMCreate.CreateRendererMesh(); @@ -531,12 +531,12 @@ bool CN3DExp::ProcessShape(INode * pNode) { pPD->MeshSet(pPMesh->FileName()); if (pTex) { - pPD->TexAlloc(1); // Texture Ҵ.. + pPD->TexAlloc(1); // Texture 할당.. pPD->TexSet(0, pTex->FileName()); } pPD->m_Mtl = mtl; - pPD->m_vPivot = vOffset - pShape->Pos(); // Pivot point .. - pPD->ReCalcMatrix(pShape->m_Matrix); // ٽ .. + pPD->m_vPivot = vOffset - pShape->Pos(); // Pivot point 를 얻고.. + pPD->ReCalcMatrix(pShape->m_Matrix); // 행렬 다시 계산.. } return true; @@ -547,7 +547,7 @@ BOOL CALLBACK CN3DExp::DlgProcExportOption(HWND hWndDlg, UINT uMsg, WPARAM wPara case WM_INITDIALOG: { CenterWindow(hWndDlg, GetParent(hWndDlg)); - // Registry ɼǰ ־ξ.. + // Registry 에 옵션값을 넣어두었다.. HKEY hKey = g_Eng.RegistryOpen("N3Export Option"); if (hKey) { g_Eng.RegistryValueGet(hKey, "Export Camera", &m_Option.bExportCamera, 4); @@ -579,8 +579,8 @@ BOOL CALLBACK CN3DExp::DlgProcExportOption(HWND hWndDlg, UINT uMsg, WPARAM wPara CheckDlgButton(hWndDlg, IDC_C_GENERATE_COMPRESSED_TEXTURE, m_Option.bGenerateCompressedTexture); Interval ii = g_pIntf->GetAnimRange(); - m_Option.nFrmStart = ii.Start() / 160; // . - m_Option.nFrmEnd = ii.End() / 160; // + m_Option.nFrmStart = ii.Start() / 160; // 시작 프레임. + m_Option.nFrmEnd = ii.End() / 160; // 끝 프레임 SetDlgItemInt(hWndDlg, IDC_E_FRAME_START, m_Option.nFrmStart, FALSE); SetDlgItemInt(hWndDlg, IDC_E_FRAME_END, m_Option.nFrmEnd, FALSE); @@ -601,8 +601,8 @@ BOOL CALLBACK CN3DExp::DlgProcExportOption(HWND hWndDlg, UINT uMsg, WPARAM wPara m_Option.bExportCharacter = IsDlgButtonChecked(hWndDlg, IDC_C_OBJ_CHARACTER); m_Option.bAnimationKey = IsDlgButtonChecked(hWndDlg, IDC_C_ANIMATION_KEY); - m_Option.nFrmStart = GetDlgItemInt(hWndDlg, IDC_E_FRAME_START, NULL, FALSE); // - m_Option.nFrmEnd = GetDlgItemInt(hWndDlg, IDC_E_FRAME_END, NULL, FALSE); // + m_Option.nFrmStart = GetDlgItemInt(hWndDlg, IDC_E_FRAME_START, NULL, FALSE); // 시작 프레임 + m_Option.nFrmEnd = GetDlgItemInt(hWndDlg, IDC_E_FRAME_END, NULL, FALSE); // 끝 프레임 m_Option.fSamplingRate = GetDlgItemInt(hWndDlg, IDC_E_SAMPLING_RATE, NULL, FALSE); // Sampling Rate m_Option.bGenerateSmoothNormal = IsDlgButtonChecked(hWndDlg, IDC_C_GENERATE_SMOOTH_NORMAL); @@ -620,7 +620,7 @@ BOOL CALLBACK CN3DExp::DlgProcExportOption(HWND hWndDlg, UINT uMsg, WPARAM wPara EndDialog(hWndDlg, 1); - // Registry ɼǰ ־ξ.. + // Registry 에 옵션값을 넣어두었다.. HKEY hKey = g_Eng.RegistryOpen("N3Export Option"); if (NULL == hKey) { RegCreateKey(HKEY_CURRENT_USER, "N3Export Option", &hKey); @@ -670,22 +670,22 @@ void CN3DExp::DecodeTransformMatrix(Matrix3 & matSrc, __Matrix44 & matDest) { // Quaternions are dumped as angle axis. AngAxisFromQ(ap.q, &fAngle, vRot); - // ... + // 행렬... __Matrix44 m, tm; m.Identity(); tm.Scale(ap.k.x, ap.k.z, ap.k.y); - m *= tm; // - // ::D3DXMatrixRotationYawPitchRoll(&tm, vRot.z * fAngle, vRot.x * fAngle, vRot.y * fAngle); m *= tm; // ȸ + m *= tm; // 스케일 + // ::D3DXMatrixRotationYawPitchRoll(&tm, vRot.z * fAngle, vRot.x * fAngle, vRot.y * fAngle); m *= tm; // 회전 tm.RotationZ(fAngle * vRot.y); - m *= tm; // ȸ + m *= tm; // 회전 tm.RotationY(fAngle * vRot.z); - m *= tm; // ȸ + m *= tm; // 회전 tm.RotationX(fAngle * vRot.x); - m *= tm; // ȸ - // m.PosSet(ap.t.x * 0.0254f, ap.t.z * 0.0254f, ap.t.y * 0.0254f); // ̵ // 1 Unit == 1 Inch -> Meter ٲ۴.. // Y, Z ݴ.. - m.PosSet(ap.t.x, ap.t.z, ap.t.y); // ̵ // 1 Unit == 1 Inch -> Meter ٲ۴.. // Y, Z ݴ.. + m *= tm; // 회전 + // m.PosSet(ap.t.x * 0.0254f, ap.t.z * 0.0254f, ap.t.y * 0.0254f); // 이동 // 1 Unit == 1 Inch -> Meter 로 바꾼다.. // Y, Z 는 반대로.. + m.PosSet(ap.t.x, ap.t.z, ap.t.y); // 이동 // 1 Unit == 1 Inch -> Meter 로 바꾼다.. // Y, Z 는 반대로.. - matDest = m; // .. ȯ ϼ.. + matDest = m; // 휴.. 변환 행렬 최종 완성.. } void CN3DExp::CancelExport() { @@ -703,13 +703,13 @@ bool CN3DExp::ProcessName(INode * pNode, CN3BaseFileAccess * pBase) { DWORD dwType = pBase->Type(); if (pNode && pNode->GetParentNode()) { - INode * pPN = pNode->GetParentNode(); // θ - INode * pPPN = NULL; // θ θ + INode * pPN = pNode->GetParentNode(); // 나의 부모 + INode * pPPN = NULL; // 나의 부모의 부모 if (pPN) { pPPN = pPN->GetParentNode(); } - // ij Ʈ ij Ʈ Ų ̸ ̸ ʴ´. + // 캐릭터 파트나 캐릭터 파트 스킨일 경우 내가 본 노드이면 나의 이름을 넣지 않는다. if ((dwType & (OBJ_CHARACTER_PART | OBJ_CHARACTER_PART_SKINS)) && IsBone(pNode)) { } else { if (!(pBase->m_szName.empty())) { @@ -722,9 +722,9 @@ bool CN3DExp::ProcessName(INode * pNode, CN3BaseFileAccess * pBase) { } } - if (NULL != pPPN) // Scene Root ƴ 쿡.. + if (NULL != pPPN) // Scene Root 가 아닐 경우에만.. { - this->ProcessName(pNode->GetParentNode(), pBase); // ȣ + this->ProcessName(pNode->GetParentNode(), pBase); // 재귀 호출 return true; } } @@ -795,7 +795,7 @@ bool CN3DExp::ProcessName(INode * pNode, CN3BaseFileAccess * pBase) { } } - // sub directory ߰Ѵ. + // sub directory 가 있으면 추가한다. std::string szFN; if (lstrlen(m_Option.szSubDir) > 0) { szFN = std::string(m_Option.szSubDir) + szDir + pBase->m_szName + szExt; @@ -809,14 +809,14 @@ bool CN3DExp::ProcessName(INode * pNode, CN3BaseFileAccess * pBase) { } bool CN3DExp::ProcessChr(INode * pNode) { - INode * pNodeRootJoint = NULL; // Ʈ Ʈ ãƾ Ѵ.. + INode * pNodeRootJoint = NULL; // 루트 조인트를 찾아야 한다.. Control * pCtrl = pNode->GetTMController(); - if (pCtrl->ClassID() != BIPBODY_CONTROL_CLASS_ID) // pNode е尡 ƴϸ pNode ƮƮ. + if (pCtrl->ClassID() != BIPBODY_CONTROL_CLASS_ID) // pNode가 바이패드가 아니면 pNode가 루트조인트다. { pNodeRootJoint = pNode; } //return false; - else { // pNode е ڽ߿ ƮƮ ã´. + else { // pNode가 바이패드면 자식중에 루트조인트를 찾는다. int nCC = pNode->NumberOfChildren(); for (int i = 0; i < nCC; i++) { @@ -839,10 +839,10 @@ bool CN3DExp::ProcessChr(INode * pNode) { // IBipedExport* pBE = (IBipedExport*)pCtrl->GetInterface(I_BIPINTERFACE); // biped export interface // pBE->RemoveNonUniformScale(1); // remove the non uniform scale - // pBE->BeginFigureMode(1); // Figure Mode .. Binding pose + // pBE->BeginFigureMode(1); // Figure Mode .. Binding pose 와 비슷 CN3Joint * pJoint = new CN3Joint(); - if (false == this->ProcessJoint(pNodeRootJoint, pJoint)) // Joint ó.. + if (false == this->ProcessJoint(pNodeRootJoint, pJoint)) // Joint 처리.. { delete pJoint; pJoint = NULL; @@ -851,7 +851,7 @@ bool CN3DExp::ProcessChr(INode * pNode) { return false; } - // ij ó.. + // 캐릭터 처리.. CN3Chr * pChr = new CN3Chr(); this->ProcessName(pNode, pChr); @@ -861,7 +861,7 @@ bool CN3DExp::ProcessChr(INode * pNode) { pChr->m_szName = "Temp"; pChr->FileNameSet(std::string("Chr\\Temp.n3Chr")); - pChr->PartAlloc(64); // ϰ Part Data Ҵ.. saveҶ ʿ ʹ ŵȴ. + pChr->PartAlloc(64); // 충분하게 Part Data 할당.. save할때 불필요한 데이터는 제거된다. for (int i = 0; i < 64; i++) { CN3CPart * pPDAdd = pChr->Part(i); CN3CPartSkins * pSkinAdd = new CN3CPartSkins(); @@ -870,19 +870,19 @@ bool CN3DExp::ProcessChr(INode * pNode) { pSkinAdd->FileNameSet(szNameTmp); CN3Base::s_MngSkins.Add(pSkinAdd); pPDAdd->SkinsSet(szNameTmp); - CN3Base::s_MngSkins.Delete(&pSkinAdd); // ̷ ־ īƮ ϳ پ.. + CN3Base::s_MngSkins.Delete(&pSkinAdd); // 이렇게 해주어야 참조 카운트가 하나 줄어든다.. } - // Biped Editable Mesh ã.. + // Biped 에서 Editable Mesh 를 찾고.. std::list MeshList; this->FindNodeRecursive(pNode, Class_ID(EDITTRIOBJ_CLASS_ID, 0x00), MeshList); std::list::iterator it; - for (it = MeshList.begin(); it != MeshList.end(); it++) // Mesh ŭ ó.. + for (it = MeshList.begin(); it != MeshList.end(); it++) // Mesh 수만큼 처리.. { INode * pNodeTmp = *it; - // 浹 üũ ޽ 캻.. + // 충돌 체크용으로 쓰일 메시인지 살펴본다.. bool bCollisionMesh = false; std::string szFNM = pNodeTmp->GetName(); if (szFNM.size() > 0) { @@ -892,9 +892,9 @@ bool CN3DExp::ProcessChr(INode * pNode) { bCollisionMesh = true; } - if (true == bCollisionMesh) // 浹 üũ ޽ø.... + if (true == bCollisionMesh) // 충돌 체크 메시면.... { - } else // if(false == bCollisionMesh) // 浹 üũ ޽ ƴϸ.... .. + } else // if(false == bCollisionMesh) // 충돌 체크 메시 아니면....정상적으로 진행.. { int nLOD = 0; int nPart = 0; @@ -905,7 +905,7 @@ bool CN3DExp::ProcessChr(INode * pNode) { } if (pCG == NULL || (pMG && (pMG == pNode || IsBone(pMG)))) - // ij ̰ų pMG , ̶ LOD  ü ׷ ̴. + // 캐릭터 노드이거나 pMG가 본 노드일 경우, 이때는 LOD가 없어서 신체부위별로 그룹지어 있지 않을때이다. { std::string strM1(pNodeTmp->GetName()); std::string strM2; @@ -914,15 +914,15 @@ bool CN3DExp::ProcessChr(INode * pNode) { INode * pCN = pMG->GetChildNode(i); __ASSERT(pCN, "null pointer : no child"); if (!CheckObjectClassID(pCN, Class_ID(EDITTRIOBJ_CLASS_ID, 0x00))) { - continue; // ޽ ƴϸ Ѿ. + continue; // 메쉬가 아니면 넘어간다. } strM2 = pCN->GetName(); if (strM1 == strM2) { - break; // ̸ .. + break; // 이름이 같을 경우.. } - ++nPart; // Part .. + ++nPart; // 같지 않으면 Part 증가.. } - } else { // LOD ־ ü ׷ Ǿ (pMG ׷̴) + } else { // LOD가 있어서 신체 부위별로 그룹 되어 있을경우 (pMG가 그룹이다) // part std::string strM1(pMG->GetName()); std::string strM2; @@ -931,13 +931,13 @@ bool CN3DExp::ProcessChr(INode * pNode) { INode * pCN = pCG->GetChildNode(i); __ASSERT(pCN, "null pointer : no child"); if (!CheckObjectClassID(pCN, Class_ID(DUMMY_CLASS_ID, 0x00))) { - continue; // ׷ ƴϸ Ѿ. + continue; // 그룹이 아니면 넘어간다. } strM2 = pCN->GetName(); if (strM1 == strM2) { - break; // ̸ .. + break; // 이름이 같을 경우.. } - ++nPart; // Part .. + ++nPart; // 같지 않으면 Part 증가.. } // lod @@ -947,13 +947,13 @@ bool CN3DExp::ProcessChr(INode * pNode) { INode * pCN = pMG->GetChildNode(i); __ASSERT(pCN, "null pointer : no child"); if (!CheckObjectClassID(pCN, Class_ID(EDITTRIOBJ_CLASS_ID, 0x00))) { - continue; // ޽ ƴϸ Ѿ. + continue; // 메쉬가 아니면 넘어간다. } strM2 = pCN->GetName(); if (strM1 == strM2) { - break; // ̸ .. + break; // 이름이 같을 경우.. } - ++nLOD; // LOD + ++nLOD; // 같지 않으면 LOD증가 } } @@ -964,7 +964,7 @@ bool CN3DExp::ProcessChr(INode * pNode) { CN3CPartSkins * pSkins = pPart->Skins(); CN3Skin * pSkin = pPart->Skin(nLOD); - if (false == this->ProcessPhysique(pNodeTmp, pNodeRootJoint, pSkin)) // Skin ó.. + if (false == this->ProcessPhysique(pNodeTmp, pNodeRootJoint, pSkin)) // Skin 처리.. { MessageBox(::GetActiveWindow(), pNodeTmp->GetName(), "Skin processing failed", MB_OK); } @@ -978,8 +978,8 @@ bool CN3DExp::ProcessChr(INode * pNode) { // pTex->FileNameSet(szFN); pPart->TexSet(pTex->FileName()); } - ProcessName(pNodeTmp, pPart); // ̸ - ProcessName(pNodeTmp, pSkins); // ̸ + ProcessName(pNodeTmp, pPart); // 이름 짓기 + ProcessName(pNodeTmp, pSkins); // 이름 짓기 } } @@ -988,15 +988,15 @@ bool CN3DExp::ProcessChr(INode * pNode) { // pBE->EndFigureMode(1); // pCtrl->ReleaseInterface(I_BIPINTERFACE, pBE); // release biped export interface // pBE = NULL; - g_pIntf->RedrawViews(0); // .. Redraw if you want to see the result + g_pIntf->RedrawViews(0); // 결과를 본다.. Redraw if you want to see the result // IBipedExport* pBE = (IBipedExport*)pCtrl->GetInterface(I_BIPINTERFACE); // biped export interface // pBE->RemoveNonUniformScale(1); // remove the non uniform scale - // pBE->BeginFigureMode(1); // Figure Mode .. Binding pose + // pBE->BeginFigureMode(1); // Figure Mode .. Binding pose 와 비슷 // // // pBE->EndFigureMode(1); - // g_pIntf->RedrawViews(0); // .. Redraw if you want to see the result + // g_pIntf->RedrawViews(0); // 결과를 본다.. Redraw if you want to see the result // pCtrl->ReleaseInterface(I_BIPINTERFACE, pBE); // release biped export interface // biped chr @@ -1010,7 +1010,7 @@ bool CN3DExp::ProcessChr(INode * pNode) { BipIface->RemoveNonUniformScale(1); // remove the non uniform scale - BipIface->BeginFigureMode(1); // Figure Mode .. Binding pose + BipIface->BeginFigureMode(1); // Figure Mode .. Binding pose 와 비슷 // to do ---------------------------------------------------------------------------- // these are subanim numbers for the center of mass controller @@ -1052,14 +1052,14 @@ bool CN3DExp::ProcessChr(INode * pNode) { // Control* pRotCtrl = c->GetRotationController(); // Control* pSclCtrl = c->GetScaleController(); // -// this->ExportAnimationPosition(pPosCtrl); // ġ -// this->ExportAnimationRotation(pRotCtrl); // ȸ -// this->ExportAnimationScale(pSclCtrl); // +// this->ExportAnimationPosition(pPosCtrl); // 위치 +// this->ExportAnimationRotation(pRotCtrl); // 회전 +// this->ExportAnimationScale(pSclCtrl); // 스케일 // // Control* pTPosCtrl = NULL; // INode* pTarget = pNode->GetTarget(); // if(pTarget != NULL) pTPosCtrl = pTarget->GetTMController()->GetPositionController(); -// this->ExportAnimationPosition(pTPosCtrl); // Ÿ ġ ϸ̼.. +// this->ExportAnimationPosition(pTPosCtrl); // 타겟 위치 에니메이션.. /////////////////////////////////////////////////////////////////////////////////////// BipIface->EndFigureMode(1); @@ -1074,7 +1074,7 @@ bool CN3DExp::ProcessChr(INode * pNode) { return true; } -bool CN3DExp::ProcessTransform(INode * pNode, CN3Transform * pTransform, bool bLocalCoordinate) // ġ +bool CN3DExp::ProcessTransform(INode * pNode, CN3Transform * pTransform, bool bLocalCoordinate) // 위치 { if (NULL == pTransform || NULL == pNode) { return false; @@ -1088,16 +1088,16 @@ bool CN3DExp::ProcessChr(INode * pNode) { AffineParts mAP; mTime = m_Option.nFrmStart * 160; - mMtx = pNode->GetNodeTM(mTime); // 0 Frame ° Ű ´.. + mMtx = pNode->GetNodeTM(mTime); // 0 Frame 째의 키값을 가져온다.. if (bLocalCoordinate) { - mMtx *= Inverse(pNode->GetParentTM(mTime)); // ǥ ٲٱ.. + mMtx *= Inverse(pNode->GetParentTM(mTime)); // 로컬 좌표로 바꾸기.. } decomp_affine(mMtx, &mAP); - // pTransform->PosSet(mAP.t.x * 0.0254f, mAP.t.z * 0.0254f, mAP.t.y * 0.0254f); // 1 Unit == 1 Inch -> Meter ٲ۴.. // ġ - y, z ٲپ ش.. + // pTransform->PosSet(mAP.t.x * 0.0254f, mAP.t.z * 0.0254f, mAP.t.y * 0.0254f); // 1 Unit == 1 Inch -> Meter 로 바꾼다.. // 위치 - y, z 를 바꾸어 준다.. pTransform->PosSet(mAP.t.x, mAP.t.z, - mAP.t.y); // 1 Unit == 1 Inch -> Meter ٲ۴.. // ġ - y, z ٲپ ش.. - __Quaternion qt; // ȸ. + mAP.t.y); // 1 Unit == 1 Inch -> Meter 로 바꾼다.. // 위치 - y, z 를 바꾸어 준다.. + __Quaternion qt; // 회전. qt.x = mAP.q.x; qt.y = mAP.q.y; qt.z = mAP.q.z; @@ -1107,17 +1107,17 @@ bool CN3DExp::ProcessChr(INode * pNode) { qt.AxisAngle(vAxis, fD); float fTmp = vAxis.y; vAxis.y = vAxis.z; - vAxis.z = fTmp; // y z ٲ۴.. - qt.RotationAxis(vAxis, fD); // ʹϾ . + vAxis.z = fTmp; // y축과 z축을 바꾼다음.. + qt.RotationAxis(vAxis, fD); // 쿼터니언 계산 및 세팅. pTransform->RotSet(qt); pTransform->ScaleSet(mAP.k.x * mAP.f, mAP.k.y * mAP.f, mAP.k.z * mAP.f); // Scale if (FALSE == m_Option.bAnimationKey) { - return true; // Animation Key ó ɼ.. + return true; // Animation Key 처리 옵션.. } int nKC = 0; - if (pTransform->Type() & OBJ_JOINT) // Joint ϶ Sampling... + if (pTransform->Type() & OBJ_JOINT) // Joint 일때는 Sampling... { nKC = (m_Option.nFrmEnd - m_Option.nFrmStart) * (m_Option.fSamplingRate / 30.0f); } else { @@ -1133,43 +1133,43 @@ bool CN3DExp::ProcessChr(INode * pNode) { nKC = pmKey->GetNumKeys(); if (nKC <= 0) { - return true; // Ű ø ʴ´.. + return true; // 키값이 없으면 샘플링 하지 않는다.. } IKey mKTmp; - pmKey->GetKey(nKC - 1, &mKTmp); // Ű .. + pmKey->GetKey(nKC - 1, &mKTmp); // 마지막키를 가져오고.. nKC = (mKTmp.time / 160.0f) * - (m_Option.fSamplingRate / 30.0f); // ̼ġ ȴ.. ȴ. + (m_Option.fSamplingRate / 30.0f); // 이수치로 나눠 줘야 한프레임이 된다.. 고로 마지막 프레임이 된다. if (nKC <= 0) { return true; } } - pTransform->m_KeyPos.Alloc(nKC, m_Option.fSamplingRate, KEY_VECTOR3); // Ű Ҵ.. + pTransform->m_KeyPos.Alloc(nKC, m_Option.fSamplingRate, KEY_VECTOR3); // 키 할당.. if (pTransform->Type() & OBJ_JOINT) { pTransform->m_KeyRot.Alloc(nKC, m_Option.fSamplingRate, - KEY_QUATERNION); // ȸ Ű Ҵ.. ̰ ʹϾ Ҵ̴... + KEY_QUATERNION); // 회전 키 할당.. 이건 쿼터니언 할당이다... } else { pTransform->m_KeyRot.Alloc(nKC, m_Option.fSamplingRate, - KEY_VECTOR3); // ȸ Ű Ҵ.. ̰ ʹϾ Ҵ̴... + KEY_VECTOR3); // 회전 키 할당.. 이건 쿼터니언 할당이다... } - pTransform->m_KeyScale.Alloc(nKC, m_Option.fSamplingRate, KEY_VECTOR3); // Ű Ҵ.. + pTransform->m_KeyScale.Alloc(nKC, m_Option.fSamplingRate, KEY_VECTOR3); // 키 할당.. __Vector3 * pVKey = NULL; for (int i = 0; i < nKC; i++) { mTime = m_Option.nFrmStart * 160 + (int)(i * 30.0f / m_Option.fSamplingRate) * 160; - mMtx = pNode->GetNodeTM(mTime); // Key شϴ Transform Sampling + mMtx = pNode->GetNodeTM(mTime); // Key 에 해당하는 Transform Sampling if (bLocalCoordinate) { - mMtx *= Inverse(pNode->GetParentTM(mTime)); // ǥ ٲٱ.. // Parent Matrix + mMtx *= Inverse(pNode->GetParentTM(mTime)); // 로컬 좌표로 바꾸기.. // Parent Matrix 역행렬 } decomp_affine(mMtx, &mAP); __Vector3 * pVP = (__Vector3 *)(pTransform->m_KeyPos.DataGet(i)); __Vector3 * pVS = (__Vector3 *)(pTransform->m_KeyScale.DataGet(i)); __Quaternion * pQR = (__Quaternion *)(pTransform->m_KeyRot.DataGet(i)); - pVP->Set(mAP.t.x, mAP.t.z, mAP.t.y); // ġ // 1 Unit == 1 Inch -> Meter ٲ۴.. - if (pQR) // ȸ. + pVP->Set(mAP.t.x, mAP.t.z, mAP.t.y); // 위치 // 1 Unit == 1 Inch -> Meter 로 바꾼다.. + if (pQR) // 회전. { __Quaternion qt; qt.x = mAP.q.x; @@ -1181,15 +1181,15 @@ bool CN3DExp::ProcessChr(INode * pNode) { qt.AxisAngle(vAxis, fD); float fTmp = vAxis.y; vAxis.y = vAxis.z; - vAxis.z = fTmp; // y z ٲ۴.. + vAxis.z = fTmp; // y축과 z축을 바꾼다음.. // while (fD>D3DX_PI) fD -= (D3DX_PI*2.0f); // while (fD<= (-D3DX_PI)) fD += (D3DX_PI*2.0f); - pQR->RotationAxis(vAxis, fD); // ʹϾ . + pQR->RotationAxis(vAxis, fD); // 쿼터니언 계산 및 세팅. } pVS->Set(mAP.k.x * mAP.f, mAP.k.y * mAP.f, mAP.k.z * mAP.f); // Scale } - // Ű .. + // 키값 정리.. CN3AnimKey * pKey[3] = {&(pTransform->m_KeyPos), &(pTransform->m_KeyRot), &(pTransform->m_KeyScale)}; for (int i = 0; i < 3; i++) { nKC = pKey[i]->Count(); @@ -1220,7 +1220,7 @@ bool CN3DExp::ProcessChr(INode * pNode) { } } if (bSameKeys) { - pKey[i]->Release(); // Ű Ȱٸ.. . + pKey[i]->Release(); // 키값이 모두 똑같다면.. 지운다. } } @@ -1232,23 +1232,23 @@ bool CN3DExp::ProcessJoint(INode * pNode, CN3Joint * pJoint) { return false; } if (false == IsBone(pNode)) { - return false; // ƴϸ + return false; // 본이 아니면 무시 } bool bLocalCoordinate = true; if (pJoint->Parent() == NULL) { bLocalCoordinate = false; } - this->ProcessTransform(pNode, pJoint, bLocalCoordinate); // Transformation ó.. Ʈ϶ .. + this->ProcessTransform(pNode, pJoint, bLocalCoordinate); // Transformation 처리.. 루트일때는 월드 값.. - // ̸ ʹ ϱ.. Ѵ. + // 이름이 너무 기니까.. 강제로 한다. pJoint->m_szName = pNode->GetName(); char szJFN[256]; wsprintf(szJFN, "%sChr\\%s.N3Joint", m_Option.szSubDir, pNode->GetName()); pJoint->FileNameSet(szJFN); /////////////////////////////////////// - // ڽ ü ó.. + // 자식 객체 처리.. int nCC = pNode->NumberOfChildren(); for (int i = 0; i < nCC; i++) { INode * pNodeChild = pNode->GetChildNode(i); @@ -1260,12 +1260,12 @@ bool CN3DExp::ProcessJoint(INode * pNode, CN3Joint * pJoint) { pJoint->ChildAdd(pChild); if (true != this->ProcessJoint(pNodeChild, pChild)) { - pJoint->ChildDelete(pChild); // ϸ ϵ忡 .. + pJoint->ChildDelete(pChild); // 실패하면 차일드에서 삭제.. delete pChild; pChild = NULL; } } - // ڽ ü ó.. + // 자식 객체 처리.. /////////////////////////////////////// return true; @@ -1287,7 +1287,7 @@ bool CN3DExp::IsBone(INode * pNode) { return true; } - if (cID == Class_ID(DUMMY_CLASS_ID, 0)) { // TMController Ʈ Ʈϰ찡 Ƿ + if (cID == Class_ID(DUMMY_CLASS_ID, 0)) { // 더미이지만 TMController가 바이패트 컨트롤일경우가 있으므로 return false; } @@ -1321,7 +1321,7 @@ bool CN3DExp::FindNodeRecursive(INode * pNode, Class_ID cID, std::list } /////////////////////////////////////// - // ڽ ü ó.. + // 자식 객체 처리.. int nCC = pNode->NumberOfChildren(); for (int i = 0; i < nCC; i++) { INode * pNodeChild = pNode->GetChildNode(i); @@ -1333,7 +1333,7 @@ bool CN3DExp::FindNodeRecursive(INode * pNode, Class_ID cID, std::list } bool CN3DExp::CheckObjectClassID(INode * pNode, - const Class_ID & cID) const // ־ 尡 ־ Ŭ ̵ ˻ + const Class_ID & cID) const // 주어진 노드가 주어진 클래스 아이디인지 검사 { if (NULL == pNode) { return false; @@ -1353,7 +1353,7 @@ bool CN3DExp::CheckObjectClassID(INode * pNode, return false; } -// Bone Skin ó ƾ.. Ϻκ ߿ ִ.. +// Bone 및 Skin 처리 루틴.. 일부분이지만 나중에 쓸수도 있다.. //////////////////////////////////// /* ISkin* pmSkin = NULL; @@ -1418,7 +1418,7 @@ bool CN3DExp::ProcessIMesh(INode * pNode, CN3IMesh * pIMesh) { return false; } if (pNode->ClassID() == Class_ID(DUMMY_CLASS_ID, 0)) { - return false; // ̸.. Ѿ.. + return false; // 더미이면.. 넘어간다.. } const char * szNamTmp = pNode->GetName(); @@ -1433,7 +1433,7 @@ bool CN3DExp::ProcessIMesh(INode * pNode, CN3IMesh * pIMesh) { } } - if (pTriObj == NULL || pNode->IsGroupHead()) // Ʈ ƴϰų ׷ .. + if (pTriObj == NULL || pNode->IsGroupHead()) // 지오메트리가 아니거나 그룹 헤드면.. { char szDebug[512]; wsprintf(szDebug, "%s -> May be Camera Target or Light Symbol\n", pNode->GetName()); @@ -1441,30 +1441,30 @@ bool CN3DExp::ProcessIMesh(INode * pNode, CN3IMesh * pIMesh) { return false; } - Mesh * pmMesh = &pTriObj->GetMesh(); // TriObject Mesh ´. - pmMesh->buildNormals(); // Normal .. + Mesh * pmMesh = &pTriObj->GetMesh(); // TriObject에서 Mesh를 얻어온다. + pmMesh->buildNormals(); // Normal 을 만든다.. - int nFC = pmMesh->getNumFaces(); // Mesh Face о´. - int nVC = pmMesh->getNumVerts(); // // Mesh о´. - int nUVC = pmMesh->getNumTVerts(); // ؽó ... + int nFC = pmMesh->getNumFaces(); // Mesh에서 Face를 읽어온다. + int nVC = pmMesh->getNumVerts(); // // Mesh에서 점 갯수 읽어온다. + int nUVC = pmMesh->getNumTVerts(); // 텍스처 매핑 점... - if (nFC <= 0) // ؽ ϳ ư.. + if (nFC <= 0) // 점과 버텍스가 하나도 없으면 돌아간다.. { - OutputDebugString("Mesh Export - ̽ ϳ ϴ..\n"); + OutputDebugString("Mesh Export - 점과 페이스가 하나도 없습니다..\n"); if (bNeedDelete) { delete pTriObj; } return false; } - // Matrix3 mMtx = pNode->GetNodeTM(m_Option.nFrmStart * 160); // İ´. - Matrix3 mMtx = pNode->GetObjTMAfterWSM(m_Option.nFrmStart * 160); // İ´. - // Matrix3 mMtx = pNode->GetObjectTM(m_Option.nFrmStart * 160); // İ´. + // Matrix3 mMtx = pNode->GetNodeTM(m_Option.nFrmStart * 160); // 월드 행렬가져온다. + Matrix3 mMtx = pNode->GetObjTMAfterWSM(m_Option.nFrmStart * 160); // 월드 행렬가져온다. + // Matrix3 mMtx = pNode->GetObjectTM(m_Option.nFrmStart * 160); // 월드 행렬가져온다. __VertexXyzNormal * pvDest1 = NULL; __Vector3 * pvDest2 = NULL; CN3VMesh * pVMesh = NULL; - if (nFC >= 8192) // ūŸ .. VMesh ϰ... + if (nFC >= 8192) // 좀 큰거면 .. 지형용으로 뽑을 VMesh 라고 생각하고... { pVMesh = new CN3VMesh(); pVMesh->CreateVertices(nFC * 3); @@ -1472,28 +1472,28 @@ bool CN3DExp::ProcessIMesh(INode * pNode, CN3IMesh * pIMesh) { } else { Point3 ptTmp; pIMesh->Create(nFC, nVC, nUVC); - pvDest1 = pIMesh->Vertices(); // ͸ + pvDest1 = pIMesh->Vertices(); // 쓸 데이터를 가져오고 this->ProcessName(pNode, pIMesh); for (int i = 0; i < nVC; i++) { - ptTmp = mMtx * pmMesh->getVert(i); // Vertex ŭ . - pvDest1[i].x = ptTmp.x; // * 0.0254f; // 1 Unit == 1 Inch -> Meter ٲ۴.. + ptTmp = mMtx * pmMesh->getVert(i); // Vertex 수만큼 루프를 돌린다. + pvDest1[i].x = ptTmp.x; // * 0.0254f; // 1 Unit == 1 Inch -> Meter 로 바꾼다.. pvDest1[i].y = ptTmp.z; // * 0.0254f; - pvDest1[i].z = ptTmp.y; // * 0.0254f; // y z ٲ۴.. + pvDest1[i].z = ptTmp.y; // * 0.0254f; // y 와 z 를 바꾼다.. } for (int i = 0; i < nUVC; i++) { - pIMesh->UVSet(i, pmMesh->tVerts[i].x, 1.0f - pmMesh->tVerts[i].y); // ϴ ؽó д.. + pIMesh->UVSet(i, pmMesh->tVerts[i].x, 1.0f - pmMesh->tVerts[i].y); // 일단 텍스처 매핑을 기록해 둔다.. } } ////////////////////////////////////// - // ˻Ѵ. - int vx1 = 0, vx2 = 2, vx3 = 1; // Triangle ȸ ϱ. + // 스케일을 검사한다. + int vx1 = 0, vx2 = 2, vx3 = 1; // Triangle 순서 회전 정하기. AffineParts ap; decomp_affine(mMtx, &ap); if (ap.k.x * ap.f <= 0 || ap.k.y * ap.f <= 0 || ap.k.z * ap.f <= 0) { // MessageBox(::GetActiveWindow(), pNode->GetName(), - // " : Դϴ -> Face ֽϴ.", MB_OK); + // "경고 : 스케일 값이 음수 입니다 -> Face가 뒤집혀 보일 수 있습니다.", MB_OK); vx1 = 0; vx2 = 1; vx3 = 2; @@ -1501,20 +1501,20 @@ bool CN3DExp::ProcessIMesh(INode * pNode, CN3IMesh * pIMesh) { Point3 ptTmp, ptNTmp; int nVI[3], nUVI[3]; - for (int i = 0; i < nFC; i++) // Face Count ŭ 鼭.. + for (int i = 0; i < nFC; i++) // Face Count 만큼 돌면서.. { Face * pFace = &(pmMesh->faces[i]); nVI[0] = pFace->v[vx1]; nVI[1] = pFace->v[vx2]; nVI[2] = pFace->v[vx3]; - if (pvDest2) // Ÿ... + if (pvDest2) // 지형용으로 뽑을 거면... { for (int j = 0; j < 3; j++) { - ptTmp = mMtx * pmMesh->getVert(nVI[j]); // Vertex ŭ . - pvDest2[i * 3 + j].x = ptTmp.x; // * 0.0254f; // 1 Unit == 1 Inch -> Meter ٲ۴.. - pvDest2[i * 3 + j].y = ptTmp.z; // * 0.0254f; // 1 Unit == 1 Inch -> Meter ٲ۴.. - pvDest2[i * 3 + j].z = ptTmp.y; // * 0.0254f; // 1 Unit == 1 Inch -> Meter ٲ۴.. + ptTmp = mMtx * pmMesh->getVert(nVI[j]); // Vertex 수만큼 루프를 돌린다. + pvDest2[i * 3 + j].x = ptTmp.x; // * 0.0254f; // 1 Unit == 1 Inch -> Meter 로 바꾼다.. + pvDest2[i * 3 + j].y = ptTmp.z; // * 0.0254f; // 1 Unit == 1 Inch -> Meter 로 바꾼다.. + pvDest2[i * 3 + j].z = ptTmp.y; // * 0.0254f; // 1 Unit == 1 Inch -> Meter 로 바꾼다.. } } else { pIMesh->VertexIndexSet(i * 3 + 0, nVI[0]); // Vertex Indices @@ -1549,7 +1549,7 @@ bool CN3DExp::ProcessIMesh(INode * pNode, CN3IMesh * pIMesh) { } if (m_Option.bGenerateSmoothNormal == TRUE && pvDest1) { - pIMesh->ReGenerateSmoothNormal(); // ε巴 .. + pIMesh->ReGenerateSmoothNormal(); // 법선 벡터 부드럽게 재계산.. } if (bNeedDelete) { @@ -1557,14 +1557,14 @@ bool CN3DExp::ProcessIMesh(INode * pNode, CN3IMesh * pIMesh) { pTriObj = NULL; } - if (pVMesh) // ޽ø.. + if (pVMesh) // 지형용으로 뽑은 메시면.. { pVMesh->m_szName = pNode->GetName(); - pVMesh->SaveToFile(pVMesh->m_szName + ".n3vmesh"); // .. + pVMesh->SaveToFile(pVMesh->m_szName + ".n3vmesh"); // 저장.. delete pVMesh; pVMesh = NULL; - return false; // ̷ ؾ IMesh ʴ´.. + return false; // 이렇게 리턴해야 IMesh 로 뽑지 않는다.. } return true; @@ -1580,9 +1580,9 @@ bool CN3DExp::ProcessMaterial(INode * pNode, __Material * pMtl, CN3Texture ** pp pMtl->Init(); *ppTex = NULL; - Mtl * pmMtl = pNode->GetMtl(); // 忡 Material ´. + Mtl * pmMtl = pNode->GetMtl(); // 노드에서 Material을 얻어온다. if (NULL == pmMtl) { - return false; // Material ̾ƿ´. + return false; // Material 이 있으면 정보를 뽑아온다. } // Methods to access sub-materials of meta-materials @@ -1604,13 +1604,13 @@ bool CN3DExp::ProcessMaterial(INode * pNode, __Material * pMtl, CN3Texture ** pp // pmMtlTmp = pmMtl; // } - if (pmMtl && pmMtl->GetSubTexmap(1) != NULL) // ؽó ִ ̸. + if (pmMtl && pmMtl->GetSubTexmap(1) != NULL) // 텍스처가 씌어 있는 재질이면. { Texmap * pmTex = pmMtl->GetSubTexmap(1); // Diffuse Texture Map BitmapTex * pBMT = NULL; if (pmTex && pmTex->ClassID() == Class_ID(BMTEX_CLASS_ID, 0x00)) { - pBMT = (BitmapTex *)pmTex; // ijƮ ڷ ٲ ִ. + pBMT = (BitmapTex *)pmTex; // 캐스트 연산자로 바꿔줄 수 있다. } if (pBMT && lstrlen(pBMT->GetMapName()) > 0) { @@ -1619,26 +1619,26 @@ bool CN3DExp::ProcessMaterial(INode * pNode, __Material * pMtl, CN3Texture ** pp szBMPFN = pBMT->GetMapName(); _splitpath(szBMPFN.c_str(), szDrv, szDir, szName, szExt); - // sub directory Ǿ ̱ + // sub directory 지정되어 있으면 붙이기 if (lstrlen(m_Option.szSubDir) > 0) { szBMPFN2 = std::string(m_Option.szSubDir); } else { szBMPFN2 = ""; } - // ؽ ̱ + // 텍스쳐 폴더 경로 붙이기 if (pszDir) { szBMPFN2 += pszDir; } else { szBMPFN2 += "Texture\\"; } szBMPFN2 += szName; - szBMPFN2 += ".DXT"; // ̸ Ȯڸ ٲپ ش.. + szBMPFN2 += ".DXT"; // 이름과 확장자를 바꾸어 준다.. CharLower(szBMPFN.begin()); CharLower(szBMPFN2.begin()); - int nTCPrev = m_pScene->s_MngTex.Count(); // ؽó ߺ üũ.. + int nTCPrev = m_pScene->s_MngTex.Count(); // 텍스처 중복 체크.. bool bOverlapped = false; for (int i = 0; i < nTCPrev; i++) { if (m_pScene->s_MngTex.Get(i)->FileName() == szBMPFN2) { @@ -1647,23 +1647,23 @@ bool CN3DExp::ProcessMaterial(INode * pNode, __Material * pMtl, CN3Texture ** pp } if (bOverlapped) { - (*ppTex) = m_pScene->s_MngTex.Get(szBMPFN2); // Ʈ а.. + (*ppTex) = m_pScene->s_MngTex.Get(szBMPFN2); // 비트맵을 읽고.. } else { (*ppTex) = new CN3Texture(); - if (false == (*ppTex)->LoadFromFile(szBMPFN)) // Ʈ бⰡ ϸ.. + if (false == (*ppTex)->LoadFromFile(szBMPFN)) // 비트맵 읽기가 실패하면.. { delete (*ppTex); (*ppTex) = NULL; return false; - } else // Ʈ о.. + } else // 비트맵을 읽었으면.. { (*ppTex)->m_szName = pBMT->GetName(); (*ppTex)->FileNameSet(szBMPFN2); - m_pScene->s_MngTex.Add(*ppTex); // Texture Manager ־ش. + m_pScene->s_MngTex.Add(*ppTex); // Texture Manager 에 넣어준다. CN3Texture * pTex = *ppTex; - if (m_Option.bGenerateHalfSizeTexture) // Texture Size ٿ .. + if (m_Option.bGenerateHalfSizeTexture) // Texture Size 를 절반으로 줄여 출력.. { D3DFORMAT fmt = pTex->PixelFormat(); int nW2 = pTex->Width() / 2; @@ -1671,7 +1671,7 @@ bool CN3DExp::ProcessMaterial(INode * pNode, __Material * pMtl, CN3Texture ** pp pTex->Convert(fmt, nW2, nH2); } - if (m_Option.bGenerateCompressedTexture) // Texture + if (m_Option.bGenerateCompressedTexture) // Texture 압축 사용 { D3DFORMAT fmt = pTex->PixelFormat(), NewFormat = D3DFMT_UNKNOWN; if (D3DFMT_X8R8G8B8 == fmt) { @@ -1689,7 +1689,7 @@ bool CN3DExp::ProcessMaterial(INode * pNode, __Material * pMtl, CN3Texture ** pp if (*ppTex && pMtl) { D3DFORMAT fmt = (*ppTex)->PixelFormat(); - if (D3DFMT_A8R8G8B8 == fmt || D3DFMT_DXT3 == fmt) // ä ؽó̸.. + if (D3DFMT_A8R8G8B8 == fmt || D3DFMT_DXT3 == fmt) // 알파채널 텍스처이면.. { pMtl->nRenderFlags |= RF_ALPHABLENDING; pMtl->dwSrcBlend = D3DBLEND_SRCALPHA; @@ -1702,8 +1702,8 @@ bool CN3DExp::ProcessMaterial(INode * pNode, __Material * pMtl, CN3Texture ** pp pMtl->Ambient.a = 1.0f; pMtl->Ambient.r = pMtl->Ambient.g = pMtl->Ambient.b = 150.0f / 255.0f; - } else { // ̷ ؽİ ϴ ƽ diffuseſ ؽĸ ִ ̱ - // ؽİ ִ°쿡 ׳ 1 ְ ƴѰ쿡 ͸ ִ´. + } else { // 이렇게 텍스쳐가 없을경우 하는 이유는 맥스에서는 diffuse대신에 텍스쳐를 넣는 개념이기 때문에 + // 텍스쳐가 있는경우에는 그냥 1을 넣고 아닌경우에만 메터리얼에 정해진 값을 넣는다. pMtl->Diffuse.a = 1.0f; pMtl->Diffuse.r = pmMtl->GetDiffuse().r; pMtl->Diffuse.g = pmMtl->GetDiffuse().g; @@ -1824,7 +1824,7 @@ bool CN3DExp::ProcessPhysique(INode * pNode, INode * pNodeRootJoint, CN3Skin * p // pPCE->ConvertToRigid(TRUE); // we convert all vertices to Rigid in this example - Matrix3 mMtxOrg = pNode->GetObjTMAfterWSM(m_Option.nFrmStart * 160); // ޽ + Matrix3 mMtxOrg = pNode->GetObjTMAfterWSM(m_Option.nFrmStart * 160); // 원래 메시의 월드 행렬 for (int i = 0; i < nPtCount; i++) { IPhyVertexExport * pVE = pPCE->GetVertexInterface(i); if (NULL == pVE) { @@ -1835,7 +1835,7 @@ bool CN3DExp::ProcessPhysique(INode * pNode, INode * pNodeRootJoint, CN3Skin * p ptOrg = ptOrg * mMtxOrg; // pVDest[i].vOrigin.Set(ptOrg.x * 0.0254f, ptOrg.z * 0.0254f, ptOrg.y * 0.0254f); pVDest[i].vOrigin.Set(ptOrg.x, ptOrg.z, ptOrg.y); - // pObj->SetPoint(i, ptBlendP); // Ȯϱ ؼ ־.. + // pObj->SetPoint(i, ptBlendP); // 확인하기 위해서 넣어본다.. int nVType = pVE->GetVertexType(); if (nVType & BLENDED_TYPE) // Blend Type @@ -1851,7 +1851,7 @@ bool CN3DExp::ProcessPhysique(INode * pNode, INode * pNodeRootJoint, CN3Skin * p for (int j = 0; j < nWC; j++) { int nJI = 0; INode * pBone = pVtxBlend->GetNode(j); - this->FindBoneIndex(pNodeRootJoint, pBone, nJI); // ͸ ε ã´.. + this->FindBoneIndex(pNodeRootJoint, pBone, nJI); // 포인터를 가지고 인덱스를 찾는다.. float fWeight = pVtxBlend->GetWeight(j); const char * szBone = pBone->GetName(); @@ -1867,7 +1867,7 @@ bool CN3DExp::ProcessPhysique(INode * pNode, INode * pNodeRootJoint, CN3Skin * p IPhyRigidVertex * pVtxNoBlend = (IPhyRigidVertex *)pVE; INode * pBone = pVtxNoBlend->GetNode(); int nJI = 0; - this->FindBoneIndex(pNodeRootJoint, pBone, nJI); // ͸ ε ã´.. + this->FindBoneIndex(pNodeRootJoint, pBone, nJI); // 포인터를 가지고 인덱스를 찾는다.. const char * szBone = pBone->GetName(); @@ -1881,7 +1881,7 @@ bool CN3DExp::ProcessPhysique(INode * pNode, INode * pNodeRootJoint, CN3Skin * p pPE->ReleaseContextInterface(pPCE); pPhyMod->ReleaseInterface(I_PHYINTERFACE, pPE); - pN3Skin->RecalcWeight(); // weight 1.0 ǵ ѹ ٽ ش. + pN3Skin->RecalcWeight(); // weight 값이 1.0이 되도록 한번더 다시 계산해준다. return TRUE; } @@ -1891,7 +1891,7 @@ bool CN3DExp::FindNodeIndex(INode* pNodeCompare, INode* pNodeSrc, Class_ID& cID, if(NULL == pNodeCompare || NULL == pNodeSrc) return false; Control* pCtrl = pNodeCompare->GetTMController(); if(NULL == pCtrl) return false; - if(pCtrl->ClassID() != cID) return false; // 尡 ƴϸ Ѵ.. + if(pCtrl->ClassID() != cID) return false; // 바이페드가 아니면 무시한다.. DWORD dwID = pNodeSrc->SuperClassID(); DWORD dwID2 = pNodeCompare->SuperClassID(); @@ -1919,7 +1919,7 @@ bool CN3DExp::FindBoneIndex(INode * pNodeCompare, INode * pNodeSrc, int & nNodeI return false; } if (false == IsBone(pNodeCompare)) { - return false; // ƴϸ Ѵ.. + return false; // 본이 아니면 무시한다.. } DWORD dwID = pNodeSrc->SuperClassID(); diff --git a/src/tool/PlugIn_Max/N3DExp.h b/src/tool/PlugIn_Max/N3DExp.h index 8cec7718..6c66ac0b 100644 --- a/src/tool/PlugIn_Max/N3DExp.h +++ b/src/tool/PlugIn_Max/N3DExp.h @@ -72,7 +72,7 @@ class CN3DExp : public SceneExport { CN3Scene * m_pScene; // N3Scene protected: - static __EXPORT_OPTION m_Option; // Export Option - Window Procedure Static .. + static __EXPORT_OPTION m_Option; // Export Option - Window Procedure 땜시 Static 으로 쓴다.. BOOL m_bCancelExport; // TRUE?->Cancel int m_nNodeCur; // Current Processing Node Count int m_nNodeCount; // Total Node Count @@ -96,7 +96,7 @@ class CN3DExp : public SceneExport { bool IsBone(INode * pNode); bool FindNodeRecursive(INode * pNode, Class_ID cID, std::list & list); bool CheckObjectClassID(INode * pNode, - const Class_ID & cID) const; // ־ Ʈ ־ Ŭ ̵ ˻ + const Class_ID & cID) const; // 주어진 노드의 오브젝트가 주어진 클래스 아이디인지 검사 Modifier * FindPhysiqueModifier(INode * pNode); // bool FindNodeIndex(INode* pNodeCompare, INode* pNodeSrc, Class_ID& cID, int& nNodeIndex); bool FindBoneIndex(INode * pNodeCompare, INode * pNodeSrc, int & nNodeIndex); diff --git a/src/tool/PlugIn_Max/N3DExp.rc b/src/tool/PlugIn_Max/N3DExp.rc index 3c9486b436114cc4239e9aa0439a877e07597f10..f699eb413b49bf010ee550f1012d6bacc3d9062f 100644 GIT binary patch literal 13372 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 TnehK(9NTNQG#n@So<`ySh{Ii$ diff --git a/src/tool/PlugIn_Max/StdAfx.h b/src/tool/PlugIn_Max/StdAfx.h index f42cd158..babf00ff 100644 --- a/src/tool/PlugIn_Max/StdAfx.h +++ b/src/tool/PlugIn_Max/StdAfx.h @@ -3,11 +3,11 @@ // are changed infrequently // -// stl ... +// stl 쓸려고... #pragma warning(disable : 4786) #pragma once -// ߰ .. +// 추가 헤더.. #include #include "N3Base/My_3DStruct.h" diff --git a/src/tool/PlugIn_Maya/N3E2Wrapper.cpp b/src/tool/PlugIn_Maya/N3E2Wrapper.cpp index 614d1da0..afc3726b 100644 --- a/src/tool/PlugIn_Maya/N3E2Wrapper.cpp +++ b/src/tool/PlugIn_Maya/N3E2Wrapper.cpp @@ -50,7 +50,7 @@ CN3EngTool * g_pEng; // CN3E2Wrapper class methods: CN3E2Wrapper::CN3E2Wrapper() { - // Ȳ ȭ + // 진행 상황 대화상자 HWND hWnd = M3dView::applicationShell(); HINSTANCE hInst = MhInstPlugin; m_hDlgProgress = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PROGRESS), hWnd, CN3E2Wrapper::DlgProcProgress); @@ -65,7 +65,7 @@ CN3E2Wrapper::CN3E2Wrapper() { } CN3E2Wrapper::~CN3E2Wrapper() { - ::DestroyWindow(m_hDlgProgress); // ֱ.. + ::DestroyWindow(m_hDlgProgress); // 진행 상자 없애기.. this->Release(); } @@ -87,8 +87,8 @@ void CN3E2Wrapper::Release() { m_Option.bGenerateCompressedTexture = TRUE; m_Option.fSamplingRate = 30.0f; - lstrcpy(m_szPath, ""); // ̸ - lstrcpy(m_szFileName, ""); // ̸ + lstrcpy(m_szPath, ""); // 경로 이름 + lstrcpy(m_szFileName, ""); // 파일 이름 delete m_pScene; m_pScene = NULL; @@ -97,23 +97,23 @@ void CN3E2Wrapper::Release() { } void CN3E2Wrapper::SetFileName(const char * szFileName) { - lstrcpy(m_szFileName, szFileName); // ̸ + lstrcpy(m_szFileName, szFileName); // 파일 이름 } void CN3E2Wrapper::SetPath(const char * szPath) { - lstrcpy(m_szPath, szPath); // ̸ + lstrcpy(m_szPath, szPath); // 파일 이름 } -// Ʈ . +// 라이트 종류를 리턴. CN3Light * CN3E2Wrapper::ProcessLight(MFnLight & mLight) { CN3Light * pLight = new CN3Light(); MFnTransform mT = MFnTransform(mLight.parent(0)); this->ProcessTransform(mT, pLight); // Transform Node pLight->m_szName = mT.name().asChar(); - pLight->FileNameSet("Data\\" + pLight->m_szName + ".N3Light"); // ̸ .. + pLight->FileNameSet("Data\\" + pLight->m_szName + ".N3Light"); // 파일 이름 결정.. - // Ʈ + // 라이트 종류 D3DCOLORVALUE dcv = {1, 1, 1, 1}; pLight->m_Data.InitPoint(m_pScene->LightCount(), __Vector3(0, 0, 0), dcv); MFn::Type Type = mLight.type(); @@ -124,21 +124,21 @@ CN3Light * CN3E2Wrapper::ProcessLight(MFnLight & mLight) { pLight->m_Data.Type = D3DLIGHT_SPOT; MFnSpotLight Spot(mLight.object()); - pLight->m_Data.Theta = (float)Spot.coneAngle(); // ԰ - pLight->m_Data.Phi = (float)Spot.penumbraAngle(); // ܺ ԰ - } else // ⺻ point light + pLight->m_Data.Theta = (float)Spot.coneAngle(); // 내부 원뿔각 + pLight->m_Data.Phi = (float)Spot.penumbraAngle(); // 외부 원뿔각 + } else // 기본적으로 point light { pLight->m_Data.Type = D3DLIGHT_POINT; } pLight->m_Data.Position = pLight->Pos(); - MFloatVector dir = mLight.lightDirection(); // + MFloatVector dir = mLight.lightDirection(); // 방향 pLight->m_Data.Direction.x = dir.x; pLight->m_Data.Direction.y = dir.y; pLight->m_Data.Direction.z = -dir.z; - MColor color = mLight.color(); // Ʈ ÷. + MColor color = mLight.color(); // 라이트 컬러. pLight->m_Data.Ambient.a = 1.0f; pLight->m_Data.Ambient.r = color.r * 0.3f; @@ -152,7 +152,7 @@ CN3Light * CN3E2Wrapper::ProcessLight(MFnLight & mLight) { /* MFnDependencyNode lightDG(mLight); MObject lightAttr = lightDG.attribute(MString("intensity")); - MPlug plug(mLight, lightAttr); // + MPlug plug(mLight, lightAttr); // 강도 double intensity; plug.getValue(intensity); @@ -161,7 +161,7 @@ CN3Light * CN3E2Wrapper::ProcessLight(MFnLight & mLight) { plug.getValue( */ - // ⺻. + // 나머지 기본값. pLight->m_Data.nNumber = m_pScene->LightCount(); pLight->m_Data.bOn = TRUE; @@ -171,15 +171,15 @@ CN3Light * CN3E2Wrapper::ProcessLight(MFnLight & mLight) { CN3Camera * CN3E2Wrapper::ProcessCamera(MFnCamera & mCamera) { CN3Camera * pCamera = new CN3Camera(); MFnTransform mT(mCamera.parent(0)); - this->ProcessTransform(mT, pCamera); // Transform ó.. + this->ProcessTransform(mT, pCamera); // Transform 처리.. std::string szFN = "Data\\" + pCamera->m_szName + ".N3Camera"; pCamera->FileNameSet(szFN); // double dHFOV, dVFOV; // mCamera.getPortFieldOfView(800, 600, dHFOV, dVFOV); - // pCamera->s_CameraData.fNP = (float)(mCamera.nearClippingPlane() * 0.01); // meter ̱⶧ 100 ش. + // pCamera->s_CameraData.fNP = (float)(mCamera.nearClippingPlane() * 0.01); // meter 단위 이기때문에 100 으로 나누어 준다. // pCamera->s_CameraData.fFP = (float)(mCamera.farClippingPlane() * 0.01); - // pCamera->s_CameraData.fFOV = (float)dHFOV; // 90 .. + // pCamera->s_CameraData.fFOV = (float)dHFOV; // 90 도 렌즈로 강제 세팅.. return pCamera; } @@ -214,7 +214,7 @@ void CN3E2Wrapper::SceneExport() { HINSTANCE hInst = MhInstPlugin; HWND hWnd = M3dView::applicationShell(); int rval = - DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EXPORT_OPTION), hWnd, DlgProcPane, NULL); // Ʈ г ȭ.. + DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_EXPORT_OPTION), hWnd, DlgProcPane, NULL); // 컨트롤 패널 대화상자.. if (rval != 1) { return; } @@ -225,7 +225,7 @@ void CN3E2Wrapper::SceneExport() { char szPath[256]; ::GetCurrentDirectory(256, szPath); - g_pEng->PathSet(szPath); // ... + g_pEng->PathSet(szPath); // 경로 설정... m_pScene = new CN3Scene(); @@ -235,12 +235,12 @@ void CN3E2Wrapper::SceneExport() { delete g_pEng; g_pEng = NULL; - MessageBox(::GetActiveWindow(), "VideoMemory մϴ. VideoMemory Ȯ ٽ õϼ.", + MessageBox(::GetActiveWindow(), "VideoMemory 가 부족합니다. VideoMemory 확보 후 다시 시도하세요.", "Data Export Error", MB_OK); return; } - MTime mOldTime = MAnimControl::currentTime(); // ° .. + MTime mOldTime = MAnimControl::currentTime(); // 현재 프레임이 몇 프레임째인지 저장.. MTime ZeroFrm; ZeroFrm.setValue(0); // ZeroFrm.setUnit(MTime::kNTSCFrame); MAnimControl::setCurrentTime(ZeroFrm); @@ -250,7 +250,7 @@ void CN3E2Wrapper::SceneExport() { DWORD dwRWC = 0; char szInfo[1024] = ""; - m_pScene->Release(); // ϰ.. + m_pScene->Release(); // 모두 해제하고.. // m_pScene->m_fFrmCur = (float)MAnimControl::currentTime().value(); m_pScene->m_fFrmStart = (float)m_Option.nFrmStart; // (float)MAnimControl::minTime().value(); @@ -258,10 +258,10 @@ void CN3E2Wrapper::SceneExport() { MObjectArray mObjects; - MItDependencyNodes IterNodes1(MFn::kCamera); // scene üũ.. - MItDependencyNodes IterNodes2(MFn::kLight); // scene üũ.. - MItDependencyNodes IterNodes3(MFn::kMesh); // scene üũ.. - MItDependencyNodes IterNodes4(MFn::kSkinClusterFilter); // scene üũ.. + MItDependencyNodes IterNodes1(MFn::kCamera); // scene 의 노드들을 체크.. + MItDependencyNodes IterNodes2(MFn::kLight); // scene 의 노드들을 체크.. + MItDependencyNodes IterNodes3(MFn::kMesh); // scene 의 노드들을 체크.. + MItDependencyNodes IterNodes4(MFn::kSkinClusterFilter); // scene 의 노드들을 체크.. for (int i = 0; !IterNodes1.isDone(); IterNodes1.next(), i++) { mObjects.append(IterNodes1.item()); @@ -284,16 +284,16 @@ void CN3E2Wrapper::SceneExport() { // Object Count... int nObjectCount = mObjects.length(); - // Ȳ ȭ Ʈ ڵ + // 진행 상황 대화상자 컨트롤 핸들 ::SendMessage(m_hWndPB, PBM_SETRANGE, 0, MAKELPARAM(0, nObjectCount)); ::SendMessage(m_hWndLB, LB_RESETCONTENT, 0, 0); - ::ShowWindow(m_hDlgProgress, SW_SHOW); // ȭڸ ̰.. + ::ShowWindow(m_hDlgProgress, SW_SHOW); // 진행 대화상자를 보이고.. ::ShowWindow(m_hDlgProgress, SW_RESTORE); m_bCancelExport = FALSE; for (int i = 0; i < nObjectCount && FALSE == m_bCancelExport; i++) { - // Dialog Message ó... + // Dialog Message 처리... MSG msg; if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) { TranslateMessage(&msg); @@ -301,18 +301,18 @@ void CN3E2Wrapper::SceneExport() { } if (TRUE == m_bCancelExport) { - break; // Export Cancel ư .. + break; // Export Cancel 버튼을 누르면 취소.. } MObject mObj = mObjects[i]; MFn::Type mType = mObj.apiType(); if (m_Option.bExportSelectedOnly && IsSelected(mSelList, mObj) == false) { - continue; // õ ͸ Export ؾ ϸ.. + continue; // 선택된 것만 Export 해야 하면.. } bool bExport = true; - if (MFn::kCamera == mType && TRUE == m_Option.bExportCamera) // ī޶.. + if (MFn::kCamera == mType && TRUE == m_Option.bExportCamera) // 카메라.. { MFnCamera mCamera(mObj); const char * szCamera = mCamera.name().asChar(); @@ -323,23 +323,23 @@ void CN3E2Wrapper::SceneExport() { } } else if ((MFn::kPointLight == mType || MFn::kDirectionalLight == mType || MFn::kAmbientLight == mType || MFn::kSpotLight == mType) && - TRUE == m_Option.bExportLight) // Ʈ + TRUE == m_Option.bExportLight) // 라이트 { CN3Light * pLight = this->ProcessLight(MFnLight(mObj)); - pLight->m_Data.nNumber = m_pScene->LightCount(); // Ʈ ȣ ̱.. - m_pScene->LightAdd(pLight); // Scene Ʈ ߰.. + pLight->m_Data.nNumber = m_pScene->LightCount(); // 라이트 번호 붙이기.. + m_pScene->LightAdd(pLight); // Scene 에 라이트 추가.. } else if (mType == MFn::kMesh && TRUE == m_Option.bExportGeometry) { MFnMesh mMesh(mObj); const char * szMeshName = mMesh.name().asChar(); - bool bHaveJoint = false; // 븦 óؾ ϸ.. + bool bHaveJoint = false; // 만약 뼈대를 처리해야 하면.. if (TRUE == m_Option.bExportCharacter) { bHaveJoint = this->HaveJoint(mMesh); } - if (true == bHaveJoint) // ޽ø .. + if (true == bHaveJoint) // 관절에 연결된 메시면 지나간다.. { - // wsprintf(szInfo, "Skinning ޽(%s) մϴ.", mMesh.name().asChar()); + // wsprintf(szInfo, "Skinning 이 된 메시(%s)를 무시합니다.", mMesh.name().asChar()); // nLI = ::SendMessage(m_hWndLB, LB_ADDSTRING, 0, (LPARAM)szInfo); // Progress dialog // ::SendMessage(m_hWndLB, LB_SETCURSEL, (WPARAM)nLI,0); // Progress dialog continue; @@ -348,21 +348,21 @@ void CN3E2Wrapper::SceneExport() { if (mMesh.parentCount() > 0 && mMesh.parent(0).apiType() == MFn::kTransform) { MFnTransform mTM(mMesh.parent(0)); if (mTM.childCount() == 1) { - bProcessShape = true; // ù° ڽ 츸 ó.. + bProcessShape = true; // 첫번째 자식일 경우만 처리.. } else if (mTM.childCount() > 1 && mTM.child(0) == mMesh.object()) { - bProcessShape = true; // ù° ڽ 츸 ó.. + bProcessShape = true; // 첫번째 자식일 경우만 처리.. } } if (bProcessShape) { ProcessShape(mMesh); } } - } else if (mType == MFn::kSkinClusterFilter && m_Option.bExportCharacter) // Ű ij.... + } else if (mType == MFn::kSkinClusterFilter && m_Option.bExportCharacter) // 스키닝 데이터 및 캐릭터.... { MFnSkinCluster mSkin(mObj); this->ProcessChr(mSkin); } else { - wsprintf(szInfo, "(%s) մϴ.", mObj.apiTypeStr()); + wsprintf(szInfo, "노드(%s) 무시합니다.", mObj.apiTypeStr()); nLI = ::SendMessage(m_hWndLB, LB_ADDSTRING, 0, (LPARAM)szInfo); // Progress dialog ::SendMessage(m_hWndLB, LB_SETCURSEL, (WPARAM)nLI, 0); // Progress dialog @@ -383,11 +383,11 @@ void CN3E2Wrapper::SceneExport() { } } - // Scene . + // Scene 저장. bool bSaveOK = true; if (m_bCancelExport == TRUE) { bSaveOK = false; - int nYesNo = MessageBox(hWnd, "File ", "Export ϼ̽ϴ. Ͻðڽϱ?", MB_YESNO); + int nYesNo = MessageBox(hWnd, "File 저장", "Export를 취소하셨습니다. 저장하시겠습니까?", MB_YESNO); if (nYesNo == IDYES) { bSaveOK = true; } @@ -396,17 +396,17 @@ void CN3E2Wrapper::SceneExport() { if (bSaveOK) { m_pScene->Tick(0); if (m_pScene->CameraCount() <= 0) { - m_pScene->DefaultCameraAdd(); // ⺻ ī޶ + m_pScene->DefaultCameraAdd(); // 기본 카메라 } if (m_pScene->LightCount() <= 0) { - m_pScene->DefaultLightAdd(); // ⺻ Ʈ ߰.. + m_pScene->DefaultLightAdd(); // 기본 라이트 추가.. } - m_pScene->SaveDataAndResourcesToFile(m_szFileName); // Scene , Resource .. + m_pScene->SaveDataAndResourcesToFile(m_szFileName); // Scene , Resource 저장.. m_pScene->Release(); } - MAnimControl::setCurrentTime(mOldTime); // .. + MAnimControl::setCurrentTime(mOldTime); // 원래 대로.. MGlobal::viewFrame(mOldTime); delete m_pScene; @@ -421,11 +421,11 @@ bool CN3E2Wrapper::ProcessIMesh(MFnMesh & mMesh, CN3IMesh * pIMesh) { } pIMesh->Release(); - // ̸ .. + // 이름 짓기.. MFnTransform mTM(mMesh.parent(0)); pIMesh->m_szName = mTM.name().asChar(); - // Polygon ﰢ ޽÷ ش.. + // Polygon 을 모두 삼각형 메시로 만들고 갯수를 세어준다.. int nPC = mMesh.numPolygons(); if (nPC <= 0) { return false; @@ -437,7 +437,7 @@ bool CN3E2Wrapper::ProcessIMesh(MFnMesh & mMesh, CN3IMesh * pIMesh) { MFloatArray mFAU, mFAV; MPointArray mVArray; mMesh.getUVs(mFAU, mFAV); - int nUVC = mFAU.length(); // UV ǥ Count + int nUVC = mFAU.length(); // UV 좌표 Count mMesh.getPoints(mVArray); int nVC = mVArray.length(); // Vertex Count @@ -447,78 +447,78 @@ bool CN3E2Wrapper::ProcessIMesh(MFnMesh & mMesh, CN3IMesh * pIMesh) { for (int i = 0; i < nPC; i++) { MVector vNTmp; mMesh.getPolygonNormal(i, vNTmp); // normal - mMesh.getPolygonVertices(i, mVITmp); // polygon ִ Index + mMesh.getPolygonVertices(i, mVITmp); // polygon 에 있는 점 Index mMesh.getPolygonUVid(i, 0, nUVI); nVI = mVITmp[0]; Normals[nVI] += vNTmp; - iNormalCounts[nVI]++; // Normal ߰. + iNormalCounts[nVI]++; // 면의 Normal 값 추가. mVIArray.append(nVI); // Vertex Index - mUVIArray.append(nUVI); // VertexIndex, UV Index .. + mUVIArray.append(nUVI); // VertexIndex, UV Index 기록.. mMesh.getPolygonUVid(i, 1, nUVI); nVI = mVITmp[1]; Normals[nVI] += vNTmp; - iNormalCounts[nVI]++; // Normal ߰. + iNormalCounts[nVI]++; // 면의 Normal 값 추가. mVIArray.append(nVI); // Vertex Index - mUVIArray.append(nUVI); // VertexIndex, UV Index .. + mUVIArray.append(nUVI); // VertexIndex, UV Index 기록.. mMesh.getPolygonUVid(i, 2, nUVI); nVI = mVITmp[2]; Normals[nVI] += vNTmp; - iNormalCounts[nVI]++; // Normal ߰. + iNormalCounts[nVI]++; // 면의 Normal 값 추가. mVIArray.append(nVI); // Vertex Index - mUVIArray.append(nUVI); // VertexIndex, UV Index .. + mUVIArray.append(nUVI); // VertexIndex, UV Index 기록.. nFC++; int nVITmp = mVITmp.length(); - for (int j = 3; j < nVITmp; j++) // Ѹ鿡 װ ̻ ִ Ÿ.. + for (int j = 3; j < nVITmp; j++) // 한면에 점이 네개 이상 있는 거면.. { mMesh.getPolygonUVid(i, 0, nUVI); nVI = mVITmp[0]; Normals[nVI] += vNTmp; - iNormalCounts[nVI]++; // Normal ߰. + iNormalCounts[nVI]++; // 면의 Normal 값 추가. mVIArray.append(nVI); // Vertex Index - mUVIArray.append(nUVI); // VertexIndex, UV Index .. + mUVIArray.append(nUVI); // VertexIndex, UV Index 기록.. mMesh.getPolygonUVid(i, nVITmp - j + 1, nUVI); nVI = mVITmp[nVITmp - j + 1]; Normals[nVI] += vNTmp; - iNormalCounts[nVI]++; // Normal ߰. + iNormalCounts[nVI]++; // 면의 Normal 값 추가. mVIArray.append(nVI); // Vertex Index - mUVIArray.append(nUVI); // VertexIndex, UV Index .. + mUVIArray.append(nUVI); // VertexIndex, UV Index 기록.. mMesh.getPolygonUVid(i, nVITmp - j + 2, nUVI); nVI = mVITmp[nVITmp - j + 2]; Normals[nVI] += vNTmp; - iNormalCounts[nVI]++; // Normal ߰. + iNormalCounts[nVI]++; // 면의 Normal 값 추가. mVIArray.append(nVI); // Vertex Index - mUVIArray.append(nUVI); // VertexIndex, UV Index .. + mUVIArray.append(nUVI); // VertexIndex, UV Index 기록.. nFC++; } } - pIMesh->Create(nFC, nVC, nUVC); // ޽ .. + pIMesh->Create(nFC, nVC, nUVC); // 메시 생성.. MFnTransform mTransform(mMesh.parent(0)); MMatrix mMtxWorld; mMtxWorld.setToIdentity(); this->GetWorldTransform(mTransform, mMtxWorld); - MMatrix mMtxWorldRot = mMtxWorld; // ȸĸ .. + MMatrix mMtxWorldRot = mMtxWorld; // 회전행렬만 떼고.. mMtxWorldRot.matrix[3][0] = mMtxWorldRot.matrix[3][1] = mMtxWorldRot.matrix[3][2] = 0; mMtxWorldRot.matrix[3][3] = 1.0; __VertexXyzNormal * pVDest = pIMesh->Vertices(); for (int i = 0; i < nVC; i++) { - MPoint mVTmp = mVArray[i]; // World Matrix ϰ.. + MPoint mVTmp = mVArray[i]; // World Matrix 곱하고.. mVTmp *= mMtxWorld; - pVDest[i].x = (float)(mVTmp.x * 0.01); // Vertex Data - meter ̱ 100 ش. + pVDest[i].x = (float)(mVTmp.x * 0.01); // Vertex Data 세팅 - meter 단위 이기 때문에 100으로 나누어 준다. pVDest[i].y = (float)(mVTmp.y * 0.01); - pVDest[i].z = -(float)(mVTmp.z * 0.01); // Z ݴ Ѵ. + pVDest[i].z = -(float)(mVTmp.z * 0.01); // Z 축은 반대로 한다. - // Normal ó... + // Normal 값 처리... // if(iNormalCounts[i] > 0) // { // mNTmp.x = mNTmp.x / iNormalCounts[i]; @@ -530,22 +530,22 @@ bool CN3E2Wrapper::ProcessIMesh(MFnMesh & mMesh, CN3IMesh * pIMesh) { mNTmp.normalize(); pVDest[i].n.x = (float)mNTmp.x; pVDest[i].n.y = (float)mNTmp.y; - pVDest[i].n.z = -(float)mNTmp.z; // Z ݴ Ѵ. + pVDest[i].n.z = -(float)mNTmp.z; // Z 축은 반대로 한다. } for (int i = 0; i < nUVC; i++) { - pIMesh->UVSet(i, mFAU[i], 1.0f - mFAV[i]); // UV .. + pIMesh->UVSet(i, mFAU[i], 1.0f - mFAV[i]); // UV 데이터 세팅.. } - // for(int i = 0; i < nUVC; i++) pIMesh->UVSet(i, mFAU[i], mFAV[i]); // UV .. + // for(int i = 0; i < nUVC; i++) pIMesh->UVSet(i, mFAU[i], mFAV[i]); // UV 데이터 세팅.. for (int i = 0; i < nFC; i++) // { - pIMesh->VertexIndexSet(i * 3 + 0, mVIArray[i * 3 + 0]); // Vertex Index + pIMesh->VertexIndexSet(i * 3 + 0, mVIArray[i * 3 + 0]); // Vertex Index 세팅 pIMesh->VertexIndexSet(i * 3 + 1, mVIArray[i * 3 + 2]); pIMesh->VertexIndexSet(i * 3 + 2, mVIArray[i * 3 + 1]); - if (nUVC > 0) // UV Index ־ Ѵ.. + if (nUVC > 0) // UV Index 가 있어야 한다.. { - pIMesh->UVIndexSet(i * 3 + 0, mUVIArray[i * 3 + 0]); // UV Index .. + pIMesh->UVIndexSet(i * 3 + 0, mUVIArray[i * 3 + 0]); // UV Index 세팅.. pIMesh->UVIndexSet(i * 3 + 1, mUVIArray[i * 3 + 2]); pIMesh->UVIndexSet(i * 3 + 2, mUVIArray[i * 3 + 1]); } @@ -564,7 +564,7 @@ bool CN3E2Wrapper::ProcessVMesh(MFnMesh & mMesh, CN3VMesh * pVMesh) { } pVMesh->Release(); - // Polygon ﰢ ޽÷ ش.. + // Polygon 을 모두 삼각형 메시로 만들고 갯수를 세어준다.. int nPC = mMesh.numPolygons(); if (nPC <= 0) { return false; @@ -575,19 +575,19 @@ bool CN3E2Wrapper::ProcessVMesh(MFnMesh & mMesh, CN3VMesh * pVMesh) { MIntArray mVIs; MPointArray mVs; - mMesh.getPoints(mVs); // ġ.. + mMesh.getPoints(mVs); // 위치들.. MPoint mPosTmp; - MFnTransform mTransform(mMesh.parent(0)); // + MFnTransform mTransform(mMesh.parent(0)); // 월드 행렬 MMatrix mMtxWorld; mMtxWorld.setToIdentity(); this->GetWorldTransform(mTransform, mMtxWorld); for (int i = 0; i < nPC; i++) { - mMesh.getPolygonVertices(i, mVIs); // polygon ִ Index + mMesh.getPolygonVertices(i, mVIs); // polygon 에 있는 점 Index if (mVIs.length() != 3) { char szErr[256]; - wsprintf(szErr, "%s ﰢ ƴմϴ.", mMesh.name().asChar()); + wsprintf(szErr, "%s 는 삼각 폴리곤이 아닙니다.", mMesh.name().asChar()); break; } @@ -599,7 +599,7 @@ bool CN3E2Wrapper::ProcessVMesh(MFnMesh & mMesh, CN3VMesh * pVMesh) { } } - // ̸ ó.. + // 이름 처리.. pVMesh->m_szName = ""; this->ProcessName(mTransform.object(), pVMesh->m_szName); std::string szFN = pVMesh->m_szName + ".N3VMesh"; @@ -642,15 +642,15 @@ bool CN3E2Wrapper::ProcessSkin(MFnSkinCluster & mSkin, CN3Skin * pSkin) { } if (false == this->ProcessIMesh(mMeshOutput, pSkin)) { - return false; // Indexed Mesh ó. + return false; // Indexed Mesh 처리. } - // Joint ׷ Ǿ ִٸ Parent Transform ó.. + // Joint 가 그룹 되어 있다면 Parent Transform 처리.. /* if(mJointRoot.parentCount() > 0 && mJointRoot.parent(0).hasFn(MFn::kTransform)) { MFnTransform mTJP(mJointRoot.parent(0)); - // Normal ٽ .. + // Normal 값 다시 정리.. MMatrix mMtx; mMtx.setToIdentity(); this->GetWorldTransform(mTJP, mMtx); MTransformationMatrix mTMtx(mMtx); @@ -675,28 +675,28 @@ bool CN3E2Wrapper::ProcessSkin(MFnSkinCluster & mSkin, CN3Skin * pSkin) { */ __VertexSkinned * pVBone = pSkin->SkinVertices(); - MFnTransform mTM(mMeshOutput.parent(0)); // Mesh, Joint Transform + MFnTransform mTM(mMeshOutput.parent(0)); // Mesh, Joint 에 적용된 Transform MMatrix mMtxM; mMtxM.setToIdentity(); this->GetWorldTransform(mTM, mMtxM); int iFind = pSkin->m_szName.find('_'); if (iFind > 0) { - pSkin->m_szName = pSkin->m_szName.substr(iFind + 1); // ٰ ߶ش.. + pSkin->m_szName = pSkin->m_szName.substr(iFind + 1); // 언더바가 있으면 잘라준다.. } - pSkin->FileNameSet("Item\\" + pSkin->m_szName + ".N3Skin"); // ̸ .. + pSkin->FileNameSet("Item\\" + pSkin->m_szName + ".N3Skin"); // 파일 이름 결정.. - for (int i = 0; !mGIt.isDone(); mGIt.next(), i++) // 鼭 Ʈ(Geometry ...) óѴ. + for (int i = 0; !mGIt.isDone(); mGIt.next(), i++) // 루프를 돌면서 컴포넌트(Geometry 의 한점...)을 처리한다. { MObject mComp = mGIt.component(); MFn::Type mType = mComp.apiType(); - // Weight Ѵ. + // Weight 값을 구한다. MFloatArray mWTs; unsigned int nWTs; mSkin.getWeights(mSkinPath, mComp, mWTs, nWTs); if (nWTs == 0) { - lstrcpy(szInfo, "Skin ó : Weight ϴ."); + lstrcpy(szInfo, "Skin 처리 오류 : Weight 값이 없습니다."); nLI = ::SendMessage(m_hWndLB, LB_ADDSTRING, 0, (LPARAM)szInfo); // Progress dialog ::SendMessage(m_hWndLB, LB_SETCURSEL, (WPARAM)nLI, 0); // Progress dialog @@ -705,16 +705,16 @@ bool CN3E2Wrapper::ProcessSkin(MFnSkinCluster & mSkin, CN3Skin * pSkin) { MPoint mPt; mPt = mGIt.position(); - // mPt = mVArray[j]; // ̰ .. ε ư Ѵ.. + // mPt = mVArray[j]; // 원래 이게 정상이지만.. 바인딩 포즈로 돌아가야 한다.. - mPt *= mMtxM; // ְ.. + mPt *= mMtxM; // 행렬을 곱해주고.. mPt.x *= 0.01; mPt.y *= 0.01; - mPt.z *= -0.01; // Z .. + mPt.z *= -0.01; // Z 축은 음수로.. pVBone[i].vOrigin.Set((float)mPt.x, (float)mPt.y, (float)mPt.z); - // Weight 0̻ ͸ .. + // Weight 값이 0이상인 것만 고른다.. int nAffect = 0; static int s_nJoints[128]; static float s_fWeights[128]; @@ -746,7 +746,7 @@ bool CN3E2Wrapper::ProcessSkin(MFnSkinCluster & mSkin, CN3Skin * pSkin) { } bool CN3E2Wrapper::ProcessShape(MFnMesh & mMesh) { - if (mMesh.numPolygons() > 10000) // Ѿ... CN3IMesh ó Ұ... + if (mMesh.numPolygons() > 10000) // 면의 갯수가 만개 넘어가면... CN3IMesh 로 처리 불가능... { CN3VMesh VMesh; this->ProcessVMesh(mMesh, &VMesh); @@ -791,8 +791,8 @@ bool CN3E2Wrapper::ProcessShape(MFnMesh & mMesh) { pShape = new CN3Shape(); this->ProcessTransform(mTG, pShape); pShape->m_szName = ""; - this->ProcessName(mTG.object(), pShape->m_szName); // ̸ ٽϱ. - pShape->FileNameSet("Object\\" + pShape->m_szName + ".N3Shape"); // ̸ ϱ.. + this->ProcessName(mTG.object(), pShape->m_szName); // 이름을 다시정하기. + pShape->FileNameSet("Object\\" + pShape->m_szName + ".N3Shape"); // 파일 이름 정하기.. m_pScene->ShapeAdd(pShape); @@ -800,7 +800,7 @@ bool CN3E2Wrapper::ProcessShape(MFnMesh & mMesh) { mMtxJWorld.setToIdentity(); this->GetWorldTransform(mTG, mMtxJWorld); - // ǹ + // 피벗점 계산 MPoint mvPivot; mvPivot = mTG.rotatePivot(MSpace::kTransform); pShape->PosSet((float)(mvPivot.x * 0.01), (float)(mvPivot.y * 0.01), -(float)(mvPivot.z * 0.01)); @@ -812,30 +812,30 @@ bool CN3E2Wrapper::ProcessShape(MFnMesh & mMesh) { return false; } - // ̸ "collision" ̶ ڿ .. 浹 ޽ô.. + // 이름에 "collision" 이라는 문자열이 들어가면.. 충돌 메시다.. std::string szTmp = IMesh.m_szName; if (szTmp.size()) { CharLower(&(szTmp[0])); } if (szTmp.find("coll") != -1 || szTmp.find("climb") != -1) { - // ޽ ġ ǹ ٽ .. Shape ǥ ߾ ش.. + // 메시의 점위치를 피벗점에 대해 다시 계산.. Shape 의 로컬 좌표로 맞추어 준다.. IMesh.ApplyOffset(pShape->Pos() * -1.0f); int nFC = IMesh.FaceCount(); CN3VMesh * pVMesh = new CN3VMesh(); szNodeFullName = ""; this->ProcessName(mTM.object(), szNodeFullName); - pVMesh->m_szName = mTM.name().asChar(); // ̸ ٽ ϰ.. - pVMesh->FileNameSet("Object\\" + szNodeFullName + ".N3VMesh"); // ̸ .. + pVMesh->m_szName = mTM.name().asChar(); // 이름 다시 정하고.. + pVMesh->FileNameSet("Object\\" + szNodeFullName + ".N3VMesh"); // 파일 이름 결정.. pVMesh->CreateVertices(nFC * 3); __VertexT1 * pVSrc = IMesh.BuildVertexList(); __Vector3 * pVDest = pVMesh->Vertices(); for (int i = 0; i < nFC * 3; i++) { - pVDest[i].x = pVSrc[i].x; // ġ ش... - pVDest[i].y = pVSrc[i].y; // ġ ش... - pVDest[i].z = pVSrc[i].z; // ġ ش... + pVDest[i].x = pVSrc[i].x; // 위치만 세팅해 준다... + pVDest[i].y = pVSrc[i].y; // 위치만 세팅해 준다... + pVDest[i].z = pVSrc[i].z; // 위치만 세팅해 준다... } pShape->s_MngVMesh.Add(pVMesh); if (szTmp.find("coll") != -1) { @@ -843,24 +843,24 @@ bool CN3E2Wrapper::ProcessShape(MFnMesh & mMesh) { } else if (szTmp.find("climb") != -1) { pShape->ClimbMeshSet(pVMesh->FileName()); } - } else // 浹 ޽ð ƴϸ.. + } else // 충돌 메시가 아니면.. { - CN3SPart * pPD = pShape->PartAdd(); // Part ߰ ְ.. + CN3SPart * pPD = pShape->PartAdd(); // Part 추가 해주고.. szNodeFullName = ""; this->ProcessName(mTM.object(), szNodeFullName); - pPD->m_szName = mTM.name().asChar(); // Part ̸ .. + pPD->m_szName = mTM.name().asChar(); // Part 이름 짓기.. pPD->FileNameSet("Object\\" + szNodeFullName + "N3CPart"); - // ǹ + // 피벗점 계산 MPoint mvPivot = mTM.rotatePivot(MSpace::kTransform); pPD->m_vPivot.Set((float)(mvPivot.x * 0.01), (float)(mvPivot.y * 0.01), -(float)(mvPivot.z * 0.01)); pPD->m_vPivot -= pShape->Pos(); - // ޽ ġ Shape Ʈ ǹ ٽ .. Shape part ǥ ߾ ش.. + // 메시의 점위치를 Shape 파트의 피벗점에 대해 다시 계산.. Shape의 part 로컬 좌표로 맞추어 준다.. __Vector3 vOffset((float)(mvPivot.x * 0.01), (float)(mvPivot.y * 0.01), -(float)(mvPivot.z * 0.01)); IMesh.ApplyOffset(vOffset * -1.0f); - // CN3Mesh Convert + // CN3Mesh 로 Convert CN3Mesh N3Mesh; N3Mesh.Import(&IMesh); N3Mesh.MakeIndexed(); @@ -868,21 +868,21 @@ bool CN3E2Wrapper::ProcessShape(MFnMesh & mMesh) { N3Mesh.ReGenerateSmoothNormal(); } - // Progressive Mesh .. + // Progressive Mesh 생성.. CN3PMeshCreate PMeshCreate; if (PMeshCreate.ConvertFromN3Mesh(&N3Mesh) == false) { - MessageBox(::GetActiveWindow(), "ȯ ų N3MeshԴϴ.", "PMesh Convert error", MB_OK); + MessageBox(::GetActiveWindow(), "변환할 수 없거나 내용이 없는 N3Mesh입니다.", "PMesh Convert error", MB_OK); //return; } - // ڵ PMesh ɼ - PMeshCreate.m_PMCOption.bUseSumOfLoss = true; // Loss - PMeshCreate.m_PMCOption.bTriangleWeight = true; // ﰢ ġ - PMeshCreate.m_PMCOption.bArea = true; // false : Ѵ. - PMeshCreate.m_PMCOption.fWeight = 1.0f; // ﰢ ġ (߿䵵) + // 자동 PMesh 생성 옵션 + PMeshCreate.m_PMCOption.bUseSumOfLoss = true; // Loss의 합을 사용 + PMeshCreate.m_PMCOption.bTriangleWeight = true; // 사라지는 삼각형 가중치 사용 + PMeshCreate.m_PMCOption.bArea = true; // false : 세변은 길이의 합으로 한다. + PMeshCreate.m_PMCOption.fWeight = 1.0f; // 사라지는 삼각형 가중치 (중요도) - CN3PMesh * pPMesh = PMeshCreate.CreateRendererMesh(); // Progressive Mesh - pPMesh->m_szName = mTM.name().asChar(); // ̸.. + CN3PMesh * pPMesh = PMeshCreate.CreateRendererMesh(); // Progressive Mesh 생성 + pPMesh->m_szName = mTM.name().asChar(); // 걍 이름.. std::string szFN; this->ProcessName(mTM.object(), szFN); @@ -890,26 +890,26 @@ bool CN3E2Wrapper::ProcessShape(MFnMesh & mMesh) { if (m_Option.bGenerateFileName && iLen >= 11) { // Item Code ::: 0_2345_78_0 szFN = szFN.substr(iLen - 11); } - pPMesh->FileNameSet("Object\\" + szFN + ".N3PMesh"); // ̸ .. + pPMesh->FileNameSet("Object\\" + szFN + ".N3PMesh"); // 파일 이름 결정.. - pShape->s_MngPMesh.Add(pPMesh); // Progressive Mesh Manager ߰.. - pPD->MeshSet(pPMesh->FileName()); // Mesh .. + pShape->s_MngPMesh.Add(pPMesh); // Progressive Mesh Manager 에 추가.. + pPD->MeshSet(pPMesh->FileName()); // Mesh 세팅.. //////////////////////////////////////////////// - // ؽó ó.. + // 재질 및 텍스처 처리.. pPD->m_Mtl.dwColorArg1 = D3DTA_DIFFUSE; pPD->m_Mtl.dwColorArg2 = D3DTA_TEXTURE; CN3Texture * pTex = this->ProcessTexture(mMesh); - if (pTex) // ؽó ̸ ⺻ .. ÷ ۷̼ Modulate + if (pTex) // 텍스처가 쓰인 재질이면 재질은 기본적인 흰색.. 컬러 오퍼레이션은 Modulate { - std::string szTFN = pTex->FileName(); // ̸ ˻ؼ.. + std::string szTFN = pTex->FileName(); // 파일 이름을 검사해서.. if (szTFN.size() > 0) { CharLower(&(szTFN[0])); } - if (-1 == szTFN.find("object\\")) // "Item\" ̶ ڿ + if (-1 == szTFN.find("object\\")) // "Item\" 이라는 문자열이 없으면 { - szTFN = "Object\\" + pTex->FileName(); // Item ̶ θ δ.. + szTFN = "Object\\" + pTex->FileName(); // Item 이라는 경로를 붙인다.. pTex->FileNameSet(szTFN); } @@ -926,7 +926,7 @@ bool CN3E2Wrapper::ProcessShape(MFnMesh & mMesh) { // this->ProcessMaterial(this->MeshGetShader(mMesh), &(pPD->m_Mtl)); pPD->m_Mtl.dwColorOp = D3DTOP_SELECTARG1; } - // ؽó ó.. + // 재질 및 텍스처 처리.. //////////////////////////////////////////////// } @@ -936,7 +936,7 @@ bool CN3E2Wrapper::ProcessShape(MFnMesh & mMesh) { CN3Joint * CN3E2Wrapper::ProcessJoint(MFnIkJoint & mJoint) { CN3Joint * pJoint = new CN3Joint(); ////////////////////////////////////////////////////////////////////////////////////////// - // Joint Transform ó.. + // Joint 의 Transform을 처리.. this->ProcessTransform(mJoint, pJoint); // Rotation Order @@ -951,22 +951,22 @@ CN3Joint * CN3E2Wrapper::ProcessJoint(MFnIkJoint & mJoint) { char szName[512]; if (mJoint.parent(0).apiType() == MFn::kTransform) { MFnTransform mTJ(mJoint.parent(0)); - wsprintf(szName, "Chr\\%s.N3Joint", mTJ.name().asChar()); // ̸ ϱ.. + wsprintf(szName, "Chr\\%s.N3Joint", mTJ.name().asChar()); // 파일 이름 정하기.. } else { - wsprintf(szName, "Chr\\%s.N3Joint", mJoint.name().asChar()); // ̸ ϱ.. + wsprintf(szName, "Chr\\%s.N3Joint", mJoint.name().asChar()); // 파일 이름 정하기.. } - pJoint->m_szName = mJoint.name().asChar(); // ̸.. FullName ʴ´.. + pJoint->m_szName = mJoint.name().asChar(); // 이름짓기.. FullName 으로 짓지는 않는다.. - // ȸ Ѵ.. - if (pJoint->m_KeyOrient.Count() <= 0) // Joint Orient Key .. Rotation Key Orient ŭ ư.. + // 회전 축 값을 구한다.. + if (pJoint->m_KeyOrient.Count() <= 0) // Joint Orient Key 값이 없으면.. Rotation Key 값을 Orient 만큼 비튼다.. { double dAxis[3]; MStatus stat = MStatus::kSuccess; stat = mJoint.getOrientation(dAxis, rotOrder); // local axis... - // Origin Rotation .. - if (dAxis[0] || dAxis[1] || dAxis[2]) // Origin Rotation .. + // Origin Rotation 값이 있으면.. + if (dAxis[0] || dAxis[1] || dAxis[2]) // Origin Rotation 이 있으면.. { __Matrix44 mtxRot; mtxRot.Rotation((float)-dAxis[0], (float)-dAxis[1], (float)dAxis[2]); @@ -975,16 +975,16 @@ CN3Joint * CN3E2Wrapper::ProcessJoint(MFnIkJoint & mJoint) { } } - // ϵ Ʈ ó.. + // 차일드 조인트 처리.. int nCC = mJoint.childCount(); for (int i = 0; i < nCC; i++) { MObject mObj = mJoint.child(i); - if (mObj.hasFn(MFn::kJoint)) // Joint .. + if (mObj.hasFn(MFn::kJoint)) // Joint 일 경우.. { MFnIkJoint mJointChild(mObj); CN3Joint * pJointChild = this->ProcessJoint(mJointChild); pJoint->ChildAdd(pJointChild); - } else if (mObj.hasFn(MFn::kTransform)) // Transform ϵ尡 ޽ .. + } else if (mObj.hasFn(MFn::kTransform)) // 보통 Transform 일 경우 차일드가 메시 인지 본다.. { int ttt = 0; } @@ -1005,64 +1005,64 @@ void CN3E2Wrapper::ProcessJointTransform(CN3Joint * pJoint, __Vector3 * pvTrans, } if (pvScale) { - pJoint->PosSet(pJoint->Pos() * (*pvScale)); // trans Ű Ͽ ߰.. - int nK = pJoint->m_KeyPos.Count(); // ϸ̼ Ű ش.. + pJoint->PosSet(pJoint->Pos() * (*pvScale)); // trans 키를 스케일에 따라 맞추고.. + int nK = pJoint->m_KeyPos.Count(); // 에니메이션 키도 변경해준다.. for (int i = 0; i < nK; i++) { __Vector3 * pvKey = (__Vector3 *)(pJoint->m_KeyPos.DataGet(i)); (*pvKey) *= (*pvScale); } } - if (pvTrans) // ̵ + if (pvTrans) // 이동값 적용 { pJoint->PosSet(pJoint->Pos() + (*pvTrans)); - int nK = pJoint->m_KeyPos.Count(); // ϸ̼ Ű ش.. + int nK = pJoint->m_KeyPos.Count(); // 에니메이션 키도 변경해준다.. for (int i = 0; i < nK; i++) { __Vector3 * pvKey = (__Vector3 *)(pJoint->m_KeyPos.DataGet(i)); (*pvKey) += (*pvTrans); } } - if (pqRot) // ȸ ش.. + if (pqRot) // 회전값을 변경해준다.. { __Quaternion qRot2 = pJoint->Rot() * (*pqRot); pJoint->RotSet(qRot2); - int nK = pJoint->m_KeyRot.Count(); // ȸ Ű ش.. + int nK = pJoint->m_KeyRot.Count(); // 회전값 키도 변경해준다.. for (int i = 0; i < nK; i++) { __Quaternion * pqRot2 = (__Quaternion *)pJoint->m_KeyRot.DataGet(i); (*pqRot2) *= (*pqRot); } } - if (bProcessChild && pvScale) // ó ?? + if (bProcessChild && pvScale) // 하위 노드 처리 ?? { int nCC = pJoint->ChildCount(); for (int i = 0; i < nCC; i++) { this->ProcessJointTransform((CN3Joint *)pJoint->Child(i), NULL, NULL, pvScale, - true); // ϸ ó ش.. + true); // 하위 노드들은 스케일만 처리해 준다.. } } } void CN3E2Wrapper::ProcessMatrix(MFnTransform & mTransform, __Matrix44 & mtx, __Vector3 & vPos, __Quaternion & qtRot, __Vector3 & vScale) { - // ȯ.. + // 행렬 변환.. static double dRs[4], dSs[3]; // MTransformationMatrix::RotationOrder RotOrder = MTransformationMatrix::kXYZ; - // mTransform.getRotation(dRs, RotOrder, MSpace::kTransform); // ȸ + // mTransform.getRotation(dRs, RotOrder, MSpace::kTransform); // 회전 MVector mVecPos; mVecPos = mTransform.translation(MSpace::kTransform); - mVecPos *= 0.01; // 100 1.. ǥ .. + mVecPos *= 0.01; // 100 분의 1로.. 미터 좌표로 맞춘다.. mVecPos.z = -mVecPos.z; - mTransform.getScale(dSs); // Ȯ + mTransform.getScale(dSs); // 확대 vPos.Set((float)mVecPos.x, (float)mVecPos.y, (float)mVecPos.z); // vRot.Set((float)-dRs[0], (float)-dRs[1], (float)dRs[2]); vScale.Set((float)dSs[0], (float)dSs[1], (float)dSs[2]); - mTransform.getRotationQuaternion(dRs[0], dRs[1], dRs[2], dRs[3]); // ȸ ʹϾ + mTransform.getRotationQuaternion(dRs[0], dRs[1], dRs[2], dRs[3]); // 회전 쿼터니언 qtRot.x = (float)dRs[0]; qtRot.y = (float)dRs[1]; qtRot.z = (float)dRs[2]; @@ -1071,12 +1071,12 @@ void CN3E2Wrapper::ProcessMatrix(MFnTransform & mTransform, __Matrix44 & mtx, __ __Vector3 vAxis; float fAngle; qtRot.AxisAngle(vAxis, fAngle); - vAxis.x *= -1; // x ȸ ݴ.. - vAxis.y *= -1; // y ȸ ݴ.. + vAxis.x *= -1; // x 축 회전이 반대.. + vAxis.y *= -1; // y 축 회전이 반대.. vAxis.Normalize(); qtRot.RotationAxis(vAxis, fAngle); - // .. + // 최종 행렬 계산.. mtx.Identity(); static __Matrix44 mtxTmp; // mtxTmp.Rotation((float)-dRs[0], (float)-dRs[1], (float)dRs[2]); mtx *= mtxTmp; @@ -1084,7 +1084,7 @@ void CN3E2Wrapper::ProcessMatrix(MFnTransform & mTransform, __Matrix44 & mtx, __ mtx *= mtxTmp; mtxTmp.Scale((float)dSs[0], (float)dSs[1], (float)dSs[2]); mtx *= mtxTmp; - mtx.PosSet((float)mVecPos.x, (float)mVecPos.y, (float)mVecPos.z); // ġ.. + mtx.PosSet((float)mVecPos.x, (float)mVecPos.y, (float)mVecPos.z); // 위치.. } bool CN3E2Wrapper::FindAnimCurve(MObject & mObj, MObjectArray & mAnimCurveArray) { @@ -1117,7 +1117,7 @@ bool CN3E2Wrapper::HaveJoint(MFnMesh & mMesh) { } } - if (nMC >= 2) // return true; // ΰ ũ.. + if (nMC >= 2) // return true; // 두개보다 크면.. { MItDependencyGraph::Direction Direction = MItDependencyGraph::kUpstream; MItDependencyGraph::Traversal TraversalType = MItDependencyGraph::kBreadthFirst; @@ -1129,14 +1129,14 @@ bool CN3E2Wrapper::HaveJoint(MFnMesh & mMesh) { for (int i = 0; !dgIter.isDone(); dgIter.next(), i++) { MObject mObjTmp = dgIter.thisNode(); if (mObjTmp.apiType() == MFn::kJoint) { - return true; // Ʈ .. + return true; // 조인트가 있으면.. } } } return false; } -// ؽó ε .. +// 텍스처 인덱스 계산.. CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { int nLI = 0; DWORD dwRWC = 0; @@ -1154,28 +1154,28 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { return NULL; } - //  ´.. + // 사이즈를 가져온다.. MString szCommand = MString("getAttr ") + szTexture + MString(".outSize"); MIntArray nWH; if (MGlobal::executeCommand(szCommand, nWH) != MS::kSuccess) { - wsprintf(szInfo, "ؽó ó : Surface - %s, Texture - %s", szSurface.asChar(), szTexture.asChar()); + wsprintf(szInfo, "텍스처 파일 처리 오류 : Surface - %s, Texture - %s", szSurface.asChar(), szTexture.asChar()); nLI = ::SendMessage(m_hWndLB, LB_ADDSTRING, 0, (LPARAM)szInfo); // Progress dialog ::SendMessage(m_hWndLB, LB_SETCURSEL, (WPARAM)nLI, 0); // Progress dialog return NULL; } - // int nW = nWH[1], nH = nWH[0]; //  ˾Ƴ.. + // int nW = nWH[1], nH = nWH[0]; // 사이즈를 알아내고.. // if(nW < 4 || nH < 4) // { - // wsprintf(szInfo, "ؽó ó : ʺ, ̰ ʹ ۽ϴ. Surface - %s, Texture - %s", szSurface.asChar(), szTexture.asChar()); + // wsprintf(szInfo, "텍스처 파일 처리 오류 : 너비, 높이가 너무 작습니다. Surface - %s, Texture - %s", szSurface.asChar(), szTexture.asChar()); // nLI = ::SendMessage(m_hWndLB, LB_ADDSTRING, 0, (LPARAM)szInfo); // Progress dialog // ::SendMessage(m_hWndLB, LB_SETCURSEL, (WPARAM)nLI,0); // Progress dialog // // return NULL; // } - // ؽó ȯѴ.. + // 텍스처를 변환한다.. MString szFile; MStringArray szResult2; szCommand = MString("getAttr ") + szTexture + MString(".fileTextureName"); @@ -1183,8 +1183,8 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { szFile = szResult2[0]; //////////////////////////////////////////// - // Texture List ϵǾ ִ .. - char szFNSrc[1024]; // ̸ ϰ.. + // Texture List 에 등록되어 있는지 본다.. + char szFNSrc[1024]; // 파일 이름을 정하고.. lstrcpy(szFNSrc, szFile.asChar()); int nFN = lstrlen(szFNSrc); for (int i = 0; i < nFN; i++) { @@ -1193,19 +1193,19 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { } } - // ڿ ":" αڰ '\\' Ȥ '//' ƴϸ Ǯ Ѵ. + // 문자열에 ":" 이 없으면 앞의 두글자가 '\\' 혹은 '//' 이 아니면 풀네임을 만들어야 한다. if (!strstr(szFNSrc, ":") && !(szFNSrc[0] == '\\' && szFNSrc[1] == '\\')) { MString szWorkSpace; MGlobal::executeCommand(MString("workspace -fullName"), szWorkSpace); lstrcpy(szFNSrc, szWorkSpace.asChar()); lstrcat(szFNSrc, szFile.asChar()); } - // WorkSpace ̸ .. + // WorkSpace 이름을 가져오고.. - char szFNDest[1024]; // ̸ + char szFNDest[1024]; // 저장할 이름 lstrcpy(szFNDest, szFNSrc); nFN = lstrlen(szFNDest); - for (int i = nFN - 1; i >= 0; i--) // ̸ .. + for (int i = nFN - 1; i >= 0; i--) // 저장할 이름을 만든다.. { if (szFNDest[i] == '.') { szFNDest[i + 1] = 'D'; @@ -1221,7 +1221,7 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { CN3Texture * pTex = NULL; - static char szFNs[1024][256]; // ̸ ߺǴ üũ... + static char szFNs[1024][256]; // 파일 이름이 중복되는지 체크... if (m_pScene->s_MngTex.Count() <= 0) { memset(szFNs, 0, sizeof(szFNs)); } @@ -1237,13 +1237,13 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { lstrcpy(szFNs[i], szFNDest); pTex = new CN3Texture(); - if (pTex->LoadFromFile(szFNSrc)) // а... + if (pTex->LoadFromFile(szFNSrc)) // 파일을 읽고... { - pTex->m_szName = szFNDest; // ̸ ϱ.. - ̸ Ѵ. - pTex->FileNameSet(szFNDest); // ̸ ϱ. - CN3Base::s_MngTex.Add(pTex); // Manager + pTex->m_szName = szFNDest; // 이름 정하기.. - 파일 이름으로 정한다. + pTex->FileNameSet(szFNDest); // 파일 이름 정하기. + CN3Base::s_MngTex.Add(pTex); // Manager 에 등록 } else { - wsprintf(szInfo, "ؽó ó : ϴ. - %s", szFNSrc); + wsprintf(szInfo, "텍스처 파일 처리 오류 : 파일을 읽을수 없습니다. - %s", szFNSrc); nLI = ::SendMessage(m_hWndLB, LB_ADDSTRING, 0, (LPARAM)szInfo); // Progress dialog ::SendMessage(m_hWndLB, LB_SETCURSEL, (WPARAM)nLI, 0); // Progress dialog @@ -1251,7 +1251,7 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { return NULL; } - if (m_Option.bGenerateHalfSizeTexture) // Texture Size ٿ .. + if (m_Option.bGenerateHalfSizeTexture) // Texture Size 를 절반으로 줄여 출력.. { D3DFORMAT fmt = pTex->PixelFormat(); int nW2 = pTex->Width() / 2; @@ -1259,7 +1259,7 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { pTex->Convert(fmt, nW2, nH2); } - if (m_Option.bGenerateCompressedTexture) // Texture + if (m_Option.bGenerateCompressedTexture) // Texture 압축 사용 { D3DFORMAT fmt = pTex->PixelFormat(), NewFormat = D3DFMT_UNKNOWN; if (D3DFMT_X8R8G8B8 == fmt) { @@ -1275,7 +1275,7 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { return pTex; /* - // ̺κ Maya Image д κ̴.. + // 이부분은 Maya Image 를 직접 읽는 부분이다.. IFFimageReader Reader; if(Reader.open(szFile) == MS::kSuccess) { @@ -1283,7 +1283,7 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { Reader.getSize(nW2, nH2); if(nW != nW2 || nH != nH2) { - wsprintf(szInfo, "ؽó ó : ϴ. - %s", szFile.asChar()); + wsprintf(szInfo, "텍스처 파일 처리 오류 : 파일을 읽을수 없습니다. - %s", szFile.asChar()); nLI = ::SendMessage(m_hWndLB, LB_ADDSTRING, 0, (LPARAM)szInfo); // Progress dialog ::SendMessage(m_hWndLB, LB_SETCURSEL, (WPARAM)nLI,0); // Progress dialog @@ -1295,28 +1295,28 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { // else // { // Reader.close(); - // DeleteFile(szFile.asChar()); // .. - // wsprintf(szInfo, "ؽó ó : GrayScale Texture Ŀ ˴ϴ. Surface - %s, Texture - %s", szSurface.asChar(), szTexture.asChar()); + // DeleteFile(szFile.asChar()); // 파일 지우기.. + // wsprintf(szInfo, "텍스처 파일 처리 오류 : GrayScale Texture 는 차후에 지원 됩니다. Surface - %s, Texture - %s", szSurface.asChar(), szTexture.asChar()); // ::SendMessage(m_hWndLB, LB_ADDSTRING, 0, (LPARAM)szInfo); // Progress dialog // ::SendMessage(m_hWndLB, LB_SETCURSEL, (WPARAM)nLI,0); // Progress dialog // return false; // } - // Surface ä. + // Surface 생성 및 채우기. LPDIRECT3DSURFACE9 lpSurf; g_pEng->s_lpD3DDev->CreateOffscreenPlainSurface(nW, nH, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &lpSurf, NULL); if(NULL == lpSurf) { Reader.close(); - wsprintf(szInfo, "ؽó ó : Direct3D Texture (%d, %d)", nW, nH); + wsprintf(szInfo, "텍스처 파일 처리 오류 : Direct3D Texture 생성 실패(%d, %d)", nW, nH); nLI = ::SendMessage(m_hWndLB, LB_ADDSTRING, 0, (LPARAM)szInfo); // Progress dialog ::SendMessage(m_hWndLB, LB_SETCURSEL, (WPARAM)nLI,0); // Progress dialog return NULL; } - Reader.readImage(); // ̹ б.. + Reader.readImage(); // 이미지 읽기.. int nBPP = 0; nBPP = Reader.getBytesPerChannel() * 4; BOOL bAlpha = Reader.hasAlpha(); @@ -1327,7 +1327,7 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { unsigned char *pDest = NULL, *pSrc = NULL; for(int y = 0; y < nH; y++) { - pSrc = (unsigned char*)pBuffer + (nH - y - 1) * nW * nBPP; // Ųٷ Ǿ ִ.. + pSrc = (unsigned char*)pBuffer + (nH - y - 1) * nW * nBPP; // 거꾸로 저장되어 있다.. pDest = (unsigned char*)LR.pBits + y * LR.Pitch; for(int x = 0; x < nW; x++, pDest += 4, pSrc += nBPP) { @@ -1348,7 +1348,7 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { if(pTex->Get() == NULL) { - wsprintf(szInfo, "### !!! Texture Export (%.3d) : w,h,w2,h2(%.4d, %.4d, %.4d, %.4d) FileName : \"%s\" TextureName \"%s\" MeshName - \"%s\"", + wsprintf(szInfo, "### !!! Texture Export 실패(%.3d) : w,h,w2,h2(%.4d, %.4d, %.4d, %.4d) FileName : \"%s\" TextureName \"%s\" MeshName - \"%s\"", m_pScene->s_MngTex.Count(), pTex->Width(), pTex->Height(), nW, nH, szFile.asChar(), pTex->m_szName.c_str(), mMesh.name().asChar()); nLI = ::SendMessage(m_hWndLB, LB_ADDSTRING, 0, (LPARAM)szInfo); // Progress dialog ::SendMessage(m_hWndLB, LB_SETCURSEL, (WPARAM)nLI,0); // Progress dialog @@ -1359,7 +1359,7 @@ CN3Texture * CN3E2Wrapper::ProcessTexture(MFnMesh & mMesh) { } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Output Window ؽó .. + // Output Window 에 텍스처 출력.. wsprintf(szInfo, "### Texture Export (%.3d) : w,h,w2,h2(%.4d, %.4d, %.4d, %.4d) FileName : \"%s\" TextureName \"%s\" MeshName - \"%s\"", m_pScene->s_MngTex.Count(), pTex->Width(), pTex->Height(), nW, nH, szFile.asChar(), pTex->m_szName.c_str(), mMesh.name().asChar()); nLI = ::SendMessage(m_hWndLB, LB_ADDSTRING, 0, (LPARAM)szInfo); // Progress dialog @@ -1415,7 +1415,7 @@ int CN3E2Wrapper::ProcessMaterial(MObject mShaderObj, __Material * pMtl) { pMtl->Diffuse.r = DC.r; pMtl->Diffuse.g = DC.g; pMtl->Diffuse.b = DC.b; - pMtl->Diffuse.a = ((1.0f - TC.r) + (1.0f - TC.g) + (1.0f - TC.b)) / 3.0f; // .. + pMtl->Diffuse.a = ((1.0f - TC.r) + (1.0f - TC.g) + (1.0f - TC.b)) / 3.0f; // 투명값.. pMtl->Ambient.r = DC.r * 0.7f; pMtl->Ambient.g = DC.g * 0.7f; @@ -1444,34 +1444,34 @@ int CN3E2Wrapper::ProcessTransform(MFnTransform & mTransform, CN3Transform * pTr if (NULL == pTransform) { return -1; } - pTransform->m_szName = mTransform.name().asChar(); // ̸ .... + pTransform->m_szName = mTransform.name().asChar(); // 이름 짓기.... __Vector3 vPos, vScale; __Quaternion qtRot; - this->ProcessMatrix(mTransform, pTransform->m_Matrix, vPos, qtRot, vScale); // ó.. + this->ProcessMatrix(mTransform, pTransform->m_Matrix, vPos, qtRot, vScale); // 행렬 처리.. - if (pTransform->Type() & OBJ_CAMERA) // ī޶ ϰ + if (pTransform->Type() & OBJ_CAMERA) // 카메라 일경우 { CN3Camera * pCamera = (CN3Camera *)pTransform; pCamera->EyePosSet(vPos); __Matrix44 mtxR = qtRot; - __Vector3 vAt(0, 0, 50); // Ÿŭ... + __Vector3 vAt(0, 0, 50); // 떨어진 거리만큼... vAt *= mtxR; pCamera->AtPosSet(vAt); pCamera->UpVectorSet(0, 1, 0); } else { pTransform->PosSet(vPos); - pTransform->RotSet(qtRot); // ȸ ʹϾ .. + pTransform->RotSet(qtRot); // 회전은 쿼터니언으로 들어간다.. pTransform->ScaleSet(vScale); } if (FALSE == m_Option.bAnimationKey) { - return -1; // Animation Key ó ɼ 츸 Ѵ.. + return -1; // Animation Key 처리 옵션이 켜질 경우만 한다.. } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // ϸ̼.. + // 에니메이션.. MObjectArray mAKs; this->FindAnimCurve(mTransform.object(), mAKs); // MStatus stat2 = mTransform.setRotationOrder(MTransformationMatrix::kXYZ, true); @@ -1487,10 +1487,10 @@ int CN3E2Wrapper::ProcessTransform(MFnTransform & mTransform, CN3Transform * pTr for (int i = 0; i < nAK; i++) { MFnAnimCurve mAC(mAKs[i]); - lstrcpy(szTmp, mAC.name().asChar()); // ϴ ̸ غ..... + lstrcpy(szTmp, mAC.name().asChar()); // 일단 이름으로 비교해보고..... CharLower(szTmp); - if (NULL != strstr(szTmp, "translatex")) // ī޶ 쿡 translate ΰ ´.. + if (NULL != strstr(szTmp, "translatex")) // 카메라의 경우에는 translate 값이 두개가 들어온다.. { nTranslateCount++; } @@ -1534,7 +1534,7 @@ int CN3E2Wrapper::ProcessTransform(MFnTransform & mTransform, CN3Transform * pTr nKType = 11; } else if (NULL != strstr(szTmp, "visibility")) { nKType = -1; - } else // ̸ ǴҼ ٸ.. ID ǴѴ...?? + } else // 이름으로 판단할수 없다면.. ID 로 판단한다...?? { // MTypeId id = mAC.typeId(); // DWORD dwID = id.id(); @@ -1582,7 +1582,7 @@ int CN3E2Wrapper::ProcessTransform(MFnTransform & mTransform, CN3Transform * pTr mACs[2][2].setObject(mAC.object()); } - // Joint Orient Key .. + // Joint Orient Key 값.. else if (nKType == 9) { mACJointOrients[0].setObject(mAC.object()); } else if (nKType == 10) { @@ -1607,24 +1607,24 @@ int CN3E2Wrapper::ProcessTransform(MFnTransform & mTransform, CN3Transform * pTr mTransform.name().asChar()); MessageBox(::GetActiveWindow(), szInfo, "Invalid Animation Key", MB_OK); } else { - // if(i == 0) this->ProcessAnimKey(mACs[i], &pTransform->m_KeyPos, true, 0.01f, false); // Translation Animation Key óѴ.. + // if(i == 0) this->ProcessAnimKey(mACs[i], &pTransform->m_KeyPos, true, 0.01f, false); // Translation Animation Key 를 처리한다.. if (i == 0) { this->ProcessAnimKey(mACs[i], &pTransform->m_KeyPos, true, 0.01f, - false); // Translation Animation Key óѴ.. + false); // Translation Animation Key 를 처리한다.. } else if (i == 1) { - if (nTranslateCount == 2) // View Translate ... ī޶ϴ Ÿó óѴ. + if (nTranslateCount == 2) // View Translate ... 요건 카메라일대 타겟처럼 처리한다. { this->ProcessAnimKey(mACs[i], &pTransform->m_KeyRot, true, 0.01f, - false); // ViewTarget Position Key óѴ.. + false); // ViewTarget Position Key 를 처리한다.. } else { MTransformationMatrix::RotationOrder rotOrder = - mTransform.rotationOrder(); // ȸ ó ޶ Ѵ.. + mTransform.rotationOrder(); // 회전 순서에 따라 처리가 달라져야 한다.. this->ProcessAnimKey(mACs[i], &pTransform->m_KeyRot, true, 1.0f, true, - rotOrder); // Rotation Animation Key ʹϾ óѴ.. + rotOrder); // Rotation Animation Key 를 쿼터니언으로 처리한다.. - // if(pTransform->Type() & OBJ_JOINT) // Ʈ ... + // if(pTransform->Type() & OBJ_JOINT) // 조인트인 경우... // { - // -180 180 ̿ ְ .. + // -180 도에서 180 도 사이에 있게 만든다.. // int nKC = pTransform->m_KeyRot.Count(); // for(int i = 0; i < nKC; i++) // { @@ -1641,25 +1641,25 @@ int CN3E2Wrapper::ProcessTransform(MFnTransform & mTransform, CN3Transform * pTr } // end of else } else if (i == 2) { this->ProcessAnimKey(mACs[i], &pTransform->m_KeyScale, false, 1.0f, false, - MTransformationMatrix::kXYZ); // Scale Animation Key óѴ.. + MTransformationMatrix::kXYZ); // Scale Animation Key 를 처리한다.. } // end of if(i == 0) } // end of if(nKs[0] <= 0 || nKs[1] <= 0 || nKs[2] <= 0) } // end of if(nKs[0] > 0 || nKs[1] > 0 || nKs[2] > 0) } // end of for(int i = 0; i < 3; i++) - if (pTransform->Type() & OBJ_JOINT) // Joint ̸... Orient Ű .. + if (pTransform->Type() & OBJ_JOINT) // Joint 이면... Orient 키 값도 본다.. { CN3Joint * pJoint = (CN3Joint *)pTransform; this->ProcessAnimKey(mACJointOrients, &(pJoint->m_KeyOrient), true, 1.0f, true, MTransformationMatrix::kXYZ); } - // ϸ̼.. + // 에니메이션.. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// return 0; } void CN3E2Wrapper::ProcessAnimKey(MFnAnimCurve * pmACs, CN3AnimKey * pKey, bool bReverseZ, float fScale, bool bQuaternion, MTransformationMatrix::RotationOrder mRotOrder) { - // ã´.. + // 가장 긴것을 찾는다.. double dfFrmMax = 0.0f, dfFrmTmp = 0.0f; int nKC = 0; for (int i = 0; i < 3; i++) { @@ -1673,14 +1673,14 @@ void CN3E2Wrapper::ProcessAnimKey(MFnAnimCurve * pmACs, CN3AnimKey * pKey, bool if (dfFrmMax <= 1) { return; } - dfFrmMax = m_pScene->m_fFrmEnd - m_pScene->m_fFrmStart; // ü Scene Ѵ. + dfFrmMax = m_pScene->m_fFrmEnd - m_pScene->m_fFrmStart; // 전체 Scene 을 대상으로 한다. - int nFrmMax = (int)(dfFrmMax * m_Option.fSamplingRate / 30.0f); // 30 Frame Per Sec Sampling + int nFrmMax = (int)(dfFrmMax * m_Option.fSamplingRate / 30.0f); // 30 Frame Per Sec 로 Sampling if (bQuaternion) { - pKey->Alloc(nFrmMax, m_Option.fSamplingRate, KEY_QUATERNION); // ̸̼ ʹϾ Ҵ. + pKey->Alloc(nFrmMax, m_Option.fSamplingRate, KEY_QUATERNION); // 로테이션이면 쿼터니언으로 할당. } else { - pKey->Alloc(nFrmMax, m_Option.fSamplingRate, KEY_VECTOR3); // ͷ Ҵ.. + pKey->Alloc(nFrmMax, m_Option.fSamplingRate, KEY_VECTOR3); // 벡터로 할당.. } MTime mTime; @@ -1691,9 +1691,9 @@ void CN3E2Wrapper::ProcessAnimKey(MFnAnimCurve * pmACs, CN3AnimKey * pKey, bool // MMatrix mMtx; // MTransformationMatrix mTMtx; __Matrix44 mtxRotFinal, mtxRots[3]; - int nRotSeqs[3] = {1, 0, 2}; // ⺻ YXZ ȸ.. + int nRotSeqs[3] = {1, 0, 2}; // 기본 YXZ 회전.. - // ȸ + // 회전순서 if (MTransformationMatrix::kXYZ == mRotOrder) { nRotSeqs[0] = 0; nRotSeqs[1] = 1; @@ -1725,7 +1725,7 @@ void CN3E2Wrapper::ProcessAnimKey(MFnAnimCurve * pmACs, CN3AnimKey * pKey, bool for (int i = 0; i < nFrmMax; i++) { pQt = (__Quaternion *)(pKey->DataGet(i)); - double dfFrm = i * 30.0f / m_Option.fSamplingRate; // 60 Frame Per Sec Sampling + double dfFrm = i * 30.0f / m_Option.fSamplingRate; // 60 Frame Per Sec 로 Sampling mTime.setValue(dfFrm); memset(dRs, 0, sizeof(double) * 4); @@ -1734,7 +1734,7 @@ void CN3E2Wrapper::ProcessAnimKey(MFnAnimCurve * pmACs, CN3AnimKey * pKey, bool pmACs[1].evaluate(mTime, dRs[1]); pmACs[2].evaluate(mTime, dRs[2]); - // -180 ~ 180 ̷ .. + // -180 ~ 180 도 사이로 맞춘다.. if (dRs[0] < -D3DX_PI) { dRs[0] -= __PI2 * (int)(dRs[0] / __PI2 - 1); } @@ -1793,10 +1793,10 @@ void CN3E2Wrapper::ProcessAnimKey(MFnAnimCurve * pmACs, CN3AnimKey * pKey, bool pV->z = (float)dfValue; if (1.0f != fScale) { - *pV *= fScale; // meter ׷.. + *pV *= fScale; // 단위가 meter 라서 그렇다.. } if (TRUE == bReverseZ) { - pV->z = -(pV->z); // Z Ѵ.. + pV->z = -(pV->z); // Z 축을 음수로 한다.. } } } @@ -1804,34 +1804,34 @@ void CN3E2Wrapper::ProcessAnimKey(MFnAnimCurve * pmACs, CN3AnimKey * pKey, bool bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { ///////////////////////////////////////////////////////////////////////////////////// - // ִ ãƼ óѴ.. + // 영향을 주는 관절을 찾아서 처리한다.. MStatus stat; MDagPathArray PathArray; mSkin.influenceObjects(PathArray, &stat); - int nJC = PathArray.length(); // д. + int nJC = PathArray.length(); // 관절 갯수를 기억해 둔다. MFnIkJoint mJointRoot; for (int i = 0; i < nJC; i++) { mJointRoot.setObject(PathArray[i].node()); - if (mJointRoot.parent(0).apiType() != MFn::kJoint) { // Ʈ 쿡 ó.. + if (mJointRoot.parent(0).apiType() != MFn::kJoint) { // 루트 관절일 경우에 처리.. break; } } if (i == nJC) { - return false; // Root Joint .. + return false; // Root Joint 가 없을 경우.. } - // ߺǴ ãƺ.. + // 중복되는지 찾아본다.. std::string szJointFN; if (mJointRoot.parentCount() > 0 && mJointRoot.parent(0).hasFn(MFn::kTransform)) { MFnTransform mP1(mJointRoot.parent(0)); szJointFN = ""; - this->ProcessName(mP1.parent(0), szJointFN); // ̸ ˾ƺ.. + this->ProcessName(mP1.parent(0), szJointFN); // 뼈의 이름을 알아보고.. szJointFN = "Chr\\" + szJointFN + ".N3Joint"; } else { - szJointFN = mJointRoot.name().asChar(); // ̸ ˾ƺ.. + szJointFN = mJointRoot.name().asChar(); // 뼈의 이름을 알아보고.. } - static std::string szJointFNs[512]; // ߺǴ üũ... + static std::string szJointFNs[512]; // 중복되는지 체크... if (m_pScene->s_MngJoint.Count() <= 0) { for (int i = 0; i < 512; i++) { szJointFNs[i] = ""; @@ -1852,47 +1852,47 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { CN3Chr * pChr = NULL; CN3Joint * pJoint = NULL; - if (false == bOverlapped) // ߺ ʴ´ٸ.. .. + if (false == bOverlapped) // 중복되지 않는다면..새로 만든다.. { - szJointFNs[i] = szJointFN; // Ʈ ̸ ϰ.. + szJointFNs[i] = szJointFN; // 조인트 이름을 기록하고.. pChr = new CN3Chr(); - m_pScene->ChrAdd(pChr); // Scene ij ߰.. - pChr->PartAlloc(64); // ϰ Part Data Ҵ.. + m_pScene->ChrAdd(pChr); // Scene 에 캐릭터 추가.. + pChr->PartAlloc(64); // 충분하게 Part Data 할당.. if (mJointRoot.parentCount() > 0) { if (mJointRoot.parent(0).hasFn(MFn::kTransform)) { MFnTransform mP1(mJointRoot.parent(0)); if (mP1.parentCount() > 0) { - this->ProcessName(mP1.parent(0), pChr->m_szName); // ̸ .... + this->ProcessName(mP1.parent(0), pChr->m_szName); // 이름 짓기.... } else { - this->ProcessName(mP1.parent(0), pChr->m_szName); // ̸ .... + this->ProcessName(mP1.parent(0), pChr->m_szName); // 이름 짓기.... } - pChr->FileNameSet("Chr\\" + pChr->m_szName + ".N3Chr"); // ̸ .. + pChr->FileNameSet("Chr\\" + pChr->m_szName + ".N3Chr"); // 파일 이름 결정.. } else { - this->ProcessName(mJointRoot.parent(0), pChr->m_szName); // ̸ .... - pChr->FileNameSet("Chr\\" + pChr->m_szName + ".N3Chr"); // ̸ ..); + this->ProcessName(mJointRoot.parent(0), pChr->m_szName); // 이름 짓기.... + pChr->FileNameSet("Chr\\" + pChr->m_szName + ".N3Chr"); // 파일 이름 결정..); } } else { pChr->m_szName = mJointRoot.name().asChar(); std::string szFN = "Chr\\"; szFN += mJointRoot.name().asChar(); - szFN += ".N3Chr"; // ̸ .. + szFN += ".N3Chr"; // 파일 이름 결정.. pChr->FileNameSet(szFN); } - pJoint = this->ProcessJoint(mJointRoot); // Joint ó + pJoint = this->ProcessJoint(mJointRoot); // Joint 처리 if (NULL == pJoint) { delete pChr; return NULL; } - pJoint->FileNameSet(szJointFN); // ̸ .. + pJoint->FileNameSet(szJointFN); // 파일 이름 설정.. pChr->s_MngJoint.Add(pJoint); pChr->JointSet(pJoint->FileName()); // Joint Setting; /////////////////////////////////////////////////////////////////////// - // Joint ׷ Ǿ ִٸ Parent Transform ó.. + // Joint 가 그룹 되어 있다면 Parent Transform 처리.. if (mJointRoot.parentCount() > 0 && mJointRoot.parent(0).hasFn(MFn::kTransform)) { MFnTransform mTJ(mJointRoot.parent(0)); // Joint Transform Node @@ -1928,8 +1928,8 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { vTrans *= mtxRotG; this->ProcessJointTransform(pJoint, &vTrans, &qRot, &vScale, true); - pJoint->PosSet(pJoint->Pos() * mtxRotG); // ġ Ͽ ° - int nK = pJoint->m_KeyPos.Count(); // ϸ̼ Ű ش.. + pJoint->PosSet(pJoint->Pos() * mtxRotG); // 위치 값도 방향과 스케일에 맞게 + int nK = pJoint->m_KeyPos.Count(); // 에니메이션 키도 변경해준다.. for (int i = 0; i < nK; i++) { __Vector3 * pvKey = (__Vector3 *)(pJoint->m_KeyPos.DataGet(i)); (*pvKey) *= mtxRotG; @@ -1938,7 +1938,7 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { } else { pJoint = m_pScene->s_MngJoint.Get(szJointFN); - int nChrCount = m_pScene->ChrCount(); // Ʈ ͸ ij ͸ ã´.. + int nChrCount = m_pScene->ChrCount(); // 같은 조인트 포인터를 갖는 캐릭터 포인터를 찾는다.. for (int i = 0; i < nChrCount; i++) { CN3Chr * pChrTmp = m_pScene->ChrGet(i); if (pChrTmp->Joint() == pJoint) { @@ -1953,7 +1953,7 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { } /////////////////////////////////////////////////// ............ // Mesh - // Mesh + // 원래 Mesh MObjectArray mMeshArray; mSkin.getInputGeometry(mMeshArray); __ASSERT(1 == mMeshArray.length(), "binding mesh count is not 1"); @@ -1973,7 +1973,7 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { mGT.setObject(mMT.object()); } - // 浹 üũ ޽ 캻.. + // 충돌 체크용으로 쓰일 메시인지 살펴본다.. std::string szFNM = mMT.name().asChar(); if (szFNM.size() > 0) { CharLower(&(szFNM[0])); @@ -1982,9 +1982,9 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { bCollisionMesh = true; } - if (true == bCollisionMesh) // 浹 üũ ޽ø.... + if (true == bCollisionMesh) // 충돌 체크 메시면.... { - /* CN3IMesh* pN3Mesh = this->ProcessIMesh(mMeshOrg); // Indexed Mesh ó. + /* CN3IMesh* pN3Mesh = this->ProcessIMesh(mMeshOrg); // Indexed Mesh 처리. int nVC = pN3Mesh->VertexCount(); int nFC = pN3Mesh->FaceCount(); __VertexXyzNormal* pVSrc = pN3Mesh->Vertices(); @@ -2004,20 +2004,20 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { pVMesh->m_szName = ""; this->ProcessName(mMeshOrg.object(), pVMesh); - std::string szFN = "Chr\\" + pVMesh->m_szName + ".N3VMesh"; // ̸ .. + std::string szFN = "Chr\\" + pVMesh->m_szName + ".N3VMesh"; // 파일 이름 결정.. pVMesh->FileNameSet(szFN); pChr->s_MngVMesh.Add(pVMesh); pChr->CollisionMeshSet(pVMesh->m_szName); - this->ProcessSkin(mSkin, pChr->CollisionSkin()); // Skin ó. + this->ProcessSkin(mSkin, pChr->CollisionSkin()); // Skin 처리. */ - } else if (false == bCollisionMesh) // 浹 üũ ޽ ƴϸ.... .. + } else if (false == bCollisionMesh) // 충돌 체크 메시 아니면....정상적으로 진행.. { int nLOD = 0; int nPart = 0; - if (mGT.parentCount() > 0 && mGT.parent(0).hasFn(MFn::kTransform)) // ׷ Ʈ 尡 .. + if (mGT.parentCount() > 0 && mGT.parent(0).hasFn(MFn::kTransform)) // 그룹 트랜스폼의 상위 노드가 있을 경우.. { MFnTransform mCT(mGT.parent(0)); // Character Transform int nC = mCT.childCount(); @@ -2028,9 +2028,9 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { MFnTransform mTTmp(mCT.child(i)); if (mTTmp.object() == mGT.object()) { - break; // ij Ʈ ϵ ̸ ׷ ̸ .. + break; // 캐릭터 트랜스폼 밑의 차일드의 이름과 그룹의 이름이 같을 경우.. } - nPart++; // Part .. + nPart++; // 같지 않으면 Part 증가.. } int nGTC = mGT.childCount(); @@ -2041,11 +2041,11 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { MFnTransform mTTmp(mGT.child(i)); if (mTTmp.name() == mMT.name()) { - break; // Mesh Transform Mesh ׷ ϵ ޽ð ̸ .. + break; // Mesh Transform 과 Mesh 그룹의 차일드 메시가 이름이 같으면.. } nLOD++; } - } else // pair of if(mGT.parentCount() > 0 && mGT.parent(0).apiType() == MFn::kTransform) // ׷ Ʈ 尡 .. + } else // pair of if(mGT.parentCount() > 0 && mGT.parent(0).apiType() == MFn::kTransform) // 그룹 트랜스폼의 상위 노드가 있을 경우.. { int nC = mGT.childCount(); for (int i = 0; i < nC; i++) { @@ -2055,9 +2055,9 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { MFnTransform mTTmp(mGT.child(i)); if (mTTmp.name() == mMT.name()) { - break; // ij Ʈ ϵ ̸ ׷ ̸ .. + break; // 캐릭터 트랜스폼 밑의 차일드의 이름과 그룹의 이름이 같을 경우.. } - nPart++; // Part .. + nPart++; // 같지 않으면 Part 증가.. } } @@ -2067,7 +2067,7 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { CN3CPart * pPart = pChr->Part(nPart); CN3Skin * pSkin = pPart->Skin(nLOD); - if (pPart->m_szName.empty()) // Ʈ ̸ .. + if (pPart->m_szName.empty()) // 파트의 이름이 없으면.. { pPart->m_szName = mGT.name().asChar(); std::string szFN; @@ -2081,10 +2081,10 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { pPart->FileNameSet("item\\" + szFN + ".N3CPart"); } - if (NULL == pSkin) // Skin ִ´.. + if (NULL == pSkin) // Skin 이 없으면 넣는다.. { CN3CPartSkins * pSkinsAdd = new CN3CPartSkins(); - pSkinsAdd->m_szName = mGT.name().asChar(); // ̸ ̸ ϰ.. + pSkinsAdd->m_szName = mGT.name().asChar(); // 이름과 파일 이름을 정하고.. std::string szFN; this->ProcessName(mGT.object(), szFN); @@ -2097,23 +2097,23 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { CN3Base::s_MngSkins.Add(pSkinsAdd); pPart->SkinsSet(pSkinsAdd->FileName()); - pSkin = pPart->Skin(nLOD); // ٽ ϱ. + pSkin = pPart->Skin(nLOD); // 다시 포인터 구하기. } - if (false == this->ProcessSkin(mSkin, pSkin)) // Skin ó.. + if (false == this->ProcessSkin(mSkin, pSkin)) // Skin 처리.. { MessageBox(::GetActiveWindow(), mSkin.name().asChar(), "Skin processing failed", MB_OK); return false; } - // ؽó ó.. + // 텍스처 처리.. pPart->m_Mtl.Init(); pPart->m_Mtl.dwColorArg1 = D3DTA_DIFFUSE; pPart->m_Mtl.dwColorArg2 = D3DTA_TEXTURE; CN3Texture * pTex = ProcessTexture(mMeshOutput); if (pTex) { - pTex->m_szName = mGT.name().asChar(); // ̸ ̸ ϰ.. + pTex->m_szName = mGT.name().asChar(); // 이름과 파일 이름을 정하고.. std::string szFN; this->ProcessName(mGT.object(), szFN); int iLen = szFN.size(); @@ -2121,7 +2121,7 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { if (m_Option.bGenerateFileName && iLen >= 11 && iLen2 >= 11) { // Item Code ::: 0_2345_78_0 szFN = szFN.substr(iLen - 11); } - pTex->FileNameSet("Item\\" + szFN + ".DXT"); // Part ̸ Texture ̸ Ѵ. + pTex->FileNameSet("Item\\" + szFN + ".DXT"); // Part 이름과 Texture 이름을 같게 한다. pPart->m_Mtl.dwColorOp = D3DTOP_MODULATE; pPart->TexSet(pTex); @@ -2131,18 +2131,18 @@ bool CN3E2Wrapper::ProcessChr(MFnSkinCluster & mSkin) { // fmtTex == D3DFMT_DXT3 || // fmtTex == D3DFMT_DXT4 || // fmtTex == D3DFMT_DXT5 ) pPart->m_Mtl.nRenderFlags = RF_ALPHABLENDING; - } else // ؽó 쿡 + } else // 텍스처가 없는 경우에만 재질 { // this->ProcessMaterial(this->MeshGetShader(mMeshOutput), &(pPart->m_Mtl)); pPart->m_Mtl.dwColorOp = D3DTOP_SELECTARG1; } - } // if(false == bCollisionMesh) // 浹 üũ ޽ ƴϸ.... .. + } // if(false == bCollisionMesh) // 충돌 체크 메시 아니면....정상적으로 진행.. return true; } void CN3E2Wrapper::ProcessName(MObject mObj, std::string & szName) { - if (mObj.hasFn(MFn::kWorld) == FALSE && mObj.hasFn(MFn::kDependencyNode)) // ֻ 尡 ƴϸ.. + if (mObj.hasFn(MFn::kWorld) == FALSE && mObj.hasFn(MFn::kDependencyNode)) // 최상위 노드가 아니면.. { MFnDependencyNode mNode(mObj); @@ -2254,7 +2254,7 @@ INT_PTR CALLBACK CN3E2Wrapper::DlgProcProgress(HWND hDlg, UINT msg, WPARAM wPara BOOL CALLBACK CN3E2Wrapper::DlgProcPane(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: { - // Registry ɼǰ ־ξ.. + // Registry 에 옵션값을 넣어두었다.. HKEY hKey = g_pEng->RegistryOpen("N3Export Option"); if (hKey) { g_pEng->RegistryValueGet(hKey, "Export Camera", &m_Option.bExportCamera, 4); @@ -2287,8 +2287,8 @@ BOOL CALLBACK CN3E2Wrapper::DlgProcPane(HWND hDlg, UINT uMsg, WPARAM wParam, LPA CheckDlgButton(hDlg, IDC_C_GENERATE_HALF_SIZE_TEXTURE, m_Option.bGenerateHalfSizeTexture); CheckDlgButton(hDlg, IDC_C_GENERATE_COMPRESSED_TEXTURE, m_Option.bGenerateCompressedTexture); - m_Option.nFrmStart = (int)(MAnimControl::minTime().value()); // . - m_Option.nFrmEnd = (int)(MAnimControl::maxTime().value() + 0.5); // + m_Option.nFrmStart = (int)(MAnimControl::minTime().value()); // 시작 프레임. + m_Option.nFrmEnd = (int)(MAnimControl::maxTime().value() + 0.5); // 끝 프레임 SetDlgItemInt(hDlg, IDC_E_FRAME_START, m_Option.nFrmStart, FALSE); SetDlgItemInt(hDlg, IDC_E_FRAME_END, m_Option.nFrmEnd, FALSE); @@ -2307,8 +2307,8 @@ BOOL CALLBACK CN3E2Wrapper::DlgProcPane(HWND hDlg, UINT uMsg, WPARAM wParam, LPA m_Option.bExportCharacter = IsDlgButtonChecked(hDlg, IDC_C_OBJ_CHARACTER); m_Option.bAnimationKey = IsDlgButtonChecked(hDlg, IDC_C_ANIMATION_KEY); - m_Option.nFrmStart = GetDlgItemInt(hDlg, IDC_E_FRAME_START, NULL, FALSE); // - m_Option.nFrmEnd = GetDlgItemInt(hDlg, IDC_E_FRAME_END, NULL, FALSE); // + m_Option.nFrmStart = GetDlgItemInt(hDlg, IDC_E_FRAME_START, NULL, FALSE); // 시작 프레임 + m_Option.nFrmEnd = GetDlgItemInt(hDlg, IDC_E_FRAME_END, NULL, FALSE); // 끝 프레임 m_Option.fSamplingRate = (float)GetDlgItemInt(hDlg, IDC_E_SAMPLING_RATE, NULL, FALSE); // Sampling Rate m_Option.bGenerateFileName = IsDlgButtonChecked(hDlg, IDC_C_GENERATE_FILE_NAME); @@ -2319,7 +2319,7 @@ BOOL CALLBACK CN3E2Wrapper::DlgProcPane(HWND hDlg, UINT uMsg, WPARAM wParam, LPA EndDialog(hDlg, 1); - // Registry ɼǰ ־ξ.. + // Registry 에 옵션값을 넣어두었다.. HKEY hKey = g_pEng->RegistryOpen("N3Export Option"); if (NULL == hKey) { RegCreateKey(HKEY_CURRENT_USER, "N3Export Option", &hKey); diff --git a/src/tool/PlugIn_Maya/N3E2Wrapper.h b/src/tool/PlugIn_Maya/N3E2Wrapper.h index af311b19..b17a1d72 100644 --- a/src/tool/PlugIn_Maya/N3E2Wrapper.h +++ b/src/tool/PlugIn_Maya/N3E2Wrapper.h @@ -1,6 +1,6 @@ #pragma once -// stl ... +// stl 쓸려고... #pragma warning(disable : 4786) /*==============================================*/ @@ -80,8 +80,8 @@ const int MAX_TEXTURE = 1024; class CN3E2Wrapper { private: // different extensions will get added to this: - char m_szPath[1024]; // ̸ - char m_szFileName[1024]; // ̸ + char m_szPath[1024]; // 경로 이름 + char m_szFileName[1024]; // 파일 이름 CN3Scene * m_pScene; static __EXPORT_OPTION m_Option; @@ -92,7 +92,7 @@ class CN3E2Wrapper { MObject MeshGetShader(MFnMesh & pMMesh); - CN3Texture * ProcessTexture(MFnMesh & mMesh); // ؽó ε ϵȴ.. + CN3Texture * ProcessTexture(MFnMesh & mMesh); // 텍스처 인덱스값이 리턴된다.. CN3Joint * ProcessJoint(MFnIkJoint & mJoint); bool ProcessIMesh(MFnMesh & mMesh, CN3IMesh * pIMesh); bool ProcessVMesh(MFnMesh & mMesh, CN3VMesh * pVMesh); diff --git a/src/tool/PlugIn_Maya/Resource.rc b/src/tool/PlugIn_Maya/Resource.rc index 72a8a959ba377536e9056715b36eedd0b52bfb2e..7bef32c4403daed98232bd56fd3dd70d07c27389 100644 GIT binary patch literal 12176 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 D8JyV1 literal 6112 zcmcH-%Z}q%b?>jZJ0#BWD@o@;^;EU%Vf*@?d*07l%?c+;ypCrn(fLch zh*vxzZn~L}b^2P4gLf z{hI84^i-$s51I1};gER$Bg1Yef~ng5vD&8uA8-RzZHc(!ZuYLzo;o%?;mIlq=F5Og z;wkr6!JI$sG&^tHt`Dvoa`q6BnynWIxjYDn2>X{h2p7Q*JGn> z?`Z4}x?|4+fn}HY11*Rqe3A3l^)=Pjs0oC&fQwcGsin4_tCBt+F~{>+F7MO&RAkVn zqO?!z^WN&CuU2uA61GaiI69*^F#J8vL^ec@*iZuTT{Wam3xs)G06YBWyvy~=9Hvvk z^c^-H?I=rRAOD0;QsUjM_&S%I>#3fh0XF!lOYN%+*MT|pdA#Il5>9d;&1c;o`F+YP z>Nz)(*xjTluqlDA)v?F40o8`N$)D15p;}2+&{)7uP9WBTC1j6+)*P({-sPwdMA`tG zZk$4DhV$EW52uM{`#_YFal??nihOs7*w(ZRZ)jDT<#-84wjJ&yv? zFJJv|CaKa$4u=q-on=R>6XN{MX?Z@wen{Q1qN#W>Oy~P=oEq=g`T2< z*y}5HD*D|PL@IiaOm5qvAM=k%d!7X?mjTUGyOOJehDC3QqKuRa`3Nc1%WPT*$zaUb*p%A z_Fi1+nkN|cGI3r*f}xHJC8UqOMT(cq&j`kcVu3*2Bta-|HtPa`)TWO$@7N~<>6vQZ zwN!UV>aQ9zvl>$9v^(w#*{RtU_$*9=fOgYS9b~a zcZj8WA;0{NDD}F04ib8eDPIQ3PczY;*va7R5NJZVM5Pc*x-OQB#R<4k6262XX?GJY zps3G%xl|3_3-v&GH{DFq`*K`te@D5xD?Wi)*il+A1S37=y|B;gAUS8n1@&3Cw#b@I z;1T==8XW?L4Q^W;iO24T_z$vBv%hvQqkP=pE@W9`fAac1)5!lBJ2$FfY&Lcl9y#vr Mh5RT^k0jOq0j&?*H~;_u diff --git a/src/tool/RscTables/RscTables.rc b/src/tool/RscTables/RscTables.rc index 0209ac44c315f5df5107d4ac283484cc29822a1d..54b3b8e43e0743561b0af3197abc441e32b31f46 100644 GIT binary patch literal 18640 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 YGBH_}A;qSMtB*JG18-Ju1*fwA0YhpIE&u=k literal 9345 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 diff --git a/src/tool/RscTables/RscTables.vcxproj.filters b/src/tool/RscTables/RscTables.vcxproj.filters index a07066cf..e8b22d94 100644 --- a/src/tool/RscTables/RscTables.vcxproj.filters +++ b/src/tool/RscTables/RscTables.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/tool/RscTables/RscTables.vcxproj.user b/src/tool/RscTables/RscTables.vcxproj.user index 78fe6cea..c8d52b03 100644 --- a/src/tool/RscTables/RscTables.vcxproj.user +++ b/src/tool/RscTables/RscTables.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\game diff --git a/src/tool/RscTables/RscTablesDlg.cpp b/src/tool/RscTables/RscTablesDlg.cpp index c1abb32f..3ce53097 100644 --- a/src/tool/RscTables/RscTablesDlg.cpp +++ b/src/tool/RscTables/RscTablesDlg.cpp @@ -180,7 +180,7 @@ HCURSOR CRscTablesDlg::OnQueryDragIcon() { return (HCURSOR)m_hIcon; } -// Ÿ . +// 데이타 형식을 새로 만든다. void CRscTablesDlg::OnFileNew() { // TODO: Add your command handler code here CDlgDataCount dlg; @@ -193,11 +193,11 @@ void CRscTablesDlg::OnFileNew() { } m_Generator.Release(); - m_Generator.DataTypeAssign(iCount, DT_STRING); // ⺻ ڿ - m_Generator.DataTypeSet(0, DT_DWORD); // ù° .. + m_Generator.DataTypeAssign(iCount, DT_STRING); // 기본값은 문자열 + m_Generator.DataTypeSet(0, DT_DWORD); // 첫번째 열은 정수.. m_ListBoxDataType.SetDividerWidth(100); - this->UpdateAllInfo(); // Ʈ ڽ ϰ.. ȭ鿡 ǥ... + this->UpdateAllInfo(); // 리스트 박스 갱신하고.. 화면에 표시... } BOOL CRscTablesDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { @@ -209,9 +209,9 @@ BOOL CRscTablesDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { if (iIndex < 0 || iIndex >= m_Generator.DataTypeCount()) { return TRUE; } - if (0 == iIndex && lstrcmpi(pItem->m_curValue, "DWORD") != 0) // 0 DWORD ƴϸ Ѵ.. + if (0 == iIndex && lstrcmpi(pItem->m_curValue, "DWORD") != 0) // 0 번이 DWORD 가 아니면 경고한다.. { - MessageBox("Data0 ε ̱ ݵ DWORD ̾ մϴ.", ""); + MessageBox("Data0 는 인덱스로 쓰이기 때문에 반드시 DWORD 형이어야 합니다.", "경고"); } DATA_TYPE DataType = DT_NONE; @@ -244,7 +244,7 @@ BOOL CRscTablesDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { return CDialog::OnNotify(wParam, lParam, pResult); } -// data type +// data type 설정해 놓을 것을 저장 void CRscTablesDlg::OnFileSaveEnum() { DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; CFileDialog dlg(FALSE, "enm", NULL, dwFlags, "Data Enum File(*.enm)|*.enm||", NULL); @@ -255,7 +255,7 @@ void CRscTablesDlg::OnFileSaveEnum() { m_Generator.DataTypeSave(dlg.GetPathName().GetString()); } -// data type +// data type 설정해 놓을 것을 열기 void CRscTablesDlg::OnFileOpenEnum() { DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; CFileDialog dlg(TRUE, "enm", NULL, dwFlags, "Data Enum File(*.enm)|*.enm||", NULL); @@ -265,7 +265,7 @@ void CRscTablesDlg::OnFileOpenEnum() { m_Generator.DataTypeLoad(dlg.GetPathName().GetString()); - this->UpdateAllInfo(); // Ʈ ڽ ϰ.. ȭ鿡 ǥ... + this->UpdateAllInfo(); // 리스트 박스 갱신하고.. 화면에 표시... } void CRscTablesDlg::OnUpdateFileSaveEnum(CCmdUI * pCmdUI) { @@ -276,18 +276,18 @@ void CRscTablesDlg::OnFileExit() { PostQuitMessage(0); } -// Text bin ͷ ȯϱ +// Text정보를 bin 데이터로 변환하기 void CRscTablesDlg::OnConvertText2bin() { int iDataCount = m_Generator.DataTypeCount(); if (iDataCount <= 0) { - MessageBox(" ־ մϴ."); + MessageBox("먼저 데이터 갯수와 형식을 지정해주어야 합니다."); return; } char szBuff[10240] = ""; CString FileName; DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT; - CFileDialog dlg(TRUE, "txt", NULL, dwFlags, "txt( и)(*.txt)|*.txt||", NULL); + CFileDialog dlg(TRUE, "txt", NULL, dwFlags, "txt(탭으로 분리)(*.txt)|*.txt||", NULL); dlg.m_ofn.nMaxFile = 10240; dlg.m_ofn.lpstrFile = szBuff; if (dlg.DoModal() == IDCANCEL) { @@ -307,7 +307,7 @@ void CRscTablesDlg::OnClose() { } void CRscTablesDlg::UpdateInfo() { - // ȭ鿡 ǥ + // 화면에 표시 int iDataCount = m_Generator.DataTypeCount(); for (int i = 0; i < iDataCount; ++i) { int iSel = -1; @@ -372,9 +372,9 @@ void CRscTablesDlg::OnSize(UINT nType, int cx, int cy) { if (m_ListBoxDataType.GetSafeHwnd() != NULL) { CRect rcOrg, rcClient; - m_ListBoxDataType.GetWindowRect(rcOrg); // ׷ Ʈ ȭ ǥ + m_ListBoxDataType.GetWindowRect(rcOrg); // 그래프 컨트롤의 원래 화면 좌표를 this->GetClientRect(rcClient); // - this->ClientToScreen(rcClient); // ȭ ǥ ٲٰ.. + this->ClientToScreen(rcClient); // 화면 좌표로 바꾸고.. int cx2 = rcOrg.Width(); int cy2 = rcClient.bottom - rcOrg.top - 5; @@ -386,8 +386,8 @@ void CRscTablesDlg::OnSize(UINT nType, int cx, int cy) { void CRscTablesDlg::OnEditInsert() { // TODO: Add your command handler code here int iCurSel = m_ListBoxDataType.GetCurSel(); - if (m_Generator.DataTypeInsert(iCurSel, DT_STRING)) { // ⺻ string߰ - UpdateAllInfo(); // Ʈ ڽ ϰ.. ȭ鿡 ǥ... + if (m_Generator.DataTypeInsert(iCurSel, DT_STRING)) { // 기본적으로 string추가 + UpdateAllInfo(); // 리스트 박스 갱신하고.. 화면에 표시... } } @@ -395,7 +395,7 @@ void CRscTablesDlg::OnEditDelete() { // TODO: Add your command handler code here const int iCurSel = m_ListBoxDataType.GetCurSel(); if (m_Generator.DataTypeDelete(iCurSel)) { - UpdateAllInfo(); // Ʈ ڽ ϰ.. ȭ鿡 ǥ... + UpdateAllInfo(); // 리스트 박스 갱신하고.. 화면에 표시... } } @@ -422,7 +422,7 @@ bool CRscTablesDlg::BrowseDataEnumAndTxt(int iIndex, BOOL bOpen, std::string * p if (pszFN_Txt) { CString FileName2; DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; - CFileDialog dlg2(bOpen, "txt", NULL, dwFlags, "Tab и Txt File(*.txt)|*.txt||", NULL); + CFileDialog dlg2(bOpen, "txt", NULL, dwFlags, "Tab 으로 분리된 Txt File(*.txt)|*.txt||", NULL); if (dlg2.DoModal() == IDCANCEL) { return false; } diff --git a/src/tool/RscTables/TableGenerator.cpp b/src/tool/RscTables/TableGenerator.cpp index 6b0e06a7..99da4e55 100644 --- a/src/tool/RscTables/TableGenerator.cpp +++ b/src/tool/RscTables/TableGenerator.cpp @@ -22,18 +22,18 @@ bool CTableGenerator::OpenSource(const std::string & szEnumFileName, const std:: HANDLE hFile = CreateFile(szEnumFileName.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { - MessageBox(hWnd, szEnumFileName.c_str(), " ų ϴ.", MB_OK); + MessageBox(hWnd, szEnumFileName.c_str(), "파일이 없거나 읽을 수 없습니다.", MB_OK); return false; } - // Ͽ б + // 파일에서 정보 읽기 m_Datas.clear(); int iDataCount = 0; DWORD dwNum; ReadFile(hFile, &iDataCount, sizeof(iDataCount), &dwNum, NULL); if (iDataCount <= 0) { CloseHandle(hFile); - MessageBox(hWnd, szEnumFileName.c_str(), "Data Type ϴ.", MB_OK); + MessageBox(hWnd, szEnumFileName.c_str(), "Data Type 이 없습니다.", MB_OK); return false; } @@ -45,11 +45,11 @@ bool CTableGenerator::OpenSource(const std::string & szEnumFileName, const std:: FILE * pFile = fopen(szTxtFileName.c_str(), "r"); if (NULL == pFile) { - MessageBox(hWnd, szTxtFileName.c_str(), " ų ϴ.", MB_OK); + MessageBox(hWnd, szTxtFileName.c_str(), "파일이 없거나 읽을 수 없습니다.", MB_OK); return false; } - // ̸ .. + // 파일 이름 기록.. m_szEnmBasic = szEnumFileName; m_szTxtBasic = szTxtFileName; @@ -75,21 +75,21 @@ bool CTableGenerator::OpenSource(const std::string & szEnumFileName, const std:: for (int j = 0; j < iDataCount; j++) { int iSuccess = this->ParseLine(szLine, iOffset, iVal, dwVal, dfVal, - szText); // ϸ 0, ߰ؾϰ ̸ -1 ߰ ʿ ̸.. -2 + szText); // 성공하면 0, 추가해야하고 끝이면 -1 추가할 필요 없고 끝이면.. -2 리턴 if (iSuccess > 0) { - if (i == 0) // ù ̴.. + if (i == 0) // 첫줄은 설명이다.. { m_Datas[j].m_szTitle = szText; } else { - if (0 == j) // Key ߺ ˻.. + if (0 == j) // Key 중복 검사.. { pair_Key pk = KeySet.insert(iVal); if (false == pk.second) { char szErr[512]; - sprintf(szErr, "Key ߺ : Line %d, Key : %d, File : %s", i + 1, iVal, + sprintf(szErr, "Key 중복 : Line %d, Key : %d, File : %s", i + 1, iVal, szTxtFileName.c_str()); - MessageBox(hWnd, szErr, "Key ߺ - ̺ ߰ ", MB_OK); + MessageBox(hWnd, szErr, "Key 중복 - 테이블에 추가 실패", MB_OK); break; } } @@ -100,7 +100,7 @@ bool CTableGenerator::OpenSource(const std::string & szEnumFileName, const std:: m_Datas[j].m_Texts.push_back(szText); } } else { - MessageBox(hWnd, szTxtFileName.c_str(), "Data ų ٸϴ.", MB_OK); + MessageBox(hWnd, szTxtFileName.c_str(), "Data 의 열 갯수가 적거나 다릅니다.", MB_OK); fclose(pFile); m_Datas.clear(); return false; @@ -122,11 +122,11 @@ bool CTableGenerator::OpenReference_Enum(const std::string & szEnumFileName) { HANDLE hFile = CreateFile(szEnumFileName.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { - MessageBox(hWnd, szEnumFileName.c_str(), " ų ϴ.", MB_OK); + MessageBox(hWnd, szEnumFileName.c_str(), "파일이 없거나 읽을 수 없습니다.", MB_OK); return false; } - // Ͽ б + // 파일에서 정보 읽기 m_DataExts.clear(); int iDataCount = 0; @@ -134,7 +134,7 @@ bool CTableGenerator::OpenReference_Enum(const std::string & szEnumFileName) { ReadFile(hFile, &iDataCount, sizeof(iDataCount), &dwNum, NULL); if (iDataCount <= 0) { CloseHandle(hFile); - MessageBox(hWnd, szEnumFileName.c_str(), "Data Type ϴ.", MB_OK); + MessageBox(hWnd, szEnumFileName.c_str(), "Data Type 이 없습니다.", MB_OK); return false; } @@ -144,7 +144,7 @@ bool CTableGenerator::OpenReference_Enum(const std::string & szEnumFileName) { } CloseHandle(hFile); - // ̸ .. + // 파일 이름 기록.. m_szEnmExt = szEnumFileName; return true; @@ -165,7 +165,7 @@ bool CTableGenerator::OpenReference_Txt(int iIndex, const std::string & szTxtFil FILE * pFile = fopen(szTxtFileName.c_str(), "r"); if (NULL == pFile) { - MessageBox(hWnd, szTxtFileName.c_str(), " ų ϴ.", MB_OK); + MessageBox(hWnd, szTxtFileName.c_str(), "파일이 없거나 읽을 수 없습니다.", MB_OK); return false; } @@ -192,21 +192,21 @@ bool CTableGenerator::OpenReference_Txt(int iIndex, const std::string & szTxtFil for (int j = 0; j < iDataCount; j++) { int iSuccess = this->ParseLine(szLine, iOffset, iVal, dwVal, dfVal, - szText); // ϸ 0, ߰ؾϰ ̸ -1 ߰ ʿ ̸.. -2 + szText); // 성공하면 0, 추가해야하고 끝이면 -1 추가할 필요 없고 끝이면.. -2 리턴 if (iSuccess > 0) { - if (i == 0) // ù ̴.. + if (i == 0) // 첫줄은 설명이다.. { m_DataExts[j].m_szTitle = szText; } else { - if (0 == j) // Key ߺ ˻.. + if (0 == j) // Key 중복 검사.. { pair_Key pk = KeySet.insert(iVal); if (false == pk.second) { char szErr[512]; - sprintf(szErr, "Key ߺ : Line %d, Key : %d, File : %s", i + 1, iVal, + sprintf(szErr, "Key 중복 : Line %d, Key : %d, File : %s", i + 1, iVal, szTxtFileName.c_str()); - MessageBox(hWnd, szErr, "Key ߺ - ̺ ߰ ", MB_OK); + MessageBox(hWnd, szErr, "Key 중복 - 테이블에 추가 실패", MB_OK); break; } } @@ -218,8 +218,8 @@ bool CTableGenerator::OpenReference_Txt(int iIndex, const std::string & szTxtFil } } else { char szErr[512]; - sprintf(szErr, "Field ʰų ڿ ̻մϴ : Line %d, Field : %d", i + 1, j); - MessageBox(hWnd, szErr, "̺ ߰ ", MB_OK); + sprintf(szErr, "Field 갯수가 맞지 않거나 문자열이 이상합니다 : Line %d, Field : %d", i + 1, j); + MessageBox(hWnd, szErr, "테이블에 추가 실패", MB_OK); fclose(pFile); // m_DataExts[iIndex].clear(); return false; @@ -229,7 +229,7 @@ bool CTableGenerator::OpenReference_Txt(int iIndex, const std::string & szTxtFil fclose(pFile); - // ̸ .. + // 파일 이름 기록.. m_szTxtExts[iIndex] = szTxtFileName; return true; @@ -251,7 +251,7 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c HWND hWnd = ::GetActiveWindow(); if (m_Datas.empty() || m_Datas[0].m_iValues.empty() || m_DataExts.empty()) { - MessageBox(hWnd, "⺻ ̺ ̺ о մϴ.", " ̺ ", MB_OK); + MessageBox(hWnd, "기본 아이템 테이블과 참조 테이블을 읽어야 합니다.", "아이템 테이블 생성 실패", MB_OK); return false; } @@ -259,11 +259,11 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c HANDLE hFile = CreateFile(szTxtFileName.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { - MessageBox(hWnd, szTxtFileName.c_str(), " ų ϴ.", MB_OK); + MessageBox(hWnd, szTxtFileName.c_str(), "파일이 없거나 쓸수 없습니다.", MB_OK); return false; } - std::vector DataTypesPrev; // Data Type س´.. + std::vector DataTypesPrev; // Data Type 백업을 해놓는다.. DataTypesPrev = m_DataTypes; m_DataTypes.clear(); @@ -272,7 +272,7 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c int iDTCount = iDTCountBasic + iDTCountRef; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Item Table .... + // Item Table 조합.... enum e_ItemGenerationIndex1 { IG1_KEY = 0, IG1_GEN_TYPE = 1, @@ -337,8 +337,8 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c IGT_UNKNONW = 0xffffffff }; - std::string szGrade[10] = {"", " ", "ǹ ", " ", "÷Ƽ ", - "ũ ", "糪 ", "ֶ ", "μƮ ", "̽ƽ "}; + std::string szGrade[10] = {"", "브론즈 ", "실버 ", "골든 ", "플레티넘 ", + "크림슨 ", "루나 ", "솔라 ", "에인션트 ", "미스틱 "}; char szBuff[1024]; int iCountBasic = m_Datas[0].m_iValues.size(); @@ -349,30 +349,30 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c int iCountWhole = iCountBasic * iCountRef; std::vector * pLineArrays = new std::vector< - std::string>[iCountWhole + 1]; // ۿ ڿ 迭 غ.. +1 ϴ ùٿ Ѵ. + std::string>[iCountWhole + 1]; // 라인 버퍼에 쓸 문자열 배열 준비.. +1을 하는 이유는 첫줄에 설명 넣을려고 한다. int iIndexCur1 = 0; int iIndexCur2 = 0; int iExt = iIndexS; - int iCountWhole2 = 0; // ó .. + int iCountWhole2 = 0; // 실제 처리한 갯수.. int iAddTitle = -1; for (int i = 0; i < iCountWhole; i++) { - int iType = m_Datas[IG1_GEN_TYPE].m_dwValues[iIndexCur1]; // Ÿ.. + int iType = m_Datas[IG1_GEN_TYPE].m_dwValues[iIndexCur1]; // 아이템 생성타입.. - // Ÿ԰ Ȯ ̺ ȣ ´°츸 ó.. + // 아이템 생성 타입과 확장 테이블에 적용할 번호가 맞는경우만 처리.. if (iType == iExt) { - int iGrade = (m_DataExts[IG2_KEY].m_dwValues[iExt][iIndexCur2]) % 10; // + int iGrade = (m_DataExts[IG2_KEY].m_dwValues[iExt][iIndexCur2]) % 10; // 무기 등급 e_ItemGenerationIndex2 eIG2 = IG2_UNKNOWN; for (int j = 0; j < iDTCountBasic; j++) { DATA_TYPE dt = m_Datas[j].m_Type; - // ϵ ڵ... + // 하드 코딩... switch (j) { - case IG1_KEY: // Ϸùȣ .. + case IG1_KEY: // 일련번호 생성.. if (DT_DWORD == dt) { - // DWORD dwKey = ((m_Datas[j].m_dwValues[iIndexCur1] / 1000) * 1000) + m_DataExts[IG2_KEY].m_dwValues[iExt][iIndexCur2]; // ǰ ڸ ġѴ. + // DWORD dwKey = ((m_Datas[j].m_dwValues[iIndexCur1] / 1000) * 1000) + m_DataExts[IG2_KEY].m_dwValues[iExt][iIndexCur2]; // 뒤의거 세자리를 대치한다. DWORD dwKey = m_Datas[j].m_dwValues[iIndexCur1] + - m_DataExts[IG2_KEY].m_dwValues[iExt][iIndexCur2]; // ش. + m_DataExts[IG2_KEY].m_dwValues[iExt][iIndexCur2]; // 더해준다. sprintf(szBuff, "%d", dwKey); } else { lstrcpy(szBuff, "Invalid Key"); @@ -383,7 +383,7 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c lstrcpy(szBuff, ""); break; - case IG1_NAME: // ̸ + case IG1_NAME: // 아이템 이름 if (DT_STRING == dt) { sprintf(szBuff, "%s%s %s", szGrade[iGrade].c_str(), m_DataExts[IG2_NAME_HEAD].m_Texts[iExt][iIndexCur2].c_str(), @@ -393,7 +393,7 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c } break; - case IG1_REMARK: // .. ͷν ʿ. + case IG1_REMARK: // 아이템 설명.. 데이터로써는 필요없다. case IG1_PIC: case IG1_ICON: case IG1_SOUND0: @@ -402,7 +402,7 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c lstrcpy(szBuff, ""); break; - case IG1_DAMAGE: // ܼ ϱ. + case IG1_DAMAGE: // 단순 더하기. case IG1_AC: case IG1_EFFECT1: case IG1_EFFECT2: @@ -416,7 +416,7 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c case IG1_REQ_INT: case IG1_REQ_CHA: { bool bApplyAbility = - false; // 䱸 ɷġ 0 ϶ ϰ... 0 0 ǥҰ.. + false; // 요구 능력치가 0 일때 무시하고... 계산한 값이 0 보다 작을때 0으로 표시할것.. if (IG1_DAMAGE == j) { eIG2 = IG2_DAMAGE; @@ -459,10 +459,10 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c if (DT_STRING != dt) { int iValue = m_Datas[j].m_iValues[iIndexCur1] + m_DataExts[eIG2].m_iValues[iExt][iIndexCur2]; - if (bApplyAbility) // 䱸 ɷġ .. + if (bApplyAbility) // 요구 능력치로 계산.. { if (0 == m_Datas[j].m_iValues[iIndexCur1]) { - iValue = 0; // 䱸 ɷġ 0 ̸ ʴ´. + iValue = 0; // 요구 능력치가 0 이면 계산하지 않는다. } if (iValue < 0) { iValue = 0; @@ -474,7 +474,7 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c } } break; - case IG1_BUY_PRICE: // - ϱ.. + case IG1_BUY_PRICE: // 아이템 가격 - 곱하기.. if (DT_STRING != dt) { int iValue = m_Datas[j].m_iValues[iIndexCur1] * m_DataExts[IG2_BUY_PRICE].m_iValues[iExt][iIndexCur2]; @@ -483,7 +483,7 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c lstrcpy(szBuff, "Invalid BuyPrice"); } break; - case IG1_DELAY: // ӵ Percentage . + case IG1_DELAY: // 공격 속도 Percentage 계산. eIG2 = IG2_DELAY_PERCENT; if (DT_STRING != dt) { int iValue = 0; @@ -497,7 +497,7 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c sprintf(szBuff, "%d", iValue); int iDamage = m_Datas[IG1_DAMAGE].m_iValues[iIndexCur1]; - if (iDamage > 0) // ϶ ӵ ˻ .. + if (iDamage > 0) // 무기일때 공격 속도를 검사해 본다.. { if (iValue < 50) { char szErr[256]; @@ -541,13 +541,13 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c } if (lstrlen(szBuff) > 0) { - pLineArrays[i + 1].push_back(szBuff); // ڿ ־ ִ´. + pLineArrays[i + 1].push_back(szBuff); // 문자열이 있어야 넣는다. if (iAddTitle < 0) { iAddTitle = i; } if (i == iAddTitle) { - pLineArrays[0].push_back(m_Datas[j].m_szTitle); // ֱ.. + pLineArrays[0].push_back(m_Datas[j].m_szTitle); // 설명 넣기.. m_DataTypes.push_back(dt); } } @@ -606,17 +606,17 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c if (lstrlen(szBuff) > 0) { if (i == iAddTitle) { - pLineArrays[0].push_back(m_DataExts[j].m_szTitle); // ֱ.. - m_DataTypes.push_back(dt); // Ÿ ֱ.. + pLineArrays[0].push_back(m_DataExts[j].m_szTitle); // 설명 넣기.. + m_DataTypes.push_back(dt); // 데이터 타입 넣기.. } - pLineArrays[i + 1].push_back(szBuff); // ڿ ־ ִ´. + pLineArrays[i + 1].push_back(szBuff); // 문자열이 있어야 넣는다. } } - iCountWhole2++; // ó .. - } // end of if(iType == iExt) // Ÿ԰ Ȯ ̺ ȣ ´°츸 ó.. + iCountWhole2++; // 실제 처리한 갯수 증가.. + } // end of if(iType == iExt) // 무기 타입과 확장 테이블에 적용할 번호가 맞는경우만 처리.. - // ε .. + // 인덱스 계산.. iIndexCur2++; if (iIndexCur2 >= m_DataExts[0].m_iValues[iExt].size()) { iIndexCur2 = 0; @@ -629,7 +629,7 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c } // end of for(int i = 0; i < iCountWhole; i++) int iColCount = pLineArrays[0].size(); - for (int i = 0; i <= iCountWhole; i++) // . + for (int i = 0; i <= iCountWhole; i++) // 설명까지 쓴다. { if (pLineArrays[i].empty()) { continue; @@ -638,28 +638,28 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c for (int j = 0; j < iColCount; j++) { WriteFile(hFile, pLineArrays[i][j].c_str(), pLineArrays[i][j].size(), &dwRWC, NULL); if (j < iColCount - 1) { - WriteFile(hFile, "\t", 1, &dwRWC, NULL); // .. + WriteFile(hFile, "\t", 1, &dwRWC, NULL); // 탭 구분.. } else { - WriteFile(hFile, "\r\n", 2, &dwRWC, NULL); // ѱ. + WriteFile(hFile, "\r\n", 2, &dwRWC, NULL); // 줄 넘기기. } } } - // Item Table .... + // Item Table 조합.... ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// delete[] pLineArrays; pLineArrays = NULL; CloseHandle(hFile); - // Data Type .. + // Data Type 저장.. this->DataTypeSave(szEnumFileName); - m_DataTypes = DataTypesPrev; // ɷ ´. + m_DataTypes = DataTypesPrev; // 백업 받은걸로 돌려놓는다. return true; } int CTableGenerator::ParseLine( const char * szLine, int & iOffset, int & iVal, DWORD & dwVal, double & dfVal, - std::string & szText) // ϸ 0, ߰ؾϰ ̸ -1 ߰ ʿ ̸.. -2 + std::string & szText) // 성공하면 0, 추가해야하고 끝이면 -1 추가할 필요 없고 끝이면.. -2 리턴 { const char * szLine2 = szLine + iOffset; @@ -680,7 +680,7 @@ int CTableGenerator::ParseLine( dfVal = atof(szText.c_str()); iOffset++; return 1; - } else if ('\r' == *szLine2 || '\n' == *(szLine2)) // ǵ + CR -> ̴.. + } else if ('\r' == *szLine2 || '\n' == *(szLine2)) // 라인피드 + CR -> 라인의 끝이다.. { iVal = atoi(szText.c_str()); dwVal = atol(szText.c_str()); @@ -704,7 +704,7 @@ bool CTableGenerator::DataTypeSave(const std::string & szFN) { HANDLE hFile = CreateFile(szFN.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); HWND hWnd = ::GetActiveWindow(); if (INVALID_HANDLE_VALUE == hFile) { - MessageBox(hWnd, " ϴ.", " ", MB_OK); + MessageBox(hWnd, "파일을 만들 수 없습니다.", "데이터 형식 저장", MB_OK); return false; } @@ -724,12 +724,12 @@ bool CTableGenerator::DataTypeLoad(const std::string & szFN) { HWND hWnd = ::GetActiveWindow(); HANDLE hFile = CreateFile(szFN.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { - MessageBox(hWnd, " ų ϴ.", " θ", MB_OK); + MessageBox(hWnd, "파일이 없거나 읽을 수 없습니다.", "데이터 형식 부르기", MB_OK); return false; } m_DataTypes.clear(); - // Ͽ б + // 파일에서 정보 읽기 int iDataCount = 0; DWORD dwNum; ReadFile(hFile, &iDataCount, sizeof(iDataCount), &dwNum, NULL); @@ -751,20 +751,20 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { HWND hWnd = ::GetActiveWindow(); FILE * stream = fopen(szFN.c_str(), "r"); if (NULL == stream) { - MessageBox(hWnd, " Դϴ.", "Convert Error", MB_OK); + MessageBox(hWnd, "읽을 수 없는 파일입니다.", "Convert Error", MB_OK); return false; } const int iMaxStrLen = 4096; char line[iMaxStrLen + 1]; - // column ̸ + // 맨 윗줄은 column의 이름들이 써있음 if (fgets(line, iMaxStrLen, stream) == NULL) { fclose(stream); - std::string szMsg = szFN + " - ϴ."; + std::string szMsg = szFN + " - 파일 내용을 읽을 수 없습니다."; MessageBox(hWnd, szMsg.c_str(), "Convert Error", MB_OK); return false; } - // column ΰ Ȯغ + // column이 몇개인가 확인해보기 int iDataCount = m_DataTypes.size(); int iCount = 0; char * token = MyToken(line); @@ -774,19 +774,19 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { } if (iCount != iDataCount) { fclose(stream); - std::string szMsg = szFN + " - Ϳ ġ ʽϴ.\nٽ Ȯ ּ!"; + std::string szMsg = szFN + " - 파일 데이터와 설정한 데이터 수가 일치하지 않습니다.\n다시 확인해 주세요!"; MessageBox(hWnd, szMsg.c_str(), "Convert Error", MB_OK); return false; } - // row  + // row 가 몇 줄인지 세어보기 iCount = 0; bool bQuotationActived = false; while (fgets(line, iMaxStrLen, stream)) { char * pcFind = line; - pcFind = strchr(pcFind, '\"'); // ǥ ִ ˻. + pcFind = strchr(pcFind, '\"'); // 따옴표 쳐져있는지 검사. while (pcFind) { if (*(pcFind - 1) != '\t' && *(pcFind + 1) != '\t' && *(pcFind + 1) != '\n') { - MessageBox(hWnd, "ġ ǥ ֽϴ.", "Convert Error", MB_OK); + MessageBox(hWnd, "예상치 않은 곳에 따옴표가 있습니다.", "Convert Error", MB_OK); return false; } bQuotationActived = !bQuotationActived; @@ -794,11 +794,11 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { } if (!bQuotationActived) { - ++iCount; // ǥ ִµ ٲ īƮ ʴ´. + ++iCount; // 따옴표 쳐져있는데 줄 바뀌면 카운트를 세지 않는다. } } - // binary file ϱ + // binary file 생성하기 char szFName[_MAX_PATH], szDrv[_MAX_DRIVE], szPath[_MAX_PATH]; char szDestFN[_MAX_PATH]; _splitpath(szFN.c_str(), szDrv, szPath, szFName, NULL); @@ -807,34 +807,34 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { if (INVALID_HANDLE_VALUE == hFile) { fclose(stream); std::string szMsg = szDestFN; - szMsg += " - ϴ."; + szMsg += " - 파일을 생성할 수 없습니다."; MessageBox(hWnd, szMsg.c_str(), "Convert Error", MB_OK); return false; } - // data(column)  Ǿ ִ ϱ + // data(column) 의 구조가 어떻게 되어 있는지 저장하기 DWORD dwNum; - WriteFile(hFile, &iDataCount, sizeof(iDataCount), &dwNum, NULL); // ( column ) + WriteFile(hFile, &iDataCount, sizeof(iDataCount), &dwNum, NULL); // (엑셀에서 column 수) for (int i = 0; i < iDataCount; ++i) { DATA_TYPE datatype = m_DataTypes[i]; - WriteFile(hFile, &datatype, sizeof(DATA_TYPE), &dwNum, NULL); // column شϴ data type + WriteFile(hFile, &datatype, sizeof(DATA_TYPE), &dwNum, NULL); // 각각의 column에 해당하는 data type } - // row + // row 가 몇줄인지 저장 WriteFile(hFile, &iCount, sizeof(iCount), &dwNum, NULL); - // txt Ͽ table ٽ б + // txt 파일에서 table 정보부터 다시 읽기 int iRet = fseek(stream, 0, SEEK_SET); ASSERT(0 == iRet); - fgets(line, iMaxStrLen, stream); // ó ׳ б (, 2° ٺ ٽ б) + fgets(line, iMaxStrLen, stream); // 처음 한줄은 그냥 읽기 (즉, 2번째 줄부터 다시 읽기) - // Ű ߺ ˻ .. + // 키 중복 검사용 데이터.. std::set KeySet; typedef typename std::set::iterator it_Key; typedef std::pair pair_Key; BOOL bCheckEmptyValue = FALSE; bQuotationActived = false; - std::string strValueBuffer; // ٿ Ʈ + std::string strValueBuffer; // 여러 줄에 걸쳐진 스트링을 저장할 버퍼 int iRowCount = 0; int iColCount = 0; while (iRowCount < iCount) { @@ -844,7 +844,7 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { int iStrLen = lstrlen(line); ASSERT(iStrLen > 0); if (line[iStrLen - 1] == '\n') { - line[iStrLen - 1] = '\0'; // \n ֱ + line[iStrLen - 1] = '\0'; // \n문자 없애기 } token = MyToken(line); @@ -853,8 +853,8 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { pair_Key pk = KeySet.insert(iKey); if (false == pk.second) { char szErr[512]; - sprintf(szErr, "Key ߺ : Line %d, Key : %d, File : %s", iRowCount + 1, iKey, szFN.c_str()); - MessageBox(hWnd, szErr, "Key ߺ - ̺ ߰ ", MB_OK); + sprintf(szErr, "Key 중복 : Line %d, Key : %d, File : %s", iRowCount + 1, iKey, szFN.c_str()); + MessageBox(hWnd, szErr, "Key 중복 - 테이블에 추가 실패", MB_OK); CloseHandle(hFile); fclose(stream); ASSERT(0); @@ -863,24 +863,24 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { //for (int j=0; j= 0 && '\"' == token[iLast]) { // ǥ ڿ ̴. + if (iLast >= 0 && '\"' == token[iLast]) { // 따옴표가 있으면 문자열 끝이다. bQuotationActived = false; strValueBuffer += std::string(token).substr(0, iLast); - // ۿ ִ° + // 버퍼에 있는것 기록 if (FALSE == WriteData(hFile, m_DataTypes[iColCount], strValueBuffer.c_str())) { char szErr[512]; wsprintf(szErr, "File - %s, Line - %d, Field - %d", szFN.c_str(), iRowCount + 1, iColCount); MessageBox( hWnd, szErr, - "Ÿ õǴ ֽϴ. ۵ Դϴ.", + "데이타 기록이 무시되는 것이 있습니다. 이 파일은 제대로 작동 되지 않을 것입니다.", MB_OK); CloseHandle(hFile); fclose(stream); @@ -890,25 +890,25 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { token = MyToken(NULL); ++iColCount; continue; - } else { // ǥ ڿ ذ. + } else { // 따옴표가 없으면 문자열을 계속 더해간다. strValueBuffer += token; token = MyToken(NULL); continue; } } - } else if (token && '\"' == token[0]) // bQuotationActived falsḛ '\"' == token[0] ̸ - { // ڿ ۵Ǿ. + } else if (token && '\"' == token[0]) // bQuotationActived 가 false이고 '\"' == token[0] 이면 + { // 문자열이 시작되었다. int iLast = lstrlen(token) - 1; - if (iLast >= 1 && '\"' == token[iLast]) // iLast>=1 ū " 2 Ȯ ϱ ؼ. - { // ū ڿ . + if (iLast >= 1 && '\"' == token[iLast]) // iLast>=1 인 이유는 토큰에 "가 2개임을 확실히 하기 위해서. + { // 같은 토큰에서 문자열이 닫혔다. strValueBuffer = std::string(token).substr(1, iLast - 1); - // ۿ ִ° + // 버퍼에 있는것 기록 if (FALSE == WriteData(hFile, m_DataTypes[iColCount], strValueBuffer.c_str())) { char szErr[512]; wsprintf(szErr, "File - %s, Line - %d, Field - %d", szFN.c_str(), iRowCount + 1, iColCount); MessageBox(hWnd, szErr, - "Ÿ õǴ ֽϴ. ۵ Դϴ.", + "데이타 기록이 무시되는 것이 있습니다. 이 파일은 제대로 작동 되지 않을 것입니다.", MB_OK); CloseHandle(hFile); fclose(stream); @@ -918,24 +918,24 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { token = MyToken(NULL); ++iColCount; continue; - } else { // ̹ ū ڿ ʾҴ. + } else { // 이번 토큰에서 문자열이 닫히지 않았다. bQuotationActived = true; - strValueBuffer = (token + 1); // +1 ǥ ʴ´. + strValueBuffer = (token + 1); // +1의 이유는 따옴표는 저장하지 않는다. token = MyToken(NULL); continue; } } - ASSERT(token || (iColCount + 1) == iDataCount); // Ͱ NULL ֵ. + ASSERT(token || (iColCount + 1) == iDataCount); // 맨 마지막에 데이터가 없으면 NULL이 올 수 있따. if (FALSE == (token || (NULL == token && DT_STRING == m_DataTypes[iColCount])) && FALSE == bCheckEmptyValue) { int iSelect = MessageBox(hWnd, - "̺ ڿ ܿ ĭ ֽϴ.\nYes : \nNo : ̹ ϰ " - "\n Cancel : ϰ ", + "테이블에 문자열 외에 빈 칸이 있습니다.\nYes : 멈춤\nNo : 이번만 무시하고 " + "계속\n Cancel : 모두 무시하고 계속", "Convert Error", MB_YESNOCANCEL); if (IDYES == iSelect) { - MessageBox(hWnd, "Ÿ ߴܵǾϴ. ۵ Դϴ.", + MessageBox(hWnd, "데이타 기록이 중단되었습니다. 이 파일은 제대로 작동 되지 않을 것입니다.", "Convert Error", MB_OK); CloseHandle(hFile); fclose(stream); @@ -950,7 +950,7 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { char szErr[512]; wsprintf(szErr, "File - %s, Line - %d, Field - %d", szFN.c_str(), iRowCount + 1, iColCount); MessageBox(hWnd, szErr, - "Ÿ õǴ ֽϴ. ۵ Դϴ.", MB_OK); + "데이타 기록이 무시되는 것이 있습니다. 이 파일은 제대로 작동 되지 않을 것입니다.", MB_OK); CloseHandle(hFile); fclose(stream); ASSERT(0); @@ -960,12 +960,12 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { ++iColCount; } if (bQuotationActived) { - continue; // ǥ ڿ̹Ƿ ٽ .. + continue; // 따옴표가 열려 있으면 계속 문자열이므로 다시 위로.. } if (iDataCount != iColCount) { char szErr[512]; wsprintf(szErr, "File - %s, Line - %d, Field - %d", szFN.c_str(), iRowCount + 1, iColCount); - MessageBox(hWnd, szErr, " Ÿ ׸ ϵǴ Ÿ ׸ ġ ʴ ׸ ֽϴ.", + MessageBox(hWnd, szErr, "현재 설정된 데이타 항목과 기록되는 데이타 항목이 일치하지 않는 항목이 있습니다.", MB_OK); CloseHandle(hFile); fclose(stream); @@ -979,31 +979,31 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { fclose(stream); //////////////////////////////////////////////////////////// - // ȣȭ.. Ű ϴ... + // 암호화.. 게임의 키와 동일하다... hFile = ::CreateFile(szDestFN, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { - MessageBox(hWnd, szDestFN, "ȣȭ ⿡ ߽ϴ.", MB_OK); - remove(szDestFN); // .. + MessageBox(hWnd, szDestFN, "암호화 파일 만들기에 실패 했습니다.", MB_OK); + remove(szDestFN); // 파일 지우고.. return false; } - // ȣȭ ϱ.. .. .. + // 파일 암호화 하기.. .. 파일을 읽은 다음.. DWORD dwSizeHigh = 0; DWORD dwSizeLow = ::GetFileSize(hFile, &dwSizeHigh); if (dwSizeLow <= 0) { CloseHandle(hFile); - ::remove(szDestFN); // ӽ .. + ::remove(szDestFN); // 임시 파일 지우기.. return false; } - // а.. + // 원래 파일을 읽고.. BYTE * pDatas = new BYTE[dwSizeLow]; DWORD dwRWC = 0; - ::ReadFile(hFile, pDatas, dwSizeLow, &dwRWC, NULL); // ȣȭ а.. - CloseHandle(hFile); // ݰ + ::ReadFile(hFile, pDatas, dwSizeLow, &dwRWC, NULL); // 암호화된 데이터 읽고.. + CloseHandle(hFile); // 원래 파일 닫고 - // ̺ Ű Ű.. + // 테이블 만드는 툴에서 쓰는 키와 같은 키.. WORD key_r = 0x0816; WORD key_c1 = 0x6081; WORD key_c2 = 0x1608; @@ -1024,39 +1024,39 @@ bool CTableGenerator::Convert2Bin(const std::string & szFN) { // return plain; //} - // ȣȭ ڵ... + // 암호화 인코딩... for (int i = 0; i < dwSizeLow; i++) { BYTE byData = (pDatas[i] ^ (key_r >> 8)); key_r = (byData + key_r) * key_c1 + key_c2; pDatas[i] = byData; } - // ٽ .. + // 다시 파일을 연다.. hFile = ::CreateFile(szDestFN, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - ::WriteFile(hFile, pDatas, dwSizeLow, &dwRWC, NULL); // Ͽ ȣȭ Ų - CloseHandle(hFile); // ݱ + ::WriteFile(hFile, pDatas, dwSizeLow, &dwRWC, NULL); // 파일에 암호화 시킨 데이터 쓰기 + CloseHandle(hFile); // 파일 닫기 delete[] pDatas; pDatas = NULL; if (iCount == iRowCount) { char szErr[512]; - wsprintf(szErr, "%d Ÿ ϷǾϴ.", iRowCount); + wsprintf(szErr, "%d개의 데이타 기록이 완료되었습니다.", iRowCount); MessageBox(hWnd, szErr, "Convert Report", MB_OK); return true; } else { char szErr[512]; wsprintf( szErr, - "ü %d Ÿ %d Ÿ ϷǾϴ.\n ̺ ۵ Դϴ.", + "전체 %d개의 데이타중 %d개의 데이타만 기록이 완료되었습니다.\n이 테이블은 제대로 작동되지 않을것입니다.", iCount, iRowCount); - MessageBox(hWnd, szErr, "Ÿ ", MB_OK); + MessageBox(hWnd, szErr, "데이타 갯수 에러", MB_OK); return false; } } -// Ͽ Ÿ ŸԺ .. +// 파일에 데이타 타입별로 쓰기.. bool CTableGenerator::WriteData(HANDLE hFile, DATA_TYPE DataType, LPCTSTR lpszData) { - // lpszData == NULL̸ datatype string 쿡 ȴ. + // 만약 lpszData == NULL이면 datatype은 string일 경우에만 된다. // ASSERT(lpszData || (NULL == lpszData && DT_STRING == DataType)); DWORD dwNum; @@ -1067,11 +1067,11 @@ bool CTableGenerator::WriteData(HANDLE hFile, DATA_TYPE DataType, LPCTSTR lpszDa if (isdigit(lpszData[0]) || '-' == lpszData[0]) { int iTemp = atoi(lpszData); if (iTemp < -127 || iTemp > 128) { - return false; // ~ + return false; // 범위가 벗어났어~ } cWrite = (char)iTemp; } else { - return false; // ڴ ȵ~! + return false; // 문자는 안되~! } } @@ -1083,11 +1083,11 @@ bool CTableGenerator::WriteData(HANDLE hFile, DATA_TYPE DataType, LPCTSTR lpszDa if (isdigit(lpszData[0])) { int iTemp = atoi(lpszData); if (iTemp < 0 || iTemp > 255) { - return false; // ~ + return false; // 범위가 벗어났어~ } byteWrite = (BYTE)iTemp; } else { - return false; // ڴ ȵ~! + return false; // 문자는 안되~! } } @@ -1099,11 +1099,11 @@ bool CTableGenerator::WriteData(HANDLE hFile, DATA_TYPE DataType, LPCTSTR lpszDa if (isdigit(lpszData[0]) || '-' == lpszData[0]) { int iTemp = atoi(lpszData); if (iTemp < -32767 || iTemp > 32768) { - return false; // ~ + return false; // 범위가 벗어났어~ } iWrite = (short)iTemp; } else { - return false; // ڴ ȵ~! + return false; // 문자는 안되~! } } @@ -1115,11 +1115,11 @@ bool CTableGenerator::WriteData(HANDLE hFile, DATA_TYPE DataType, LPCTSTR lpszDa if (isdigit(lpszData[0])) { int iTemp = atoi(lpszData); if (iTemp < 0 || iTemp > 65535) { - return false; // ~ + return false; // 범위가 벗어났어~ } iWrite = (short)iTemp; } else { - return false; // ڴ ȵ~! + return false; // 문자는 안되~! } } @@ -1131,7 +1131,7 @@ bool CTableGenerator::WriteData(HANDLE hFile, DATA_TYPE DataType, LPCTSTR lpszDa if (isdigit(lpszData[0]) || '-' == lpszData[0]) { iWrite = atoi(lpszData); } else { - return false; // ڴ ȵ~! + return false; // 문자는 안되~! } } @@ -1143,7 +1143,7 @@ bool CTableGenerator::WriteData(HANDLE hFile, DATA_TYPE DataType, LPCTSTR lpszDa if (isdigit(lpszData[0])) { iWrite = strtoul(lpszData, NULL, 10); } else { - return false; // ڴ ȵ~! + return false; // 문자는 안되~! } } @@ -1165,7 +1165,7 @@ bool CTableGenerator::WriteData(HANDLE hFile, DATA_TYPE DataType, LPCTSTR lpszDa if (isdigit(lpszData[0]) || '-' == lpszData[0] || '.' == lpszData[0]) { fWrite = (float)atof(lpszData); } else { - return false; // ڴ ȵ~! + return false; // 문자는 안되~! } } WriteFile(hFile, &fWrite, sizeof(fWrite), &dwNum, NULL); @@ -1189,12 +1189,12 @@ bool CTableGenerator::WriteData(HANDLE hFile, DATA_TYPE DataType, LPCTSTR lpszDa return true; } -// binary Ͽ Ÿ ŸԺ б +// binary 파일에서 데이타 타입별로 읽기 bool CTableGenerator::ReadData(HANDLE hFile, DATA_TYPE DataType, LPTSTR lpszData) { return true; } -// е ڿ ã´. +// 탭으로 구분된 문자열을 찾는다. char * CTableGenerator::MyToken(LPCTSTR lpszInput) { static char szLine[4096] = ""; static char * pszCur = NULL; diff --git a/src/tool/RscTables/TableGenerator.h b/src/tool/RscTables/TableGenerator.h index 5045496f..9a7db804 100644 --- a/src/tool/RscTables/TableGenerator.h +++ b/src/tool/RscTables/TableGenerator.h @@ -73,12 +73,12 @@ class CTableGenerator { protected: std::vector m_DataTypes; - std::vector m_Datas; // ⺻ Ǵ ̺ - std::vector m_DataExts; // ̺ + std::vector m_Datas; // 기본이 되는 아이템 테이블 + std::vector m_DataExts; // 참조할 아이템 테이블 private: int ParseLine(const char * szLine, int & iOffset, int & iVal, DWORD & dwVal, double & dfVal, - std::string & szText); // ϸ 0, ߰ؾϰ ̸ -1 ߰ ʿ ̸.. -2 + std::string & szText); // 성공하면 0, 추가해야하고 끝이면 -1 추가할 필요 없고 끝이면.. -2 리턴 bool WriteData(HANDLE hFile, DATA_TYPE DataType, LPCTSTR lpszData); bool ReadData(HANDLE hFile, DATA_TYPE DataType, LPTSTR lpszData); diff --git a/src/tool/RscTables/res/RscTables.rc2 b/src/tool/RscTables/res/RscTables.rc2 index b258a1b63071e3b01d875046cc90fc7b5640f432..7e436a581c8b187251b19bb8c5c20db725228184 100644 GIT binary patch literal 778 zcmd6ly9&ZU5JhjRU$I~*8t@M^T8K}4wUX#c0#PAq;m@mQLc~HrOBr@|-nln3_gkPq zRZbwMndS<$P+J`h)x&Dy3)Ldl;N8K0ZrqG>6O3`z?7TM`c-U{D|tVkJFs5;`b zC2sXj2Q0!xX`|;=GDT5#iBI TA*fm2=?K5d7>OxKlC`~0&%kBX diff --git a/src/tool/ServerInfoViewer/MainFrm.cpp b/src/tool/ServerInfoViewer/MainFrm.cpp index e90a8f9d..7d57965a 100644 --- a/src/tool/ServerInfoViewer/MainFrm.cpp +++ b/src/tool/ServerInfoViewer/MainFrm.cpp @@ -76,7 +76,7 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { m_Eng.Init(TRUE, m_hWnd, 0, 0, 0, TRUE); m_Eng.SetDefaultEnvironment(); - m_Eng.GridCreate(64, 64); // 64 ; 4096 ǥ.. + m_Eng.GridCreate(64, 64); // 64 미터씩 4096 미터 표현.. return 0; } diff --git a/src/tool/ServerInfoViewer/ServerInfoViewer.rc b/src/tool/ServerInfoViewer/ServerInfoViewer.rc index 82c561fe2f244052de6e556bff94959f307372e4..30ff01d7f58e94ab5ee2d727412c4c505cce8b27 100644 GIT binary patch literal 20502 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 literal 11055 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 mdIm)vcCR#c + diff --git a/src/tool/ServerInfoViewer/ServerInfoViewer.vcxproj.user b/src/tool/ServerInfoViewer/ServerInfoViewer.vcxproj.user index e1af248a..26afb8ce 100644 --- a/src/tool/ServerInfoViewer/ServerInfoViewer.vcxproj.user +++ b/src/tool/ServerInfoViewer/ServerInfoViewer.vcxproj.user @@ -1,4 +1,4 @@ - + WindowsLocalDebugger diff --git a/src/tool/ServerInfoViewer/ServerInfoViewerDoc.h b/src/tool/ServerInfoViewer/ServerInfoViewerDoc.h index 5a3b73ec..e58d0efc 100644 --- a/src/tool/ServerInfoViewer/ServerInfoViewerDoc.h +++ b/src/tool/ServerInfoViewer/ServerInfoViewerDoc.h @@ -5,19 +5,19 @@ #pragma once struct __CharacterSymbol { - __Vector3 vBoxes[5]; // ڸ LineStrip ׸. 5 + __Vector3 vBoxes[5]; // 상자를 LineStrip 으로 그린다. 5 __Vector3 vDirections[3]; __Matrix44 mtxWorld; - D3DCOLOR color; // .. + D3DCOLOR color; // 색.. char szID[64]; // ID - char szRemark[128]; // ּ??? + char szRemark[128]; // 주석??? __CharacterSymbol() { __Matrix44 mtxTmp; mtxWorld.Identity(); - color = 0xffffffff; // ⺻ .. + color = 0xffffffff; // 기본은 흰색.. szID[0] = NULL; // ID - szRemark[0] = NULL; // ּ??? + szRemark[0] = NULL; // 주석??? float fRadius = 2.0f; vBoxes[0].Set(-fRadius, 0, fRadius); diff --git a/src/tool/ServerInfoViewer/ServerInfoViewerView.cpp b/src/tool/ServerInfoViewer/ServerInfoViewerView.cpp index b9c75d09..dd1cde82 100644 --- a/src/tool/ServerInfoViewer/ServerInfoViewerView.cpp +++ b/src/tool/ServerInfoViewer/ServerInfoViewerView.cpp @@ -75,7 +75,7 @@ void CServerInfoViewerView::OnDraw(CDC * pDC) { mtx.Identity(); mtx.Scale(64, 64, 64); mtx.PosSet(2048.0f, 0, 2048.0f); - pFrm->m_Eng.RenderGrid(mtx); // 4 Ϳ Ѱ ǥ.. + pFrm->m_Eng.RenderGrid(mtx); // 4 미터에 한개씩 라인 표시.. pFrm->m_Eng.RenderAxis(); __CharacterSymbol * pSymbol = NULL; @@ -171,7 +171,7 @@ BOOL CServerInfoViewerView::OnEraseBkgnd(CDC * pDC) { void CServerInfoViewerView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default - if (nChar == 'F') // õ Ʈ Ŀ.. + if (nChar == 'F') // 선택된 오브젝트를 포커스.. { this->FocusGround(); } @@ -194,7 +194,7 @@ void CServerInfoViewerView::FocusGround() { ::_Convert2D_To_3DCoordinate(point.x, point.y, CN3Base::s_CameraData.mtxView, CN3Base::s_CameraData.mtxProjection, CN3Base::s_CameraData.vp, vPos, vDir); - __Vector3 v0(0, 0, 4096), v1(4096, 0, 4096), v2(4096, 0, 0), v3(0, 0, 0); // ūǿ .. + __Vector3 v0(0, 0, 4096), v1(4096, 0, 4096), v2(4096, 0, 0), v3(0, 0, 0); // 큰판에 찍히면.. __Vector3 vCol; float t, u, v; if (::_IntersectTriangle(vPos, vDir, v0, v1, v2, t, u, v, &vCol) || @@ -252,7 +252,7 @@ void CServerInfoViewerView::OnLButtonDblClk(UINT nFlags, CPoint point) { ::_Convert2D_To_3DCoordinate(point.x, point.y, CN3Base::s_CameraData.mtxView, CN3Base::s_CameraData.mtxProjection, CN3Base::s_CameraData.vp, vPos, vDir); - __Vector3 v0(0, 0, 4096), v1(4096, 0, 4096), v2(4096, 0, 0), v3(0, 0, 0); // ūǿ .. + __Vector3 v0(0, 0, 4096), v1(4096, 0, 4096), v2(4096, 0, 0), v3(0, 0, 0); // 큰판에 찍히면.. __Vector3 vCol; float t, u, v; if (::_IntersectTriangle(vPos, vDir, v0, v1, v2, t, u, v, &vCol) || diff --git a/src/tool/ServerInfoViewer/res/ServerInfoViewer.rc2 b/src/tool/ServerInfoViewer/res/ServerInfoViewer.rc2 index 81b175e675cb35f0d6e1761129c1c5d08561ade4..25c4ae5fbef42314108f47663ddbc6d2da5c5619 100644 GIT binary patch literal 792 zcmd6l$qK?i5Jc;$UoqfOG~geI3y7GA>rq@r3}}R?2Y+6DJw!Yx=uw85>7}|;m7e=8 zQlv6FlG9injWi2qPqDg6@Ot?35UZ1IsR6Ra&gFH|Q5URru$=}9??h2VLIM30WB1Ntsa26*!Qgjg#?hn6G#E$wv)_4|HbegBdcKb) esy1jkFw3l%sLkg!JDcI>m$3_T@T!OP?|L6_7HR|l literal 395 zcmb`DK?=e!5JlJK6a!rr6YvJ5jS$3ET8&Go&4dPG14+8*?TvyU=(4jJhJp9^pE1H1 zbi9?k74^Q6f?s({+j0k6@EF|e2MlmDgLlE{2-1YPw@~IeD3?Byi-5{RP{!jB?UHze zWJW90P@KB+r4r3e)UrA7ifl6U-g$_l380NdNc)56@9DlTe`O@YNf`}{{V+)~t~jqg Y3Z>xDPbsKf-sw<%l`*16O6l6(CnW%A2LJ#7 diff --git a/src/tool/SkyViewer/FormViewProperty.cpp b/src/tool/SkyViewer/FormViewProperty.cpp index f6a12d06..40b063ab 100644 --- a/src/tool/SkyViewer/FormViewProperty.cpp +++ b/src/tool/SkyViewer/FormViewProperty.cpp @@ -100,34 +100,34 @@ void CFormViewProperty::OnInitialUpdate() { CSkyViewerDoc * pDoc = GetDocument(); m_SldTime.SetRange(0, 24 * 60); - //enum eSKY_DAYCHANGE { SDC_SKYCOLOR=0, // ϴû - // SDC_FOGCOLOR, // Ȱ - // SDC_STARCOUNT, // - // SDC_MOONPHASE, // - // SDC_SUNCOLOR, // - // SDC_GLOWCOLOR, // glow - // SDC_FLARECOLOR, // flare - // SDC_CLOUD1COLOR, // 1 - // SDC_CLOUD2COLOR, // 2 - // SDC_CLOUDTEX, // ؽ ٲٱ + //enum eSKY_DAYCHANGE { SDC_SKYCOLOR=0, // 하늘색 + // SDC_FOGCOLOR, // 안개색 + // SDC_STARCOUNT, // 별 수 + // SDC_MOONPHASE, // 달 모양 + // SDC_SUNCOLOR, // 해 색 + // SDC_GLOWCOLOR, // 해의 glow색 + // SDC_FLARECOLOR, // 해의 flare색 + // SDC_CLOUD1COLOR, // 구름층 1의 색 + // SDC_CLOUD2COLOR, // 구름층 2의 색 + // SDC_CLOUDTEX, // 구름 텍스쳐 바꾸기 // NUM_SKYDAYCHANGE, // // SDC_UNKNOWN = 0xffffffff //}; m_LPProperty.ResetContent(); - m_LPProperty.AddPropItem("̸", "", PIT_EDIT, ""); - m_LPProperty.AddPropItem("", "", PIT_COMBO, - "ϴû|Ȱ||޸| | Glow | Flare |1 |2 " - "|ؽó ٲٱ|Ʈ0|Ʈ1|Ʈ2"); - m_LPProperty.AddPropItem("μ1", "", PIT_EDIT, ""); - m_LPProperty.AddPropItem("1", "", PIT_COLOR, ""); - m_LPProperty.AddPropItem("μ2", "", PIT_EDIT, ""); - m_LPProperty.AddPropItem("2", "", PIT_COLOR, ""); - m_LPProperty.AddPropItem("ð", "", PIT_EDIT, "00"); - m_LPProperty.AddPropItem("ð", "", PIT_EDIT, "0"); - - // ð .. + m_LPProperty.AddPropItem("이름", "", PIT_EDIT, ""); + m_LPProperty.AddPropItem("종류", "", PIT_COMBO, + "하늘색|안개색|별수|달모양|해의 색|해의 Glow 색|해의 Flare 색|구름층1의 색|구름층2의 " + "색|구름텍스처 바꾸기|라이트0|라이트1|라이트2"); + m_LPProperty.AddPropItem("인수1", "", PIT_EDIT, ""); + m_LPProperty.AddPropItem("색1", "", PIT_COLOR, ""); + m_LPProperty.AddPropItem("인수2", "", PIT_EDIT, ""); + m_LPProperty.AddPropItem("색2", "", PIT_COLOR, ""); + m_LPProperty.AddPropItem("시간", "", PIT_EDIT, "0시0분"); + m_LPProperty.AddPropItem("지연시간", "", PIT_EDIT, "0초"); + + // 시간을 가져와 세팅.. SYSTEMTIME Time; ::GetLocalTime(&Time); pDoc->m_Sky.SetGameTime(Time.wYear, Time.wMonth, Time.wDay, Time.wHour, Time.wMinute); @@ -149,23 +149,23 @@ BOOL CFormViewProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult } CPropertyItem * pItem = (CPropertyItem *)lParam; - if (pItem->m_propName == "̸") { + if (pItem->m_propName == "이름") { pSDC->szName = pItem->m_curValue; - } else if (pItem->m_propName == "ð") { + } else if (pItem->m_propName == "시간") { int iHour = 0, iMin = 0; - sscanf(pItem->m_curValue, "%d%d", &iHour, &iMin); + sscanf(pItem->m_curValue, "%d시%d분", &iHour, &iMin); pSDC->dwWhen = CONVERT_SEC(iHour, iMin, 0); - } else if (pItem->m_propName == "") { + } else if (pItem->m_propName == "종류") { pSDC->eSkyDayChange = (eSKY_DAYCHANGE)(pItem->m_crColor); - } else if (pItem->m_propName == "μ1") { + } else if (pItem->m_propName == "인수1") { pSDC->dwParam1 = atoi(pItem->m_curValue); - } else if (pItem->m_propName == "1") { + } else if (pItem->m_propName == "색1") { pSDC->dwParam1 = ::_RGB_To_D3DCOLOR(pItem->m_crColor, (DWORD)255); - } else if (pItem->m_propName == "μ2") { + } else if (pItem->m_propName == "인수2") { pSDC->dwParam2 = atoi(pItem->m_curValue); - } else if (pItem->m_propName == "2") { + } else if (pItem->m_propName == "색2") { pSDC->dwParam2 = ::_RGB_To_D3DCOLOR(pItem->m_crColor, (DWORD)255); - } else if (pItem->m_propName == "ð") { + } else if (pItem->m_propName == "지연시간") { pSDC->fHowLong = (float)(atof(pItem->m_curValue)); } @@ -191,7 +191,7 @@ void CFormViewProperty::UpdateTime() { CSkyViewerDoc * pDoc = GetDocument(); pDoc->m_Sky.GetGameTime(&iYear, &iMonth, &iDay, &iHour, &iMin); - // ð Ʈ.. + // 시간 업데이트.. SetDlgItemInt(IDC_E_YEAR, iYear); SetDlgItemInt(IDC_E_MONTH, iMonth); SetDlgItemInt(IDC_E_DAY, iDay); @@ -210,16 +210,16 @@ void CFormViewProperty::UpdateInfo() { int iIndex = m_ListDayChanges.GetCurSel(); __SKY_DAYCHANGE * pSDC = pDoc->m_Sky.DayChangeGet(iIndex); - CPropertyItem * pItem0 = m_LPProperty.GetPropItem("̸"); - CPropertyItem * pItem1 = m_LPProperty.GetPropItem("ð"); - CPropertyItem * pItem2 = m_LPProperty.GetPropItem(""); + CPropertyItem * pItem0 = m_LPProperty.GetPropItem("이름"); + CPropertyItem * pItem1 = m_LPProperty.GetPropItem("시간"); + CPropertyItem * pItem2 = m_LPProperty.GetPropItem("종류"); - CPropertyItem * pItem3 = m_LPProperty.GetPropItem("μ1"); - CPropertyItem * pItem4 = m_LPProperty.GetPropItem("1"); - CPropertyItem * pItem5 = m_LPProperty.GetPropItem("μ2"); - CPropertyItem * pItem6 = m_LPProperty.GetPropItem("2"); + CPropertyItem * pItem3 = m_LPProperty.GetPropItem("인수1"); + CPropertyItem * pItem4 = m_LPProperty.GetPropItem("색1"); + CPropertyItem * pItem5 = m_LPProperty.GetPropItem("인수2"); + CPropertyItem * pItem6 = m_LPProperty.GetPropItem("색2"); - CPropertyItem * pItem7 = m_LPProperty.GetPropItem("ð"); + CPropertyItem * pItem7 = m_LPProperty.GetPropItem("지연시간"); if (NULL == pSDC) { SetDlgItemInt(IDC_E_NUMBER, iIndex); @@ -229,7 +229,7 @@ void CFormViewProperty::UpdateInfo() { pItem0->m_curValue = ""; } if (pItem1) { - pItem1->m_curValue = "00"; + pItem1->m_curValue = "0시0분"; } if (pItem2) { pItem2->m_crColor = 0; @@ -260,7 +260,7 @@ void CFormViewProperty::UpdateInfo() { } if (pItem1) { int iHour = pSDC->dwWhen / (3600), iMin = (pSDC->dwWhen % (3600)) / 60; - pItem1->m_curValue.Format("%d%d", iHour, iMin); + pItem1->m_curValue.Format("%d시%d분", iHour, iMin); } if (pItem2) { pItem2->m_crColor = pSDC->eSkyDayChange; @@ -403,7 +403,7 @@ void CFormViewProperty::OnDblclkListCloudTextures() { CString FileName; DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; CFileDialog dlg(TRUE, "DXT", NULL, dwFlags, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA||", NULL); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA||", NULL); if (dlg.DoModal() == IDCANCEL) { return; } @@ -426,7 +426,7 @@ void CFormViewProperty::OnDblclkListSunTextures() { CString FileName; DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; CFileDialog dlg(TRUE, "DXT", NULL, dwFlags, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA||", NULL); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA||", NULL); if (dlg.DoModal() == IDCANCEL) { return; } @@ -449,7 +449,7 @@ void CFormViewProperty::OnBBrowseMoonTexture() { CString FileName; DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; CFileDialog dlg(TRUE, "DXT", NULL, dwFlags, - "Texture ִ ׸ (*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA||", NULL); + "Texture 로 쓸수 있는 그림 파일(*.DXT; *.BMP; *.TGA)|*.DXT; *.BMP; *.TGA||", NULL); if (dlg.DoModal() == IDCANCEL) { return; } diff --git a/src/tool/SkyViewer/MainFrm.cpp b/src/tool/SkyViewer/MainFrm.cpp index c9e31491..a002f250 100644 --- a/src/tool/SkyViewer/MainFrm.cpp +++ b/src/tool/SkyViewer/MainFrm.cpp @@ -65,7 +65,7 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (!m_Eng.Init(TRUE, m_hWnd, 64, 64, 0, TRUE)) { return -1; } - m_Eng.GridCreate(1000, 1000); // ׸ .. + m_Eng.GridCreate(1000, 1000); // 그리드 만들기.. m_Camera.m_bFogUse = true; @@ -74,7 +74,7 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { m_Lights[1].m_Data.InitDirection(1, __Vector3(0, 0, -1), crLgt); m_Lights[2].m_Data.InitPoint(2, __Vector3(0, 0, 0), crLgt, 32.0f); - m_ObjectBundle.LoadFromFile("Object\\Field.N3Shape"); // Ʈ θ.. + m_ObjectBundle.LoadFromFile("Object\\Field.N3Shape"); // 배경으로 쓸 오브젝트 부르기.. return 0; } @@ -143,7 +143,7 @@ void CMainFrame::OnImportObject() { std::string szObjPrev = m_ObjectBundle.FileName(); m_ObjectBundle.Release(); - if (m_ObjectBundle.LoadFromFile((const char *)szFullPath)) // Ʈ θ.. + if (m_ObjectBundle.LoadFromFile((const char *)szFullPath)) // 배경으로 쓸 오브젝트 부르기.. { CSkyViewerView * pView = (CSkyViewerView *)(m_wndSplitter.GetPane(0, 1)); pView->InvalidateRect(NULL, FALSE); diff --git a/src/tool/SkyViewer/SkyViewer.rc b/src/tool/SkyViewer/SkyViewer.rc index cdfd929fa4071603ec862ad8221f1bfec047bcde..640f3b2bc197f2f46e7d6ead802974569da819cd 100644 GIT binary patch literal 28806 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 literal 15332 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 d#X*CwuQ+&skFR*9 + diff --git a/src/tool/SkyViewer/SkyViewer.vcxproj.user b/src/tool/SkyViewer/SkyViewer.vcxproj.user index 7912fcf6..1aa1e2ae 100644 --- a/src/tool/SkyViewer/SkyViewer.vcxproj.user +++ b/src/tool/SkyViewer/SkyViewer.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\game diff --git a/src/tool/SkyViewer/SkyViewerView.cpp b/src/tool/SkyViewer/SkyViewerView.cpp index 040303a1..0fbee417 100644 --- a/src/tool/SkyViewer/SkyViewerView.cpp +++ b/src/tool/SkyViewer/SkyViewerView.cpp @@ -100,7 +100,7 @@ void CSkyViewerView::OnDraw(CDC * pDC) { pFrm->m_Eng.s_lpD3DDev->EndScene(); pFrm->m_Eng.Present(m_hWnd); - // ǥ + // 프레임 표시 CString szInfo0; szInfo0.Format("FPS : %6.2f", pFrm->m_Eng.s_fFrmPerSec); pDC->TextOut(0, 0, szInfo0); diff --git a/src/tool/SkyViewer/res/SkyViewer.rc2 b/src/tool/SkyViewer/res/SkyViewer.rc2 index cec4a716b99e493c873957122a2e2c7cfa82713b..4dd54b9f9e70e690d672df98c1b7761133c60215 100644 GIT binary patch literal 778 zcmd6lNeaS15JmsioT9;{XuunYW+CE$Bd#Qx4h9?`>cY#buR_Fyf-a?~?&_NIf2!`c zP@w`el+#2#Ej3qHkrwD!4YaK$u{xT|>!hPDSewFj>MO&}@meI+nY=l^6Iro#yxOWE zP6=_VcRFBMp2wFJmfhBU!)vE&i74Q%5=qJPoK7u`KsnV+9Z(Ln;vDe3A;=?qfhtsZ zdKsdeinF!_8b^IbZ;#K=y`zY=F5_zu{LaiUdN>&e!)X8VJ5J+fng1!zjcCCtfzzH@ Z9?FT@d|tD&8Ghc3Z7~PW4w?Kr-v=5XXZQdB literal 388 zcmb`D!3u&v5Qfj~Qw(^NT<8r%JxG+HWpoO4W^rJ1VRt?F_H98B)X}*N!@&3P|56Gm zq1oTsvbYv?QfE8Zf+c5WJCK6|57s!NJhbfQPD2*QfF^t<!Z(J5a0%!u}w-KHUBCS0*BwkQGSz!xX`|;=GDT5#iBI TA*f#7=?K5d7|BwSBx`%02k>S4 diff --git a/src/tool/UIE/DlgBar.cpp b/src/tool/UIE/DlgBar.cpp index 3b8883a0..b85b1541 100644 --- a/src/tool/UIE/DlgBar.cpp +++ b/src/tool/UIE/DlgBar.cpp @@ -51,7 +51,7 @@ void CDlgBar::OnButtonBasepath() { pWnd->GetWindowText(strPath); } char szFolder[_MAX_PATH] = ""; - char szTitle[] = "ҽ baseθ ּ."; + char szTitle[] = "리소스 base경로를 선택해주세요."; BROWSEINFO bi; LPCITEMIDLIST lpidl; diff --git a/src/tool/UIE/DlgChangeImage.cpp b/src/tool/UIE/DlgChangeImage.cpp index 13f1f045..18bfbedd 100644 --- a/src/tool/UIE/DlgChangeImage.cpp +++ b/src/tool/UIE/DlgChangeImage.cpp @@ -47,7 +47,7 @@ void CDlgChangeImage::OnBBrowseOldFile() { return; } CString szFN_Old = dlg.GetPathName(); - szFN_Old.MakeLower(); // ҹڷ .. + szFN_Old.MakeLower(); // 소문자로 만들고.. CString szPath = CN3Base::PathGet().c_str(); szPath.MakeLower(); @@ -67,10 +67,10 @@ void CDlgChangeImage::OnBBrowseNewFile() { return; } CString szFN_New = dlg.GetPathName(); - szFN_New.MakeLower(); // ҹڷ .. + szFN_New.MakeLower(); // 소문자로 만들고.. CString szPath = CN3Base::PathGet().c_str(); - szPath.MakeLower(); // ҹڷ + szPath.MakeLower(); // 소문자로 만든다 int i = szFN_New.Find(szPath); if (i >= 0) { szFN_New = szFN_New.Mid(i + szPath.GetLength()); diff --git a/src/tool/UIE/DlgTexture.cpp b/src/tool/UIE/DlgTexture.cpp index bebe2de0..d34f045e 100644 --- a/src/tool/UIE/DlgTexture.cpp +++ b/src/tool/UIE/DlgTexture.cpp @@ -115,12 +115,12 @@ void CDlgTexture::OnSelchangeComboImagetype() { void CDlgTexture::OnOK() { ASSERT(m_pTexViewer); - if (m_iImageTypeCount > 0) { // Ǿ üũ + if (m_iImageTypeCount > 0) { // 모두 영역 선택이 되었나 체크 for (int i = 0; i < m_iImageTypeCount; ++i) { if (-1 == m_pTexViewer->GetImageRect(i).left) { CString str, strLBText; m_ImageType.GetLBText(i, strLBText); - str.Format("%s õ ʾҽϴ.", strLBText); + str.Format("%s의 영역이 선택되지 않았습니다.", strLBText); MessageBox(str); return; } @@ -130,7 +130,7 @@ void CDlgTexture::OnOK() { if (-1 != m_pTexViewer->GetSelectedRect().left) { CDialog::OnOK(); } else { - MessageBox(" ʾҽϴ."); + MessageBox("영역이 선택 되지 않았습니다."); } } } @@ -146,7 +146,7 @@ void CDlgTexture::OnRadioSelect() { return; } CTexViewer::eEDITMODE eEditMode = m_pTexViewer->SetEditMode(CTexViewer::EDITMODE_SELECT); - if (CTexViewer::EDITMODE_SELECT != eEditMode) { // ٲٱ + if (CTexViewer::EDITMODE_SELECT != eEditMode) { // 모드 바꾸기 실패 UpdateData(TRUE); m_RadioEditMode = eEditMode; UpdateData(FALSE); @@ -158,7 +158,7 @@ void CDlgTexture::OnRadioZoom() { return; } CTexViewer::eEDITMODE eEditMode = m_pTexViewer->SetEditMode(CTexViewer::EDITMODE_ZOOM); - if (CTexViewer::EDITMODE_ZOOM != eEditMode) { // ٲٱ + if (CTexViewer::EDITMODE_ZOOM != eEditMode) { // 모드 바꾸기 실패 UpdateData(TRUE); m_RadioEditMode = eEditMode; UpdateData(FALSE); @@ -179,7 +179,7 @@ void CDlgTexture::OnRadioHand() { return; } CTexViewer::eEDITMODE eEditMode = m_pTexViewer->SetEditMode(CTexViewer::EDITMODE_HAND); - if (CTexViewer::EDITMODE_HAND != eEditMode) { // ٲٱ + if (CTexViewer::EDITMODE_HAND != eEditMode) { // 모드 바꾸기 실패 UpdateData(TRUE); m_RadioEditMode = eEditMode; UpdateData(FALSE); @@ -225,7 +225,7 @@ LRESULT CDlgTexture::OnUpdateInfo(WPARAM wParam, LPARAM lParam) { return 0; } -// control ٽ ġ +// control들 다시 배치 void CDlgTexture::Resize() { CWnd * pOKBtn = GetDlgItem(IDOK); CWnd * pCancelBtn = GetDlgItem(IDCANCEL); @@ -238,7 +238,7 @@ void CDlgTexture::Resize() { pWnd = GetDlgItem(IDC_STATIC_INFO); pWnd->GetWindowRect(&rc); - // texture window ġ + // texture window 배치 int iTexViewerWidth = rcClient.Width() - rc.Width() - iOffset; int iTexViewerHeight = rcClient.Height(); if (iTexViewerWidth < 0) { @@ -253,7 +253,7 @@ void CDlgTexture::Resize() { } m_pTexViewer->MoveWindow(0, 0, iTexViewerWidth, iTexViewerHeight); - // ư ġ + // 버튼들 배치 pWnd = GetDlgItem(IDC_STATIC_INFO); pWnd->GetWindowRect(&rc); CPoint ptCtrl(rcClient.Width() - rc.Width(), 0); @@ -307,7 +307,7 @@ BOOL CDlgTexture::GetSelectedUVRect(struct __FLOAT_RECT * pFRect) const { return m_pTexViewer->GetSelectedUVRect(pFRect); } -void CDlgTexture::SetSelectedUVRect(const __FLOAT_RECT * pFRect) // õ UVǥ ֱ +void CDlgTexture::SetSelectedUVRect(const __FLOAT_RECT * pFRect) // 현재 선택된 UV좌표 넣기 { if (NULL == m_pTexViewer) { return; diff --git a/src/tool/UIE/DlgTexture.h b/src/tool/UIE/DlgTexture.h index 090dfc06..13a87486 100644 --- a/src/tool/UIE/DlgTexture.h +++ b/src/tool/UIE/DlgTexture.h @@ -34,7 +34,7 @@ class CDlgTexture : public CDialog { public: void SetTexture(LPCTSTR pszFileName); BOOL GetSelectedUVRect(struct __FLOAT_RECT * pFRect) const; - void SetSelectedUVRect(const struct __FLOAT_RECT * pFRect); // õ UVǥ ֱ + void SetSelectedUVRect(const struct __FLOAT_RECT * pFRect); // 현재 선택된 UV좌표 넣기 CRect GetSelectedRect() const; void SetImageTypes(int iCount, char ** pszNames); CRect GetImageRect(int iIndex, __FLOAT_RECT * pUVRect = NULL); diff --git a/src/tool/UIE/HierarchyView.cpp b/src/tool/UIE/HierarchyView.cpp index 7b30658f..0e34cb8c 100644 --- a/src/tool/UIE/HierarchyView.cpp +++ b/src/tool/UIE/HierarchyView.cpp @@ -105,7 +105,7 @@ void CHierarchyView::OnSelchanged(NMHDR * pNMHDR, LRESULT * pResult) { CN3UIBase * pUI = (CN3UIBase *)GetTreeCtrl().GetItemData(hItem); if (0 == ::_IsKeyDown(VK_CONTROL)) { - GetDocument()->SetSelectedUI(NULL); // Ʈ Ű ȴ.. ܵ Ʈ.. + GetDocument()->SetSelectedUI(NULL); // 컨트롤 키를 안눌렀으면.. 단독 셀렉트.. } GetDocument()->SetSelectedUI(pUI); @@ -121,7 +121,7 @@ void CHierarchyView::OnRclick(NMHDR * pNMHDR, LRESULT * pResult) { ///////////////////////////////////////////////////////////////////////////// // CHierarchyView Operations -// tree item ϱ +// 모든 tree item 정보 갱신하기 void CHierarchyView::UpdateAllInfo() { GetTreeCtrl().DeleteAllItems(); @@ -130,7 +130,7 @@ void CHierarchyView::UpdateAllInfo() { this->SelectObject(TVI_ROOT, GetDocument()->GetSelectedUI()); } -// tree item ϱ +// tree item 정보 갱신하기 void CHierarchyView::UpdateTreeItem(HTREEITEM hParent, CN3UIBase * pUIBase) { if (pUIBase == NULL) { return; @@ -145,7 +145,7 @@ void CHierarchyView::UpdateTreeItem(HTREEITEM hParent, CN3UIBase * pUIBase) { break; case UI_TYPE_BUTTON: { str = _T("Button"); - if (pParentUI && UI_TYPE_SCROLLBAR == pParentUI->UIType()) { // θ ũ ư + if (pParentUI && UI_TYPE_SCROLLBAR == pParentUI->UIType()) { // 부모가 스크롤의 버튼일 경우 if (CN3UIScrollBar::BTN_LEFTUP == pUIBase->GetReserved()) { str = _T("Left/Up Button"); } else if (CN3UIScrollBar::BTN_RIGHTDOWN == pUIBase->GetReserved()) { @@ -165,7 +165,7 @@ void CHierarchyView::UpdateTreeItem(HTREEITEM hParent, CN3UIBase * pUIBase) { break; } if (UI_TYPE_IMAGE == pParentUI->UIType()) { - ASSERT(UISTYLE_IMAGE_ANIMATE & pParentUI->m_dwStyle); // θ ݵ Animate image Ѵ. + ASSERT(UISTYLE_IMAGE_ANIMATE & pParentUI->m_dwStyle); // 부모는 반드시 Animate image여야 한다. str.Format("Image (%d)", pUIBase->GetReserved()); } else if (UI_TYPE_BUTTON == pParentUI->UIType()) { if (CN3UIButton::BS_NORMAL == pUIBase->GetReserved()) { @@ -227,10 +227,10 @@ void CHierarchyView::UpdateTreeItem(HTREEITEM hParent, CN3UIBase * pUIBase) { } str += " - "; - str += pUIBase->m_szID.c_str(); // ̸ ٿش... !! + str += pUIBase->m_szID.c_str(); // 이름을 붙여준다... !! HTREEITEM hItem = GetTreeCtrl().InsertItem(str, hParent); // insert - GetTreeCtrl().SetItemData(hItem, (DWORD)pUIBase); // pointer + GetTreeCtrl().SetItemData(hItem, (DWORD)pUIBase); // pointer 저장 GetTreeCtrl().Expand(hItem, TVE_EXPAND); // expand // update child @@ -240,7 +240,7 @@ void CHierarchyView::UpdateTreeItem(HTREEITEM hParent, CN3UIBase * pUIBase) { } } -// UIBase ͷ tree item ϱ +// UIBase 포인터로 tree item 선택하기 void CHierarchyView::SelectObject(HTREEITEM hItem, CN3UIBase * pUIBase) { if (NULL == pUIBase || NULL == hItem) { return; diff --git a/src/tool/UIE/HierarchyView.h b/src/tool/UIE/HierarchyView.h index 227b6d94..ee94dfb3 100644 --- a/src/tool/UIE/HierarchyView.h +++ b/src/tool/UIE/HierarchyView.h @@ -18,9 +18,9 @@ class CHierarchyView : public CTreeView { // Operations public: protected: - void UpdateAllInfo(); // tree item ϱ - void UpdateTreeItem(HTREEITEM hParent, CN3UIBase * pUIBase); // tree item ϱ - void SelectObject(HTREEITEM hItem, CN3UIBase * pUIBase); // UPBase ͷ tree item ϱ + void UpdateAllInfo(); // 모든 tree item 정보 갱신하기 + void UpdateTreeItem(HTREEITEM hParent, CN3UIBase * pUIBase); // tree item 정보 갱신하기 + void SelectObject(HTREEITEM hItem, CN3UIBase * pUIBase); // UPBase 포인터로 tree item 선택하기 public: // Overrides diff --git a/src/tool/UIE/MainFrm.cpp b/src/tool/UIE/MainFrm.cpp index 66f8073e..665d0698 100644 --- a/src/tool/UIE/MainFrm.cpp +++ b/src/tool/UIE/MainFrm.cpp @@ -87,7 +87,7 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { // TODO: Remove this if you don't want tool tips m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY); - // Engine + // Engine 생성 //m_Eng.InitEnv(); if (!m_Eng.Init(TRUE, GetRightPane()->m_hWnd, 64, 64, 0, TRUE)) { return -1; @@ -267,7 +267,7 @@ void CMainFrame::OnDestroy() { } void CMainFrame::EnableAccelerator(BOOL bEnable) { - // ó ȣǸ Accel table س + // 처음 호출되면 원래 Accel table 저장해놓기 if (NULL == m_hDefaultAccelTable) { m_hDefaultAccelTable = m_hAccelTable; } diff --git a/src/tool/UIE/PropertyView.cpp b/src/tool/UIE/PropertyView.cpp index 870ca8ef..dc0a690b 100644 --- a/src/tool/UIE/PropertyView.cpp +++ b/src/tool/UIE/PropertyView.cpp @@ -107,19 +107,19 @@ void CPropertyView::OnInitialUpdate() { m_UIBase.AddPropItem("Tooltip text", "", PIT_EDIT, ""); // m_pszTooltipText m_UIBase.AddPropItem("Open sound", "", PIT_FILE, ""); // sound m_UIBase.AddPropItem("Close sound", "", PIT_FILE, ""); // sound - m_UIBase.AddPropItem("Delete sound", "", PIT_BUTTON, ""); // sound + m_UIBase.AddPropItem("Delete sound", "", PIT_BUTTON, ""); // sound 설정 지우기 m_UIBase.AddPropItem("Visible", "", PIT_BUTTON, ""); // visible // image m_UIImage.AddPropItem("Texture", "", PIT_FILE, ""); // texture - m_UIImage.AddPropItem("UV left", "", PIT_BUTTON, ""); // m_frcUVRect (UVǥ) + m_UIImage.AddPropItem("UV left", "", PIT_BUTTON, ""); // m_frcUVRect (UV좌표) m_UIImage.AddPropItem("UV top", "", PIT_BUTTON, ""); m_UIImage.AddPropItem("UV right", "", PIT_BUTTON, ""); m_UIImage.AddPropItem("UV bottom", "", PIT_BUTTON, ""); m_UIImage.AddPropItem("Color", "", PIT_COLOR, ""); // m_Color m_UIImage.AddPropItem("Animate Frame", "", PIT_EDIT, - ""); // Animate frame ʴ ϸƮ ΰ? - m_UIImage.AddPropItem("Make Animation", "", PIT_BUTTON, ""); // Animation + ""); // Animate frame 초당 몇 프레임으로 에니메이트 될 것인가? + m_UIImage.AddPropItem("Make Animation", "", PIT_BUTTON, ""); // Animation으로 만들기 // string m_UIString.AddPropItem("Line", "", PIT_COMBO, "SINGLE LINE|MULTI LINE|"); // style(line) @@ -145,27 +145,27 @@ void CPropertyView::OnInitialUpdate() { m_UIButton.AddPropItem("ClickRect bottom", "", PIT_BUTTON, ""); m_UIButton.AddPropItem("On sound", "", PIT_FILE, ""); // sound m_UIButton.AddPropItem("Click sound", "", PIT_FILE, ""); // sound - m_UIButton.AddPropItem("Delete sound", "", PIT_BUTTON, ""); // sound + m_UIButton.AddPropItem("Delete sound", "", PIT_BUTTON, ""); // sound 설정 지우기 // static m_UIStatic.AddPropItem("Click sound", "", PIT_FILE, ""); // sound - m_UIStatic.AddPropItem("Delete sound", "", PIT_BUTTON, ""); // sound + m_UIStatic.AddPropItem("Delete sound", "", PIT_BUTTON, ""); // sound 설정 지우기 m_UIStatic.AddPropItem("Delete bkgnd image", "", PIT_BUTTON, ""); // edit m_UIEdit.AddPropItem("Style", "", PIT_COMBO, "Normal Edit|Password Edit|Number Only Edit|"); m_UIEdit.AddPropItem("Typing sound", "", PIT_FILE, ""); // sound - m_UIEdit.AddPropItem("Delete sound", "", PIT_BUTTON, ""); // sound + m_UIEdit.AddPropItem("Delete sound", "", PIT_BUTTON, ""); // sound 설정 지우기 // progress - m_UIProgress.AddPropItem("Style", "", PIT_COMBO, " | |Ʒ | |"); + m_UIProgress.AddPropItem("Style", "", PIT_COMBO, "오른쪽 증가|왼쪽 증가|아래로 증가|위로 증가|"); m_UIProgress.AddPropItem("MaxValue", "", PIT_EDIT, ""); m_UIProgress.AddPropItem("MinValue", "", PIT_EDIT, ""); m_UIProgress.AddPropItem("CurValue", "", PIT_EDIT, ""); - m_UIProgress.AddPropItem("Delete BkGnd", "click", PIT_BUTTON, ""); // ̹ ư + m_UIProgress.AddPropItem("Delete BkGnd", "click", PIT_BUTTON, ""); // 배경 이미지 지우는 버튼 // trackbar - m_UITrackBar.AddPropItem("Style", "", PIT_COMBO, "||"); + m_UITrackBar.AddPropItem("Style", "", PIT_COMBO, "가로|세로|"); m_UITrackBar.AddPropItem("Max pos", "", PIT_EDIT, ""); m_UITrackBar.AddPropItem("Min pos", "", PIT_EDIT, ""); m_UITrackBar.AddPropItem("Cur pos", "", PIT_EDIT, ""); @@ -173,7 +173,7 @@ void CPropertyView::OnInitialUpdate() { m_UITrackBar.AddPropItem("Delete bkgnd image", "", PIT_BUTTON, ""); // scrollbar - m_UIScrollBar.AddPropItem("Style", "", PIT_COMBO, "||"); + m_UIScrollBar.AddPropItem("Style", "", PIT_COMBO, "가로|세로|"); m_UIScrollBar.AddPropItem("Line size", "", PIT_EDIT, ""); // area @@ -210,11 +210,11 @@ BOOL CPropertyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { pUI->SetID(pItem->m_curValue); } else if (pItem->m_propName == "Region left" || pItem->m_propName == "Region top" || pItem->m_propName == "Region right" || pItem->m_propName == "Region bottom") { - // region ϴ Լ  óϱ + // region 갱신하는 함수 만들어서 처리하기 pFrm->GetRightPane()->SelectRectType(CUIEView::RT_REGION); } else if (pItem->m_propName == "MoveRect left" || pItem->m_propName == "MoveRect top" || pItem->m_propName == "MoveRect right" || pItem->m_propName == "MoveRect bottom") { - // move rect ϴ Լ  óϱ + // move rect 갱신하는 함수 만들어서 처리하기 pFrm->GetRightPane()->SelectRectType(CUIEView::RT_MOVE); } else if (pItem->m_propName == "Tooltip text") { pUI->SetTooltipText(pItem->m_curValue); @@ -238,7 +238,7 @@ BOOL CPropertyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { } Invalidate(); } else if (pItem->m_propName == "Visible") { - pUI->SetVisible(!pUI->IsVisible()); // Ⱥϰ ϱ + pUI->SetVisible(!pUI->IsVisible()); // 보였다 안보였다하게 하기 GetDocument()->UpdateAllViews(NULL); } } @@ -247,14 +247,14 @@ BOOL CPropertyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { CN3UIImage * pImage = (CN3UIImage *)pUI; if (pItem->m_propName == "Texture") { CN3BaseFileAccess tmpBase; - tmpBase.FileNameSet((LPCTSTR)pItem->m_curValue); // Baseο ؼ θ Ѱش. + tmpBase.FileNameSet((LPCTSTR)pItem->m_curValue); // Base경로에 대해서 상대적 경로를 넘겨준다. pImage->SetTex(tmpBase.FileName()); - pItem->m_curValue = tmpBase.FileName().c_str(); //tex file name ٽ + pItem->m_curValue = tmpBase.FileName().c_str(); //tex file name 다시 설정 m_UIImage.Invalidate(); } else if (pItem->m_propName == "UV left" || pItem->m_propName == "UV top" || pItem->m_propName == "UV right" || pItem->m_propName == "UV bottom") { - // UV ϴ Լ  óϱ + // UV 설정하는 함수 만들어서 처리하기 CN3Texture * pTex = pImage->GetTex(); if (pTex && pTex->FileName().size() > 0) { CDlgTexture dlg; @@ -268,7 +268,7 @@ BOOL CPropertyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { } } - // ܻȲ : θ Progress϶ Ʒ Լ ҷ Ѵ. + // 예외상황 : 부모가 Progress일때는 아래 함수를 불러줘야 한다. CN3UIBase * pParent = pUI->GetParent(); if (pParent && UI_TYPE_PROGRESS == pParent->UIType()) { ((CN3UIProgress *)pParent)->SetFrGndUVFromFrGndImage(); @@ -280,27 +280,27 @@ BOOL CPropertyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { pImage->SetColor(pItem->D3DColorGet()); } else if (pItem->m_propName == "Animate Frame") { pImage->m_fAnimFrame = atof(pItem->m_curValue); - } else if (pItem->m_propName == "Make Animation") { // Animation image + } else if (pItem->m_propName == "Make Animation") { // Animation image로 만들기 CN3UIBase * pParentUI = pImage->GetParent(); while (1) { if (NULL == pParentUI || - (UI_TYPE_IMAGE == pParentUI->UIType())) { // ݵ θ image ƴϾ Ѵ. - pFrm->MessageBox("Animate image ڽ image animate image ϴ."); + (UI_TYPE_IMAGE == pParentUI->UIType())) { // 반드시 부모는 image가 아니어야 한다. + pFrm->MessageBox("Animate image의 자식 image는 animate image로 만들 수 없습니다."); break; } CDlgAnimate dlgAnim; if (IDCANCEL == dlgAnim.DoModal()) { - break; // animateǴ ׸ ΰ? + break; // animate되는 그림이 몇장인가? } - pImage->SetAnimImage(dlgAnim.m_iCount); // + pImage->SetAnimImage(dlgAnim.m_iCount); // 장수 세팅 if (dlgAnim.m_iCount <= 0) { - break; // 1 ̸̻ texture uvǥ + break; // 1장 이상이면 texture와 uv좌표 세팅 } char szTexFName[_MAX_PATH]; if (FALSE == SelectTexture(szTexFName)) { - break; // texture̸ ϱ + break; // texture이름 정하기 } - // ̹ ϰ ϱ + // 여러장의 이미지 세팅하게 하기 CDlgTexture dlgTex; dlgTex.SetTexture(szTexFName); char szNames[1000][20]; @@ -311,7 +311,7 @@ BOOL CPropertyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { } dlgTex.SetImageTypes(dlgAnim.m_iCount, szImageTypeNames); if (IDCANCEL == dlgTex.DoModal()) { - break; // + break; // 취소의 경우 } CN3UIImage * pChildImage; for (int i = 0; i < dlgAnim.m_iCount; ++i) { @@ -321,13 +321,13 @@ BOOL CPropertyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { if (NULL == pChildImage) { continue; } - pChildImage->SetTex(szTexFName); // texture - pChildImage->SetUVRect(frcUV.left, frcUV.top, frcUV.right, frcUV.bottom); // uv + pChildImage->SetTex(szTexFName); // texture설정 + pChildImage->SetUVRect(frcUV.left, frcUV.top, frcUV.right, frcUV.bottom); // uv 설정 } - // ġ + // 위치 설정 CRect rcRegion = dlgTex.GetImageRect(0); if (-1 == rcRegion.left) { - break; // ̸ ׳ Ѿ. + break; // 영역이 비정상적이면 그냥 넘어간다. } rcRegion.OffsetRect(-rcRegion.TopLeft()); pImage->SetRegion(rcRegion); @@ -376,7 +376,7 @@ BOOL CPropertyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { pString->SetStyle(dwStyle); } else if (pItem->m_propName == "Font" || pItem->m_propName == "Font size" || pItem->m_propName == "Font style") { - // font ϴ ƾ + // font 정하는 루틴 LOGFONT logfont; ZeroMemory(&logfont, sizeof(logfont)); CDFont * pDFont = pString->m_pDFont; @@ -390,10 +390,10 @@ BOOL CPropertyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { } CFontDialog dlg(&logfont); if (IDOK == dlg.DoModal()) { - __ASSERT(dlg.GetSize() > 0, "font height 0 ۽ϴ."); + __ASSERT(dlg.GetSize() > 0, "font height가 0보다 작습니다."); const std::string strFontName(dlg.GetFaceName()); pString->SetFont(strFontName, dlg.GetSize() / 10, dlg.IsBold(), dlg.IsItalic()); - UpdateUIStringInfo(); // string ٽ ϱ + UpdateUIStringInfo(); // string 정보 다시 갱신하기 } } else if (pItem->m_propName == "Text Color") { pString->SetColor(pItem->D3DColorGet()); @@ -405,7 +405,7 @@ BOOL CPropertyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { if ((void *)wParam == (&m_UIList) && UI_TYPE_LIST == pUI->UIType()) { CN3UIList * pUIList = (CN3UIList *)pUI; if (pItem->m_propName == "Font" || pItem->m_propName == "Font size" || pItem->m_propName == "Font style") { - // font ϴ ƾ + // font 정하는 루틴 LOGFONT logfont; ZeroMemory(&logfont, sizeof(logfont)); logfont.lfHeight = 0; // pUIList->FontHeightInLogicalUnit(); @@ -415,10 +415,10 @@ BOOL CPropertyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { CFontDialog dlg(&logfont); if (IDOK == dlg.DoModal()) { - __ASSERT(dlg.GetSize() > 0, "font height 0 ۽ϴ."); + __ASSERT(dlg.GetSize() > 0, "font height가 0보다 작습니다."); std::string szFontName(dlg.GetFaceName().GetString()); pUIList->SetFont(szFontName, dlg.GetSize() / 10, dlg.IsBold(), dlg.IsItalic()); - UpdateUIListInfo(); // List ٽ ϱ + UpdateUIListInfo(); // List 정보 다시 갱신하기 } } else if (pItem->m_propName == "Text Color") { pUIList->SetFontColor(pItem->D3DColorGet()); @@ -439,7 +439,7 @@ BOOL CPropertyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult) { pBtn->SetStyle(dwStyle); } else if (pItem->m_propName == "ClickRect left" || pItem->m_propName == "ClickRect top" || pItem->m_propName == "ClickRect right" || pItem->m_propName == "ClickRect bottom") { - // Ŭ ϴ ڵ ֱ + // 클릭 영역 지정하는 코드 넣기 pFrm->GetRightPane()->SelectRectType(CUIEView::RT_CLICK); } else if (pItem->m_propName == "On sound") { pBtn->SetSndOn((LPCTSTR)pItem->m_curValue); @@ -652,7 +652,7 @@ void CPropertyView::UpdateInfo() { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); CN3UIBase * pUIBase = GetDocument()->GetSelectedUI(); - // ϴ ߱ + // 일단 모두 감추기 m_UIBase.ShowWindow(SW_HIDE); m_UIImage.ShowWindow(SW_HIDE); m_UIString.ShowWindow(SW_HIDE); @@ -666,36 +666,36 @@ void CPropertyView::UpdateInfo() { m_UIIconSlot.ShowWindow(SW_HIDE); m_UIList.ShowWindow(SW_HIDE); if (NULL == pUIBase) { - return; // õ UI Ƿ ׳ + return; // 선택된 UI가 없으므로 그냥 리턴 } CPoint ptWndPos = -GetScrollPosition(); - // base ̱(base ϴ ִ ̹Ƿ ǥش.) + // base의 값 보이기(base는 일단 모두 가지고 있는 값이므로 표시해준다.) - UpdateUIBaseInfo(); // + UpdateUIBaseInfo(); // 정보 갱신 // image - UpdateUIImageInfo(); // + UpdateUIImageInfo(); // 정보 갱신 // string - UpdateUIStringInfo(); // + UpdateUIStringInfo(); // 정보 갱신 // button - UpdateUIButtonInfo(); // + UpdateUIButtonInfo(); // 정보 갱신 // static - UpdateUIStaticInfo(); // + UpdateUIStaticInfo(); // 정보 갱신 // edit - UpdateUIEditInfo(); // + UpdateUIEditInfo(); // 정보 갱신 // progress - UpdateUIProgressInfo(); // + UpdateUIProgressInfo(); // 정보 갱신 // trackbar - UpdateUITrackBarInfo(); // + UpdateUITrackBarInfo(); // 정보 갱신 // scrollbar - UpdateUIScrollBarInfo(); // + UpdateUIScrollBarInfo(); // 정보 갱신 // area - UpdateUIAreaInfo(); // + UpdateUIAreaInfo(); // 정보 갱신 // icon slot - UpdateUIIconSlotInfo(); // + UpdateUIIconSlotInfo(); // 정보 갱신 // List - UpdateUIListInfo(); // + UpdateUIListInfo(); // 정보 갱신 Resize(); } @@ -703,34 +703,34 @@ void CPropertyView::UpdateInfo() { void CPropertyView::Resize() { CPoint ptWndPos = -GetScrollPosition(); if (m_UIBase.IsWindowVisible()) { - SetPropertyListPos(&m_UIBase, ptWndPos); // Property list window ġ + SetPropertyListPos(&m_UIBase, ptWndPos); // Property list window 위치조정 } if (m_UIImage.IsWindowVisible()) { - SetPropertyListPos(&m_UIImage, ptWndPos); // Property list window ġ + SetPropertyListPos(&m_UIImage, ptWndPos); // Property list window 위치조정 } if (m_UIString.IsWindowVisible()) { - SetPropertyListPos(&m_UIString, ptWndPos); // Property list window ġ + SetPropertyListPos(&m_UIString, ptWndPos); // Property list window 위치조정 } if (m_UIButton.IsWindowVisible()) { - SetPropertyListPos(&m_UIButton, ptWndPos); // Property list window ġ + SetPropertyListPos(&m_UIButton, ptWndPos); // Property list window 위치조정 } if (m_UIStatic.IsWindowVisible()) { - SetPropertyListPos(&m_UIStatic, ptWndPos); // Property list window ġ + SetPropertyListPos(&m_UIStatic, ptWndPos); // Property list window 위치조정 } if (m_UIEdit.IsWindowVisible()) { - SetPropertyListPos(&m_UIEdit, ptWndPos); // Property list window ġ + SetPropertyListPos(&m_UIEdit, ptWndPos); // Property list window 위치조정 } if (m_UIProgress.IsWindowVisible()) { - SetPropertyListPos(&m_UIProgress, ptWndPos); // Property list window ġ + SetPropertyListPos(&m_UIProgress, ptWndPos); // Property list window 위치조정 } if (m_UITrackBar.IsWindowVisible()) { - SetPropertyListPos(&m_UITrackBar, ptWndPos); // Property list window ġ + SetPropertyListPos(&m_UITrackBar, ptWndPos); // Property list window 위치조정 } if (m_UIScrollBar.IsWindowVisible()) { - SetPropertyListPos(&m_UIScrollBar, ptWndPos); // Property list window ġ + SetPropertyListPos(&m_UIScrollBar, ptWndPos); // Property list window 위치조정 } if (m_UIArea.IsWindowVisible()) { - SetPropertyListPos(&m_UIArea, ptWndPos); // Property list window ġ + SetPropertyListPos(&m_UIArea, ptWndPos); // Property list window 위치조정 } if (m_UIIconSlot.IsWindowVisible()) { SetPropertyListPos(&m_UIIconSlot, ptWndPos); @@ -744,7 +744,7 @@ void CPropertyView::SetPropertyListPos(CPropertyList * pList, CPoint & ptWndPos) if (NULL == pList) { return; } - // ġ ̰ ϱ + // 위치 조정 및 보이게 하기 CRect rc; GetClientRect(&rc); int iHeight = pList->GetItemHeight(0) * pList->GetCount() + 4; @@ -842,7 +842,7 @@ void CPropertyView::UpdateUIImageInfo() { m_UIImage.ShowWindow(SW_SHOW); CPropertyItem * pItem = NULL; - pItem = m_UIImage.GetPropItem("Texture"); // texture ̸ + pItem = m_UIImage.GetPropItem("Texture"); // texture 이름 if (pItem) { pItem->m_curValue = pUI->GetTexFN().c_str(); CN3Texture * pTex = pUI->GetTex(); @@ -852,7 +852,7 @@ void CPropertyView::UpdateUIImageInfo() { pItem->m_curValue += " : Load fail."; } } - pItem = m_UIImage.GetPropItem("UV left"); // m_frcUVRect (UVǥ) + pItem = m_UIImage.GetPropItem("UV left"); // m_frcUVRect (UV좌표) if (pItem) { pItem->m_curValue.Format("%f", pUI->m_frcUVRect.left); } @@ -959,14 +959,14 @@ void CPropertyView::UpdateUIStringInfo() { if (pUI->m_pDFont) { DWORD dwFlag = pUI->m_pDFont->GetFontFlags(); if (D3DFONT_BOLD & dwFlag) { - pItem->m_curValue += " "; + pItem->m_curValue += "굵게 "; } if (D3DFONT_ITALIC & dwFlag) { - pItem->m_curValue += "Ӳ"; + pItem->m_curValue += "기울임꼴"; } } if (pItem->m_curValue.GetLength() == 0) { - pItem->m_curValue = _T(""); + pItem->m_curValue = _T("보통"); } } pItem = m_UIString.GetPropItem("Text Color"); // string color @@ -1011,13 +1011,13 @@ void CPropertyView::UpdateUIListInfo() { if (pItem) { pItem->m_curValue = _T(""); if (pUI->FontIsBold()) { - pItem->m_curValue += " "; + pItem->m_curValue += "굵게 "; } if (pUI->FontIsItalic()) { - pItem->m_curValue += "Ӳ"; + pItem->m_curValue += "기울임꼴"; } if (pItem->m_curValue.GetLength() == 0) { - pItem->m_curValue = _T(""); + pItem->m_curValue = _T("보통"); } } pItem = m_UIList.GetPropItem("Text Color"); // string color @@ -1100,7 +1100,7 @@ void CPropertyView::UpdateUIIconSlotInfo() { } // Area -void CPropertyView::UpdateUIAreaInfo() // Area +void CPropertyView::UpdateUIAreaInfo() // Area정보 갱신 { CN3UIBase * pUIBase = GetDocument()->GetSelectedUI(); if (NULL == pUIBase) { @@ -1182,7 +1182,7 @@ void CPropertyView::UpdateUIStaticInfo() { } CN3UIStatic * pUI = NULL; if (UI_TYPE_STATIC == pUIBase->UIType() || UI_TYPE_EDIT == pUIBase->UIType()) { - pUI = (CN3UIStatic *)pUIBase; // edit static ̴. + pUI = (CN3UIStatic *)pUIBase; // edit도 static에서 상속 받은 것이다. } else { return; } diff --git a/src/tool/UIE/PropertyView.h b/src/tool/UIE/PropertyView.h index 6f6bdef0..5ae8268f 100644 --- a/src/tool/UIE/PropertyView.h +++ b/src/tool/UIE/PropertyView.h @@ -50,22 +50,22 @@ class CPropertyView : public CFormView { public: // Operations public: - void UpdateInfo(); // - void UpdateUIBaseInfo(); // Base - void UpdateUIImageInfo(); // Image - void UpdateUIStringInfo(); // String - void UpdateUIListInfo(); // List - void UpdateUIButtonInfo(); // Button - void UpdateUIEditInfo(); // Edit - void UpdateUIProgressInfo(); // Progress - void UpdateUITrackBarInfo(); // Trackbar - void UpdateUIScrollBarInfo(); // ScrollBar - void UpdateUIAreaInfo(); // Area - void UpdateUIIconSlotInfo(); // IconSlot (Ʈ ) - void UpdateUIStaticInfo(); // Static + void UpdateInfo(); // 모든 정보 갱신 + void UpdateUIBaseInfo(); // Base정보 갱신 + void UpdateUIImageInfo(); // Image정보 갱신 + void UpdateUIStringInfo(); // String정보 갱신 + void UpdateUIListInfo(); // List정보 갱신 + void UpdateUIButtonInfo(); // Button정보 갱신 + void UpdateUIEditInfo(); // Edit정보 갱신 + void UpdateUIProgressInfo(); // Progress정보 갱신 + void UpdateUITrackBarInfo(); // Trackbar정보 갱신 + void UpdateUIScrollBarInfo(); // ScrollBar정보 갱신 + void UpdateUIAreaInfo(); // Area정보 갱신 + void UpdateUIIconSlotInfo(); // IconSlot 정보 갱신(리펜트 전용) + void UpdateUIStaticInfo(); // Static 정보 갱신 protected: - void Resize(); // ȭ ġ - void SetPropertyListPos(CPropertyList * pList, CPoint & ptWndPos); // Ưġ ġϴ Լ + void Resize(); // 화면 구성요소 재배치 + void SetPropertyListPos(CPropertyList * pList, CPoint & ptWndPos); // 구성요소 특정위치에 배치하는 함수 public: // Overrides // ClassWizard generated virtual function overrides diff --git a/src/tool/UIE/TexViewer.cpp b/src/tool/UIE/TexViewer.cpp index 13494b6c..f29a15be 100644 --- a/src/tool/UIE/TexViewer.cpp +++ b/src/tool/UIE/TexViewer.cpp @@ -79,9 +79,9 @@ void CTexViewer::OnPaint() { CPaintDC dc(this); // device context for painting dc.SetViewportOrg(-m_ptLeftTopInImage.x * m_fScale, -m_ptLeftTopInImage.y * m_fScale); - // õ ׸ + // 현재 선택된 영역 그리기 if (m_rcSelectedRect.top != -1) { - // ¿ϸ ũ⿡ ٽ ġ ȭ ǥ ȯ + // 선택 영역을 좌우상하를 를 크기에 따라 다시 배치 후 화면 좌표로 변환 CRect rcSelected; if (m_rcSelectedRect.left < m_rcSelectedRect.right) { rcSelected.left = m_rcSelectedRect.left; @@ -105,15 +105,15 @@ void CTexViewer::OnPaint() { dc.SetBkColor(RGB(0, 0, 0)); dc.SelectStockObject(NULL_BRUSH); CPen * pOldPen = dc.SelectObject(&m_WhiteDashPen); - dc.Rectangle(&rcSelected); // ĥϰ + dc.Rectangle(&rcSelected); // 흰 점선 펜으로 칠하고 dc.SelectObject(pOldPen); } - // ImageType ׸ + // ImageType별 영역이 있으면 그리기 int iOldMode = dc.SetROP2(R2_NOTXORPEN); dc.SelectStockObject(NULL_BRUSH); for (int i = 0; i < m_iImageTypeCount; ++i) { if (m_iCurSelectedImage == i) { - continue; // õ dzʶٱ + continue; // 현재 선택된 것은 건너뛰기 } CRect rcTmp = m_ImageRects[i]; rcTmp.left *= m_fScale; @@ -133,7 +133,7 @@ void CTexViewer::OnLButtonDown(UINT nFlags, CPoint point) { SetCapture(); if (EDITMODE_SELECT == m_eEditMode) { - // 簢 簢 ϴ üũ + // 지정된 사각형이 있으면 그 사각형을 변형하는지 체크하자 if (-1 != m_rcSelectedRect.left) { CRect rcReal = m_rcSelectedRect; ImageToScreen(&rcReal); @@ -144,7 +144,7 @@ void CTexViewer::OnLButtonDown(UINT nFlags, CPoint point) { if (DRAGTYPE_NONE == m_eDragType) { CPoint pt = point; - ScreenToImage(&pt); // image ǥ ȯ + ScreenToImage(&pt); // image 좌표로 변환 m_rcSelectedRect.SetRect(pt, pt); m_eDragType = DRAGTYPE_SELECT; m_bDeselect = TRUE; @@ -170,9 +170,9 @@ void CTexViewer::OnLButtonUp(UINT nFlags, CPoint point) { m_rcSelectedRect.SetRect(-1, -1, -1, -1); // deselect } else { CPoint pt = point; - ScreenToImage(&pt); // image ǥ ȯ + ScreenToImage(&pt); // image 좌표로 변환 - // 簢 left,top ǥ right, bottom ū ǥ ϱ + // 사각형의 left,top은 작은 좌표 right, bottom은 큰 좌표로 정리하기 if (m_rcSelectedRect.left > pt.x) { m_rcSelectedRect.right = m_rcSelectedRect.left; m_rcSelectedRect.left = pt.x; @@ -192,7 +192,7 @@ void CTexViewer::OnLButtonUp(UINT nFlags, CPoint point) { m_eDragType = DRAGTYPE_NONE; if (m_iCurSelectedImage >= 0) { m_ImageRects[m_iCurSelectedImage] = - m_rcSelectedRect; // ImageType Ѵٸ õ 簢 copyֱ + m_rcSelectedRect; // 만약 ImageType별로 저장한다면 선택된 사각형을 copy해주기 } Invalidate(); } else if (EDITMODE_ZOOM == m_eEditMode) { @@ -200,13 +200,13 @@ void CTexViewer::OnLButtonUp(UINT nFlags, CPoint point) { CRect rc; GetClientRect(&rc); CPoint ptPrev = point; - ScreenToImage(&ptPrev); // zoom ϱ imageǥ + ScreenToImage(&ptPrev); // zoom 하기 전의 image좌표 저장 Zoom((GetAsyncKeyState(VK_MENU) & 0xff00) ? FALSE : TRUE); CPoint ptNext = ptPrev; - ImageToScreen(&ptNext); // zoom imageǥ screenǥ ȯ - ptNext.x = int((ptNext.x - rc.CenterPoint().x) / m_fScale); //ȭ  Բ + ImageToScreen(&ptNext); // zoom 한 후의 image좌표를 screen좌표로 전환 + ptNext.x = int((ptNext.x - rc.CenterPoint().x) / m_fScale); //화면 가운데로 오게끔 설정 ptNext.y = int((ptNext.y - rc.CenterPoint().y) / m_fScale); - SetLeftTopInImage(m_ptLeftTopInImage + ptNext); //̸ŭ ű + SetLeftTopInImage(m_ptLeftTopInImage + ptNext); //차이만큼 옮기기 } else { } } else if (EDITMODE_HAND == m_eEditMode) { @@ -225,11 +225,11 @@ void CTexViewer::OnLButtonUp(UINT nFlags, CPoint point) { void CTexViewer::OnMouseMove(UINT nFlags, CPoint point) { if (m_bDrag && (MK_LBUTTON & nFlags)) { if (EDITMODE_SELECT == m_eEditMode) { - // ȭ ũ üũ + // 화면 스크롤 체크 CRect rcClient; GetClientRect(&rcClient); CPoint ptOffset(0, 0); - int iBorder = 20; // ȭ ڸ 20 ̳ 1 + int iBorder = 20; // 화면 가장자리 20 이내있으면 1씩 증감 if (point.x < rcClient.left + iBorder) { ptOffset.x = -1; } else if (point.x > rcClient.right - iBorder) { @@ -240,7 +240,7 @@ void CTexViewer::OnMouseMove(UINT nFlags, CPoint point) { } else if (point.y > rcClient.bottom - iBorder) { ptOffset.y = 1; } - iBorder = 10; // 10 ̳ 5 + iBorder = 10; // 10 이내있으면 5씩 증감 if (point.x < rcClient.left + iBorder) { ptOffset.x = -5; } else if (point.x > rcClient.right - iBorder) { @@ -251,7 +251,7 @@ void CTexViewer::OnMouseMove(UINT nFlags, CPoint point) { } else if (point.y > rcClient.bottom - iBorder) { ptOffset.y = 5; } - iBorder = 5; // 5 ̳ 20 + iBorder = 5; // 5 이내있으면 20씩 증감 if (point.x < rcClient.left + iBorder) { ptOffset.x = -20; } else if (point.x > rcClient.right - iBorder) { @@ -267,13 +267,13 @@ void CTexViewer::OnMouseMove(UINT nFlags, CPoint point) { } if (DRAGTYPE_SELECT == m_eDragType) { - // + // 선택 영역 갱신 CPoint pt = point; - ScreenToImage(&pt); // image ǥ ȯ + ScreenToImage(&pt); // image 좌표로 변환 m_rcSelectedRect.right = pt.x; m_rcSelectedRect.bottom = pt.y; - m_bDeselect = FALSE; // deselect - } else { // ó + m_bDeselect = FALSE; // deselect 해제 + } else { // 영역 변형일 경우 다음과 같이 처리 ProcessDrag(point); } Invalidate(); @@ -291,7 +291,7 @@ void CTexViewer::OnMouseMove(UINT nFlags, CPoint point) { void CTexViewer::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); - SetLeftTopInImage(m_ptLeftTopInImage); //  ޶Ƿ ٽ Ͽ ٽ ϰ ϱ + SetLeftTopInImage(m_ptLeftTopInImage); // 사이즈가 달라졌으므로 다시 설정하여 왼쪽 위를 다시 계산하게 하기 } BOOL CTexViewer::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT message) { @@ -299,7 +299,7 @@ BOOL CTexViewer::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT message) { case EDITMODE_SELECT: { HCURSOR hCur = m_hCursorSelect; eDRAGTYPE eDT = m_eDragType; - if (DRAGTYPE_NONE == m_eDragType) // 巹 Type NONE̸ cursor ġ  ׽Ʈϱ + if (DRAGTYPE_NONE == m_eDragType) // 드레그 Type이 NONE이면 cursor의 위치를 얻어서 테스트하기 { CPoint pt; if (GetCursorPos(&pt)) { @@ -366,7 +366,7 @@ void CTexViewer::Release() { m_eDragType = DRAGTYPE_NONE; m_ptClickOffset = CPoint(-1, -1); - // image type + // image type관련 for (int i = 0; i < MAX_IMAGETYPE; ++i) { m_ImageRects[i].SetRect(-1, -1, -1, -1); } @@ -402,7 +402,7 @@ void CTexViewer::Render() { lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); } if (FALSE != dwFog) { - lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); // 2d fog Դ´ .; + lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); // 2d도 fog를 먹는다 ㅡ.ㅡ; } if (D3DTEXF_POINT != dwMagFilter) { lpD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); @@ -419,7 +419,7 @@ void CTexViewer::Render() { lpD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); lpD3DDev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - // ׸ ġ ؼ + // 그림 위치와 배율등을 고려해서 계산 CRect rcRender(0, 0, m_TexSize.cx * m_fScale, m_TexSize.cy * m_fScale); rcRender.OffsetRect(-m_ptLeftTopInImage.x * m_fScale, -m_ptLeftTopInImage.y * m_fScale); static __VertexTransformed Vertices[4]; @@ -431,7 +431,7 @@ void CTexViewer::Render() { Vertices[2].Set((float)rcRender.right, (float)rcRender.bottom, z, rhw, color, 1.0f, 1.0f); Vertices[3].Set((float)rcRender.left, (float)rcRender.bottom, z, rhw, color, 0.0f, 1.0f); - // ׸ + // 그리기 lpD3DDev->SetFVF(FVF_TRANSFORMED); HRESULT hr = lpD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, Vertices, sizeof(Vertices[0])); @@ -460,7 +460,7 @@ void CTexViewer::SetTexture(LPCTSTR pszFName) { CN3Base::s_MngTex.Delete(&m_pTex); m_pTex = CN3Base::s_MngTex.Get(pszFName); - // texture size + // texture size 지정 if (m_pTex) { m_TexSize.cx = m_pTex->Width(); m_TexSize.cy = m_pTex->Height(); @@ -544,16 +544,16 @@ CTexViewer::eEDITMODE CTexViewer::SetEditMode(eEDITMODE eMode) { return m_eEditMode; } if (m_bDrag) { - return m_eEditMode; // 巡 ̸ ٲ ̻ ɼ . + return m_eEditMode; // 드래그 중이면 바꾸지 말자 이상동장 가능성이 많다. } m_eEditMode = eMode; return m_eEditMode; } void CTexViewer::SetLeftTopInImage(CPoint ptLeftTop) { - // Ѱ ϱ - // ׸ ġ ؼ - CRect rcClient; // Client + // 한계 영역 계산하기 + // 그림 위치와 배율등을 고려해서 계산 + CRect rcClient; // Client영역 GetClientRect(&rcClient); CPoint ptLimit; ptLimit.x = int(m_TexSize.cx - rcClient.Width() / m_fScale); @@ -565,7 +565,7 @@ void CTexViewer::SetLeftTopInImage(CPoint ptLeftTop) { ptLimit.y = 0; } - //Ѱ ߾ ϱ + //한계 영역에 맞추어 계산하기 if (ptLeftTop.x < 0) { ptLeftTop.x = 0; } @@ -614,7 +614,7 @@ void CTexViewer::SetSelectedUVRect(const __FLOAT_RECT * pFRect) { } ASSERT(m_TexSize.cx > 2 && m_TexSize.cy > 2); - m_rcSelectedRect.left = int(pFRect->left * m_TexSize.cx + 0.5f); // 0.5f ϴ ݿø.. + m_rcSelectedRect.left = int(pFRect->left * m_TexSize.cx + 0.5f); // 0.5f를 더하는 이유는 반올림.. m_rcSelectedRect.right = int(pFRect->right * m_TexSize.cx + 0.5f); m_rcSelectedRect.top = int(pFRect->top * m_TexSize.cy + 0.5f); m_rcSelectedRect.bottom = int(pFRect->bottom * m_TexSize.cy + 0.5f); @@ -668,7 +668,7 @@ CTexViewer::eDRAGTYPE CTexViewer::CheckDragType(CRect rcSel, CPoint point) { return DRAGTYPE_NONE; } -// óϴ ƾ +// 영역 변형일 경우 처리하는 루틴 void CTexViewer::ProcessDrag(CPoint point) { ScreenToImage(&point); @@ -811,13 +811,13 @@ CRect CTexViewer::GetImageRect(int iIndex) { } BOOL CTexViewer::AutoMultiRectSelect( - BOOL bHorizon, CString & strErrMsg) // Ǵ η ̹ Rect ڵ ũ ش. + BOOL bHorizon, CString & strErrMsg) // 가로 또는 세로로 연결된 이미지 Rect들을 자동으로 같은 크기로 선택해준다. { if (-1 == m_rcSelectedRect.left) { - strErrMsg = " õ ϴ."; + strErrMsg = "현재 선택된 영역이 없습니다."; return FALSE; } else if (0 == m_rcSelectedRect.Width() || 0 == m_rcSelectedRect.Height()) { - strErrMsg = "õ Ǵ ũⰡ 0Դϴ."; + strErrMsg = "선택된 영역의 가로 또는 세로 크기가 0입니다."; return FALSE; } @@ -825,14 +825,14 @@ BOOL CTexViewer::AutoMultiRectSelect( int iRow = 0; int iCol = 0; CPoint ptLeftTop = m_rcSelectedRect.TopLeft(); - if (bHorizon) { // ̵ϸ + if (bHorizon) { // 수평으로 이동하며 나누기 for (int i = 0; i < m_iImageTypeCount; ++i) { if ((ptLeftTop.x + m_rcSelectedRect.Width() * (iRow + 1)) > m_TexSize.cx) { ++iCol; iRow = 0; } if ((ptLeftTop.y + m_rcSelectedRect.Height() * (iCol + 1)) > m_TexSize.cy) { - strErrMsg.Format(" 簢 ϴ.(%d )", i + 1); + strErrMsg.Format("모든 사각형 영역을 선택할 수 없습니다.(%d개 설정)", i + 1); return FALSE; } m_ImageRects[i].SetRect(ptLeftTop.x + m_rcSelectedRect.Width() * iRow, @@ -841,14 +841,14 @@ BOOL CTexViewer::AutoMultiRectSelect( ptLeftTop.y + m_rcSelectedRect.Height() * (iCol + 1)); ++iRow; } - } else { // ̵ϸ + } else { // 수직으로 이동하며 나누기 for (int i = 0; i < m_iImageTypeCount; ++i) { if ((ptLeftTop.y + m_rcSelectedRect.Height() * (iCol + 1)) > m_TexSize.cy) { ++iRow; iCol = 0; } if ((ptLeftTop.x + m_rcSelectedRect.Width() * (iRow + 1)) > m_TexSize.cx) { - strErrMsg.Format(" 簢 ϴ.(%d )", i + 1); + strErrMsg.Format("모든 사각형 영역을 선택할 수 없습니다.(%d개 설정)", i + 1); return FALSE; } m_ImageRects[i].SetRect(ptLeftTop.x + m_rcSelectedRect.Width() * iRow, diff --git a/src/tool/UIE/TexViewer.h b/src/tool/UIE/TexViewer.h index 8658c6b8..2b461eff 100644 --- a/src/tool/UIE/TexViewer.h +++ b/src/tool/UIE/TexViewer.h @@ -27,16 +27,16 @@ class CTexViewer : public CWnd { protected: CN3Texture * m_pTex; // texture CSize m_TexSize; // texture size - float m_fScale; // ȭ - CPoint m_ptLeftTopInImage; // ܿ ̴ texture ǥ - eEDITMODE m_eEditMode; //  Ȳ.(, , zoom in/out...) - CRect m_rcSelectedRect; // õ 簢(imageǥ ) - BOOL m_bDrag; // 巡 ΰ? - CPen m_WhiteDashPen; // - CPoint m_ptMouseOld; // 콺 - BOOL m_bDeselect; // deselect ΰ? - CPoint m_ptClickOffset; // ̷ Ҷ click - // â Ŭ ǥ( lefttop 0,0 )(image pixelǥ) + float m_fScale; // 화면 배율 + CPoint m_ptLeftTopInImage; // 이 윈도우 좌측 상단에 보이는 texture의 좌측 상단 좌표 + eEDITMODE m_eEditMode; // 현재 어떤 편집 상황인지.(예, 영역선택, zoom in/out...) + CRect m_rcSelectedRect; // 선택된 사각형(image좌표 기준) + BOOL m_bDrag; // 드래그 중인가? + CPen m_WhiteDashPen; // 흰색 점선 + CPoint m_ptMouseOld; // 마우스의 이전 지점 기억 + BOOL m_bDeselect; // deselect 할 것인가? + CPoint m_ptClickOffset; // 선택 영역을 움직이려고 할때 click했을경우의 + // 선택창의 클릭지점 상대좌표(선택 영역lefttop 0,0 기준)(image pixel좌표계) enum eDRAGTYPE { DRAGTYPE_NONE = 0, @@ -51,9 +51,9 @@ class CTexViewer : public CWnd { DRAGTYPE_RIGHTBOTTOM, DRAGTYPE_SELECT }; - eDRAGTYPE m_eDragType; // Drag + eDRAGTYPE m_eDragType; // Drag 상태 - // Ŀ + // 커서 HCURSOR m_hCursorSelect; HCURSOR m_hCursorZoomIn; HCURSOR m_hCursorZoomOut; @@ -65,36 +65,36 @@ class CTexViewer : public CWnd { HCURSOR m_hCursorSizeNWSE; HCURSOR m_hCursorSizeNESW; - // image type - int m_iImageTypeCount; // õǾ ̹ - CRect m_ImageRects[MAX_IMAGETYPE]; // m_iImageTypeCountŭ ImageRect - int m_iCurSelectedImage; // õ ImageType + // image type관련 + int m_iImageTypeCount; // 선택되어야 할 이미지 종류의 수 + CRect m_ImageRects[MAX_IMAGETYPE]; // m_iImageTypeCount만큼의 ImageRect + int m_iCurSelectedImage; // 현재 선택된 ImageType // Operations public: void Release(); - BOOL Zoom(BOOL bZoomIn); // in : Ȯ, out : - BOOL Zoom(float fScale); // f Zoom ϱ - void Render(); // texture renderϱ - void SetTexture(LPCTSTR pszFName); // texture - eEDITMODE SetEditMode(eEDITMODE eMode); // mode ٲٱ (zoom, hand, select) ϸ mode ش. - void SetLeftTopInImage(CPoint ptLeftTop); // ̹ ǥ ٲٱ - BOOL GetSelectedUVRect(struct __FLOAT_RECT * pFRect) const; // õ UVǥ - void SetSelectedUVRect(const struct __FLOAT_RECT * pFRect); // õ UVǥ ֱ + BOOL Zoom(BOOL bZoomIn); // in : 확대, out : 축소 + BOOL Zoom(float fScale); // f배로 Zoom 하기 + void Render(); // texture render하기 + void SetTexture(LPCTSTR pszFName); // texture 지정 + eEDITMODE SetEditMode(eEDITMODE eMode); // mode 바꾸기 (zoom, hand, select) 실패하면 이전 mode를 돌려준다. + void SetLeftTopInImage(CPoint ptLeftTop); // 이미지의 좌측 상단 좌표 바꾸기 + BOOL GetSelectedUVRect(struct __FLOAT_RECT * pFRect) const; // 현재 선택된 UV좌표 얻기 + void SetSelectedUVRect(const struct __FLOAT_RECT * pFRect); // 현재 선택된 UV좌표 넣기 - // image type - void SetImageTypeCount(int iCount) { m_iImageTypeCount = iCount; } // image type ϱ - BOOL SetImageTypeIndex(int iIndex); // zero base õ image typeϱ + // image type관련 + void SetImageTypeCount(int iCount) { m_iImageTypeCount = iCount; } // image type 갯수 정하기 + BOOL SetImageTypeIndex(int iIndex); // zero base 선택된 image type정하기 CRect GetImageRect(int iIndex); BOOL AutoMultiRectSelect(BOOL bHorizon, CString & strErrMsg); protected: - BOOL ScreenToImage(POINT * pPoint); // screenǥ imageǥ - BOOL ScreenToImage(RECT * pRect); // screenǥ imageǥ - BOOL ImageToScreen(POINT * pPoint); // imageǥ screenǥ - BOOL ImageToScreen(RECT * pRect); // imageǥ screenǥ + BOOL ScreenToImage(POINT * pPoint); // screen좌표를 image좌표로 + BOOL ScreenToImage(RECT * pRect); // screen좌표를 image좌표로 + BOOL ImageToScreen(POINT * pPoint); // image좌표를 screen좌표로 + BOOL ImageToScreen(RECT * pRect); // image좌표를 screen좌표로 eDRAGTYPE CheckDragType(CRect rcSel, CPoint point); - void ProcessDrag(CPoint point); // óϴ ƾ + void ProcessDrag(CPoint point); // 영역 변형일 경우 처리하는 루틴 public: // Overrides // ClassWizard generated virtual function overrides diff --git a/src/tool/UIE/UIE.cpp b/src/tool/UIE/UIE.cpp index bfb31647..8eed44d7 100644 --- a/src/tool/UIE/UIE.cpp +++ b/src/tool/UIE/UIE.cpp @@ -173,7 +173,7 @@ BOOL SelectTexture(char * pszBuff) { lstrcpy(pszBuff, dlg.GetPathName()); // CN3BaseFileAccess tmpBase; - // tmpBase.FileNameSet(pszBuff); // Baseο ؼ θ Ѱش. + // tmpBase.FileNameSet(pszBuff); // Base경로에 대해서 상대적 경로를 넘겨준다. // const std::string strFN(tmpBase.FileName()); // strcpy(pszBuff, strFN.c_str()); return TRUE; diff --git a/src/tool/UIE/UIE.rc b/src/tool/UIE/UIE.rc index 743141deac9f37f4c2eedfbafa4b64f6896a60ef..95af8f6e8a15ce7cea2b1cd4ba77f96e477f47e3 100644 GIT binary patch literal 46264 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

1pm$YssMKnUv>#Fy+RtZ@stm*3Nf)v3We( zfj+E5>U{U!A+mLQ^EMW=*V*#Q#z}LI1-L_C5;m@x&@Pjw#IncIo zUtUna;T2O}Yv6~+78C9}a3kQ3qS%OZjo#X`lXCK-Y~F5O*=i!>hKu?ICamM`LkZ2|g(d={>l>I? zQWgG;l;1|cS&cJj^6nf?0Ojuh>3DVE3?9+%06^afyx>Dea$sVCvlW55u^fWko2#F5 z$H($2_TE7q7dPV&E&CQ96k-SWj=SC%7E49b5Zry2qvvP^o^kIZH zQcmvnoA88I@3HNNtv9^A$P1Xf{cx?67mcAaA18$3dHG9-gOLbX1|os1XxVp(Nj$L; zSyPl3CCfoGW$PhVqU~>5AIw#@zJ;UCR~N2tSfB9N(l#3pE+0(Gdq3!qA;-l-I+THk zC6xCq0+AZ~gt&6(1fv z@uO(JoP-m}HHxqWePjn|GS>z1nqK~w4Ej9Vfo*qLAMK5(xaURI8ntaa9&JzJ?$txCCm*pd z?H1RQcf0u6zF@uMbi`ql&(1 diff --git a/src/tool/UIE/UIE.vcxproj.filters b/src/tool/UIE/UIE.vcxproj.filters index b62d817b..6ae0b17a 100644 --- a/src/tool/UIE/UIE.vcxproj.filters +++ b/src/tool/UIE/UIE.vcxproj.filters @@ -1,4 +1,4 @@ - + diff --git a/src/tool/UIE/UIE.vcxproj.user b/src/tool/UIE/UIE.vcxproj.user index 7912fcf6..1aa1e2ae 100644 --- a/src/tool/UIE/UIE.vcxproj.user +++ b/src/tool/UIE/UIE.vcxproj.user @@ -1,4 +1,4 @@ - + $(ProjectDir)..\..\assets\game diff --git a/src/tool/UIE/UIEDoc.cpp b/src/tool/UIE/UIEDoc.cpp index 588b75c6..d21363b2 100644 --- a/src/tool/UIE/UIEDoc.cpp +++ b/src/tool/UIE/UIEDoc.cpp @@ -159,7 +159,7 @@ void CUIEDoc::SetSelectedUI(CN3UIBase * pUI) { bool bOverLapped = false; for (; it != itEnd;) { if (pUI == *it) { - it = m_SelectedUIs.erase(it); // Ÿ ÿ . + it = m_SelectedUIs.erase(it); // 같은 거면 선택에서 제외. bOverLapped = true; } else { it++; @@ -167,7 +167,7 @@ void CUIEDoc::SetSelectedUI(CN3UIBase * pUI) { } if (false == bOverLapped) { - m_SelectedUIs.push_front(pUI); // ġ .. ߰.. + m_SelectedUIs.push_front(pUI); // 겹치지 않으면.. 추가.. } } @@ -189,19 +189,19 @@ void CUIEDoc::OnInsertImage() { SetSelectedUI(NULL); SetSelectedUI(pUI); - // Ʒ ⺻ ָ ͵ . + // 아래로 기본적으로 해주면 좋은 것들을 써놓았음. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); if (FALSE == SetImageInfos(pUI)) { if (IDYES == - pFrm->MessageBox("Image ҵǾϴ.\n ̹ Ͻðڽϱ?", NULL, MB_YESNO)) { + pFrm->MessageBox("Image 정보 지정이 취소되었습니다.\n생성된 이미지를 삭제하시겠습니까?", NULL, MB_YESNO)) { OnEditDelete(); } else { - pFrm->MessageBox("ؽ Ÿ ؾ ̹ Դϴ."); + pFrm->MessageBox("텍스쳐지정 및 기타 설정을 해야 이미지가 보일 것입니다."); } return; } - pFrm->MessageBox("ġ ũ⸦ ּ"); + pFrm->MessageBox("위치와 크기를 정해주세요"); pFrm->GetRightPane()->SetMode(CUIEView::UIEMODE_EDIT); pFrm->GetRightPane()->SelectRectType(CUIEView::RT_REGION); UpdateAllViews(NULL); @@ -219,21 +219,21 @@ void CUIEDoc::OnInsertString() { SetSelectedUI(NULL); SetSelectedUI(pUI); - // Ʒ ⺻ ָ ͵ . + // 아래로 기본적으로 해주면 좋은 것들을 써놓았음. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); if (FALSE == SetStringInfos(pUI)) { if (IDYES == - pFrm->MessageBox("Font ҵǾϴ.\n UIString Ͻðڽϱ?", NULL, MB_YESNO)) { + pFrm->MessageBox("Font 지정이 취소되었습니다.\n생성된 UIString을 삭제하시겠습니까?", NULL, MB_YESNO)) { OnEditDelete(); } else { - pFrm->MessageBox("Font Ÿ ؾ UIString Դϴ."); + pFrm->MessageBox("Font 지정 및 기타 설정을 해야 UIString이 보일 것입니다."); } return; } - // + // 영역 지정 SIZE size; CRect rcRegion(0, 0, 20, 30); - if (pUI->GetTextExtent("", lstrlen(""), &size)) { + if (pUI->GetTextExtent("진", lstrlen("진"), &size)) { rcRegion.SetRect(0, 0, size.cx, size.cy); } @@ -256,29 +256,29 @@ void CUIEDoc::OnInsertButton() { SetSelectedUI(NULL); SetSelectedUI(pUI); - // Ʒ ⺻ ָ ͵ . + // 아래로 기본적으로 해주면 좋은 것들을 써놓았음. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); if (FALSE == SetButtonInfos(pUI)) { if (IDYES == - pFrm->MessageBox("ؽ ҵǾϴ.\n ư Ͻðڽϱ?", NULL, MB_YESNO)) { + pFrm->MessageBox("텍스쳐 지정이 취소되었습니다.\n생성된 버튼을 삭제하시겠습니까?", NULL, MB_YESNO)) { OnEditDelete(); } else { - pFrm->MessageBox("ؽ Ÿ ؾ ư Դϴ."); + pFrm->MessageBox("텍스쳐지정 및 기타 설정을 해야 버튼이 보일 것입니다."); } return; } - // ư ġ , size(width,height) image . + // 버튼 위치 설정, size(width,height)는 image영역 설정에 따른다. CRect rcRegion = pUI->GetRegion(); - rcRegion.OffsetRect(-rcRegion.TopLeft()); // 0,0 ߱ + rcRegion.OffsetRect(-rcRegion.TopLeft()); // 0,0인점으로 마추기 pUI->SetRegion(rcRegion); - pFrm->MessageBox("1. ư ġ ּ.\n2. ׸ ư ƴҰ clickǴ " - "ּ.\n3. üũư style ּ."); + pFrm->MessageBox("1. 버튼의 위치와 영역을 지정해주세요.\n2. 네모 버튼이 아닐경우 click되는 영역을 " + "지정해주세요.\n3. 체크버튼으로 만들고 싶으면 style을 지정해주세요."); pFrm->GetRightPane()->SetMode(CUIEView::UIEMODE_EDIT); pFrm->GetRightPane()->SelectRectType(CUIEView::RT_REGION); UpdateAllViews(NULL); - // click ʿ䰡 Ѵ. - // style + // click 영역을 따로 지정할 필요가 있으면 지정한다. + // style 지정 } void CUIEDoc::OnInsertStatic() { @@ -294,18 +294,18 @@ void CUIEDoc::OnInsertStatic() { SetSelectedUI(NULL); SetSelectedUI(pUI); - // Ʒ ⺻ ָ ͵ . + // 아래로 기본적으로 해주면 좋은 것들을 써놓았음. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - // image õ ְ image static + // image에 관련된 세팅을 해주고 image영역을 가져와 static의 영역을 세팅후 CN3UIImage * pBkImage = pUI->GetImageBkGnd(); SetImageInfos(pBkImage); RECT rcRegion = pBkImage->GetRegion(); pUI->SetRegion(rcRegion); - // string ,  text ش. + // string 관련 세팅, 들어갈 text를 지정해준다. CN3UIString * pUIString = pUI->GetUIString(); if (FALSE == SetStringInfos(pUIString)) { - pFrm->MessageBox("text ־ ۾ Դϴ."); + pFrm->MessageBox("text의 정보를 넣어야 글씨가 제대로 보일 것입니다."); } pFrm->GetRightPane()->SetMode(CUIEView::UIEMODE_EDIT); @@ -326,17 +326,17 @@ void CUIEDoc::OnInsertEdit() { SetSelectedUI(NULL); SetSelectedUI(pUI); - // Ʒ ⺻ ָ ͵ . + // 아래로 기본적으로 해주면 좋은 것들을 써놓았음. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - // image õ ְ image edit + // image에 관련된 세팅을 해주고 image영역을 가져와 edit의 영역을 세팅후 CN3UIImage * pBkImage = pUI->GetImageBkGnd(); SetImageInfos(pBkImage); RECT rcRegion = pBkImage->GetRegion(); pUI->SetRegion(rcRegion); - // string + // string 관련 세팅 CN3UIString * pUIString = pUI->GetUIString(); if (FALSE == SetStringInfos(pUIString)) { - pFrm->MessageBox("text ־ ۾ Դϴ."); + pFrm->MessageBox("text의 정보를 넣어야 글씨가 제대로 보일 것입니다."); } pFrm->GetRightPane()->SetMode(CUIEView::UIEMODE_EDIT); @@ -357,47 +357,47 @@ void CUIEDoc::OnInsertProgress() { SetSelectedUI(NULL); SetSelectedUI(pUI); - // Ʒ ⺻ ָ ͵ . + // 아래로 기본적으로 해주면 좋은 것들을 써놓았음. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - // background̹ foreground̹ ϰ + // background이미지와 foreground이미지를 설정하고 CN3UIImage * pUIImage = pUI->GetBkGndImgRef(); ASSERT(pUIImage); - // texture + // texture 설정 char szTexture[_MAX_PATH]; while (1) { if (FALSE == SelectTexture(szTexture)) { if (IDYES == - pFrm->MessageBox("ؽ ҵǾϴ.\nProgress Ͻðڽϱ?", NULL, MB_YESNO)) { + pFrm->MessageBox("텍스쳐 지정이 취소되었습니다.\nProgress를 삭제하시겠습니까?", NULL, MB_YESNO)) { OnEditDelete(); } else { - pFrm->MessageBox("ؽ Ÿ ؾ progress Դϴ."); + pFrm->MessageBox("텍스쳐지정 및 기타 설정을 해야 progress가 보일 것입니다."); } return; } pUIImage->SetTex(szTexture); if (NULL == pUIImage->GetTex()) { - if (IDYES == pFrm->MessageBox("ؽĸ Load ϴ.\nٽ Ͻðڽϱ?", NULL, MB_YESNO)) { + if (IDYES == pFrm->MessageBox("텍스쳐를 Load할 수 없습니다.\n다시 지정하시겠습니까?", NULL, MB_YESNO)) { continue; } else { - pFrm->MessageBox("ؽ Ÿ ؾ progress Դϴ."); + pFrm->MessageBox("텍스쳐지정 및 기타 설정을 해야 progress가 보일 것입니다."); } return; } else { break; } } - // image normal on down disable׸ + // image의 normal on down disable그림 영역 설정 CDlgTexture dlg; dlg.SetTexture(szTexture); char szNames[2][20] = {"Back", "Fore"}; char * szImageTypeNames[2] = {szNames[0], szNames[1]}; dlg.SetImageTypes(2, szImageTypeNames); if (IDCANCEL == dlg.DoModal()) { - if (IDYES == pFrm->MessageBox("ؽ UVǥ ҵǾϴ.\n Progress Ͻðڽϱ?", NULL, + if (IDYES == pFrm->MessageBox("텍스쳐 UV좌표 지정이 취소되었습니다.\n생성된 Progress를 삭제하시겠습니까?", NULL, MB_YESNO)) { OnEditDelete(); } else { - pFrm->MessageBox("UVǥ Ÿ ؾ Progress Դϴ."); + pFrm->MessageBox("UV좌표 설정 및 기타 설정을 해야 Progress가 보일 것입니다."); } return; } @@ -417,12 +417,12 @@ void CUIEDoc::OnInsertProgress() { pUIImage->SetUVRect(frcUV.left, frcUV.top, frcUV.right, frcUV.bottom); } - // image progress + // image영역을 가져와 progress 영역을 설정 rcRegion = dlg.GetImageRect(0); pUI->SetFrGndUVFromFrGndImage(); pUI->SetRegion(rcRegion); - // style - pFrm->MessageBox("â Ÿ(/) ּ."); + // style 지정 + pFrm->MessageBox("왼쪽창에서 스타일(가로/세로)을 지정해주세요."); pFrm->GetRightPane()->SetMode(CUIEView::UIEMODE_EDIT); pFrm->GetRightPane()->SelectRectType(CUIEView::RT_REGION); @@ -442,19 +442,19 @@ void CUIEDoc::OnInsertTrackbar() { SetSelectedUI(NULL); SetSelectedUI(pUI); - // Ʒ ⺻ ָ ͵ . + // 아래로 기본적으로 해주면 좋은 것들을 써놓았음. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); if (FALSE == SetTrackBarInfos(pUI)) { - if (IDYES == pFrm->MessageBox("Trackbar ҵǾϴ.\n Trackbar Ͻðڽϱ?", NULL, + if (IDYES == pFrm->MessageBox("Trackbar 정보 지정이 취소되었습니다.\n생성된 Trackbar를 삭제하시겠습니까?", NULL, MB_YESNO)) { OnEditDelete(); } else { - pFrm->MessageBox("ؽ Ÿ ؾ Trackbar Դϴ."); + pFrm->MessageBox("텍스쳐지정 및 기타 설정을 해야 Trackbar가 보일 것입니다."); } return; } - // style - pFrm->MessageBox("â Ÿ(/) ּ."); + // style 지정 + pFrm->MessageBox("왼쪽창에서 스타일(가로/세로)을 지정해주세요."); pFrm->GetRightPane()->SetMode(CUIEView::UIEMODE_EDIT); pFrm->GetRightPane()->SelectRectType(CUIEView::RT_REGION); @@ -473,64 +473,64 @@ void CUIEDoc::OnInsertScrollbar() { pUI->CreateTrackBarAndBtns(); SetSelectedUI(NULL); SetSelectedUI(pUI); - // Ʒ ⺻ ָ ͵ . + // 아래로 기본적으로 해주면 좋은 것들을 써놓았음. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - pFrm->MessageBox("(ũѹ )/ ư Դϴ."); - // 2 button ϰ + pFrm->MessageBox("(스크롤바 만들기)위/왼쪽 버튼 지정입니다."); + // 2개의 button을 설정하고 CN3UIButton * pUIBtn = pUI->GetBtnRef(CN3UIScrollBar::BTN_LEFTUP); ASSERT(pUIBtn); if (FALSE == SetButtonInfos(pUIBtn)) { if (IDYES == - pFrm->MessageBox("ؽ ҵǾϴ.\n ũ Ͻðڽϱ?", NULL, MB_YESNO)) { + pFrm->MessageBox("텍스쳐 지정이 취소되었습니다.\n생성된 스크롤을 삭제하시겠습니까?", NULL, MB_YESNO)) { OnEditDelete(); } else { - pFrm->MessageBox("ؽ Ÿ ؾ ũ Դϴ."); + pFrm->MessageBox("텍스쳐지정 및 기타 설정을 해야 스크롤이 보일 것입니다."); } return; } - // ư ġ , size(width,height) image . + // 버튼 위치 설정, size(width,height)는 image영역 설정에 따른다. CRect rcRegion = pUIBtn->GetRegion(); - rcRegion.OffsetRect(-rcRegion.TopLeft()); // 0,0 ߱ + rcRegion.OffsetRect(-rcRegion.TopLeft()); // 0,0인점으로 마추기 pUIBtn->SetRegion(rcRegion); - // 2° ư - pFrm->MessageBox("(ũѹ )Ʒ/ ư Դϴ."); + // 2번째 버튼 + pFrm->MessageBox("(스크롤바 만들기)아래/오른쪽 버튼 지정입니다."); pUIBtn = pUI->GetBtnRef(CN3UIScrollBar::BTN_RIGHTDOWN); ASSERT(pUIBtn); if (FALSE == SetButtonInfos(pUIBtn)) { if (IDYES == - pFrm->MessageBox("ؽ ҵǾϴ.\n ũ Ͻðڽϱ?", NULL, MB_YESNO)) { + pFrm->MessageBox("텍스쳐 지정이 취소되었습니다.\n생성된 스크롤을 삭제하시겠습니까?", NULL, MB_YESNO)) { OnEditDelete(); } else { - pFrm->MessageBox("ؽ Ÿ ؾ ũ Դϴ."); + pFrm->MessageBox("텍스쳐지정 및 기타 설정을 해야 스크롤이 보일 것입니다."); } return; } - // ư ġ , size(width,height) image . + // 버튼 위치 설정, size(width,height)는 image영역 설정에 따른다. rcRegion = pUIBtn->GetRegion(); - rcRegion.OffsetRect(CPoint(20, 20) - rcRegion.TopLeft()); // 20,20 ߱ + rcRegion.OffsetRect(CPoint(20, 20) - rcRegion.TopLeft()); // 20,20인점으로 맞추기 pUIBtn->SetRegion(rcRegion); - pFrm->MessageBox("(ũѹ ) Track barԴϴ."); - // trackbar ϰ + pFrm->MessageBox("(스크롤바 만들기)가운데 Track bar지정입니다."); + // trackbar를 설정하고 CN3UITrackBar * pUITrackBar = pUI->GetTrackBarRef(); if (FALSE == SetTrackBarInfos(pUITrackBar)) { - if (IDYES == pFrm->MessageBox("Trackbar ҵǾϴ.\n ScrollBar Ͻðڽϱ?", NULL, + if (IDYES == pFrm->MessageBox("Trackbar 정보 지정이 취소되었습니다.\n생성된 ScrollBar 삭제하시겠습니까?", NULL, MB_YESNO)) { OnEditDelete(); } else { - pFrm->MessageBox("ؽ Ÿ ؾ ScrollBar Դϴ."); + pFrm->MessageBox("텍스쳐지정 및 기타 설정을 해야 ScrollBar가 보일 것입니다."); } return; } rcRegion = pUITrackBar->GetRegion(); - rcRegion.OffsetRect(CPoint(40, 40) - rcRegion.TopLeft()); // 40,40 ߱ + rcRegion.OffsetRect(CPoint(40, 40) - rcRegion.TopLeft()); // 40,40인점으로 맞추기 pUITrackBar->SetRegion(rcRegion); pUI->SetRegion(rcRegion); - // ư trackbar ؼ scrollbar - // style ϰ - pFrm->MessageBox("1. â Ÿ(/) ּ.\nũ ݵ ư  " - "Ʈٰ  ּ"); + // 버튼과 trackbar영역을 더해서 scrollbar영역을 설정 + // style을 정하고 + pFrm->MessageBox("1. 왼쪽창에서 스타일(가로/세로)을 지정해주세요.\n스크롤의 영역을 반드시 양 버튼과 가운데 " + "트랙바가 들어가게 정해주세요"); pFrm->GetRightPane()->SetMode(CUIEView::UIEMODE_EDIT); pFrm->GetRightPane()->SelectRectType(CUIEView::RT_REGION); @@ -550,7 +550,7 @@ void CUIEDoc::OnInsertArea() { SetSelectedUI(NULL); SetSelectedUI(pUI); - // Ʒ ⺻ ָ ͵ . + // 아래로 기본적으로 해주면 좋은 것들을 써놓았음. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); pFrm->GetRightPane()->SetMode(CUIEView::UIEMODE_EDIT); pFrm->GetRightPane()->SelectRectType(CUIEView::RT_REGION); @@ -568,14 +568,14 @@ void CUIEDoc::OnInsertIconslot() { pUI->Init(&m_RootUI); } SetSelectedUI(pUI); - // Ʒ ⺻ ָ ͵ . + // 아래로 기본적으로 해주면 좋은 것들을 써놓았음. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - pFrm->MessageBox(" ּ."); + pFrm->MessageBox("영역을 지정해 주세요."); pFrm->GetRightPane()->SetMode(CUIEView::UIEMODE_EDIT); pFrm->GetRightPane()->SelectRectType(CUIEView::RT_REGION); UpdateAllViews(NULL); #else - AfxGetMainWnd()->MessageBox("Repent Ǵ Դϴ."); + AfxGetMainWnd()->MessageBox("Repent만 지원되는 형식입니다."); #endif } @@ -592,7 +592,7 @@ void CUIEDoc::OnInsertList() { SetSelectedUI(NULL); SetSelectedUI(pUI); - // Ʒ ⺻ ָ ͵ . + // 아래로 기본적으로 해주면 좋은 것들을 써놓았음. CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); pFrm->GetRightPane()->SetMode(CUIEView::UIEMODE_EDIT); pFrm->GetRightPane()->SelectRectType(CUIEView::RT_REGION); @@ -600,15 +600,15 @@ void CUIEDoc::OnInsertList() { // this->OnInsertScrollbar(); } -void CUIEDoc::OnEditDelete() // õ ui +void CUIEDoc::OnEditDelete() // 선택된 ui 지우기 { CN3UIBase * pUI = NULL; it_UI it = m_SelectedUIs.begin(), itEnd = m_SelectedUIs.end(); for (; it != itEnd;) { pUI = *it; // if (pUI && (&m_RootUI) == pUI->GetParent()) - // { // õ ui m_RootUI child̸ . - if (pUI && (&m_RootUI) != pUI) // Root UI ƴϸ .. + // { // 선택된 ui가 m_RootUI의 child이면 지운다. + if (pUI && (&m_RootUI) != pUI) // Root UI 가 아니면 지운다.. { delete pUI; it = m_SelectedUIs.erase(it); @@ -641,7 +641,7 @@ BOOL CUIEDoc::SetImageInfos(CN3UIImage * pUI) { return FALSE; } CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - // texture + // texture 지정 char szTexture[_MAX_PATH]; while (1) { if (FALSE == SelectTexture(szTexture)) { @@ -649,7 +649,7 @@ BOOL CUIEDoc::SetImageInfos(CN3UIImage * pUI) { } pUI->SetTex(szTexture); if (NULL == pUI->GetTex()) { - if (IDYES == pFrm->MessageBox("ؽĸ Load ϴ.\nٽ Ͻðڽϱ?", NULL, MB_YESNO)) { + if (IDYES == pFrm->MessageBox("텍스쳐를 Load할 수 없습니다.\n다시 지정하시겠습니까?", NULL, MB_YESNO)) { continue; } return FALSE; @@ -657,7 +657,7 @@ BOOL CUIEDoc::SetImageInfos(CN3UIImage * pUI) { break; } } - // texture ̴ κ ( UV ϱ ) + // texture 위의 쓰이는 부분 지정 (영역과 UV지정을 하기 위해) CDlgTexture dlg; dlg.SetTexture(szTexture); if (IDCANCEL == dlg.DoModal()) { @@ -669,25 +669,25 @@ BOOL CUIEDoc::SetImageInfos(CN3UIImage * pUI) { return FALSE; } rcRegion = dlg.GetSelectedRect(); - // UVǥ + // UV좌표 지정 pUI->SetUVRect(frcUV.left, frcUV.top, frcUV.right, frcUV.bottom); - // (texture ũ⿡ width height ڵ ϰ ġ ) - rcRegion.OffsetRect(-rcRegion.TopLeft()); // 0,0 ߱ + // 영역 지정(texture의 크기에 따라 width와 height는 자동으로 지정하고 위치는 물어보자) + rcRegion.OffsetRect(-rcRegion.TopLeft()); // 0,0인점으로 마추기 pUI->SetRegion(rcRegion); return TRUE; } BOOL CUIEDoc::SetStringInfos(CN3UIString * pUI) { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - // font , + // font 지정, 글자 색 지정 CFontDialog dlg; if (IDCANCEL == dlg.DoModal()) { return FALSE; } - __ASSERT(dlg.GetSize() > 0, "font height 0 ۽ϴ."); + __ASSERT(dlg.GetSize() > 0, "font height가 0보다 작습니다."); CString strTmp = dlg.GetFaceName(); - std::string strFontName = "ü"; + std::string strFontName = "굴림체"; if (strTmp.GetLength() > 0) { strFontName = strTmp; } @@ -696,18 +696,18 @@ BOOL CUIEDoc::SetStringInfos(CN3UIString * pUI) { COLORREF color = dlg.GetColor(); D3DCOLOR d3dColor = 0xff000000 | ((color & 0x00ff0000) >> 16) | (color & 0x0000ff00) | ((color & 0x000000ff) << 16); pUI->SetColor(d3dColor); - // style - pFrm->MessageBox("1. â ١ڡ١[[[Style]]]١ڡ١ ֽð(߿),\n2. ġ ũ⸦ " - "ּ.\n3. ǥõ ڰ Ʒâ ּ."); + // style 지정 + pFrm->MessageBox("1. 왼쪽 창에서 ☆★☆★[[[Style]]]☆★☆★을 지정해주시고(중요),\n2. 위치와 크기를 " + "정해주세요.\n3. 표시될 글자가 있으면 왼쪽 아래창에 써주세요."); return TRUE; } BOOL CUIEDoc::SetTrackBarInfos(CN3UITrackBar * pUI) { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); - // background̹ thumb̹ ϰ + // background이미지와 thumb이미지를 설정하고 CN3UIImage * pUIImage = pUI->GetBkGndImgRef(); ASSERT(pUIImage); - // texture + // texture 설정 char szTexture[_MAX_PATH]; while (1) { if (FALSE == SelectTexture(szTexture)) { @@ -720,7 +720,7 @@ BOOL CUIEDoc::SetTrackBarInfos(CN3UITrackBar * pUI) { break; } } - // image normal on down disable׸ + // image의 normal on down disable그림 영역 설정 CDlgTexture dlg; dlg.SetTexture(szTexture); char szNames[2][20] = {"Back", "Thumb"}; @@ -746,7 +746,7 @@ BOOL CUIEDoc::SetTrackBarInfos(CN3UITrackBar * pUI) { rcRegion.OffsetRect(-rcRegion.TopLeft()); pUIImage->SetRegion(rcRegion); } - // background image trackbar + // background image영역을 가져와 trackbar 영역을 설정 rcRegion = dlg.GetImageRect(0); rcRegion.OffsetRect(-rcRegion.TopLeft()); pUI->SetRegion(rcRegion); @@ -757,7 +757,7 @@ BOOL CUIEDoc::SetButtonInfos(CN3UIButton * pUI) { CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); CN3UIImage * pUIImage = pUI->GetImageRef(CN3UIButton::BS_NORMAL); ASSERT(pUIImage); - // texture + // texture 설정 char szTexture[_MAX_PATH]; while (1) { if (FALSE == SelectTexture(szTexture)) { @@ -770,7 +770,7 @@ BOOL CUIEDoc::SetButtonInfos(CN3UIButton * pUI) { break; } } - // image normal on down disable׸ + // image의 normal on down disable그림 영역 설정 CDlgTexture dlg; dlg.SetTexture(szTexture); char szNames[4][_MAX_PATH] = {"Normal", "Down", "On", "Disable"}; @@ -800,7 +800,7 @@ void CUIEDoc::OnFileExportTooltip() { if (NULL == pUI) { return; } - ASSERT(UI_TYPE_STATIC == pUI->UIType()); // tooltip static ӹް ϴ . + ASSERT(UI_TYPE_STATIC == pUI->UIType()); // tooltip은 static에서 상속받고 따로 저장하는 정보가 없다. DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; CFileDialog dlg(FALSE, "uif", NULL, dwFlags, "UI Files(*.uif)|*.uif;||", NULL); @@ -860,7 +860,7 @@ void CUIEDoc::OnEditDuplicate() { CN3UIStatic * pUINew = new CN3UIStatic(); *pUINew = *((CN3UIStatic *)pUISrc); pUIDest = pUINew; - } break; // static (׸ ڰ Ŭ) + } break; // static (배경그림과 글자가 나오는 클래스) case UI_TYPE_PROGRESS: { CN3UIProgress * pUINew = new CN3UIProgress(); *pUINew = *((CN3UIProgress *)pUISrc); @@ -927,7 +927,7 @@ void CUIEDoc::OnEditDuplicate() { pUIDest->MoveOffset(10, 10); } - // region ϴ Լ  óϱ + // region 갱신하는 함수 만들어서 처리하기 CMainFrame * pFrm = (CMainFrame *)AfxGetMainWnd(); pFrm->GetRightPane()->SelectRectType(CUIEView::RT_REGION); @@ -945,25 +945,25 @@ void CUIEDoc::OnEditMakeGroup() { pUI = *it; if (iUIC == iUIC) { pUIFirst = pUI; - } else // оƮ Ȯ.. + } else // 모두 같은 패어런트인지 확인.. { if (pUIFirst->GetParent() != pUI->GetParent()) { - MessageBox(AfxGetMainWnd()->m_hWnd, "׷ų UI оƮ ־ մϴ.", - "׷ ", MB_OK); + MessageBox(AfxGetMainWnd()->m_hWnd, "그룹시킬 UI 는 모두 같은 패어런트에 있어야 합니다.", + "그룹지정 실패", MB_OK); return; } } } if (iUIC <= 1) { - MessageBox(AfxGetMainWnd()->m_hWnd, "ΰ̻ UI ؾ ׷ ֽϴ.", "׷ ", + MessageBox(AfxGetMainWnd()->m_hWnd, "두개이상의 UI 를 선택해야 그룹을 만들수 있습니다.", "그룹지정 실패", MB_OK); return; } CN3UIBase * pUIParentOld = pUIFirst->GetParent(); CN3UIBase * pUIParentNew = new CN3UIBase(); - pUIParentNew->Init(pUIParentOld); // ׷ оƮ ؿ ְ.. + pUIParentNew->Init(pUIParentOld); // 그룹을 예전 패어런트 밑에 넣고.. it = m_SelectedUIs.begin(); itEnd = m_SelectedUIs.end(); @@ -1117,11 +1117,11 @@ void CUIEDoc::OnEditReplaceTex() { } if (m_RootUI.ReplaceAllTextures(LPCTSTR(dlg.m_strFind), LPCTSTR(dlg.m_strReplace))) { CString strMsg; - strMsg.Format("%s ؽĸ %s ؽķ ٲپϴ.", dlg.m_strFind, dlg.m_strReplace); + strMsg.Format("%s 텍스쳐를 %s 텍스쳐로 모두 바꾸었습니다.", dlg.m_strFind, dlg.m_strReplace); AfxGetMainWnd()->MessageBox(strMsg); } else { CString strMsg; - strMsg.Format("%s ؽĸ %s ؽ ٲٱ Ͽϴ.", dlg.m_strFind, dlg.m_strReplace); + strMsg.Format("%s 텍스쳐를 %s 텍스쳐 바꾸기 실패 하였습니다.", dlg.m_strFind, dlg.m_strReplace); AfxGetMainWnd()->MessageBox(strMsg); } } @@ -1154,7 +1154,7 @@ void CUIEDoc::OnBatchToolChangeImagePath() { return; } - CDlgChangeImage dlg2; // ̹ ̸ .. + CDlgChangeImage dlg2; // 이미지 파일 이름 가져오기.. if (dlg2.DoModal() == IDCANCEL) { return; } @@ -1189,7 +1189,7 @@ void CUIEDoc::OnBatchToolChangeFont() { return; } - CFontDialog dlg2; // ̹ ̸ .. + CFontDialog dlg2; // 이미지 파일 이름 가져오기.. if (dlg2.DoModal() == IDCANCEL) { return; } @@ -1231,14 +1231,14 @@ void CUIEDoc::OnBatchToolGatherImageFileName() { base.GatherImageFileName(setImgFNs); } - // ϱ.. + // 폴더 선택하기.. char szFolder[_MAX_PATH] = ""; BROWSEINFO bi; LPCITEMIDLIST lpidl; bi.hwndOwner = AfxGetMainWnd()->m_hWnd; bi.pidlRoot = NULL; bi.pszDisplayName = szFolder; - bi.lpszTitle = "̸ ּ"; + bi.lpszTitle = "파일이름을 비교할 폴더를 선택해주세요"; bi.ulFlags = BIF_RETURNONLYFSDIRS; bi.lpfn = NULL; bi.lParam = 0; diff --git a/src/tool/UIE/UIEDoc.h b/src/tool/UIE/UIEDoc.h index 9f8e6ce6..82fbbbbf 100644 --- a/src/tool/UIE/UIEDoc.h +++ b/src/tool/UIE/UIEDoc.h @@ -15,7 +15,7 @@ class CUIEDoc : public CDocument { DECLARE_DYNCREATE(CUIEDoc) protected: - CN3UIBase m_RootUI; // Ϳ child(tool control) ̸ ȴ. + CN3UIBase m_RootUI; // 이 것에 child(tool에서 만드는 모든 control)들을 붙이면 된다. std::list m_SelectedUIs; public: @@ -34,8 +34,8 @@ class CUIEDoc : public CDocument { void SetSelectedUI(CN3UIBase * pUI); protected: - void Release(); // Document ʱȭ - BOOL SetImageInfos(CN3UIImage * pUI); // image ִ ƾ + void Release(); // Document 변수 초기화 + BOOL SetImageInfos(CN3UIImage * pUI); // image정보 넣는 루틴 BOOL SetStringInfos(CN3UIString * pUI); // string BOOL SetTrackBarInfos(CN3UITrackBar * pUI); // track bar BOOL SetButtonInfos(CN3UIButton * pUI); // button diff --git a/src/tool/UIE/UIEView.cpp b/src/tool/UIE/UIEView.cpp index 1fed30b7..074d28b5 100644 --- a/src/tool/UIE/UIEView.cpp +++ b/src/tool/UIE/UIEView.cpp @@ -92,7 +92,7 @@ void CUIEView::OnDraw(CDC * pDC) { ASSERT_VALID(pDoc); if (UIEMODE_PREVIEW == m_eMode) { - return; // preview϶ ׳ + return; // preview일때는 그냥 리턴 } int iUIC = pDoc->GetSelectedUICount(); @@ -112,7 +112,7 @@ void CUIEView::OnDraw(CDC * pDC) { pDC->SelectObject(pOldPen); } - if (RT_NONE == m_eSelectedRectType) { // Rect ƴҶ Rect ǥ + if (RT_NONE == m_eSelectedRectType) { // Rect 수정중이 아닐때 각각 Rect 표시 // region RECT rcRegion = pUI->GetRegion(); @@ -146,7 +146,7 @@ void CUIEView::OnDraw(CDC * pDC) { } } - if (RT_NONE != m_eSelectedRectType) // Rect ϶ Rect ǥ + if (RT_NONE != m_eSelectedRectType) // Rect 수정중일때 각각 Rect 표시 { CPen SelPen(PS_DOT, 1, RGB(0, 0, 0)); CPen * pOldPen = pDC->SelectObject(&SelPen); @@ -154,7 +154,7 @@ void CUIEView::OnDraw(CDC * pDC) { pDC->SelectObject(pOldPen); } - if (m_bViewGrid) // ׸ .. + if (m_bViewGrid) // 그리드 보기.. { CRect rc; CPen pen, penThick; @@ -239,7 +239,7 @@ BOOL CUIEView::OnEraseBkgnd(CDC * pDC) { pEng->s_lpD3DDev->BeginScene(); - // ׸... + // 그리기... switch (m_eMode) { case UIEMODE_PREVIEW: RenderPreview(); @@ -274,7 +274,7 @@ void CUIEView::OnLButtonDown(UINT nFlags, CPoint point) { } } else if (UIEMODE_EDIT == m_eMode) { CN3UIBase * pSelectedUI = pDoc->GetSelectedUI(); - if (RT_NONE != m_eSelectedRectType && pSelectedUI) { // 簢 ϶ + if (RT_NONE != m_eSelectedRectType && pSelectedUI) { // 지정된 사각형 변형일때 if (-1000 != m_rcSelectedRect.left) { m_eDragType = CheckDragType(m_rcSelectedRect, point); } else { @@ -282,9 +282,9 @@ void CUIEView::OnLButtonDown(UINT nFlags, CPoint point) { } } - if (DRAGTYPE_NONE == m_eDragType) { // m_RootUI ڽ߿ point ġ ui ϱ + if (DRAGTYPE_NONE == m_eDragType) { // m_RootUI의 자식중에서 point에 위치한 ui 선택하기 if (!(nFlags & MK_CONTROL)) { - pDoc->SetSelectedUI(NULL); // Ʈ Ű Ƽ Ʈ .. + pDoc->SetSelectedUI(NULL); // 컨트롤 키를 누르지 않으면 멀티 셀렉트 해제후.. } CN3UIBase * pRootUI = GetDocument()->GetRootUI(); @@ -298,7 +298,7 @@ void CUIEView::OnLButtonDown(UINT nFlags, CPoint point) { } if (NULL == pUISelected && pRootUI->IsIn(point.x, point.y)) { - pUISelected = pRootUI; // ϰ͵ ƮUI . + pUISelected = pRootUI; // 암것도 못찍으면 루트UI를 찍어본다. } if (pUISelected) { pDoc->SetSelectedUI(pUISelected); @@ -439,7 +439,7 @@ BOOL CUIEView::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT message) { if (UIEMODE_EDIT == m_eMode && RT_NONE != m_eSelectedRectType) { char * pszRsrcID = NULL; eDRAGTYPE eDT = m_eDragType; - if (DRAGTYPE_NONE == m_eDragType) // 巹 ƴϸ cursor ġ  ׽Ʈϱ + if (DRAGTYPE_NONE == m_eDragType) // 드레그 중이 아니면 cursor의 위치를 얻어서 테스트하기 { CPoint pt; if (GetCursorPos(&pt)) { @@ -484,14 +484,14 @@ BOOL CUIEView::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT message) { return CView::OnSetCursor(pWnd, nHitTest, message); } -// mode ٲٱ +// mode 바꾸기 void CUIEView::SetMode(eUIE_MODE eMode) { m_eMode = eMode; UpdateStatusBarText(); Invalidate(); } -// ̸ render +// 미리보기 render void CUIEView::RenderPreview() { CUIEDoc * pDoc = GetDocument(); if (NULL == pDoc) { @@ -527,7 +527,7 @@ void CUIEView::RenderPreview() { lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); } if (FALSE != dwFog) { - lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); // 2d fog Դ´ .; + lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); // 2d도 fog를 먹는다 ㅡ.ㅡ; } if (D3DTEXF_POINT != dwMagFilter) { lpD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); @@ -608,7 +608,7 @@ void CUIEView::RenderEditview() { lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); } if (FALSE != dwFog) { - lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); // 2d fog Դ´ .; + lpD3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); // 2d도 fog를 먹는다 ㅡ.ㅡ; } if (D3DTEXF_POINT != dwMagFilter) { lpD3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); @@ -630,7 +630,7 @@ void CUIEView::RenderEditview() { for (int i = 0; i < iUIC; i++) { CN3UIBase * pUI = pDoc->GetSelectedUI(i); if (pUI) { - pUI->Render(); // õ UIѹ ׸(ڿ ϱ ѹ ׸. button Ư) + pUI->Render(); // 선택된 UI한번 더 그리기(뒤에 가릴 수도 있으니까 한번 더 그린다. button같은 경우 특히) } } @@ -666,14 +666,14 @@ void CUIEView::SelectRectType(eRECTTYPE eRectType) { m_rcSelectedRect.SetRect(-1000, -1000, -1000, -1000); CN3UIBase * pSelectedUI = GetDocument()->GetSelectedUI(); - // õ UI RT_NONE + // 선택된 UI가 없으면 RT_NONE으로 만들고 리턴 if (NULL == pSelectedUI) { m_eSelectedRectType = RT_NONE; Invalidate(); return; } - // õ UI RectType ´ 簢 + // 선택된 UI에서 RectType에 맞는 사각형 가져오기 switch (m_eSelectedRectType) { case RT_NONE: case RT_REGION: @@ -814,7 +814,7 @@ BOOL CUIEView::MoveSelectedRect(int dx, int dy) { return FALSE; } -// selected rect UI ϱ +// selected rect정보를 토대로 UI 정보를 갱신하기 void CUIEView::UpdateUIInfo_SelectedRect() { CUIEDoc * pDoc = this->GetDocument(); CN3UIBase * pSelectedUI = pDoc->GetSelectedUI(pDoc->GetSelectedUICount() - 1); @@ -835,7 +835,7 @@ void CUIEView::UpdateUIInfo_SelectedRect() { CPoint ptOffset = ptMouse - m_ptOldLBPos; pSelectedUI->MoveOffset(ptOffset.x, ptOffset.y); } else if (i == 0 && m_eDragType >= DRAGTYPE_LEFT && - m_eDragType <= DRAGTYPE_RIGHTBOTTOM) // UI + m_eDragType <= DRAGTYPE_RIGHTBOTTOM) // 마지막에 선택한 UI { pSelectedUI->SetRegion(m_rcSelectedRect); pSelectedUI->SetSize(m_rcSelectedRect.Width(), m_rcSelectedRect.Height()); @@ -844,9 +844,9 @@ void CUIEView::UpdateUIInfo_SelectedRect() { pSelectedUI->SetSize(m_rcSelectedRect.Width(), m_rcSelectedRect.Height()); } - if (pSelectedUI->GetParent()) // θ UI .. + if (pSelectedUI->GetParent()) // 부모 UI 가 있으면.. { - pSelectedUI->GetParent()->ResizeAutomaticalyByChild(); // ڵ ٽ .. + pSelectedUI->GetParent()->ResizeAutomaticalyByChild(); // 자동으로 영역 다시 계산.. } } @@ -939,7 +939,7 @@ BOOL CUIEView::PreTranslateMessage(MSG * pMsg) { } void CUIEView::OnViewGrid() { - m_bViewGrid = !m_bViewGrid; // ׸ .. + m_bViewGrid = !m_bViewGrid; // 그리드 보기.. this->InvalidateRect(NULL, FALSE); } diff --git a/src/tool/UIE/UIEView.h b/src/tool/UIE/UIEView.h index 128b98de..fc74ce98 100644 --- a/src/tool/UIE/UIEView.h +++ b/src/tool/UIE/UIEView.h @@ -32,14 +32,14 @@ class CUIEView : public CView { protected: // int m_iZoom; HACCEL m_hAccelTable; - eUIE_MODE m_eMode; // Mode - eRECTTYPE m_eSelectedRectType; // ϴ 簢 (, ̴ , Ŭ ) - CPoint m_ptOldMouse; // 콺 ǥ - CPoint m_ptOldLBPos; // ư 콺.. + eUIE_MODE m_eMode; // 현재 Mode + eRECTTYPE m_eSelectedRectType; // 수정하는 사각형 종류 (영역, 움직이는 영역, 클릭 영역) + CPoint m_ptOldMouse; // 이전 마우스 좌표 + CPoint m_ptOldLBPos; // 이전에 왼쪽 버튼으로 찍은 마우스.. - COLORREF m_RegionRectColor; // 簢 ǥϴ - COLORREF m_MoveRectColor; // ̴ 簢 ǥϴ - COLORREF m_ClickRectColor; // click 簢 ǥϴ + COLORREF m_RegionRectColor; // 영역 사각형을 표시하는 선 색 + COLORREF m_MoveRectColor; // 움직이는 영역 사각형을 표시하는 선 색 + COLORREF m_ClickRectColor; // click 사각형을 표시하는 선 색 enum eDRAGTYPE { DRAGTYPE_NONE = 0, @@ -53,23 +53,23 @@ class CUIEView : public CView { DRAGTYPE_LEFTBOTTOM, DRAGTYPE_RIGHTBOTTOM }; - eDRAGTYPE m_eDragType; // Drag - CRect m_rcSelectedRect; // õ 簢 + eDRAGTYPE m_eDragType; // Drag 상태 + CRect m_rcSelectedRect; // 선택된 사각형 영역 - BOOL m_bViewGrid; // ׸ .. + BOOL m_bViewGrid; // 그리드 보기.. // Operations public: CN3UIBase * Pick(const POINT & point, CN3UIBase * pUI); - void SetMode(eUIE_MODE eMode); // 带 ϴ Լ(Edit, Preview) - void SelectRectType(eRECTTYPE eRectType); // ϴ 簢 (, ̴ , Ŭ ) ϴ Լ - void ChangeBkgndColor(); // ٲ + void SetMode(eUIE_MODE eMode); // 모드를 변경하는 함수(Edit, Preview) + void SelectRectType(eRECTTYPE eRectType); // 수정하는 사각형 종류(영역, 움직이는 영역, 클릭 영역)를 정하는 함수 + void ChangeBkgndColor(); // 배경색을 바꿈 protected: - void RenderPreview(); // Preview ȭ ϴ Լ - void RenderEditview(); // Editview ȭ ϴ Լ - eDRAGTYPE CheckDragType(CRect rcSel, CPoint point); // 콺 ġ 巡 ¸ ϴ Լ - void UpdateStatusBarText(); // Status Bar text ¿ ް ϴ Լ - void UpdateUIInfo_SelectedRect(); // selected rect UI ϱ + void RenderPreview(); // Preview 화면을 렌더하는 함수 + void RenderEditview(); // Editview 화면을 렌더하는 함수 + eDRAGTYPE CheckDragType(CRect rcSel, CPoint point); // 마우스 위치에 따라 드래그 상태를 구별하는 함수 + void UpdateStatusBarText(); // Status Bar text를 현재 상태에 받게 갱신하는 함수 + void UpdateUIInfo_SelectedRect(); // selected rect정보를 토대로 UI 정보를 갱신하기 public: // Overrides // ClassWizard generated virtual function overrides diff --git a/src/tool/UIE/res/UIE.rc2 b/src/tool/UIE/res/UIE.rc2 index e4d9f3b79e14f962fc75d2825f726738e4ea921b..eaa1907241bb9eb1e04454c35e09b9f65f062849 100644 GIT binary patch literal 766 zcmd6ly9&ZU5JhjRU$I~*8t@OqScquES1X!qFrX2l7XG|?CPXY0v<$=U&O7&J=5Y@c zsL2WBw9-gJbv4&OJ?svrkk?r!UD4uFcbX_eFYsC<)rGt@zB5@{9k2#!BTfl%t9Q!L zEYIW1O3hyD9%CJJt57s~TSQXwJhxL{GcB|PT?oEN8}2FJi!=spNPdF~PcK7MP;t?| zMB}K>=Ba&61H zx!1>Av#(0ENl3&AgpoZMwghp15M3Yde)%g?2~EfbwEkhLXk2k#737HU=%yIdF7I@N NUuBFWlx5l4-X}5nWEB7a diff --git a/src/tool/Widget/PropertyList.cpp b/src/tool/Widget/PropertyList.cpp index 43dc6f4f..226d30bc 100644 --- a/src/tool/Widget/PropertyList.cpp +++ b/src/tool/Widget/PropertyList.cpp @@ -101,10 +101,10 @@ void CPropertyList::DrawItem(LPDRAWITEMSTRUCT lpDIS) { dc.DrawText(pItem->m_propName, CRect(rect2.left + 3, rect2.top + 3, rect2.right - 3, rect2.bottom + 3), DT_LEFT | DT_SINGLELINE); - // ÷.. + // 만약 컬러면.. if (pItem->m_nItemType == PIT_COLOR) { dc.FillSolidRect(CRect(rect.left + 2, rect.top + 2, rect.right - 4, rect.bottom - 4), - pItem->m_crColor); // ׸.. + pItem->m_crColor); // 배경 색 그리기.. } else if (pItem->m_nItemType == PIT_COMBO) { int nSel = pItem->m_crColor; if (nSel >= 0 && nSel < pItem->m_szCBItemsOrFilter.GetSize()) { @@ -313,7 +313,7 @@ void CPropertyList::OnSelchangeCmbBox() { CWnd * pWnd = GetParent(); if (pWnd) { - pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // θ 쿡 ޽ .. + pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // 부모 윈도우에 메시지 보내기.. } } } @@ -327,7 +327,7 @@ void CPropertyList::OnChangeEditBox() { CWnd * pWnd = GetParent(); if (pWnd) { - pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // θ 쿡 ޽ .. + pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // 부모 윈도우에 메시지 보내기.. } } @@ -347,7 +347,7 @@ void CPropertyList::OnButton() { CWnd * pWnd = GetParent(); if (pWnd) { - pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // θ 쿡 ޽ .. + pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // 부모 윈도우에 메시지 보내기.. } } else if (pItem->m_nItemType == PIT_FILE) { @@ -371,7 +371,7 @@ void CPropertyList::OnButton() { CWnd * pWnd = GetParent(); if (pWnd) { - pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // θ 쿡 ޽ .. + pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // 부모 윈도우에 메시지 보내기.. } } else if (pItem->m_nItemType == PIT_FILE_MULTI) { @@ -397,7 +397,7 @@ void CPropertyList::OnButton() { for ( int i = 1; i < iSC - 1; - i++) // 1 ϴ ȭڿ θ ÷ ̸ ٲ ̴. + i++) // 1 부터 시작하는 이유는 파일 대화상자에서 여러 파일을 부르면 첨과 끝 파일 이름이 바뀌기 때문이다. { pItem->m_curValue += szFNs[i]; pItem->m_curValue += '\n'; @@ -411,7 +411,7 @@ void CPropertyList::OnButton() { CWnd * pWnd = GetParent(); if (pWnd) { - pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // θ 쿡 ޽ .. + pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // 부모 윈도우에 메시지 보내기.. } } } @@ -429,12 +429,12 @@ void CPropertyList::OnButton() { CWnd * pWnd = GetParent(); if (pWnd) { - pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // θ 쿡 ޽ .. + pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // 부모 윈도우에 메시지 보내기.. } } else { CWnd * pWnd = GetParent(); if (pWnd) { - pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // θ 쿡 ޽ .. + pWnd->SendMessage(WM_NOTIFY, (DWORD)this, (DWORD)pItem); // 부모 윈도우에 메시지 보내기.. } } } diff --git a/src/tool/Widget/PropertyList.h b/src/tool/Widget/PropertyList.h index 6a75d347..be83a97d 100644 --- a/src/tool/Widget/PropertyList.h +++ b/src/tool/Widget/PropertyList.h @@ -17,7 +17,7 @@ #define PIT_COLOR 2 #define PIT_FONT 3 #define PIT_FILE 4 -#define PIT_FILE_MULTI 5 // FileName1'\n'FileName2'\n'....FileName'\n' ̷ ڿ ȴ.. +#define PIT_FILE_MULTI 5 // FileName1'\n'FileName2'\n'....FileName'\n' 이렇게 문자열이 된다.. #define PIT_CHECK 6 #define PIT_BUTTON 7 @@ -31,10 +31,10 @@ class CPropertyItem { // Attributes public: CString m_propName; - CString m_curValue; // Color Alpha ε δ.. + CString m_curValue; // Color 값의 Alpha 값으로도 쓰인다.. int m_nItemType; CStringArray m_szCBItemsOrFilter; - COLORREF m_crColor; // ColorReference | Combo Box Index δ.. + COLORREF m_crColor; // ColorReference | Combo Box Index 로 쓰인다.. public: void D3DColorSet(D3DCOLOR color); From 1854329f6eaadceb4c1aff371c9076bfee197351 Mon Sep 17 00:00:00 2001 From: Steve Williams <90905675+stevewgr@users.noreply.github.com> Date: Sat, 20 Jul 2024 15:50:12 -0400 Subject: [PATCH 3/7] Configure vscode to use LF line feed for newly created files. --- .vscode/settings.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.vscode/settings.json b/.vscode/settings.json index 19f6ddb5..d665cdce 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "files.autoGuessEncoding": true, + "files.eol": "\n", "files.associations": { "vector": "cpp", "algorithm": "cpp", From 0518207a0d30c8f92d913917888c18e4e76567e3 Mon Sep 17 00:00:00 2001 From: Steve Williams <90905675+stevewgr@users.noreply.github.com> Date: Sat, 20 Jul 2024 16:29:12 -0400 Subject: [PATCH 4/7] Run clang-format pass after transcoding. --- src/engine/N3Base/BitMapFile.h | 10 ++-- src/engine/N3Base/DFont.h | 8 +-- src/engine/N3Base/JPEG.H | 4 +- src/engine/N3Base/My_3DStruct.h | 12 ++--- src/engine/N3Base/N3AlphaPrimitiveManager.h | 4 +- src/engine/N3Base/N3AnimControl.h | 6 +-- src/engine/N3Base/N3Base.cpp | 14 ++--- src/engine/N3Base/N3Base.h | 10 ++-- src/engine/N3Base/N3Chr.cpp | 4 +- src/engine/N3Base/N3Chr.h | 8 +-- src/engine/N3Base/N3GlobalEffect.h | 6 +-- src/engine/N3Base/N3IMesh.h | 10 ++-- src/engine/N3Base/N3Joint.cpp | 2 +- src/engine/N3Base/N3Joint.h | 2 +- src/engine/N3Base/N3Mng.h | 2 +- src/engine/N3Base/N3PMesh.h | 4 +- src/engine/N3Base/N3PMeshCreate.h | 4 +- src/engine/N3Base/N3Pond.cpp | 4 +- src/engine/N3Base/N3Shape.h | 2 +- src/engine/N3Base/N3ShapeEx.h | 12 ++--- src/engine/N3Base/N3ShapeMgr.cpp | 12 ++--- src/engine/N3Base/N3ShapeMgr.h | 16 +++--- src/engine/N3Base/N3ShapeMod.h | 22 ++++---- src/engine/N3Base/N3Sky.cpp | 2 +- src/engine/N3Base/N3SkyMng.cpp | 2 +- src/engine/N3Base/N3SkyMng.h | 4 +- src/engine/N3Base/N3SndMgr.h | 2 +- src/engine/N3Base/N3SndObj.h | 4 +- src/engine/N3Base/N3TableBase.h | 2 +- src/engine/N3Base/N3Texture.h | 2 +- src/engine/N3Base/N3UIBase.h | 10 ++-- src/engine/N3Base/N3UIDef.h | 28 +++++----- src/engine/N3Base/N3UIEdit.h | 4 +- src/engine/N3Base/N3UIImage.h | 6 +-- src/engine/N3Base/N3UIManager.cpp | 2 +- src/engine/N3Base/N3UIProgress.cpp | 14 ++--- src/engine/N3Base/N3UITrackBar.cpp | 4 +- src/game/DungeonManager.cpp | 2 +- src/game/GameBase.cpp | 12 ++--- src/game/GameBase.h | 36 ++++++------- src/game/GameDef.h | 10 ++-- src/game/GameEng.cpp | 4 +- src/game/GameEng.h | 20 +++---- src/game/GameProcCharacterCreate.cpp | 2 +- src/game/GameProcCharacterSelect.cpp | 12 ++--- src/game/GameProcLogIn.cpp | 2 +- src/game/GameProcMain.cpp | 58 ++++++++++----------- src/game/GameProcMain.h | 32 ++++++------ src/game/GameProcedure.cpp | 36 ++++++------- src/game/GameProcedure.h | 4 +- src/game/ItemRepairMgr.cpp | 4 +- src/game/LocalInput.cpp | 2 +- src/game/Main.cpp | 2 +- src/game/N3EffectWave2.cpp | 4 +- src/game/N3TerrainManager.cpp | 2 +- src/game/N3WorldBase.h | 2 +- src/game/PacketDef.h | 46 ++++++++-------- src/game/PlayerBase.cpp | 28 +++++----- src/game/PlayerBase.h | 48 ++++++++--------- src/game/PlayerMySelf.cpp | 8 +-- src/game/PlayerMySelf.h | 6 +-- src/game/PlayerNPC.h | 2 +- src/game/PlayerOtherMgr.cpp | 2 +- src/game/PlayerOtherMgr.h | 26 ++++----- src/game/SubProcPerTrade.h | 14 ++--- src/game/UIChat.h | 28 +++++----- src/game/UIDead.cpp | 2 +- src/game/UIInventory.cpp | 10 ++-- src/game/UIInventory.h | 6 +-- src/game/UIManager.cpp | 8 +-- src/game/UIMessageWnd.h | 12 ++--- src/game/UISkillTreeDlg.cpp | 4 +- src/game/UISkillTreeDlg.h | 6 +-- src/game/UIVarious.cpp | 4 +- src/game/UIVarious.h | 6 +-- src/server/AIServer/AIServerDlg.cpp | 30 +++++------ src/server/AIServer/AIServerDlg.h | 4 +- src/server/AIServer/Define.h | 2 +- src/server/AIServer/MAP.h | 8 +-- src/server/AIServer/N3BASE/My_3DStruct.h | 8 +-- src/server/AIServer/N3BASE/N3ShapeMgr.cpp | 16 +++--- src/server/AIServer/N3BASE/N3ShapeMgr.h | 24 ++++----- src/server/AIServer/Npc.cpp | 4 +- src/server/AIServer/Npc.h | 40 +++++++------- src/server/Ebenezer/EbenezerDlg.h | 6 +-- src/server/Ebenezer/Map.cpp | 6 +-- src/server/Ebenezer/N3BASE/My_3DStruct.h | 8 +-- src/server/Ebenezer/N3BASE/N3ShapeMgr.cpp | 16 +++--- src/server/Ebenezer/N3BASE/N3ShapeMgr.h | 24 ++++----- src/tool/N3CE/TransDummy.h | 12 ++--- src/tool/N3Indoor/MainFrm.h | 26 ++++----- src/tool/N3Indoor/TransDummy.h | 2 +- src/tool/N3ME/DlgRiverProperty.cpp | 2 +- src/tool/N3ME/LyTerrain.cpp | 2 +- src/tool/N3ME/LyTerrain.h | 12 ++--- src/tool/N3ME/MapMng.h | 38 +++++++------- src/tool/N3ME/PondMesh.cpp | 10 ++-- src/tool/N3ME/PondMesh.h | 4 +- src/tool/N3ME/PondMng.cpp | 6 +-- src/tool/N3ME/PondMng.h | 4 +- src/tool/N3ME/RiverMesh.cpp | 28 +++++----- src/tool/N3ME/RiverMng.cpp | 6 +-- src/tool/N3ME/RiverMng.h | 2 +- src/tool/N3ME/TransDummy.h | 14 ++--- src/tool/PlugIn_Max/N3DExp.cpp | 2 +- src/tool/PlugIn_Max/N3DExp.h | 2 +- src/tool/RscTables/TableGenerator.cpp | 2 +- src/tool/UIE/TexViewer.h | 20 +++---- src/tool/UIE/UIEView.h | 12 ++--- 109 files changed, 589 insertions(+), 589 deletions(-) diff --git a/src/engine/N3Base/BitMapFile.h b/src/engine/N3Base/BitMapFile.h index 039d04b0..c862ed1a 100644 --- a/src/engine/N3Base/BitMapFile.h +++ b/src/engine/N3Base/BitMapFile.h @@ -10,11 +10,11 @@ class CBitMapFile { BITMAPINFOHEADER m_bmInfoHeader; public: - void * m_pPixels; // 실제 픽셀 데이터 - int Pitch() { return ((int)((m_bmInfoHeader.biWidth * 3 + 3) / 4)) * 4; } // 비트맵의 실제 너비(byte 단위).. - bool Create(int nWidth, int nHeight, int nBPP = 24); - bool SaveRectToFile(const std::string & szFN, RECT rc); - void * Pixels(int x = 0, int y = 0); + void * m_pPixels; // 실제 픽셀 데이터 + int Pitch() { return ((int)((m_bmInfoHeader.biWidth * 3 + 3) / 4)) * 4; } // 비트맵의 실제 너비(byte 단위).. + bool Create(int nWidth, int nHeight, int nBPP = 24); + bool SaveRectToFile(const std::string & szFN, RECT rc); + void * Pixels(int x = 0, int y = 0); BITMAPINFOHEADER * GetBitmapInfoHeader() { return &m_bmInfoHeader; } BITMAPFILEHEADER * GetBitmapFileHeader() { return &m_bmfHeader; } bool Load(HANDLE hFile); diff --git a/src/engine/N3Base/DFont.h b/src/engine/N3Base/DFont.h index 0e05dca2..8dbd183e 100644 --- a/src/engine/N3Base/DFont.h +++ b/src/engine/N3Base/DFont.h @@ -83,9 +83,9 @@ class CDFont : public CN3Base { void AddToAlphaManager(DWORD dwColor, float fDist, __Matrix44 & mtxWorld, DWORD dwFlags); HRESULT SetFontColor(DWORD dwColor); // 글씨 색을 바꾼다. HRESULT InitDeviceObjects(LPDIRECT3DDEVICE9 pd3dDevice); // d3d device를 정해주는 초기화 함수 (Init할때 호출) - HRESULT RestoreDeviceObjects(); // resource를 메모리에 세팅하는 초기화 함수 (Init할때 호출) - HRESULT InvalidateDeviceObjects(); // resource등을 무효화시키는 함수 (release할때 호출) - HRESULT DeleteDeviceObjects(); // resource등을 메모리에서 해제 (release할때 호출) + HRESULT RestoreDeviceObjects(); // resource를 메모리에 세팅하는 초기화 함수 (Init할때 호출) + HRESULT InvalidateDeviceObjects(); // resource등을 무효화시키는 함수 (release할때 호출) + HRESULT DeleteDeviceObjects(); // resource등을 메모리에서 해제 (release할때 호출) HRESULT SetText(const std::string & szText, DWORD dwFlags = 0L); // 출력할 글씨가 달라졌을때만 호출하는 것이 중요. HRESULT DrawText(FLOAT sx, FLOAT sy, DWORD dwColor, DWORD dwFlags, @@ -97,7 +97,7 @@ class CDFont : public CN3Base { BOOL GetTextExtent(const std::string & szString, int iStrLen, SIZE * pSize); protected: - void Make2DVertex(const int iFontHeight, + void Make2DVertex(const int iFontHeight, const std::string & szText); // 입력 받은 문자를 적절하게 배치된 2d 폴리곤으로 만든다. void Make3DVertex(const int iFontHeight, const std::string & szText, DWORD dwFlags); // 입력 받은 문자를 적절하게 배치된 3d 폴리곤을 만든다. diff --git a/src/engine/N3Base/JPEG.H b/src/engine/N3Base/JPEG.H index 2665e54f..1101ee0d 100644 --- a/src/engine/N3Base/JPEG.H +++ b/src/engine/N3Base/JPEG.H @@ -87,8 +87,8 @@ class CJpeg { void PutSOS(HANDLE hFile); // ScanHeader를 삽입 void PutEOI(HANDLE hFile); // End of Image 마커를 삽입 - void ShotBit(BYTE Bit); // 1비트를 버퍼에 저장하는 함수 - void ChargeCode(WORD Code, int Size); // Size만큼의 길이(아랫자리로부터)로 Code를 버퍼에 저장하는 함수 + void ShotBit(BYTE Bit); // 1비트를 버퍼에 저장하는 함수 + void ChargeCode(WORD Code, int Size); // Size만큼의 길이(아랫자리로부터)로 Code를 버퍼에 저장하는 함수 void EncodeDU(short * pos, BOOL Flag, int bWidth); // 8x8 Block을 인코드하는 함수 void hEncode(int bWidth, int bHeight); // 허프만 인코딩 하는 부분 BYTE GetCategory(short V); // 주어진 값의 카테고리를 구하는 함수 diff --git a/src/engine/N3Base/My_3DStruct.h b/src/engine/N3Base/My_3DStruct.h index 946d7765..d9134bf1 100644 --- a/src/engine/N3Base/My_3DStruct.h +++ b/src/engine/N3Base/My_3DStruct.h @@ -820,12 +820,12 @@ const DWORD RF_NOTUSEFOG = 0x2; // 안개 무시 const DWORD RF_DOUBLESIDED = 0x4; // 양면 - D3DCULL_NONE const DWORD RF_BOARD_Y = 0x8; // Y 축으로 해서.. 카메라를 본다. const DWORD RF_POINTSAMPLING = 0x10; // MipMap 에서.. PointSampling 으로 한다.. -const DWORD RF_WINDY = 0x20; // 바람에 날린다.. 바람의 값은 CN3Base::s_vWindFactor 를 참조 한다.. -const DWORD RF_NOTUSELIGHT = 0x40; // Light Off -const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse 값을 갖고 투명하게 Alpha blending -const DWORD RF_NOTZWRITE = 0x100; // ZBuffer 에 안쓴다. -const DWORD RF_UV_CLAMP = 0x200; // texture UV적용을 Clamp로 한다..default는 wrap이다.. -const DWORD RF_NOTZBUFFER = 0x400; // ZBuffer 무시. +const DWORD RF_WINDY = 0x20; // 바람에 날린다.. 바람의 값은 CN3Base::s_vWindFactor 를 참조 한다.. +const DWORD RF_NOTUSELIGHT = 0x40; // Light Off +const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse 값을 갖고 투명하게 Alpha blending +const DWORD RF_NOTZWRITE = 0x100; // ZBuffer 에 안쓴다. +const DWORD RF_UV_CLAMP = 0x200; // texture UV적용을 Clamp로 한다..default는 wrap이다.. +const DWORD RF_NOTZBUFFER = 0x400; // ZBuffer 무시. struct __Material : public _D3DMATERIAL9 { public: diff --git a/src/engine/N3Base/N3AlphaPrimitiveManager.h b/src/engine/N3Base/N3AlphaPrimitiveManager.h index a50c0fae..86752889 100644 --- a/src/engine/N3Base/N3AlphaPrimitiveManager.h +++ b/src/engine/N3Base/N3AlphaPrimitiveManager.h @@ -24,8 +24,8 @@ struct __AlphaPrimitive { BOOL bUseVB; // 버텍스 버퍼, 인덱스 버퍼를 사용할 것인가 아닌가 const void * pwIndices; // 만약 Index 기반이면... NULL 이 아닌것을 넣으면 된다. int nVertexCount; - const void * pVertices; // 삼각형.. 벡터 형이지만.. 강제 형변환을 통해 다양한 점형식이 들어오도록 써야 한다.. - __Matrix44 MtxWorld; // Matrix + const void * pVertices; // 삼각형.. 벡터 형이지만.. 강제 형변환을 통해 다양한 점형식이 들어오도록 써야 한다.. + __Matrix44 MtxWorld; // Matrix }; const int MAX_ALPHAPRIMITIVE_BUFFER = 1024; diff --git a/src/engine/N3Base/N3AnimControl.h b/src/engine/N3Base/N3AnimControl.h index 1b051fc7..5d4c15fa 100644 --- a/src/engine/N3Base/N3AnimControl.h +++ b/src/engine/N3Base/N3AnimControl.h @@ -26,8 +26,8 @@ typedef struct __AnimData { float fFrmSound0; float fFrmSound1; - float fTimeBlend; // 다른 동작과 연결시 블렌딩 시간 - int iBlendFlags; // 블렌딩 플래그 0 이면 걍 블렌딩.. 1이면 루핑시 블렌딩 타임만큼 시간 지연 + float fTimeBlend; // 다른 동작과 연결시 블렌딩 시간 + int iBlendFlags; // 블렌딩 플래그 0 이면 걍 블렌딩.. 1이면 루핑시 블렌딩 타임만큼 시간 지연 float fFrmStrike0; float fFrmStrike1; @@ -39,7 +39,7 @@ typedef struct __AnimData { fFrmPlugTraceStart = fFrmPlugTraceEnd = 0; fFrmSound0 = fFrmSound1 = 0; fTimeBlend = 0.25f; // 기본 블렌딩 시간.. - iBlendFlags = 0; // 블렌딩 플래그 0 이면 걍 블렌딩.. 1이면 루핑시 블렌딩 타임만큼 시간 지연 + iBlendFlags = 0; // 블렌딩 플래그 0 이면 걍 블렌딩.. 1이면 루핑시 블렌딩 타임만큼 시간 지연 fFrmStrike0 = fFrmStrike1 = 0; } diff --git a/src/engine/N3Base/N3Base.cpp b/src/engine/N3Base/N3Base.cpp index 53810f2c..73da0526 100644 --- a/src/engine/N3Base/N3Base.cpp +++ b/src/engine/N3Base/N3Base.cpp @@ -40,15 +40,15 @@ CN3SndMgr CN3Base::s_SndMgr; //사운드 메니저. CN3SndMgr CN3Base::s_SndMgr; //사운드 메니저. #endif -CN3Mng CN3Base::s_MngTex; // Texture Manager -CN3Mng CN3Base::s_MngMesh; // Mesh Manager -CN3Mng CN3Base::s_MngVMesh; // 단순히 폴리곤만 갖고 있는 메시 - 주로 충돌 체크에 쓴다.. -CN3Mng CN3Base::s_MngPMesh; // Progressive Mesh Manager -CN3Mng CN3Base::s_MngJoint; // Joint Manager +CN3Mng CN3Base::s_MngTex; // Texture Manager +CN3Mng CN3Base::s_MngMesh; // Mesh Manager +CN3Mng CN3Base::s_MngVMesh; // 단순히 폴리곤만 갖고 있는 메시 - 주로 충돌 체크에 쓴다.. +CN3Mng CN3Base::s_MngPMesh; // Progressive Mesh Manager +CN3Mng CN3Base::s_MngJoint; // Joint Manager CN3Mng CN3Base::s_MngSkins; // Character Part Skins Manager CN3Mng CN3Base::s_MngAniCtrl; // Animation Manager -CN3Mng CN3Base::s_MngFXPMesh; // FX에서 쓰는 PMesh - 파일은 일반 PMesh를 쓰지만 속은 다르다. -CN3Mng CN3Base::s_MngFXShape; // FX에서 쓰는 Shape - 파일은 일반 shape를 쓰지만 속은 다르다. +CN3Mng CN3Base::s_MngFXPMesh; // FX에서 쓰는 PMesh - 파일은 일반 PMesh를 쓰지만 속은 다르다. +CN3Mng CN3Base::s_MngFXShape; // FX에서 쓰는 Shape - 파일은 일반 shape를 쓰지만 속은 다르다. CN3AlphaPrimitiveManager CN3Base:: s_AlphaMgr; // Alpha blend 할 폴리곤들을 관리.. 추가했다가.. 카메라 거리에 맟추어 정렬하고 한꺼번에 그린다.. diff --git a/src/engine/N3Base/N3Base.h b/src/engine/N3Base/N3Base.h index 6b0747c1..d853145c 100644 --- a/src/engine/N3Base/N3Base.h +++ b/src/engine/N3Base/N3Base.h @@ -183,15 +183,15 @@ class CN3Base { static CN3AlphaPrimitiveManager s_AlphaMgr; // Alpha blend 할 폴리곤들을 관리.. 추가했다가.. 카메라 거리에 씗추어 정렬하고 한꺼번에 그린다.. - static CN3Mng s_MngTex; // Texture Manager - static CN3Mng s_MngMesh; // Normal Mesh Manager - static CN3Mng s_MngVMesh; // 단순히 폴리곤만 갖고 있는 메시 - 주로 충돌 체크에 쓴다.. + static CN3Mng s_MngTex; // Texture Manager + static CN3Mng s_MngMesh; // Normal Mesh Manager + static CN3Mng s_MngVMesh; // 단순히 폴리곤만 갖고 있는 메시 - 주로 충돌 체크에 쓴다.. static CN3Mng s_MngPMesh; // Progressive Mesh Manager static CN3Mng s_MngJoint; // Joint Manager static CN3Mng s_MngSkins; // Character Part Skin Manager static CN3Mng s_MngAniCtrl; // Animation Manager - static CN3Mng s_MngFXPMesh; // FX에서 쓰는 PMesh - 파일은 일반 PMesh를 쓰지만 속은 다르다. - static CN3Mng s_MngFXShape; // FX에서 쓰는 Shape - 파일은 일반 shape를 쓰지만 속은 다르다. + static CN3Mng s_MngFXPMesh; // FX에서 쓰는 PMesh - 파일은 일반 PMesh를 쓰지만 속은 다르다. + static CN3Mng s_MngFXShape; // FX에서 쓰는 Shape - 파일은 일반 shape를 쓰지만 속은 다르다. protected: static std::string s_szPath; // 프로그램이 실행된 경로.. diff --git a/src/engine/N3Base/N3Chr.cpp b/src/engine/N3Base/N3Chr.cpp index 0ae6206a..fd892ceb 100644 --- a/src/engine/N3Base/N3Chr.cpp +++ b/src/engine/N3Base/N3Chr.cpp @@ -1119,7 +1119,7 @@ void CN3Chr::Release() { for (int i = 0; i < MAX_CHR_ANI_PART; i++) { m_nJointPartStarts[i] = -1; // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 시작 번호 - m_nJointPartEnds[i] = -1; // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 끝 번호 + m_nJointPartEnds[i] = -1; // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 끝 번호 m_FrmCtrl.Init(); m_FrmCtrlUpper.Init(); @@ -1489,7 +1489,7 @@ void CN3Chr::TickAnimationFrame() { if (m_FrmCtrl.bOnceAndFreeze) { m_FrmCtrl.fFrmCur = - m_FrmCtrl.pAniData->fFrmEnd; // 한번 에니메이션 하고 멈춰야 한다면.. 걍 멈춰 있는다.. + m_FrmCtrl.pAniData->fFrmEnd; // 한번 에니메이션 하고 멈춰야 한다면.. 걍 멈춰 있는다.. } else if (m_FrmCtrl.pAniData->iBlendFlags & 1) // 루핑 지연시간이 있으면.. { m_FrmCtrl.fFrmCur = m_FrmCtrl.pAniData->fFrmEnd; diff --git a/src/engine/N3Base/N3Chr.h b/src/engine/N3Base/N3Chr.h index 1a43d1ee..13569440 100644 --- a/src/engine/N3Base/N3Chr.h +++ b/src/engine/N3Base/N3Chr.h @@ -237,7 +237,7 @@ class CN3CPlug_Cloak : public CN3CPlugBase { #endif }; -const int MAX_CHR_ANI_PART = 2; // 0 - 상체, 1 - 하체 ::: 관절들을 나누어서 나누어서 에니메이션 설정.. +const int MAX_CHR_ANI_PART = 2; // 0 - 상체, 1 - 하체 ::: 관절들을 나누어서 나누어서 에니메이션 설정.. const int MAX_PLUG_TRACE = 2; // 최대 두개의 무기 궤적을 남긴다.. const int MAX_PLUG_TRACE_VERTEX = 64; // 무기 궤적 점의 수.. 점 8 개로는 잔상이 3단계로 남는다.. @@ -249,7 +249,7 @@ class CN3Chr : public CN3TransformCollision { friend class CPlayerMySelf; public: - int m_nLOD; // Level Of Detail - 강제로 세팅할수 있도록 한다.. + int m_nLOD; // Level Of Detail - 강제로 세팅할수 있도록 한다.. int m_nLOD_0; // Level Of Detail - 0가장 디테일한 값으로 계산된 LOD 강제로 세팅할수 있도록 한다.. protected: @@ -268,7 +268,7 @@ class CN3Chr : public CN3TransformCollision { class CN3FXPlug * m_pFXPlug; // 캐릭터에 FX를 붙이는 것. int m_nJointPartStarts[MAX_CHR_ANI_PART]; // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 시작 번호 - int m_nJointPartEnds[MAX_CHR_ANI_PART]; // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 끝 번호 + int m_nJointPartEnds[MAX_CHR_ANI_PART]; // 조인트의 일부분이 따로 에니메이션 되야 한다면.. 조인트 인덱스 끝 번호 // CN3Skin * m_pSkinCollision; @@ -408,7 +408,7 @@ class CN3Chr : public CN3TransformCollision { float FrmPrev() { return m_FrmCtrl.fFrmPrev; } float AniBlendDelta(); float AniSpeedDelta() { return m_fAniSpeedDelta; } // 에니메이션 속도 조정 변수 1 이보통, 더 크면 빨라진다.. - void AniSpeedDeltaSet(float fDelta) { + void AniSpeedDeltaSet(float fDelta) { if (fDelta > 0.1f && fDelta < 10.0f) { m_fAniSpeedDelta = fDelta; } diff --git a/src/engine/N3Base/N3GlobalEffect.h b/src/engine/N3Base/N3GlobalEffect.h index 27940090..436c0352 100644 --- a/src/engine/N3Base/N3GlobalEffect.h +++ b/src/engine/N3Base/N3GlobalEffect.h @@ -24,9 +24,9 @@ class CN3GlobalEffect : public CN3Transform { LPDIRECT3DINDEXBUFFER9 m_pIB; DWORD m_dwEffectType; BOOL m_bActive; - float m_fFadeTime; // 이시간 동안 차차 목표한 양만큼 파티클의 수가 늘어난다.. - float m_fFadeTimeCur; // 지난시간.. - int m_iFadeMode; // 1 - FadeIn 0... -1 FadeOut + float m_fFadeTime; // 이시간 동안 차차 목표한 양만큼 파티클의 수가 늘어난다.. + float m_fFadeTimeCur; // 지난시간.. + int m_iFadeMode; // 1 - FadeIn 0... -1 FadeOut // Operations public: diff --git a/src/engine/N3Base/N3IMesh.h b/src/engine/N3Base/N3IMesh.h index f2a30ce6..d5d85f09 100644 --- a/src/engine/N3Base/N3IMesh.h +++ b/src/engine/N3Base/N3IMesh.h @@ -32,11 +32,11 @@ class CN3IMesh : public CN3BaseFileAccess { void ReGenerateSmoothNormal(); void RenderSelected(); #endif // end of _N3TOOL - __Vector3 Min() { return m_vMin; } - __Vector3 Max() { return m_vMax; } - void FindMinMax(); - void Render(bool bUseTwoUV = false); - __VertexT1 * BuildVertexList(); // Vertex Buffer 에다가 점을 만든다.. 동시에 두번 사용하지 않도록 주의가 필요 + __Vector3 Min() { return m_vMin; } + __Vector3 Max() { return m_vMax; } + void FindMinMax(); + void Render(bool bUseTwoUV = false); + __VertexT1 * BuildVertexList(); // Vertex Buffer 에다가 점을 만든다.. 동시에 두번 사용하지 않도록 주의가 필요 __VertexT2 * BuildVertexListTwoUV(); // Vertex Buffer 에다가 점을 만든다.. 동시에 두번 사용하지 않도록 주의가 필요 int FaceCount() { return m_nFC; } diff --git a/src/engine/N3Base/N3Joint.cpp b/src/engine/N3Base/N3Joint.cpp index 55ea8bae..73e74cc2 100644 --- a/src/engine/N3Base/N3Joint.cpp +++ b/src/engine/N3Base/N3Joint.cpp @@ -259,7 +259,7 @@ void CN3Joint::NodeCount(int & nCount) { #ifdef _N3TOOL BOOL CN3Joint::FindPointerByName(const std::string & szName, - CN3Joint *& pJoint) // 이름을 넣으면 해당 노드의 포인터를 돌려준다.. + CN3Joint *& pJoint) // 이름을 넣으면 해당 노드의 포인터를 돌려준다.. { if (szName.empty()) { pJoint = NULL; diff --git a/src/engine/N3Base/N3Joint.h b/src/engine/N3Base/N3Joint.h index 8c97fc98..617d23a1 100644 --- a/src/engine/N3Base/N3Joint.h +++ b/src/engine/N3Base/N3Joint.h @@ -58,7 +58,7 @@ class CN3Joint : public CN3Transform { #ifdef _N3TOOL BOOL FindIndex(const std::string & szName, int & nIndex); BOOL FindPointerByName(const std::string & szName, - CN3Joint *& pJoint); // 이름을 넣으면 해당 노드의 포인터를 돌려준다.. + CN3Joint *& pJoint); // 이름을 넣으면 해당 노드의 포인터를 돌려준다.. void RotSet(const __Quaternion & qtRot) { m_qRot = qtRot; this->ReCalcMatrix(); diff --git a/src/engine/N3Base/N3Mng.h b/src/engine/N3Base/N3Mng.h index 7774f14a..5c1e9085 100644 --- a/src/engine/N3Base/N3Mng.h +++ b/src/engine/N3Base/N3Mng.h @@ -105,7 +105,7 @@ template class CN3Mng { // asm if (reChk == -1) // 추가시 전에 데이터가 있어 참조 카운트를 하나 더한다 { - T * pBakData = pData; // 같은 파일중 전 데이타를 받아 리턴(새로운 그림으로 바뀌지 않을수 있다) + T * pBakData = pData; // 같은 파일중 전 데이타를 받아 리턴(새로운 그림으로 바뀌지 않을수 있다) it_Data it = m_Datas.find(pBakData->FileName()); pData = (*it).second; diff --git a/src/engine/N3Base/N3PMesh.h b/src/engine/N3Base/N3PMesh.h index b3ee846c..0b0b0533 100644 --- a/src/engine/N3Base/N3PMesh.h +++ b/src/engine/N3Base/N3PMesh.h @@ -25,8 +25,8 @@ class CN3PMesh : public CN3BaseFileAccess { // float Value; int NumIndicesToLose, NumIndicesToChange, NumVerticesToLose; //int *IndexChanges; - int iIndexChanges; // 포인터 대신 n번째 저장 (0, 1, 2,...) - int CollapseTo; + int iIndexChanges; // 포인터 대신 n번째 저장 (0, 1, 2,...) + int CollapseTo; bool bShouldCollapse; // 여기서 병합/나누기를 멈추면 구멍이 뚤린다. 다음단계를 더 진행해야함. }; diff --git a/src/engine/N3Base/N3PMeshCreate.h b/src/engine/N3Base/N3PMeshCreate.h index 2efbc60d..7b39a2e6 100644 --- a/src/engine/N3Base/N3PMeshCreate.h +++ b/src/engine/N3Base/N3PMeshCreate.h @@ -19,8 +19,8 @@ class CN3PMeshCreate { struct __PMCreateOption { bool bUseSumOfLoss; // Loss의 합을 사용할 것인가 아니면 .. bool bTriangleWeight; // 사라질 삼각형 가중치 계산 할 것인가? - bool bArea; // false = sum of side 가중치를 넓이로 할 것인가? 세 변의 합으로 할 것인가? - float fWeight; // 가중치 + bool bArea; // false = sum of side 가중치를 넓이로 할 것인가? 세 변의 합으로 할 것인가? + float fWeight; // 가중치 }; protected: diff --git a/src/engine/N3Base/N3Pond.cpp b/src/engine/N3Base/N3Pond.cpp index be33a821..32852daa 100644 --- a/src/engine/N3Base/N3Pond.cpp +++ b/src/engine/N3Base/N3Pond.cpp @@ -96,8 +96,8 @@ bool CN3Pond::Load(HANDLE hFile) { // XyxT2 -> XyzColorT2 Converting. ptmpPondMesh->m_pVertices = new __VertexPond[iVC]; /// ReadFile(hFile, ptmpPondMesh->m_pVertices, iVC * sizeof(__VertexPond), &dwNum, NULL); - ptmpPondMesh->m_pVertices[0].y += 0.2f; // 수치가 높으면 물결이 크게 요동친다 - ptmpPondMesh->m_pVertices[iWidthVertex].y += 0.2f; // 수치가 높으면 물결이 크게 요동친다 + ptmpPondMesh->m_pVertices[0].y += 0.2f; // 수치가 높으면 물결이 크게 요동친다 + ptmpPondMesh->m_pVertices[iWidthVertex].y += 0.2f; // 수치가 높으면 물결이 크게 요동친다 ptmpPondMesh->m_pfMaxHeight = ptmpPondMesh->m_pVertices[0].y += 0.3f; // 물결의 최대치 ptmpPondMesh->m_pfVelocityArray = new float[iVC]; /// diff --git a/src/engine/N3Base/N3Shape.h b/src/engine/N3Base/N3Shape.h index 9eb8c587..d2bb7d9b 100644 --- a/src/engine/N3Base/N3Shape.h +++ b/src/engine/N3Base/N3Shape.h @@ -147,7 +147,7 @@ class CN3Shape : public CN3TransformCollision { __Vector3 * pVNormal = NULL); // 정밀하게 폴리곤 단위로 체크 - 먼저 박스 체크후 다시 정밀 체크.. int CheckCollisionPrecisely( bool bIgnoreBoxCheck, const __Vector3 & vPos, const __Vector3 & vDir, __Vector3 * pVCol = NULL, - __Vector3 * pVNormal = NULL); // 정밀하게 폴리곤 단위로 체크 - 먼저 박스 체크후 다시 정밀 체크.. + __Vector3 * pVNormal = NULL); // 정밀하게 폴리곤 단위로 체크 - 먼저 박스 체크후 다시 정밀 체크.. bool MakeCollisionMeshByParts(); // 충돌 메시를 박스 형태로 다시 만든다... bool MakeCollisionMeshByPartsDetail(); // 현재 모습 그대로... 충돌 메시를 만든다... diff --git a/src/engine/N3Base/N3ShapeEx.h b/src/engine/N3Base/N3ShapeEx.h index af93701c..9528d19e 100644 --- a/src/engine/N3Base/N3ShapeEx.h +++ b/src/engine/N3Base/N3ShapeEx.h @@ -16,8 +16,8 @@ const DWORD AF_SCALE = 0x00000002; // Scale 변화가 있다. const DWORD AF_ROTATION = 0x00000004; // Rotation 변화가 있다. struct __ActionInfo { - DWORD dwActionFlag; // Pos, Scale, Rot 변화가 있는가? - std::vector<__Vector3> ActionStateInfos_Pos; // 움직일 상태 정보들(이동 정보 있다면 m_iActionStateCount개) + DWORD dwActionFlag; // Pos, Scale, Rot 변화가 있는가? + std::vector<__Vector3> ActionStateInfos_Pos; // 움직일 상태 정보들(이동 정보 있다면 m_iActionStateCount개) std::vector<__Vector3> ActionStateInfos_Scale; // 확대축소 std::vector<__Quaternion> ActionStateInfos_Rot; // 회전 // __Vector3 vCurAction_Pos; // 현재 움직인 상태 정보(tick에 따라 변화한다) @@ -58,9 +58,9 @@ class CN3ShapeEx : public CN3Shape { // Attributes public: protected: - int m_iActionStateCount; // 상태가 몇개가 있는지 나타낸다. - int m_iCurActionState; // 현재 상태 - int m_iPrevActionState; // 이전 상태(새로운 상태를 설정해주면 Animation되는 동안 이전상태를 저장해둔다. + int m_iActionStateCount; // 상태가 몇개가 있는지 나타낸다. + int m_iCurActionState; // 현재 상태 + int m_iPrevActionState; // 이전 상태(새로운 상태를 설정해주면 Animation되는 동안 이전상태를 저장해둔다. float m_fActionTimeChanged; // 상태가 완전히 바뀌는 시간 float m_fActionTimeChanging; // 상태가 바뀌는 시작시간부터 지금까지의 경과 시간 @@ -68,7 +68,7 @@ class CN3ShapeEx : public CN3Shape { // Operations public: - BOOL SetState(int iState, float fSec); // fSec시간동안 상태를 바꾼다. (fSec이 0일경우 즉시 바뀐다.) + BOOL SetState(int iState, float fSec); // fSec시간동안 상태를 바꾼다. (fSec이 0일경우 즉시 바뀐다.) virtual void Release(); virtual void ReCalcMatrix(); virtual void Tick(float fFrm = FRAME_SELFPLAY); diff --git a/src/engine/N3Base/N3ShapeMgr.cpp b/src/engine/N3Base/N3ShapeMgr.cpp index ca935da2..3c46ee5e 100644 --- a/src/engine/N3Base/N3ShapeMgr.cpp +++ b/src/engine/N3Base/N3ShapeMgr.cpp @@ -539,10 +539,10 @@ void CN3ShapeMgr::GenerateCollisionData() { pSubCell->pdwCCVertIndices[nCCPC * 3 + 0] = i * 3 + 0; // 인덱스 저장.. pSubCell->pdwCCVertIndices[nCCPC * 3 + 1] = i * 3 + 1; // 인덱스 저장.. pSubCell->pdwCCVertIndices[nCCPC * 3 + 2] = i * 3 + 2; // 인덱스 저장.. - pSubCell->nCCPolyCount++; // Collision Check Polygon Count 를 늘린다. - } // end of for(int x = xx1; x <= xx2; x++) - } // end of for(int z = zz1; z <= zz2; z++) // 범위만큼 처리.. - } // end of for(int j = 0; j < 3; j++) // 걸쳐 있는 메시 만큼 생성... + pSubCell->nCCPolyCount++; // Collision Check Polygon Count 를 늘린다. + } // end of for(int x = xx1; x <= xx2; x++) + } // end of for(int z = zz1; z <= zz2; z++) // 범위만큼 처리.. + } // end of for(int j = 0; j < 3; j++) // 걸쳐 있는 메시 만큼 생성... } } #endif // end of _N3TOOL @@ -904,7 +904,7 @@ CN3Shape * CN3ShapeMgr::Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __ vPos, vDir); it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... - int iSC = m_ShapesToRender.size(); + int iSC = m_ShapesToRender.size(); // 거리순으로 정렬.. std::vector Shapes(iSC, NULL); @@ -937,7 +937,7 @@ CN3Shape * CN3ShapeMgr::PickMovable(int iXScreen, int iYScreen, __Vector3 * pvPi vPos, vDir); it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... - int iSC = m_ShapesToRender.size(); + int iSC = m_ShapesToRender.size(); // 거리순으로 정렬.. std::vector Shapes(iSC, NULL); diff --git a/src/engine/N3Base/N3ShapeMgr.h b/src/engine/N3Base/N3ShapeMgr.h index e009b0c0..77fcd260 100644 --- a/src/engine/N3Base/N3ShapeMgr.h +++ b/src/engine/N3Base/N3ShapeMgr.h @@ -15,8 +15,8 @@ const int CELL_MAIN_DEVIDE = 4; // 메인셀은 4 X 4 의 서브셀로 나뉜다.. const int CELL_SUB_SIZE = 4; // 4 Meter 가 서브셀의 사이즈이다.. const int CELL_MAIN_SIZE = CELL_MAIN_DEVIDE * CELL_SUB_SIZE; // 메인셀 크기는 서브셀갯수 X 서브셀 크기이다. -const int MAX_CELL_MAIN = 4096 / CELL_MAIN_SIZE; // 메인셀의 최대 갯수는 지형크기 / 메인셀크기 이다. -const int MAX_CELL_SUB = MAX_CELL_MAIN * CELL_MAIN_DEVIDE; // 서브셀 최대 갯수는 메인셀 * 메인셀나눔수 이다. +const int MAX_CELL_MAIN = 4096 / CELL_MAIN_SIZE; // 메인셀의 최대 갯수는 지형크기 / 메인셀크기 이다. +const int MAX_CELL_SUB = MAX_CELL_MAIN * CELL_MAIN_DEVIDE; // 서브셀 최대 갯수는 메인셀 * 메인셀나눔수 이다. #ifdef _3DSERVER class CN3ShapeMgr @@ -114,10 +114,10 @@ class CN3ShapeMgr : public CN3BaseFileAccess protected: #ifndef _3DSERVER - std::vector m_Shapes; // 리스트로 안 만든 이유는... 배열이 훨씬 효율적이기 때문이다. - std::list m_ShapesToRender; // Tick 을 호출하면 렌더링할 것만 추린다.. - std::list m_ShapesHaveID; // ID 를 갖고 있어 NPC 가 될수 있는 Shapes.... -#endif // end of #ifndef _3DSERVER + std::vector m_Shapes; // 리스트로 안 만든 이유는... 배열이 훨씬 효율적이기 때문이다. + std::list m_ShapesToRender; // Tick 을 호출하면 렌더링할 것만 추린다.. + std::list m_ShapesHaveID; // ID 를 갖고 있어 NPC 가 될수 있는 Shapes.... +#endif // end of #ifndef _3DSERVER float m_fMapWidth; // 맵 너비.. 미터 단위 float m_fMapLength; // 맵 길이.. 미터 단위 @@ -163,8 +163,8 @@ class CN3ShapeMgr : public CN3BaseFileAccess float Height() { return m_fMapWidth; } // 맵의 너비. 단위는 미터이다. #ifndef _3DSERVER - void ReleaseShapes(); - void RenderCollision(const __Vector3 & vPos); // 넣은 위치에 있는 충돌 메시를 그려준다.. 디버깅용... + void ReleaseShapes(); + void RenderCollision(const __Vector3 & vPos); // 넣은 위치에 있는 충돌 메시를 그려준다.. 디버깅용... void Tick(); void Render(); bool Load(HANDLE hFile); diff --git a/src/engine/N3Base/N3ShapeMod.h b/src/engine/N3Base/N3ShapeMod.h index a9bb8f7a..977b7941 100644 --- a/src/engine/N3Base/N3ShapeMod.h +++ b/src/engine/N3Base/N3ShapeMod.h @@ -31,12 +31,12 @@ class CN3ShapeMod : public CN3Shape { } }; struct __ModPart { - CN3SPart * pPart; // 움직일 Part - bool bPos; // Pos 변화가 있는가? - bool bRot; // Rot 변화가 있는가? - bool bScale; // Scale 변화가 있는가? - __ModPosRotScale * pStateInfos; // 움직일 상태 정보들(이동,회전,확대축소 정보 m_iStateCount개) - __ModPosRotScale CurStateInfo; // 현재 움직인 상태 정보(tick에 따라 변화한다) + CN3SPart * pPart; // 움직일 Part + bool bPos; // Pos 변화가 있는가? + bool bRot; // Rot 변화가 있는가? + bool bScale; // Scale 변화가 있는가? + __ModPosRotScale * pStateInfos; // 움직일 상태 정보들(이동,회전,확대축소 정보 m_iStateCount개) + __ModPosRotScale CurStateInfo; // 현재 움직인 상태 정보(tick에 따라 변화한다) __ModPart() { pPart = NULL; @@ -84,9 +84,9 @@ class CN3ShapeMod : public CN3Shape { // N3SHAPEMOD_TYPE_NORMAL = 4 // 둘 다 변화하는 것 // }; // int m_iModType; // type.. - int m_iStateCount; // 상태가 몇개가 있는지 나타낸다. - int m_iCurState; // 현재 상태 - int m_iPrevState; // 이전 상태(새로운 상태를 설정해주면 Animation되는 동안 이전상태를 저장해둔다. + int m_iStateCount; // 상태가 몇개가 있는지 나타낸다. + int m_iCurState; // 현재 상태 + int m_iPrevState; // 이전 상태(새로운 상태를 설정해주면 Animation되는 동안 이전상태를 저장해둔다. float m_fTimeChanged; // 상태가 완전히 바뀌는 시간 float m_fTimeChanging; // 상태가 바뀌는 시작시간부터 지금까지의 경과 시간 @@ -99,8 +99,8 @@ class CN3ShapeMod : public CN3Shape { // Operations public: - BOOL SetState(int iState, float fSec); // fSec시간동안 상태를 바꾼다. (fSec이 0일경우 즉시 바뀐다.) - BOOL LoadStateInfo(FILE * stream); // 상태 정보를 읽어온다.(text로부터) + BOOL SetState(int iState, float fSec); // fSec시간동안 상태를 바꾼다. (fSec이 0일경우 즉시 바뀐다.) + BOOL LoadStateInfo(FILE * stream); // 상태 정보를 읽어온다.(text로부터) virtual void Release(); virtual void ReCalcMatrix(); virtual void Tick(float fFrm = FRAME_SELFPLAY); diff --git a/src/engine/N3Base/N3Sky.cpp b/src/engine/N3Base/N3Sky.cpp index 21945a61..437ce660 100644 --- a/src/engine/N3Base/N3Sky.cpp +++ b/src/engine/N3Base/N3Sky.cpp @@ -72,7 +72,7 @@ void CN3Sky::Init() { // 노을 진 경우를 예로 든다.... const float fWidth = 3.5f; // 전면 판의 폭 - const float fTopY = 0.5f; // 전면 판의 높이.. 노을져서 붉으스름하게 된 부분의 위 높이 - 이 위부터는 하늘이다.. + const float fTopY = 0.5f; // 전면 판의 높이.. 노을져서 붉으스름하게 된 부분의 위 높이 - 이 위부터는 하늘이다.. const float fBottomY = 0.1f; // 전면 판의 바닥 높이.. 노을져서 붉으스름하게 된 부분의 아래 - 이 아래는 순수한 안개색이다.. const float fDistance = 1.5f; // 전면 판의 바닥 길이.. diff --git a/src/engine/N3Base/N3SkyMng.cpp b/src/engine/N3Base/N3SkyMng.cpp index ee08f970..32f146d5 100644 --- a/src/engine/N3Base/N3SkyMng.cpp +++ b/src/engine/N3Base/N3SkyMng.cpp @@ -798,7 +798,7 @@ void CN3SkyMng::SetCheckGameTime(DWORD dwCheckGameTime) { continue; // 한바퀴를 다 돌았는데도 변화값을 찾을 수 없다. } __SKY_DAYCHANGE * pSDC = &(m_DayChanges[iPos]); - DWORD dwEnd = pSDC->dwWhen + (DWORD)(TIME_REAL_PER_GAME * pSDC->fHowLong); // 변화가 끝나는 시간 + DWORD dwEnd = pSDC->dwWhen + (DWORD)(TIME_REAL_PER_GAME * pSDC->fHowLong); // 변화가 끝나는 시간 if (dwEnd > 86400) { dwEnd -= 86400; // 24시간이 넘었을경우 24시간을 빼준다. } diff --git a/src/engine/N3Base/N3SkyMng.h b/src/engine/N3Base/N3SkyMng.h index d097ffb1..1fb1e41b 100644 --- a/src/engine/N3Base/N3SkyMng.h +++ b/src/engine/N3Base/N3SkyMng.h @@ -129,7 +129,7 @@ class CN3SkyMng : public CN3BaseFileAccess { int m_iWeatherChangeCurPos; DWORD m_dwCheckTick; // 서버에서 시간을 받을때의 윈도우TickCount(실시간) (게임시간으로 24시에 다시 설정하기도 한다.) - DWORD m_dwCheckGameTime; // 서버에서 내려받은 시간(게임 시간 초단위) 0 ~ (24*60*60) + DWORD m_dwCheckGameTime; // 서버에서 내려받은 시간(게임 시간 초단위) 0 ~ (24*60*60) eSKY_WEATHER m_eWeather; int m_iYear; @@ -226,6 +226,6 @@ class CN3SkyMng : public CN3BaseFileAccess { int GetLatestChange(eSKY_DAYCHANGE eSDC, int iPos); // m_pDayChangeQueues에서 지정된 위치(iPos) 이전의 가장 최근에 변화하는 위치 얻어오기 void ChangeSky(__SKY_DAYCHANGE * pSDC, float fTakeTime); - int GetDayChangePos_AfterNSec(DWORD dwCurGameTime, float fSec); // 실시간 N초 후에 DayChangeQueue의 위치 구하기 + int GetDayChangePos_AfterNSec(DWORD dwCurGameTime, float fSec); // 실시간 N초 후에 DayChangeQueue의 위치 구하기 static int CompareTime(const void * pArg1, const void * pArg2); }; diff --git a/src/engine/N3Base/N3SndMgr.h b/src/engine/N3Base/N3SndMgr.h index d870bc11..7de5fc33 100644 --- a/src/engine/N3Base/N3SndMgr.h +++ b/src/engine/N3Base/N3SndMgr.h @@ -28,7 +28,7 @@ class CN3SndMgr { std::map m_SndObjSrcs; std::list m_SndObjStreams; // 스트리밍 사운드.. std::list m_SndObjs_Duplicated; - std::list m_SndObjs_PlayOnceAndRelease; // 한번만 플레이 하고 릴리즈 해야 하는 사운드들 + std::list m_SndObjs_PlayOnceAndRelease; // 한번만 플레이 하고 릴리즈 해야 하는 사운드들 public: void ReleaseObj(CN3SndObj ** ppObj); diff --git a/src/engine/N3Base/N3SndObj.h b/src/engine/N3Base/N3SndObj.h index b9c74788..ae45d64f 100644 --- a/src/engine/N3Base/N3SndObj.h +++ b/src/engine/N3Base/N3SndObj.h @@ -58,8 +58,8 @@ class CN3SndObj { void SetMaxVolume(int vol) { m_iMaxVolume = vol; } int GetMaxVolume() { return m_iMaxVolume; } - void Init(); - void Release(); // 참조 카운트를 리턴 해준다.. 사운드 매니저에서는 이 참조 카운트를 보고 맵에서 지운다.. + void Init(); + void Release(); // 참조 카운트를 리턴 해준다.. 사운드 매니저에서는 이 참조 카운트를 보고 맵에서 지운다.. virtual bool Create(const std::string & szFN, e_SndType eType); bool Duplicate(CN3SndObj * pSrc, e_SndType eType, D3DVECTOR * pPos = NULL); diff --git a/src/engine/N3Base/N3TableBase.h b/src/engine/N3Base/N3TableBase.h index 336e1248..8392bf2d 100644 --- a/src/engine/N3Base/N3TableBase.h +++ b/src/engine/N3Base/N3TableBase.h @@ -374,7 +374,7 @@ template BOOL CN3TableBase::Load(HANDLE hFile) { int iSize = offsets [iDataTypeCount]; // MakeOffstTable 함수에서 리턴되는 값중 m_iDataTypeCount번째에 이 함수의 실제 사이즈가 들어있다. - if (sizeof(Type) != iSize || // 전체 type의 크기와 실제 구조체의 크기와 다르거나 + if (sizeof(Type) != iSize || // 전체 type의 크기와 실제 구조체의 크기와 다르거나 DT_DWORD != m_DataTypes[0]) // 맨 처음의 데이타가 DT_DWORD형이 아닐때(맨처음은 고유한 ID이므로) { m_DataTypes.clear(); diff --git a/src/engine/N3Base/N3Texture.h b/src/engine/N3Base/N3Texture.h index 18ce9bc4..58ea44e6 100644 --- a/src/engine/N3Base/N3Texture.h +++ b/src/engine/N3Base/N3Texture.h @@ -49,7 +49,7 @@ class CN3Texture : public CN3BaseFileAccess { } } - bool Create(int nWidth, int nHeight, D3DFORMAT Format, BOOL bGenerateMipMap); // 장치에 맞게 생성 + bool Create(int nWidth, int nHeight, D3DFORMAT Format, BOOL bGenerateMipMap); // 장치에 맞게 생성 LPDIRECT3DTEXTURE9 Get() { return m_lpTexture; } operator LPDIRECT3DTEXTURE9() { return m_lpTexture; } diff --git a/src/engine/N3Base/N3UIBase.h b/src/engine/N3Base/N3UIBase.h index 21ab29bc..31b7afaf 100644 --- a/src/engine/N3Base/N3UIBase.h +++ b/src/engine/N3Base/N3UIBase.h @@ -70,7 +70,7 @@ class CN3UIBase : public CN3BaseFileAccess { RECT m_rcMovable; // UI를 드래그 하여 움직이게 할 수 있는 영역 - (screen : main window client area) ~~~~~~~ - bool m_bVisible; // 화면에 보이는가 (부모가 보이지 않으면 자식들은 render 하지 않는다.) + bool m_bVisible; // 화면에 보이는가 (부모가 보이지 않으면 자식들은 render 하지 않는다.) CN3SndObj * m_pSnd_OpenUI; // UI가 화면에 보이는 순간 내는 소리 CN3SndObj * m_pSnd_CloseUI; // UI가 화면에서 사라지는 순간 내는 소리 @@ -99,10 +99,10 @@ class CN3UIBase : public CN3BaseFileAccess { // Operations public: - bool IsIn(int x, int y); - void AddChild(CN3UIBase * pChild) { m_Children.push_front(pChild); } - void RemoveChild(CN3UIBase * pChild); // 자식 리스트에서 포인터만 없어지고 실제로 delete 되지는 않는다. - void SetParent(CN3UIBase * pParent); // 부모를 바꾼다. + bool IsIn(int x, int y); + void AddChild(CN3UIBase * pChild) { m_Children.push_front(pChild); } + void RemoveChild(CN3UIBase * pChild); // 자식 리스트에서 포인터만 없어지고 실제로 delete 되지는 않는다. + void SetParent(CN3UIBase * pParent); // 부모를 바꾼다. int GetWidth() { return m_rcRegion.right - m_rcRegion.left; } int GetHeight() { return m_rcRegion.bottom - m_rcRegion.top; } POINT GetPos() const; diff --git a/src/engine/N3Base/N3UIDef.h b/src/engine/N3Base/N3UIDef.h index dfcbff39..9729e912 100644 --- a/src/engine/N3Base/N3UIDef.h +++ b/src/engine/N3Base/N3UIDef.h @@ -39,16 +39,16 @@ enum eUI_TYPE { // State enum eUI_STATE { UI_STATE_COMMON_NONE = - 0, // 아무렇지도 않은 그냥 평범한 상태 혹은 아이콘을 가진 윈도우가 아이콘을 선택하지 않은 상태 - UI_STATE_COMMON_MOVE, // 움직여야 하는 - UI_STATE_BUTTON_NORMAL, // 아무렇지도 않은 그냥 평범한 상태.. - UI_STATE_BUTTON_DOWN, // 버튼이 눌린상태 + 0, // 아무렇지도 않은 그냥 평범한 상태 혹은 아이콘을 가진 윈도우가 아이콘을 선택하지 않은 상태 + UI_STATE_COMMON_MOVE, // 움직여야 하는 + UI_STATE_BUTTON_NORMAL, // 아무렇지도 않은 그냥 평범한 상태.. + UI_STATE_BUTTON_DOWN, // 버튼이 눌린상태 UI_STATE_BUTTON_DOWN_2CHECKDOWN, // 버튼이 임시적으로 눌린 상태(체크 버튼시 사용, 진짜로 눌린 상태가 아니다) 다음에 down상태로 UI_STATE_BUTTON_DOWN_2CHECKUP, // 버튼이 임시적으로 눌린 상태(체크 버튼시 사용, 진짜로 눌린 상태가 아니다) 다음에 normal상태로 UI_STATE_BUTTON_ON, // 버튼이 켜진 상태.. - UI_STATE_BUTTON_DISABLE, // 버튼이 비활성화된 상태 - UI_STATE_BUTTON_CLICK, // 버튼이 눌렸다 떨어진 상태 - Click. - UI_STATE_SCROLLBAR_NULL, // 아무상태도 아님.. + UI_STATE_BUTTON_DISABLE, // 버튼이 비활성화된 상태 + UI_STATE_BUTTON_CLICK, // 버튼이 눌렸다 떨어진 상태 - Click. + UI_STATE_SCROLLBAR_NULL, // 아무상태도 아님.. UI_STATE_SCROLLBAR_TOPBUTTON_DOWN, // 위로 올리는 버튼이 눌린 상태. UI_STATE_SCROLLBAR_BOTTOMBUTTON_DOWN, // 아래로 내리는 버튼이 눌린상태. UI_STATE_EDTCTRL_ACTIVE, @@ -62,9 +62,9 @@ enum eUI_STATE { UI_STATE_ICON_MOVING, // 아이콘을 가진 윈도우가 아이콘을 움직이고 있는 상태.. // UI_STATE_ICON_SELECTED, // 아이콘을 가진 윈도우가 아이콘을 선택한 상태.. UI_STATE_ICON_WAIT_FROM_SERVER, // 아이콘을 가진 윈도우가 아이콘을 옮기고 서버로 부터 응답을 기다리는 상태.. - UI_STATE_ICON_DO_SUCCESS, // 아이콘을 가진 윈도우가 서버로 부터 성공을 받은 상태.. - UI_STATE_ICON_DO_FAIL, // 아이콘을 가진 윈도우가 서버로 부터 실패를 받은 상태.. - UI_STATE_ICON_DO_RECOVERY, // 아이콘을 가진 윈도우가 서버로 부터 실패를 받아 복구해야 하는 상태.. + UI_STATE_ICON_DO_SUCCESS, // 아이콘을 가진 윈도우가 서버로 부터 성공을 받은 상태.. + UI_STATE_ICON_DO_FAIL, // 아이콘을 가진 윈도우가 서버로 부터 실패를 받은 상태.. + UI_STATE_ICON_DO_RECOVERY, // 아이콘을 가진 윈도우가 서버로 부터 실패를 받아 복구해야 하는 상태.. }; // message @@ -124,10 +124,10 @@ const DWORD UI_STR_TYPE_VALIGN = 0x00000002; // 스트링 수직정렬 // ui style const DWORD UISTYLE_NONE = 0x00000000; -const DWORD UISTYLE_ALWAYSTOP = 0x00000001; // 항상 최상위에 -const DWORD UISTYLE_MODAL = 0x00000002; // modal dialog -const DWORD UISTYLE_FOCUS_UNABLE = 0x00000004; // 포커스를 받을수 없는 유아이 -const DWORD UISTYLE_SHOW_ME_ALONE = 0x00000008; // 단지 자기 자신만 열릴수 있는 다른것은 닫혀야한다면.. +const DWORD UISTYLE_ALWAYSTOP = 0x00000001; // 항상 최상위에 +const DWORD UISTYLE_MODAL = 0x00000002; // modal dialog +const DWORD UISTYLE_FOCUS_UNABLE = 0x00000004; // 포커스를 받을수 없는 유아이 +const DWORD UISTYLE_SHOW_ME_ALONE = 0x00000008; // 단지 자기 자신만 열릴수 있는 다른것은 닫혀야한다면.. const DWORD UISTYLE_HIDE_UNABLE = 0x00000010; // 닫히지 않는 유아이 const DWORD UISTYLE_USER_MOVE_HIDE = 0x00000020; // 유저가 움직이면 닫히는 유아이 const DWORD UISTYLE_POS_LEFT = 0x00000040; // 왼쪽에 달린 유아이 diff --git a/src/engine/N3Base/N3UIEdit.h b/src/engine/N3Base/N3UIEdit.h index 4865a664..94297342 100644 --- a/src/engine/N3Base/N3UIEdit.h +++ b/src/engine/N3Base/N3UIEdit.h @@ -75,8 +75,8 @@ class CN3UIEdit : public CN3UIStatic { virtual DWORD MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & ptOld); virtual BOOL MoveOffset(int iOffsetX, int iOffsetY); // 위치 지정(chilren의 위치도 같이 바꾸어준다. caret위치도 같이 바꾸어줌.) - void KillFocus(); // 포커스를 없앤다. - bool SetFocus(); // 포커스를 준다. + void KillFocus(); // 포커스를 없앤다. + bool SetFocus(); // 포커스를 준다. bool HaveFocus() const { return (this == s_pFocusedEdit); } void SetCaretPos(UINT nPos); //몇번째 바이트에 있는지 설정한다. void SetMaxString(int iMax); // 최대 글씨 수를 정해준다. diff --git a/src/engine/N3Base/N3UIImage.h b/src/engine/N3Base/N3UIImage.h index c073c542..eacd8d15 100644 --- a/src/engine/N3Base/N3UIImage.h +++ b/src/engine/N3Base/N3UIImage.h @@ -21,9 +21,9 @@ class CN3UIImage : public CN3UIBase { __FLOAT_RECT * GetUVRect() { return &m_frcUVRect; } protected: - LPDIRECT3DVERTEXBUFFER9 m_pVB; // vertex buffer - CN3Texture * m_pTexRef; // texture 참조 포인터 (s_TexMng에서 관리하므로 참조포인터이다.) - std::string m_szTexFN; // 텍스처 이름.. 따로 갖고 있는 이유는 툴에서 텍스처 부르기가 실패할 경우를 대비해서이다. + LPDIRECT3DVERTEXBUFFER9 m_pVB; // vertex buffer + CN3Texture * m_pTexRef; // texture 참조 포인터 (s_TexMng에서 관리하므로 참조포인터이다.) + std::string m_szTexFN; // 텍스처 이름.. 따로 갖고 있는 이유는 툴에서 텍스처 부르기가 실패할 경우를 대비해서이다. __FLOAT_RECT m_frcUVRect; // uv 좌표를 저장 D3DCOLOR m_Color; // 칼라(배경 이미지가 없을경우 사용된다.) diff --git a/src/engine/N3Base/N3UIManager.cpp b/src/engine/N3Base/N3UIManager.cpp index 6a3827e4..087ed5b6 100644 --- a/src/engine/N3Base/N3UIManager.cpp +++ b/src/engine/N3Base/N3UIManager.cpp @@ -42,7 +42,7 @@ DWORD CN3UIManager::MouseProc(DWORD dwFlags, const POINT & ptCur, const POINT & return m_dwMouseFlagsCur; } else if ((UI_MOUSE_LBCLICK & dwFlags) && (UI_MOUSEPROC_INREGION & dwChildRet)) { // 영역 안을 클릭 했을때 먼가 일을 했다고 하고 리턴해버린다. - itor = m_Children.erase(itor); // 우선 리스트에서 지우고 + itor = m_Children.erase(itor); // 우선 리스트에서 지우고 m_Children.push_front( pChild); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하고 메세지를 맨 먼저 받게 하려고 m_dwMouseFlagsCur |= (UI_MOUSEPROC_DIALOGFOCUS); diff --git a/src/engine/N3Base/N3UIProgress.cpp b/src/engine/N3Base/N3UIProgress.cpp index 1b1176b1..a79f2875 100644 --- a/src/engine/N3Base/N3UIProgress.cpp +++ b/src/engine/N3Base/N3UIProgress.cpp @@ -192,14 +192,14 @@ bool CN3UIProgress::Load(HANDLE hFile) { void CN3UIProgress::operator=(const CN3UIProgress & other) { CN3UIBase::operator=(other); - m_frcFrGndImgUV = other.m_frcFrGndImgUV; // m_FrGndImgRef 의 uv좌표 - m_iMaxValue = other.m_iMaxValue; // 최대 - m_iMinValue = other.m_iMinValue; // 최소 - m_fCurValue = other.m_fCurValue; // 현재 값 - 부드럽게 점차 값을 올려가려고 float 로 했다.. + m_frcFrGndImgUV = other.m_frcFrGndImgUV; // m_FrGndImgRef 의 uv좌표 + m_iMaxValue = other.m_iMaxValue; // 최대 + m_iMinValue = other.m_iMinValue; // 최소 + m_fCurValue = other.m_fCurValue; // 현재 값 - 부드럽게 점차 값을 올려가려고 float 로 했다.. m_fChangeSpeedPerSec = other.m_fChangeSpeedPerSec; // 현재값이 변해야 되는 속도.. Unit SpeedPerSec - m_iValueToReach = other.m_iValueToReach; // 도달해야 될값 - 부드럽게 값이 올라가는 경우에 필요하다.. - m_fTimeToDelay = other.m_fTimeToDelay; // 지연시간.. - m_iStepValue = other.m_iStepValue; // 변화값 StepIt()을 통한 변화되는 값 + m_iValueToReach = other.m_iValueToReach; // 도달해야 될값 - 부드럽게 값이 올라가는 경우에 필요하다.. + m_fTimeToDelay = other.m_fTimeToDelay; // 지연시간.. + m_iStepValue = other.m_iStepValue; // 변화값 StepIt()을 통한 변화되는 값 // m_ImageRef 설정하기 for (UIListItor itor = m_Children.begin(); m_Children.end() != itor; ++itor) { diff --git a/src/engine/N3Base/N3UITrackBar.cpp b/src/engine/N3Base/N3UITrackBar.cpp index 0ffc8d6d..d3cb233f 100644 --- a/src/engine/N3Base/N3UITrackBar.cpp +++ b/src/engine/N3Base/N3UITrackBar.cpp @@ -233,7 +233,7 @@ void CN3UITrackBar::UpDownThumbPos(int iDiff) { if (fPercentage > 1.0f) // 너무 아래로 내렸다. { m_pThumbImageRef->SetPos(rcThumb.left, rcThumb.bottom - iThumbHeight); - m_iCurPos = m_iMaxPos; // SetCurrentPos함수를 호출하면 thumb위치를 다시 계산하기 때문에 직접 바꾸어줌. + m_iCurPos = m_iMaxPos; // SetCurrentPos함수를 호출하면 thumb위치를 다시 계산하기 때문에 직접 바꾸어줌. } else if (fPercentage < 0.0f) // 너무 위로 올렸다. { m_pThumbImageRef->SetPos(rcThumb.left, rcThumb.top); @@ -258,7 +258,7 @@ void CN3UITrackBar::UpDownThumbPos(int iDiff) { if (fPercentage > 1.0f) // 너무 오른쪽으로 밀었다. { m_pThumbImageRef->SetPos(rcThumb.right - iThumbWidth, rcThumb.top); - m_iCurPos = m_iMaxPos; // SetCurrentPos함수를 호출하면 thumb위치를 다시 계산하기 때문에 직접 바꾸어줌. + m_iCurPos = m_iMaxPos; // SetCurrentPos함수를 호출하면 thumb위치를 다시 계산하기 때문에 직접 바꾸어줌. } else if (fPercentage < 0.0f) // 너무 왼쪽으로 밀었다 { m_pThumbImageRef->SetPos(rcThumb.left, rcThumb.top); diff --git a/src/game/DungeonManager.cpp b/src/game/DungeonManager.cpp index 8f713333..da6f5cf0 100644 --- a/src/game/DungeonManager.cpp +++ b/src/game/DungeonManager.cpp @@ -108,7 +108,7 @@ bool CDungeonManager::CheckCollisionWithShape(const __Vector3 & vPos, // float fSpeedPerSec, // 초당 움직이는 속도 __Vector3 * pvCol, // 충돌 지점 __Vector3 * pvNormal, // 충돌한면의 법선벡터 - __Vector3 * pVec) // 충돌한 면 의 폴리곤 __Vector3[3] + __Vector3 * pVec) // 충돌한 면 의 폴리곤 __Vector3[3] { return m_pvsmgr.CheckCollisionWithShape(vPos, vDir, fSpeedPerSec, pvCol, pvNormal, pVec); } diff --git a/src/game/GameBase.cpp b/src/game/GameBase.cpp index 6814d063..a209b1fd 100644 --- a/src/game/GameBase.cpp +++ b/src/game/GameBase.cpp @@ -22,13 +22,13 @@ CN3TableBase<__TABLE_PLAYER_LOOKS> * CGameBase::s_pTbl_UPC_Looks = NULL; // 각 유저의(내 자신과 주위 다른 사람) 클레스별 기본 스킨 CN3TableBase<__TABLE_PLAYER_LOOKS> * CGameBase::s_pTbl_NPC_Looks = NULL; // NPC, Mob 기본 모습 - 6개의 캐릭터 파트(), 2개의 플러그 -CN3TableBase<__TABLE_UPC_SKILL> * CGameBase::s_pTbl_Skill = NULL; // Skill 정보에 관한 Table +CN3TableBase<__TABLE_UPC_SKILL> * CGameBase::s_pTbl_Skill = NULL; // Skill 정보에 관한 Table CN3TableBase<__TABLE_EXCHANGE_QUEST> * CGameBase::s_pTbl_Exchange_Quest = NULL; // 교환 퀘스트에 관한 테이블.. -CN3TableBase<__TABLE_FX> * CGameBase::s_pTbl_FXSource; // FX소스 정보 테이블.. -CN3TableBase<__TABLE_QUEST_MENU> * CGameBase::s_pTbl_QuestMenu = NULL; // 퀘스트 선택 메뉴 -CN3TableBase<__TABLE_QUEST_TALK> * CGameBase::s_pTbl_QuestTalk = NULL; // 퀘스트 지문 -CN3TableBase<__TABLE_TEXTS> * CGameBase::s_pTbl_Texts = NULL; -CN3TableBase<__TABLE_HELP> * CGameBase::s_pTbl_Help = NULL; +CN3TableBase<__TABLE_FX> * CGameBase::s_pTbl_FXSource; // FX소스 정보 테이블.. +CN3TableBase<__TABLE_QUEST_MENU> * CGameBase::s_pTbl_QuestMenu = NULL; // 퀘스트 선택 메뉴 +CN3TableBase<__TABLE_QUEST_TALK> * CGameBase::s_pTbl_QuestTalk = NULL; // 퀘스트 지문 +CN3TableBase<__TABLE_TEXTS> * CGameBase::s_pTbl_Texts = NULL; +CN3TableBase<__TABLE_HELP> * CGameBase::s_pTbl_Help = NULL; CN3WorldManager * CGameBase::s_pWorldMgr = NULL; // 월드 매니져.. CPlayerOtherMgr * CGameBase::s_pOPMgr = NULL; // Other Player Manager - 다른 유저 관리 클래스.. diff --git a/src/game/GameBase.h b/src/game/GameBase.h index ff16f232..0f2470f7 100644 --- a/src/game/GameBase.h +++ b/src/game/GameBase.h @@ -22,13 +22,13 @@ class CGameBase : public CN3Base { s_pTbl_UPC_Looks; // 각 유저의(내 자신과 주위 다른 사람) 클레스별 기본 스킨 static CN3TableBase * s_pTbl_NPC_Looks; // NPC, Mob 기본 모습 - 6개의 캐릭터 파트(), 2개의 플러그 - static CN3TableBase * s_pTbl_Skill; // Skill 정보에 관한 Table + static CN3TableBase * s_pTbl_Skill; // Skill 정보에 관한 Table static CN3TableBase * s_pTbl_Exchange_Quest; // 교환 퀘스트에 관한 테이블.. - static CN3TableBase * s_pTbl_FXSource; // FX소스 정보 테이블.. - static CN3TableBase * s_pTbl_QuestMenu; // 퀘스트 선택 메뉴 - static CN3TableBase * s_pTbl_QuestTalk; // 퀘스트 지문 - static CN3TableBase * s_pTbl_Texts; // Localized strings - static CN3TableBase * s_pTbl_Help; // Leveling Guide + static CN3TableBase * s_pTbl_FXSource; // FX소스 정보 테이블.. + static CN3TableBase * s_pTbl_QuestMenu; // 퀘스트 선택 메뉴 + static CN3TableBase * s_pTbl_QuestTalk; // 퀘스트 지문 + static CN3TableBase * s_pTbl_Texts; // Localized strings + static CN3TableBase * s_pTbl_Help; // Leveling Guide static class CN3WorldManager * s_pWorldMgr; // 월드 매니져 클래스.. static class CPlayerOtherMgr * s_pOPMgr; // Other Player Manager - 다른 유저 관리 클래스.. @@ -39,19 +39,19 @@ class CGameBase : public CN3Base { static void StaticMemberRelease(); // 테이블 및 기본 지형, 오브젝트, 캐리터등 초기화.. public: - static bool GetTextByAttrib(e_ItemAttrib eAttrib, std::string & szAttrib); - static bool GetTextByClass(e_Class eClass, std::string & szText); - static bool GetTextByItemClass(e_ItemClass eItemClass, std::string & szText); - static bool GetTextByKnightsDuty(e_KnightsDuty eDuty, std::string & szText); - static bool GetTextByNation(e_Nation eNation, std::string & szText); - static bool GetTextByRace(e_Race eRace, std::string & szText); - static D3DCOLOR GetIDColorByLevelDifference(int iLevelDiff); // 레벨 차이에 따른 ID 색 돌려준다. + static bool GetTextByAttrib(e_ItemAttrib eAttrib, std::string & szAttrib); + static bool GetTextByClass(e_Class eClass, std::string & szText); + static bool GetTextByItemClass(e_ItemClass eItemClass, std::string & szText); + static bool GetTextByKnightsDuty(e_KnightsDuty eDuty, std::string & szText); + static bool GetTextByNation(e_Nation eNation, std::string & szText); + static bool GetTextByRace(e_Race eRace, std::string & szText); + static D3DCOLOR GetIDColorByLevelDifference(int iLevelDiff); // 레벨 차이에 따른 ID 색 돌려준다. static e_Class_Represent GetRepresentClass(e_Class eClass); // 세부직업을 넣어주면 대표되는 직업을 돌려준다. - static e_ItemType MakeResrcFileNameForUPC(__TABLE_ITEM_BASIC * pItem, // 아이템 데이터... - std::string * szResrcFN, // Resource FileName - std::string * szIconFN, // Icon FileName - e_PartPosition & ePartPosition, // Part 일경우 Index - e_PlugPosition & ePlugPosition); // Plug 일경우 Index + static e_ItemType MakeResrcFileNameForUPC(__TABLE_ITEM_BASIC * pItem, // 아이템 데이터... + std::string * szResrcFN, // Resource FileName + std::string * szIconFN, // Icon FileName + e_PartPosition & ePartPosition, // Part 일경우 Index + e_PlugPosition & ePlugPosition); // Plug 일경우 Index class CPlayerBase * CharacterGetByID(int iID, bool bFromAlive); bool IsValidCharacter(CPlayerBase * pCharacter); diff --git a/src/game/GameDef.h b/src/game/GameDef.h index a82e365b..92988c61 100644 --- a/src/game/GameDef.h +++ b/src/game/GameDef.h @@ -747,11 +747,11 @@ typedef struct __TABLE_UI_RESRC { std::string szChat; // 2 std::string szMsgOutput; // 3 std::string szStateBar; // 4 - std::string szVarious; // 5 - 캐릭터 상태, 기사단 관리, 퀘스트, 친구.. 등등 네페이지가 한개에 들어있음. - std::string szState; // 6 - 캐릭터 상태 - std::string szKnights; // 7 - 기사단 관리 - std::string szQuest; // 8 - 퀘스트 - std::string szFriends; // 9 - 친구 관리 + std::string szVarious; // 5 - 캐릭터 상태, 기사단 관리, 퀘스트, 친구.. 등등 네페이지가 한개에 들어있음. + std::string szState; // 6 - 캐릭터 상태 + std::string szKnights; // 7 - 기사단 관리 + std::string szQuest; // 8 - 퀘스트 + std::string szFriends; // 9 - 친구 관리 std::string szInventory; // 10 std::string szTransaction; // 11 diff --git a/src/game/GameEng.cpp b/src/game/GameEng.cpp index 0a728c69..633987bf 100644 --- a/src/game/GameEng.cpp +++ b/src/game/GameEng.cpp @@ -216,8 +216,8 @@ void CGameEng::Tick(const D3DCOLOR * crDiffuses, // Diffuse 라이트 색 __Vector3 vEyeResult = m_vEyeToReach; float fNP = m_pActiveCam->m_Data.fNP; CGameBase::ACT_WORLD->CheckCollisionCameraWithTerrain(vEyeResult, m_vAtToReach, fNP); // 지형과 충돌체크 - CGameBase::ACT_WORLD->CheckCollisionCameraWithShape(vEyeResult, m_vAtToReach, fNP); // 오브젝트와 충돌체크.. - m_pActiveCam->LookAt(vEyeResult, m_vAtToReach, __Vector3(0, 1, 0)); // 처다본다.. + CGameBase::ACT_WORLD->CheckCollisionCameraWithShape(vEyeResult, m_vAtToReach, fNP); // 오브젝트와 충돌체크.. + m_pActiveCam->LookAt(vEyeResult, m_vAtToReach, __Vector3(0, 1, 0)); // 처다본다.. } // 카메라 충돌 체크... //////////////////////////////////////////////////////////////////////////////////// diff --git a/src/game/GameEng.h b/src/game/GameEng.h index be9da3a6..1ea2d6fb 100644 --- a/src/game/GameEng.h +++ b/src/game/GameEng.h @@ -82,16 +82,16 @@ class CGameEng : public CN3Eng { void CameraPitchAdd(float fRotXPerSec); void CameraYawAdd(float fRotYPerSec); void CameraZoom(float fDelta); - float CameraYaw() { return m_fRotYawVPGod; } // 위에서 바라본 시점일 경우에 카메라 회전각도.. - void SetActiveCamera(CN3Camera * pCamera) { m_pActiveCam = pCamera; } - void Tick(const D3DCOLOR * crDiffuses, // Diffuse 라이트 색깔.. - const D3DCOLOR * crAmbients, // Ambient 라이트 색깔.. - const D3DCOLOR crFog, // 안개 색깔.. - const __Vector3 & vPosPlayer, // 플레이어 위치 - const __Quaternion & qtPlayer, // 회전 쿼터니언 - float fHeightPlayer, // 키를 인수로 넣으면 카메라와 라이트 처리.. - float fSunRadianZ); // 해의 Z 각도.. - void ApplyCameraAndLight(); // 카메라와 라이트에 세팅된 값 적용. 라이트는 해의 각도에 따라 다르게 한다. + float CameraYaw() { return m_fRotYawVPGod; } // 위에서 바라본 시점일 경우에 카메라 회전각도.. + void SetActiveCamera(CN3Camera * pCamera) { m_pActiveCam = pCamera; } + void Tick(const D3DCOLOR * crDiffuses, // Diffuse 라이트 색깔.. + const D3DCOLOR * crAmbients, // Ambient 라이트 색깔.. + const D3DCOLOR crFog, // 안개 색깔.. + const __Vector3 & vPosPlayer, // 플레이어 위치 + const __Quaternion & qtPlayer, // 회전 쿼터니언 + float fHeightPlayer, // 키를 인수로 넣으면 카메라와 라이트 처리.. + float fSunRadianZ); // 해의 Z 각도.. + void ApplyCameraAndLight(); // 카메라와 라이트에 세팅된 값 적용. 라이트는 해의 각도에 따라 다르게 한다. CGameEng(); virtual ~CGameEng(); diff --git a/src/game/GameProcCharacterCreate.cpp b/src/game/GameProcCharacterCreate.cpp index 31e28e26..f2630da3 100644 --- a/src/game/GameProcCharacterCreate.cpp +++ b/src/game/GameProcCharacterCreate.cpp @@ -281,7 +281,7 @@ bool CGameProcCharacterCreate::ProcessPacket(DataPack * pDataPack, int & iOffset BYTE bySuccess = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 커멘드 파싱.. if (0 == bySuccess) { ProcActiveSet((CGameProcedure *)s_pProcCharacterSelect); // 캐릭터 선택창으로 가기.. - } else // 실패하면.. 이유가 0 이 아닌 값으로 온다.. + } else // 실패하면.. 이유가 0 이 아닌 값으로 온다.. { this->ReportErrorCharacterCreate((e_ErrorCharacterCreate)bySuccess); // 에러 메시지 띄움.. s_pUIMgr->EnableOperationSet(false); // UI 조작 가능하게 한다... 다시 캐릭터 만들어야 한다.. diff --git a/src/game/GameProcCharacterSelect.cpp b/src/game/GameProcCharacterSelect.cpp index 70cc160d..fafdcbfb 100644 --- a/src/game/GameProcCharacterSelect.cpp +++ b/src/game/GameProcCharacterSelect.cpp @@ -1325,15 +1325,15 @@ void CGameProcCharacterSelect::MsgRecv_AllCharacterInfo(DataPack * pDataPack, in m_InfoChrs[i].dwItemHelmet = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 투구 dw m_InfoChrs[i].iItemHelmetDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 m_InfoChrs[i].dwItemUpper = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 상체 dw - m_InfoChrs[i].iItemUpperDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 + m_InfoChrs[i].iItemUpperDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 m_InfoChrs[i].dwItemCloak = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 어깨(망토) dw - m_InfoChrs[i].iItemCloakDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 - m_InfoChrs[i].dwItemLower = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 하체 dw - m_InfoChrs[i].iItemLowerDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 - m_InfoChrs[i].dwItemGloves = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 장갑 dw + m_InfoChrs[i].iItemCloakDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 + m_InfoChrs[i].dwItemLower = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 하체 dw + m_InfoChrs[i].iItemLowerDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 + m_InfoChrs[i].dwItemGloves = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 장갑 dw m_InfoChrs[i].iItemGlovesDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 m_InfoChrs[i].dwItemShoes = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 신발 dw - m_InfoChrs[i].iItemShoesDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 + m_InfoChrs[i].iItemShoesDurability = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 내구성값 } // 캐릭터 추가.. diff --git a/src/game/GameProcLogIn.cpp b/src/game/GameProcLogIn.cpp index 4f71a072..870456a9 100644 --- a/src/game/GameProcLogIn.cpp +++ b/src/game/GameProcLogIn.cpp @@ -382,7 +382,7 @@ void CGameProcLogIn::MsgRecv_AccountLogIn(int iCmd, DataPack * pDataPack, int & ::_LoadStringFromResource(IDS_SERVER_CONNECT_FAIL, szMsg); ::_LoadStringFromResource(IDS_CONNECT_FAIL, szTmp); this->MessageBoxPost(szMsg, szTmp, MB_OK); // MGame ID 로 접속할거냐고 물어본다. - } else if (5 == iResult) // 어떤 넘이 접속해 있다. 서버에게 끊어버리라고 하자.. + } else if (5 == iResult) // 어떤 넘이 접속해 있다. 서버에게 끊어버리라고 하자.. { int iLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); if (iOffset > 0) { diff --git a/src/game/GameProcMain.cpp b/src/game/GameProcMain.cpp index aef56a3a..db35bc1d 100644 --- a/src/game/GameProcMain.cpp +++ b/src/game/GameProcMain.cpp @@ -438,8 +438,8 @@ void CGameProcMain::InitPlayerPosition( const __Vector3 & vPos) // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. { __Vector3 vPosFinal = vPos; - float fYTerrain = ACT_WORLD->GetHeightWithTerrain(vPos.x, vPos.z); // 지형의 높이값 얻기.. - float fYObject = ACT_WORLD->GetHeightNearstPosWithShape(vPos, 1.0f); // 오브젝트에서 가장 가까운 높이값 얻기.. + float fYTerrain = ACT_WORLD->GetHeightWithTerrain(vPos.x, vPos.z); // 지형의 높이값 얻기.. + float fYObject = ACT_WORLD->GetHeightNearstPosWithShape(vPos, 1.0f); // 오브젝트에서 가장 가까운 높이값 얻기.. if (!s_pWorldMgr->IsIndoor()) { if (T_Abs(vPos.y - fYObject) < T_Abs(vPos.y - fYTerrain)) { vPosFinal.y = fYObject; // 좀더 가까운 곳에 놓는다.. @@ -892,13 +892,13 @@ bool CGameProcMain::ProcessPacket(DataPack * pDataPack, int & iOffset) { case N3_UPDATE_REGION_UPC: // 첨에 로그온하면 그 주변 지역의 캐릭터들 업데이트... this->MsgRecv_UserInAndRequest(pDataPack, iOffset); return true; - case N3_REQUEST_USER_IN: // 서버에 요청한 UserIn 에 대한 자세한 정보 받기.. + case N3_REQUEST_USER_IN: // 서버에 요청한 UserIn 에 대한 자세한 정보 받기.. this->MsgRecv_UserInRequested(pDataPack, iOffset); // return true; case N3_UPDATE_REGION_NPC: // 첨에 로그온하면 그 주변 지역의 캐릭터들 업데이트... this->MsgRecv_NPCInAndRequest(pDataPack, iOffset); return true; - case N3_REQUEST_NPC_IN: // 서버에 요청한 UserIn 에 대한 자세한 정보 받기.. + case N3_REQUEST_NPC_IN: // 서버에 요청한 UserIn 에 대한 자세한 정보 받기.. this->MsgRecv_NPCInRequested(pDataPack, iOffset); // return true; case N3_NPC_INOUT: // NPC 인/아웃.. @@ -2447,8 +2447,8 @@ bool CGameProcMain::MsgRecv_UserIn(DataPack * pDataPack, int & iOffset, bool bWi // 기사단 관련 int iKnightsID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 기사단 ID e_KnightsDuty eKnightsDuty = - (e_KnightsDuty)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 소속 국가. 0 이면 없다. 1 - int iKnightNameLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 소속 기사단 이름 길이. + (e_KnightsDuty)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 소속 국가. 0 이면 없다. 1 + int iKnightNameLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 소속 기사단 이름 길이. std::string szKnightsName; CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szKnightsName, iKnightNameLen); int iKnightsGrade = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 등급 @@ -2734,14 +2734,14 @@ bool CGameProcMain::MsgRecv_NPCInOut(DataPack * pDataPack, int & iOffset) { } bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { - int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Server에서 관리하는 고유 ID - int iIDResrc = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 리소스 ID - int iType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // NPC Type - 0x05 : 상인 + int iID = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // Server에서 관리하는 고유 ID + int iIDResrc = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 리소스 ID + int iType = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // NPC Type - 0x05 : 상인 int iItemTrdeID = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 아이템 거래할 그룹 ID 서버에 요청할 ID - int iScale = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 스케일 100 은 1.0 - int iItemID0 = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 리소스 ID - int iItemID1 = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 리소스 ID - int iNameLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); + int iScale = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 스케일 100 은 1.0 + int iItemID0 = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 리소스 ID + int iItemID1 = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 리소스 ID + int iNameLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); std::string szName; // NPC 아이디.. if (iNameLen > 0) { CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, szName, iNameLen); @@ -2754,7 +2754,7 @@ bool CGameProcMain::MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset) { //#endif e_Nation eNation = (e_Nation)CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); // 소속 국가. 0 이면 없다. 1 - int iLevel = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); + int iLevel = CAPISocket::Parse_GetByte(pDataPack->m_pData, iOffset); float fXPos = (CAPISocket::Parse_GetWord(pDataPack->m_pData, iOffset)) / 10.0f; float fZPos = (CAPISocket::Parse_GetWord(pDataPack->m_pData, iOffset)) / 10.0f; @@ -3109,7 +3109,7 @@ bool CGameProcMain::MsgRecv_Attack(DataPack * pDataPack, int & iOffset) { __TABLE_UPC_SKILL * pSkill = s_pTbl_Skill->Find(s_pPlayer->m_dwMagicID); if (pSkill) { int SuccessValue = rand() % 100; - if (SuccessValue >= pSkill->iPercentSuccess) { // 스킬 테이블에 있는 확률대로 실패한다.. + if (SuccessValue >= pSkill->iPercentSuccess) { // 스킬 테이블에 있는 확률대로 실패한다.. s_pPlayer->Action(PSA_BASIC, false, NULL, true); // 캐스팅 취소, 기본동작으로 강제 세팅.. } } @@ -4355,8 +4355,8 @@ void CGameProcMain::InitZone(int iZone, const __Vector3 & vPosPlayer) { //////////////////////////////////////////////////////////////////////////////// CLogWriter::Write("InitPlayerPosition() Position(%.1f, %.1f, %.1f)", vPosPlayer.x, vPosPlayer.y, - vPosPlayer.z); // TmpLog1122 - this->InitPlayerPosition(vPosPlayer); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. + vPosPlayer.z); // TmpLog1122 + this->InitPlayerPosition(vPosPlayer); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. CLogWriter::Write("%d->Release()2", s_pOPMgr); // TmpLog1122 s_pOPMgr->Release(); // 다른 플레이어 삭제... } @@ -4461,7 +4461,7 @@ void CGameProcMain::CommandMove(e_MoveDirection eMD, bool bStartOrEnd) { float fSpeed = s_pPlayer ->MoveSpeedCalculationAndCheckCollision(); // 속도를 구하고 그 속도로 충돌 체크를 한다. 리턴값이 0 이면 충돌이다.. - if (0 == fSpeed) // 못움직이는 상황이면.. + if (0 == fSpeed) // 못움직이는 상황이면.. { s_pPlayer->ActionMove(PSM_STOP); // 멈춤.. } else { @@ -4986,7 +4986,7 @@ void CGameProcMain::MsgRecv_PartyOrForce(DataPack * pDataPack, int & iOffset) { e_Class eClass = (e_Class)(CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)); m_pUIPartyOrForce->MemberAdd(iID, szID, iLevel, eClass, iHP, iHPMax); // 다른넘 파티에추가.. - if (iID != s_pPlayer->IDNumber()) // 자기 자신이 아닌 경우 메시지 출력. + if (iID != s_pPlayer->IDNumber()) // 자기 자신이 아닌 경우 메시지 출력. { std::string szMsg; ::_LoadStringFromResource(IDS_PARTY_INSERT, szMsg); @@ -6130,7 +6130,7 @@ void CGameProcMain::MsgRecv_KnightsListBasic(DataPack * pDataPack, int & iOffset } void CGameProcMain::MsgRecv_CompressedPacket(DataPack * pDataPack, - int & iOffset) // 압축된 데이터 이다... 한번 더 파싱해야 한다!!! + int & iOffset) // 압축된 데이터 이다... 한번 더 파싱해야 한다!!! { short sCompLen, sOrgLen; DWORD dwCrcValue; @@ -6161,7 +6161,7 @@ void CGameProcMain::MsgRecv_CompressedPacket(DataPack * pDataPack, } void CGameProcMain::MsgRecv_ContinousPacket(DataPack * pDataPack, - int & iOffset) // 압축된 데이터 이다... 한번 더 파싱해야 한다!!! + int & iOffset) // 압축된 데이터 이다... 한번 더 파싱해야 한다!!! { int iWholeSize = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 원래데이타길이얻기... int iOffset2 = iOffset, iOffsetPrev = 0, iSizeThisPacket = 0; @@ -6505,11 +6505,11 @@ void CGameProcMain::MsgRecv_WarpList(DataPack * pDataPack, int & iOffset) // 워 iStrLen = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 동의문 길이 CAPISocket::Parse_GetString(pDataPack->m_pData, iOffset, WI.szAgreement, iStrLen); // 동의문 WI.iZone = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 존번호 - WI.iMaxUser = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 최대 유저 카운트. - WI.iGold = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 돈 - WI.vPos.x = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; // 좌표 - WI.vPos.z = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; // - WI.vPos.y = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; // + WI.iMaxUser = CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset); // 최대 유저 카운트. + WI.iGold = CAPISocket::Parse_GetDword(pDataPack->m_pData, iOffset); // 돈 + WI.vPos.x = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; // 좌표 + WI.vPos.z = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; // + WI.vPos.y = (CAPISocket::Parse_GetShort(pDataPack->m_pData, iOffset)) / 10.0f; // m_pUIWarp->InfoAdd(WI); } @@ -7084,7 +7084,7 @@ bool CGameProcMain::MsgRecv_CharacterSelect(DataPack * pDataPack, int & iOffset) //전쟁존에서 죽어서 서버 체인지 하는 경우는 다시 값을 세팅해준다. if (s_pPlayer->IsDead()) { this->InitPlayerPosition( - s_pPlayer->Position()); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. + s_pPlayer->Position()); // 플레이어 위치 초기화.. 일으켜 세우고, 기본동작을 취하게 한다. s_pPlayer->RegenerateCollisionMesh(); // 충돌 메시를 다시 만든다.. s_pPlayer->m_iSendRegeneration = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 s_pPlayer->m_fTimeAfterDeath = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 @@ -7450,7 +7450,7 @@ bool CGameProcMain::OnMouseRBtnPress(POINT ptCur, POINT ptPrev) { if (NULL == pNPC) { CPlayerNPC * pCorpse = s_pOPMgr->PickCorpse(ptCur.x, ptCur.y, iID); // 픽킹.. - if (false == this->MsgSend_RequestItemBundleOpen(pCorpse)) // 시체 뒤저서 아이템 상자 열기.. + if (false == this->MsgSend_RequestItemBundleOpen(pCorpse)) // 시체 뒤저서 아이템 상자 열기.. { CN3Shape * pShape = ACT_WORLD->PickWithShape(ptCur.x, ptCur.y, true); if (pShape && pShape == s_pPlayer->m_pObjectTarget && pShape->m_iEventID) // Event 가 있으면.. @@ -7588,7 +7588,7 @@ void CGameProcMain::MsgSend_SpeedCheck(bool bInit) { float fTime = CN3Base::TimeGet(); // 클라이언트 시간 s_pSocket->MP_AddByte(byBuff, iOffset, N3_CHECK_SPEEDHACK); // 스피드핵 체크 패킷.. - s_pSocket->MP_AddByte(byBuff, iOffset, bInit); // 서버가 기준 시간으로 쓸 타입 true 이면 기준시간 false면 체크타입 + s_pSocket->MP_AddByte(byBuff, iOffset, bInit); // 서버가 기준 시간으로 쓸 타입 true 이면 기준시간 false면 체크타입 s_pSocket->MP_AddFloat(byBuff, iOffset, fTime); // 클라이언트 시간 s_pSocket->Send(byBuff, iOffset); // 보냄.. } diff --git a/src/game/GameProcMain.h b/src/game/GameProcMain.h index c9d1043f..1ca2d090 100644 --- a/src/game/GameProcMain.h +++ b/src/game/GameProcMain.h @@ -21,13 +21,13 @@ class CGameProcMain : public CGameProcedure { #ifdef _N3_64GRID_ CServerMesh * m_pSMesh; // 서버에게 필요한 메쉬 클래스.. #endif - class CUIInventory * m_pUIInventory; // 인벤토리 - class CUIVarious * m_pUIVar; // 캐릭터 상태창, 기사단 관리 등이 페이지로 들어간 다용도 UI - class CUIChat * m_pUIChatDlg; // 채팅 입출력 대화상자.. - class CUIMessageWnd * m_pUIMsgDlg; // 게임 메시지 출력 상자. - class CUIStateBar * m_pUIStateBarAndMiniMap; // mp,hp,exp, minimap.... - class CUICmd * m_pUICmd; // 왼쪽 하단의 명령버튼 창.. - class CUITargetBar * m_pUITargetBar; // 타겟 상태창.. + class CUIInventory * m_pUIInventory; // 인벤토리 + class CUIVarious * m_pUIVar; // 캐릭터 상태창, 기사단 관리 등이 페이지로 들어간 다용도 UI + class CUIChat * m_pUIChatDlg; // 채팅 입출력 대화상자.. + class CUIMessageWnd * m_pUIMsgDlg; // 게임 메시지 출력 상자. + class CUIStateBar * m_pUIStateBarAndMiniMap; // mp,hp,exp, minimap.... + class CUICmd * m_pUICmd; // 왼쪽 하단의 명령버튼 창.. + class CUITargetBar * m_pUITargetBar; // 타겟 상태창.. class CUITransactionDlg * m_pUITransactionDlg; class CUIDroppedItemDlg * m_pUIDroppedItemDlg; class CSubProcPerTrade * m_pSubProcPerTrade; @@ -121,7 +121,7 @@ class CGameProcMain : public CGameProcedure { int & iOffset); // 주위 영역의 모든 User 아이디를 카운트만큼 받는다... 글구.. 업데이트가 필요한 것만 서버에게 요청.. bool MsgRecv_UserInRequested(DataPack * pDataPack, - int & iOffset); // 서버에게 요청한 유저의 아이디들을 받아서 User 처리.. + int & iOffset); // 서버에게 요청한 유저의 아이디들을 받아서 User 처리.. bool MsgRecv_UserInOut(DataPack * pDataPack, int & iOffset); bool MsgRecv_UserIn(DataPack * pDataPack, int & iOffset, bool bWithFX = false); bool MsgRecv_UserOut(DataPack * pDataPack, int & iOffset); @@ -132,7 +132,7 @@ class CGameProcMain : public CGameProcedure { int & iOffset); // 주위 영역의 모든 NPC 아이디를 카운트만큼 받는다... 글구.. 업데이트가 필요한 것만 서버에게 요청.. bool MsgRecv_NPCInRequested(DataPack * pDataPack, - int & iOffset); // 서버에게 요청한 NPC 아이디들을 받아서 User 처리.. + int & iOffset); // 서버에게 요청한 NPC 아이디들을 받아서 User 처리.. bool MsgRecv_NPCInOut(DataPack * pDataPack, int & iOffset); bool MsgRecv_NPCIn(DataPack * pDataPack, int & iOffset); bool MsgRecv_NPCOut(DataPack * pDataPack, int & iOffset); @@ -141,9 +141,9 @@ class CGameProcMain : public CGameProcedure { bool MsgRecv_Attack(DataPack * pDataPack, int & iOffset); bool MsgRecv_Dead(DataPack * pDataPack, int & iOffset); - bool MsgRecv_ItemMove(DataPack * pDataPack, int & iOffset); // Item Move에 대한 응답.. - bool MsgRecv_ItemBundleDrop(DataPack * pDataPack, int & iOffset); // Item 이 필드에 나타나는데에 대한 응답 - bool MsgRecv_ItemBundleOpen(DataPack * pDataPack, int & iOffset); // 아이템 상자를 열거나 시체를 뒤진다.. + bool MsgRecv_ItemMove(DataPack * pDataPack, int & iOffset); // Item Move에 대한 응답.. + bool MsgRecv_ItemBundleDrop(DataPack * pDataPack, int & iOffset); // Item 이 필드에 나타나는데에 대한 응답 + bool MsgRecv_ItemBundleOpen(DataPack * pDataPack, int & iOffset); // 아이템 상자를 열거나 시체를 뒤진다.. bool MsgRecv_ItemTradeStart(DataPack * pDataPack, int & iOffset); // 아이템 상거래.. bool MsgRecv_ItemTradeResult(DataPack * pDataPack, int & iOffset); // 아이템 상거래 결과.. bool MsgRecv_ItemDroppedGetResult(DataPack * pDataPack, int & iOffset); // 땅에 떨어진 아이템 먹기 결과.. @@ -173,7 +173,7 @@ class CGameProcMain : public CGameProcedure { void MsgRecv_CompressedPacket(DataPack * pDataPack, int & iOffset); // 압축된 패킷이다... 압축 풀고 루프를 돌면서 한번더 파싱해야 한다!!! void MsgRecv_ContinousPacket(DataPack * pDataPack, - int & iOffset); // 붙어서 오는 패킷이다.. 루프를 돌면서 한번더 파싱해야 한다!!! + int & iOffset); // 붙어서 오는 패킷이다.. 루프를 돌면서 한번더 파싱해야 한다!!! void MsgRecv_ItemRepair(DataPack * pDataPack, int & iOffset); // Item Repair Result.. void MsgRecv_ItemCountChange(DataPack * pDataPack, int & iOffset); // Item Count Change.. @@ -257,13 +257,13 @@ class CGameProcMain : public CGameProcedure { float fDistance); // 공격 패킷 날리기 - 테이블의 공격 주기를 같이 줘서 해킹을 막는다. void MsgSend_Move(bool bMove, bool bContinous); // 서버에게 움직임 패킷을 날린다.. // 움직이는가 ? 주기적으로 움직이는 건가? - void MsgSend_Rotation(); // 서버에게 회전 패킷을 날린다.. + void MsgSend_Rotation(); // 서버에게 회전 패킷을 날린다.. void MsgSend_Chat(enum e_ChatMode eMode, const std::string & szChat); // 서버에게 채팅 메시지를 날린다.. void MsgSend_ChatSelectTarget(const std::string & szTargetID); // 일대일 채팅 상대 정하기. void MsgSend_Regen(); bool MsgSend_RequestItemBundleOpen(CPlayerNPC * pCorpse); // 아이템 상자를 열거나 시체를 뒤진다.. void MsgSend_RequestTargetHP(short siIDTarget, - BYTE byUpdateImmediately); // 0x00 - 점차 늘어나게끔.. 0x01 - 즉시 업데이트.. + BYTE byUpdateImmediately); // 0x00 - 점차 늘어나게끔.. 0x01 - 즉시 업데이트.. void MsgSend_GameStart(); bool MsgSend_NPCEvent(short siIDTarget); void MsgSend_NPCInRequest(int iID); // NPC 정보가 없을 경우 요청한다.. @@ -291,7 +291,7 @@ class CGameProcMain : public CGameProcedure { void MsgSend_PerTradeBBSReq(std::string szName, int iDestID); void MsgSend_CharacterSelect(); // virtual - void ProcessPlayerInclination(); // 경사 처리..(가만히 있어도 경사가 급하면 미끄러짐..). + void ProcessPlayerInclination(); // 경사 처리..(가만히 있어도 경사가 급하면 미끄러짐..). void ProcessLocalInput(DWORD dwMouseFlags); // 키보드 눌린것을 처리한다.. void ParseChattingCommand(const std::string & szCmd); diff --git a/src/game/GameProcedure.cpp b/src/game/GameProcedure.cpp index 45cc8f1e..3d08531a 100644 --- a/src/game/GameProcedure.cpp +++ b/src/game/GameProcedure.cpp @@ -56,13 +56,13 @@ CN3UIDebug CGameProcedure::s_UIDebug; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// -CKnightChrMgr * CGameProcedure::s_pKnightChr = NULL; // 나이트 캐릭터.. -CN3SndObjStream * CGameProcedure::s_pSnd_BGM = NULL; // 메인 배경음악 포인터.. -CLocalInput * CGameProcedure::s_pLocalInput = NULL; // 마우스와 키보드 입력 객체 .. Direct Input 을 썼다. -CAPISocket * CGameProcedure::s_pSocket = NULL; // 메인 소켓 객체 -CAPISocket * CGameProcedure::s_pSocketSub = NULL; // 서브 소켓 객체 -CGameEng * CGameProcedure::s_pEng = NULL; // 3D Wrapper Engine -CN3FXMgr * CGameProcedure::s_pFX = NULL; +CKnightChrMgr * CGameProcedure::s_pKnightChr = NULL; // 나이트 캐릭터.. +CN3SndObjStream * CGameProcedure::s_pSnd_BGM = NULL; // 메인 배경음악 포인터.. +CLocalInput * CGameProcedure::s_pLocalInput = NULL; // 마우스와 키보드 입력 객체 .. Direct Input 을 썼다. +CAPISocket * CGameProcedure::s_pSocket = NULL; // 메인 소켓 객체 +CAPISocket * CGameProcedure::s_pSocketSub = NULL; // 서브 소켓 객체 +CGameEng * CGameProcedure::s_pEng = NULL; // 3D Wrapper Engine +CN3FXMgr * CGameProcedure::s_pFX = NULL; CUIManager * CGameProcedure::s_pUIMgr = NULL; // UI Manager CUILoading * CGameProcedure::s_pUILoading = NULL; // 로딩바.. @@ -97,10 +97,10 @@ HCURSOR CGameProcedure::m_hPrevGameCursor = NULL; HWND CGameProcedure::s_hWndSubSocket = NULL; // 서브 소켓용 윈도우 핸들.. int CGameProcedure::s_iChrSelectIndex = 0; bool CGameProcedure::s_bNeedReportVersionCheck = false; -bool CGameProcedure::s_bNeedReportConnectionClosed = false; // 서버접속이 끊어진걸 보고해야 하는지.. -bool CGameProcedure::s_bWindowed = false; // 창모드 실행?? -bool CGameProcedure::s_bKeyPress = false; //키가 눌려졌을때 ui에서 해당하는 조작된적이 있다면 -bool CGameProcedure::s_bKeyPressed = false; //키가 올라갔을때 ui에서 해당하는 조작된적이 있다면 +bool CGameProcedure::s_bNeedReportConnectionClosed = false; // 서버접속이 끊어진걸 보고해야 하는지.. +bool CGameProcedure::s_bWindowed = false; // 창모드 실행?? +bool CGameProcedure::s_bKeyPress = false; //키가 눌려졌을때 ui에서 해당하는 조작된적이 있다면 +bool CGameProcedure::s_bKeyPressed = false; //키가 올라갔을때 ui에서 해당하는 조작된적이 있다면 CGameProcedure::CGameProcedure() { m_bCursorLocked = false; @@ -886,14 +886,14 @@ void CGameProcedure::MsgSend_CharacterSelect() // virtual { BYTE byBuff[64]; int iOffset = 0; - CAPISocket::MP_AddByte(byBuff, iOffset, N3_CHARACTER_SELECT); // 커멘드. - CAPISocket::MP_AddShort(byBuff, iOffset, s_szAccount.size()); // 계정 길이.. - CAPISocket::MP_AddString(byBuff, iOffset, s_szAccount); // 계정 문자열.. - CAPISocket::MP_AddShort(byBuff, iOffset, s_pPlayer->IDString().size()); // 캐릭 아이디 길이.. - CAPISocket::MP_AddString(byBuff, iOffset, s_pPlayer->IDString()); // 캐릭 아이디 문자열.. + CAPISocket::MP_AddByte(byBuff, iOffset, N3_CHARACTER_SELECT); // 커멘드. + CAPISocket::MP_AddShort(byBuff, iOffset, s_szAccount.size()); // 계정 길이.. + CAPISocket::MP_AddString(byBuff, iOffset, s_szAccount); // 계정 문자열.. + CAPISocket::MP_AddShort(byBuff, iOffset, s_pPlayer->IDString().size()); // 캐릭 아이디 길이.. + CAPISocket::MP_AddString(byBuff, iOffset, s_pPlayer->IDString()); // 캐릭 아이디 문자열.. CAPISocket::MP_AddByte(byBuff, iOffset, s_pPlayer->m_InfoExt.iZoneInit); // 처음 접속인지 아닌지 0x01:처음 접속 - CAPISocket::MP_AddByte(byBuff, iOffset, s_pPlayer->m_InfoExt.iZoneCur); // 캐릭터 선택창에서의 캐릭터 존 번호 - s_pSocket->Send(byBuff, iOffset); // 보낸다 + CAPISocket::MP_AddByte(byBuff, iOffset, s_pPlayer->m_InfoExt.iZoneCur); // 캐릭터 선택창에서의 캐릭터 존 번호 + s_pSocket->Send(byBuff, iOffset); // 보낸다 CLogWriter::Write("MsgSend_CharacterSelect - name(%s) zone(%d)", s_pPlayer->IDString().c_str(), s_pPlayer->m_InfoExt.iZoneCur); // 디버깅 로그.. diff --git a/src/game/GameProcedure.h b/src/game/GameProcedure.h index 06e2907b..b8697cff 100644 --- a/src/game/GameProcedure.h +++ b/src/game/GameProcedure.h @@ -113,8 +113,8 @@ class CGameProcedure : public CGameBase { static void ReportServerConnectionClosed(bool bNeedQuitGame); static void ReportDebugStringAndSendToServer(const std::string & szDebug); - virtual int MsgRecv_VersionCheck(DataPack * pDataPack, int & iOffset); // 암호화 키도 같이 받는다.. - virtual int MsgRecv_GameServerLogIn(DataPack * pDataPack, int & iOffset); // virtual - 국가번호를 리턴한다. + virtual int MsgRecv_VersionCheck(DataPack * pDataPack, int & iOffset); // 암호화 키도 같이 받는다.. + virtual int MsgRecv_GameServerLogIn(DataPack * pDataPack, int & iOffset); // virtual - 국가번호를 리턴한다. virtual bool MsgRecv_CharacterSelect(DataPack * pDataPack, int & iOffset); static void MsgSend_GameServerLogIn(); diff --git a/src/game/ItemRepairMgr.cpp b/src/game/ItemRepairMgr.cpp index 383732ef..f6691896 100644 --- a/src/game/ItemRepairMgr.cpp +++ b/src/game/ItemRepairMgr.cpp @@ -131,8 +131,8 @@ void CItemRepairMgr::Tick() { int iOffset = 0; // 패킷 오프셋.. CAPISocket::MP_AddByte(byBuff, iOffset, N3_ITEM_REPAIR_REQUEST); // 게임 스타트 패킷 커멘드.. - CAPISocket::MP_AddByte(byBuff, iOffset, iArm); // 아이디 길이 패킷에 넣기.. - CAPISocket::MP_AddByte(byBuff, iOffset, iOrder); // 아이디 길이 패킷에 넣기.. + CAPISocket::MP_AddByte(byBuff, iOffset, iArm); // 아이디 길이 패킷에 넣기.. + CAPISocket::MP_AddByte(byBuff, iOffset, iOrder); // 아이디 길이 패킷에 넣기.. CAPISocket::MP_AddDword(byBuff, iOffset, spItem->pItemBasic->dwID + spItem->pItemExt->dwID); // 아이디 문자열 패킷에 넣기.. diff --git a/src/game/LocalInput.cpp b/src/game/LocalInput.cpp index 70ab1582..9c119318 100644 --- a/src/game/LocalInput.cpp +++ b/src/game/LocalInput.cpp @@ -325,7 +325,7 @@ void CLocalInput::Tick(void) { RECT rcClient; ::GetClientRect(m_hWnd, &rcClient); - ::GetCursorPos(&m_ptCurMouse); // 좀 이상해서... 그냥 시스템 마우스 커서 위치 가져오기 + ::GetCursorPos(&m_ptCurMouse); // 좀 이상해서... 그냥 시스템 마우스 커서 위치 가져오기 ::ScreenToClient(m_hWnd, &m_ptCurMouse); // 클라이언트 영역으로 변환 if (PtInRect(&rcClient, m_ptCurMouse) == diff --git a/src/game/Main.cpp b/src/game/Main.cpp index 6c224775..84f63455 100644 --- a/src/game/Main.cpp +++ b/src/game/Main.cpp @@ -445,7 +445,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi ////////////////////////////////////////////////////////////////////////////////////////// // Static Member 생성... - CGameProcedure::StaticMemberInit(hInstance, hWndMain, hWndSub); // 파괴는 WM_DESTROY 에서 한다.. + CGameProcedure::StaticMemberInit(hInstance, hWndMain, hWndSub); // 파괴는 WM_DESTROY 에서 한다.. CGameProcedure::ProcActiveSet((CGameProcedure *)CGameProcedure::s_pProcLogIn); // 로그인 프로시져부터 시작.. BOOL bGotMsg = FALSE; diff --git a/src/game/N3EffectWave2.cpp b/src/game/N3EffectWave2.cpp index c37ed106..dfdf73f3 100644 --- a/src/game/N3EffectWave2.cpp +++ b/src/game/N3EffectWave2.cpp @@ -85,8 +85,8 @@ bool CN3EffectWave2::Load(HANDLE hFile) { // XyxT2 -> XyzColorT2 Converting. ptmpPondMesh->m_pVertices = new __VertexPond[iVC]; /// ReadFile(hFile, ptmpPondMesh->m_pVertices, iVC * sizeof(__VertexPond), &dwNum, NULL); - ptmpPondMesh->m_pVertices[0].y += 0.2f; // 수치가 높으면 물결이 크게 요동친다 - ptmpPondMesh->m_pVertices[iWidthVertex].y += 0.2f; // 수치가 높으면 물결이 크게 요동친다 + ptmpPondMesh->m_pVertices[0].y += 0.2f; // 수치가 높으면 물결이 크게 요동친다 + ptmpPondMesh->m_pVertices[iWidthVertex].y += 0.2f; // 수치가 높으면 물결이 크게 요동친다 ptmpPondMesh->m_pfMaxHeight = ptmpPondMesh->m_pVertices[0].y -= 0.3f; // 물결의 최대치 ptmpPondMesh->m_pfVelocityArray = new float[iVC]; /// diff --git a/src/game/N3TerrainManager.cpp b/src/game/N3TerrainManager.cpp index 17b95fba..9c03ed3e 100644 --- a/src/game/N3TerrainManager.cpp +++ b/src/game/N3TerrainManager.cpp @@ -269,7 +269,7 @@ bool CN3TerrainManager::CheckCollisionWithShape(const __Vector3 & vPos, float fSpeedPerSec, // 초당 움직이는 속도 __Vector3 * pvCol, // 충돌 지점 __Vector3 * pvNormal, // 충돌한면의 법선벡터 - __Vector3 * pVec) // 충돌한 면 의 폴리곤 __Vector3[3] + __Vector3 * pVec) // 충돌한 면 의 폴리곤 __Vector3[3] { if (m_pShapes) { return m_pShapes->CheckCollision(vPos, vDir, fSpeedPerSec, pvCol, pvNormal, pVec); diff --git a/src/game/N3WorldBase.h b/src/game/N3WorldBase.h index 0243a682..86be2549 100644 --- a/src/game/N3WorldBase.h +++ b/src/game/N3WorldBase.h @@ -49,7 +49,7 @@ class CN3WorldBase : public CN3BaseFileAccess, public CGameBase { float fSpeedPerSec, // 초당 움직이는 속도 __Vector3 * pvCol = NULL, // 충돌 지점 __Vector3 * pvNormal = NULL, // 충돌한면의 법선벡터 - __Vector3 * pVec = NULL) = 0; // 충돌한 면 의 폴리곤 __Vector3[3] + __Vector3 * pVec = NULL) = 0; // 충돌한 면 의 폴리곤 __Vector3[3] // Sky.. virtual D3DCOLOR GetSkyColorWithSky() { return 0x00000000; } diff --git a/src/game/PacketDef.h b/src/game/PacketDef.h index 12d789c7..a47639f9 100644 --- a/src/game/PacketDef.h +++ b/src/game/PacketDef.h @@ -92,7 +92,7 @@ enum e_SubPacket_Party { N3_SP_PARTY_OR_FORCE_PERMIT = 0x02, // Send - b1(YesNo) | Recv - s1(ID) N3_SP_PARTY_OR_FORCE_INSERT = 0x03, // Send - s1(ID) | Recv - s3(ID, HPMax, HP) b2(Level, Class) - 문자열은 ID 로 알아낸다.. ID 가 -1 이면.. 파티에 들어오는것을 상대방이 거절한거다.. - N3_SP_PARTY_OR_FORCE_REMOVE = 0x04, // Send - s1(ID) | Recv - s1(ID) - 자기 자신이면 파티를 깨야 한다.. + N3_SP_PARTY_OR_FORCE_REMOVE = 0x04, // Send - s1(ID) | Recv - s1(ID) - 자기 자신이면 파티를 깨야 한다.. N3_SP_PARTY_OR_FORCE_DESTROY = 0x05, // Send N3_SP_PARTY_OR_FORCE_HP_CHANGE = 0x06, // Recv - s3(ID, HPMax, HP) N3_SP_PARTY_OR_FORCE_LEVEL_CHANGE = 0x07, // Recv - s1(ID), b1(Level) @@ -171,12 +171,12 @@ enum e_SubPacket_ClassChange { #define N3_KNIGHTS 0x3C // Knights Related Packet.. enum e_SubPacket_Knights { - N3_SP_KNIGHTS_CREATE = 0x01, // 생성 Send - s1(Name Length) str1 | Recv - b1(1:성공 0:실패) - N3_SP_KNIGHTS_JOIN = 0x02, // 가입 Send - s1(Knights ID) | Recv - b1(1:성공 0:실패) - N3_SP_KNIGHTS_WITHDRAW = 0x03, // 탈퇴 Send - | Recv - b1(1:성공 0:실패) - N3_SP_KNIGHTS_MEMBER_REMOVE = 0x04, // 멤버 삭제 - - N3_SP_KNIGHTS_DESTROY = 0x05, // 뽀개기 Send - | Recv - b1(1:성공 0:실패) - N3_SP_KNIGHTS_MEMBER_JOIN_ADMIT = 0x06, // 멤버 가입 허가 Send - s1(Knights ID) | Recv - b1(1:성공 0:실패) + N3_SP_KNIGHTS_CREATE = 0x01, // 생성 Send - s1(Name Length) str1 | Recv - b1(1:성공 0:실패) + N3_SP_KNIGHTS_JOIN = 0x02, // 가입 Send - s1(Knights ID) | Recv - b1(1:성공 0:실패) + N3_SP_KNIGHTS_WITHDRAW = 0x03, // 탈퇴 Send - | Recv - b1(1:성공 0:실패) + N3_SP_KNIGHTS_MEMBER_REMOVE = 0x04, // 멤버 삭제 - + N3_SP_KNIGHTS_DESTROY = 0x05, // 뽀개기 Send - | Recv - b1(1:성공 0:실패) + N3_SP_KNIGHTS_MEMBER_JOIN_ADMIT = 0x06, // 멤버 가입 허가 Send - s1(Knights ID) | Recv - b1(1:성공 0:실패) N3_SP_KNIGHTS_MEMBER_JOIN_REJECT = 0x07, // 멤버 가입 거절 Send - s1(Knights ID) | Recv - b1(1:성공 0:실패) N3_SP_KNIGHTS_MEMBER_PUNISH = 0x08, // 멤버 징계 - 가입과 같음 N3_SP_KNIGHTS_APPOINT_CHIEF = 0x09, // 단장 임명 - 가입과 같음 @@ -188,9 +188,9 @@ enum e_SubPacket_Knights { 0x0D, // 모든 멤버 요청 Send - s1(page) | s1(Member Count) Loop { s1(Name Length) str1 (Name) } N3_SP_KNIGHTS_MEMBER_INFO_ONLINE = 0x0E, // 현재 접속 리스트 Send - s1(page) | s1(Member Count) Loop { s1(Name Length) str1 (Name) } - N3_SP_KNIGHTS_STASH = 0x0F, // 기사단 창고 + N3_SP_KNIGHTS_STASH = 0x0F, // 기사단 창고 N3_SP_KNIGHTS_DUTY_CHANGE = 0x10, // 멤버의 직위 변경.. 해당 멤버에게 간다.. Recv - s1(Knights ID) b1(직위); - N3_SP_KNIGHTS_JOIN_REQ = 0x11, // 기사단 인덱스 + N3_SP_KNIGHTS_JOIN_REQ = 0x11, // 기사단 인덱스 N3_SP_KNIGHTS_UNKNOWN }; @@ -207,20 +207,20 @@ enum e_SubPacket_KNights_Create { }; enum e_SubPacket_KNights_Common { - N3_SP_KNIGHTS_COMMON_DBFAIL = 0x00, //DB검색 실패.. - N3_SP_KNIGHTS_COMMON_SUCCESS = 0x01, //성공 - N3_SP_KNIGHTS_COMMON_FAIL_NONE_USER = 0x02, //없는 유저.. - N3_SP_KNIGHTS_COMMON_FAIL_DEAD_USER = 0x03, //상대유저가 죽어 있음.. - N3_SP_KNIGHTS_COMMON_FAIL_ENEMY_USER = 0x04, //상대유저의 국가가 다름.. + N3_SP_KNIGHTS_COMMON_DBFAIL = 0x00, //DB검색 실패.. + N3_SP_KNIGHTS_COMMON_SUCCESS = 0x01, //성공 + N3_SP_KNIGHTS_COMMON_FAIL_NONE_USER = 0x02, //없는 유저.. + N3_SP_KNIGHTS_COMMON_FAIL_DEAD_USER = 0x03, //상대유저가 죽어 있음.. + N3_SP_KNIGHTS_COMMON_FAIL_ENEMY_USER = 0x04, //상대유저의 국가가 다름.. N3_SP_KNIGHTS_COMMON_FAIL_OTHER_CLAN_USER = 0x05, //상대유저가 이미 다른 클랜이나 기사단에 가입되어 있음.. - N3_SP_KNIGHTS_COMMON_FAIL_INVALIDRIGHT = 0x06, //권한이 없음.. - N3_SP_KNIGHTS_COMMON_FAIL_NONE_CLAN = 0x07, //존재하지 않는 기사단.. - N3_SP_KNIGHTS_COMMON_FAIL_FULL = 0x08, //인원이 풀.. - N3_SP_KNIGHTS_COMMON_FAIL_ME = 0x09, //자기자신을 선택한 경우.. - N3_SP_KNIGHTS_COMMON_FAIL_NOT_JOINED = 0x0A, //기사단이나 클랜에 가입되어 있지 않음... - N3_SP_KNIGHTS_COMMON_FAIL_REJECT = 0x0B, //상대편에서 거절... - N3_SP_KNIGHTS_COMMON_FAIL_BATTLEZONE = 0x0C // 전쟁존에서의 거부.. -}; // join, appoint, leave, withdraw 모두 쓴다..... + N3_SP_KNIGHTS_COMMON_FAIL_INVALIDRIGHT = 0x06, //권한이 없음.. + N3_SP_KNIGHTS_COMMON_FAIL_NONE_CLAN = 0x07, //존재하지 않는 기사단.. + N3_SP_KNIGHTS_COMMON_FAIL_FULL = 0x08, //인원이 풀.. + N3_SP_KNIGHTS_COMMON_FAIL_ME = 0x09, //자기자신을 선택한 경우.. + N3_SP_KNIGHTS_COMMON_FAIL_NOT_JOINED = 0x0A, //기사단이나 클랜에 가입되어 있지 않음... + N3_SP_KNIGHTS_COMMON_FAIL_REJECT = 0x0B, //상대편에서 거절... + N3_SP_KNIGHTS_COMMON_FAIL_BATTLEZONE = 0x0C // 전쟁존에서의 거부.. +}; // join, appoint, leave, withdraw 모두 쓴다..... #define N3_ITEM_COUNT_CHANGE 0x3d #define N3_KNIGHTS_LIST_BASIC 0x3e // 기사단 정보 요청 @@ -234,7 +234,7 @@ enum e_SubPacket_KnightsList { enum e_SubPacket_Administrator { N3_SP_ADMINISTRATOR_ARREST = 0x01, // 그 유저 있는 곳으로 존체인지.. Send b1(Type) s1(유저이름길이), str1(유저이름) N3_SP_ADMINISTRATOR_FORBID_CONNECT = 0x02, // 접속금지 및 쫓아내기.. Send b1(Type) s1(유저이름길이), str1(유저이름) - N3_SP_ADMINISTRATOR_CHAT_FORBID = 0x03, // 채팅금지 Send b1(Type) s1(유저이름길이), str1(유저이름) + N3_SP_ADMINISTRATOR_CHAT_FORBID = 0x03, // 채팅금지 Send b1(Type) s1(유저이름길이), str1(유저이름) N3_SP_ADMINISTRATOR_CHAT_PERMIT = 0x04 }; // 채팅허가 Send b1(Type) s1(유저이름길이), str1(유저이름) diff --git a/src/game/PlayerBase.cpp b/src/game/PlayerBase.cpp index 16030a7f..2b5cd10d 100644 --- a/src/game/PlayerBase.cpp +++ b/src/game/PlayerBase.cpp @@ -41,7 +41,7 @@ CPlayerBase::CPlayerBase() { m_iDroppedItemID = 0; // 죽은후 떨어트린 아이템 m_Chr.m_nJointPartStarts[0] = 1; // 상체 - 에니메이션을 분리해 처리하는데... 조인트 인덱스이다. - m_Chr.m_nJointPartEnds[0] = 15; // 상체 + m_Chr.m_nJointPartEnds[0] = 15; // 상체 m_Chr.m_nJointPartStarts[1] = 16; // 하체 m_Chr.m_nJointPartEnds[1] = 23; // 하체 @@ -62,7 +62,7 @@ CPlayerBase::CPlayerBase() { m_fRotRadianPerSec = D3DXToRadian(270.0f); // 초당 회전 라디안값 m_fMoveSpeedPerSec = - 0; // 초당 움직임 값.. 이값은 기본값이고 상태(걷기, 달리기, 뒤로, 저주등) 에 따라 가감해서 쓴다.. + 0; // 초당 움직임 값.. 이값은 기본값이고 상태(걷기, 달리기, 뒤로, 저주등) 에 따라 가감해서 쓴다.. m_fYawCur = 0; // 현재 회전값.. m_fYawToReach = 0; @@ -87,9 +87,9 @@ CPlayerBase::CPlayerBase() { m_pShapeExtraRef = NULL; // 이 NPC 가 성문이나 집등 오브젝트의 형태이면 이 포인터를 세팅해서 쓴,다.. m_fCastFreezeTime = 0.0f; - m_iSkillStep = 0; // 현재 스킬을 쓰고 있다면 0 이 아닌값이다... + m_iSkillStep = 0; // 현재 스킬을 쓰고 있다면 0 이 아닌값이다... m_fAttackDelta = 1.0f; // 스킬이나 마법에 의해 변하는 공격 속도.. 1.0 이 기본이고 클수록 더 빨리 공격한다. - m_fMoveDelta = 1.0f; // 스킬이나 마법에 의해 변하는 이동 속도 1.0 이 기본이고 클수록 더 빨리 움직인다. + m_fMoveDelta = 1.0f; // 스킬이나 마법에 의해 변하는 이동 속도 1.0 이 기본이고 클수록 더 빨리 움직인다. m_vDirDying.Set(0, 0, 1); // 죽을때 밀리는 방향.. @@ -205,7 +205,7 @@ void CPlayerBase::Release() { m_fRotRadianPerSec = D3DXToRadian(270.0f); // 초당 회전 라디안값 m_fMoveSpeedPerSec = - 0; // 초당 움직임 값.. 이값은 기본값이고 상태(걷기, 달리기, 뒤로, 저주등) 에 따라 가감해서 쓴다.. + 0; // 초당 움직임 값.. 이값은 기본값이고 상태(걷기, 달리기, 뒤로, 저주등) 에 따라 가감해서 쓴다.. m_fYawCur = 0; // 현재 회전값.. m_fYawToReach = 0; @@ -220,9 +220,9 @@ void CPlayerBase::Release() { m_pShapeExtraRef = NULL; // 이 NPC 가 성문이나 집등 오브젝트의 형태이면 이 포인터를 세팅해서 쓴,다.. m_fCastFreezeTime = 0.0f; - m_iSkillStep = 0; // 현재 스킬을 쓰고 있다면 0 이 아닌값이다... - m_fAttackDelta = 1.0f; // 스킬이나 마법에 의해 변하는 공격 속도.. 1.0 이 기본이고 클수록 더 빨리 공격한다. - m_fMoveDelta = 1.0f; // 스킬이나 마법에 의해 변하는 이동 속도 1.0 이 기본이고 클수록 더 빨리 움직인다. + m_iSkillStep = 0; // 현재 스킬을 쓰고 있다면 0 이 아닌값이다... + m_fAttackDelta = 1.0f; // 스킬이나 마법에 의해 변하는 공격 속도.. 1.0 이 기본이고 클수록 더 빨리 공격한다. + m_fMoveDelta = 1.0f; // 스킬이나 마법에 의해 변하는 이동 속도 1.0 이 기본이고 클수록 더 빨리 움직인다. m_vDirDying.Set(0, 0, 1); // 죽을때 밀리는 방향.. m_bAnimationChanged = false; // 큐에 넣은 에니메이션이 변하는 순간만 세팅된다.. @@ -556,7 +556,7 @@ void CPlayerBase::RenderChrInRect(CN3Chr * pChr, const RECT & Rect) { D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f); D3DXMatrixLookAtLH(&mtxView, &vEye, // 여기서 View matrix는 카메라 각도와 상관있다. 거리는 원근에 아무 영향을 미치지 않는다. - &vAt, // fVCenter: 캐릭터 키의 중간을 바라보기 + &vAt, // fVCenter: 캐릭터 키의 중간을 바라보기 &vUp); s_lpD3DDev->SetTransform(D3DTS_VIEW, &mtxView); s_lpD3DDev->SetTransform(D3DTS_PROJECTION, &mtxProj); @@ -711,7 +711,7 @@ void CPlayerBase::TickAnimation() { { CPlayerBase * pTarget = this->CharacterGetByID(m_iIDTarget, true); this->Action(m_eStateNext, true, pTarget); // 상태 돌리기.. - } else // 에니메이션 데크가 비어 있지 않고 시킬 동작이 있으면.. + } else // 에니메이션 데크가 비어 있지 않고 시킬 동작이 있으면.. { e_Ani eAniToSet = m_AnimationDeque[0]; // 데크에서 하나 빼오고.. m_AnimationDeque.pop_front(); @@ -1101,8 +1101,8 @@ bool CPlayerBase::Action(e_StateAction eState, bool bLooping, CPlayerBase * pTar // TRACE("%s(%.1f) - %s\n", m_szName.c_str(), CN3Base::TimeGet(), szSt1.c_str()); // } - bool bNPC = (RACE_NPC == m_InfoBase.eRace ? true : false); - bool bNeedUpperAnimationOnly = false; // 몸 전체에 에니메이션을 적요하는가... -1 : 전체, 0 : 하체 1 : 상체 + bool bNPC = (RACE_NPC == m_InfoBase.eRace ? true : false); + bool bNeedUpperAnimationOnly = false; // 몸 전체에 에니메이션을 적요하는가... -1 : 전체, 0 : 하체 1 : 상체 bool bOnceAndFreeze = false; e_Ani eAni = ANI_UNKNOWN; e_Ani eAniToRestore = ANI_UNKNOWN; @@ -1292,7 +1292,7 @@ bool CPlayerBase::ActionMove(e_StateMove eMove) { this->Action(PSA_BASIC, true); // 딴짓 못하게 건다.. // 에니메이션 세팅.. - this->AnimationClear(); // 에니메이션 큐의 내용을 지운다.. 그래야 바로 에니메이션이 나간다. + this->AnimationClear(); // 에니메이션 큐의 내용을 지운다.. 그래야 바로 에니메이션이 나간다. m_Chr.AniCurSet(eAni, false, FLT_MIN, 0, false); // 상체 에니메이션을 중지시키지 않고 걷거나 뛴다... return true; @@ -2034,7 +2034,7 @@ CN3CPart * CPlayerBase::PartSet(e_PartPosition ePos, const std::string & szFN, _ ePlugPos2); this->PartSet(PART_POS_LOWER, szFN2, m_pItemPartBasics[PART_POS_LOWER], m_pItemPartExts[PART_POS_LOWER]); // 하체에 전의 옷을 입힌다.. - } else // 하체에 입고 있었던 아이템이 없다면.. + } else // 하체에 입고 있었던 아이템이 없다면.. { __TABLE_PLAYER_LOOKS * pLooks = s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); // User Player Character Skin 구조체 포인터.. diff --git a/src/game/PlayerBase.h b/src/game/PlayerBase.h index 93dd6418..01ef67f3 100644 --- a/src/game/PlayerBase.h +++ b/src/game/PlayerBase.h @@ -30,15 +30,15 @@ class CPlayerBase : public CGameBase { protected: e_PlayerType m_ePlayerType; // Player Type ... Base, NPC, OTher, MySelf - std::deque m_AnimationDeque; // 에니메이션 큐... 여기다 집어 넣으면 tick 을 돌면서 차례대로 한다.. - bool m_bAnimationChanged; // 큐에 넣은 에니메이션이 변하는 순간만 세팅된다.. + std::deque m_AnimationDeque; // 에니메이션 큐... 여기다 집어 넣으면 tick 을 돌면서 차례대로 한다.. + bool m_bAnimationChanged; // 큐에 넣은 에니메이션이 변하는 순간만 세팅된다.. - CN3Chr m_Chr; // 캐릭터 기본 객체... + CN3Chr m_Chr; // 캐릭터 기본 객체... __TABLE_PLAYER_LOOKS * m_pLooksRef; // 기본 참조 테이블 - 캐릭터에 관한 리소스 정보, 관절 위치, 사운드 파일등등.. - __TABLE_ITEM_BASIC * m_pItemPartBasics[PART_POS_COUNT]; // 캐릭터에 붙은 무기들.. - __TABLE_ITEM_EXT * m_pItemPartExts[PART_POS_COUNT]; // 캐릭터에 붙은 무기들.. - __TABLE_ITEM_BASIC * m_pItemPlugBasics[PLUG_POS_COUNT]; // 캐릭터에 붙은 무기들.. - __TABLE_ITEM_EXT * m_pItemPlugExts[PLUG_POS_COUNT]; // 캐릭터에 붙은 무기들.. + __TABLE_ITEM_BASIC * m_pItemPartBasics[PART_POS_COUNT]; // 캐릭터에 붙은 무기들.. + __TABLE_ITEM_EXT * m_pItemPartExts[PART_POS_COUNT]; // 캐릭터에 붙은 무기들.. + __TABLE_ITEM_BASIC * m_pItemPlugBasics[PLUG_POS_COUNT]; // 캐릭터에 붙은 무기들.. + __TABLE_ITEM_EXT * m_pItemPlugExts[PLUG_POS_COUNT]; // 캐릭터에 붙은 무기들.. // ID CDFont * m_pClanFont; // clan or knights..이름 찍는데 쓰는 Font.. -.-; @@ -96,10 +96,10 @@ class CPlayerBase : public CGameBase { float m_fTimeAfterDeath; // 죽은지 지난시간 - 5초정도면 적당한가?? 그전에 공격을 받으면 바로 죽는다. - int m_iSkillStep; // 현재 스킬을 쓰고 있다면 0 이 아닌값이다... - float m_fAttackDelta; // 스킬이나 마법에 의해 변하는 공격 속도.. 1.0 이 기본이고 클수록 더 빨리 공격한다. - float m_fMoveDelta; // 스킬이나 마법에 의해 변하는 이동 속도 1.0 이 기본이고 클수록 더 빨리 움직인다. - __Vector3 m_vDirDying; // 죽을때 밀리는 방향.. + int m_iSkillStep; // 현재 스킬을 쓰고 있다면 0 이 아닌값이다... + float m_fAttackDelta; // 스킬이나 마법에 의해 변하는 공격 속도.. 1.0 이 기본이고 클수록 더 빨리 공격한다. + float m_fMoveDelta; // 스킬이나 마법에 의해 변하는 이동 속도 1.0 이 기본이고 클수록 더 빨리 움직인다. + __Vector3 m_vDirDying; // 죽을때 밀리는 방향.. //sound.. bool m_bSoundAllSet; @@ -149,8 +149,8 @@ class CPlayerBase : public CGameBase { virtual void SetSoundAndInitFont(); void SetSoundPlug(__TABLE_ITEM_BASIC * pItemBasic); void ReleaseSoundAndFont(); - void RegenerateCollisionMesh(); // 최대 최소값을 다시 찾고 충돌메시를 다시 만든다.. - e_StateAction State() { return m_eState; } // 행동 상태... + void RegenerateCollisionMesh(); // 최대 최소값을 다시 찾고 충돌메시를 다시 만든다.. + e_StateAction State() { return m_eState; } // 행동 상태... e_StateMove StateMove() { return m_eStateMove; } // 움직이는 상태 e_ItemClass ItemClass_RightHand() { @@ -171,12 +171,12 @@ class CPlayerBase : public CGameBase { e_Ani JudgeAnimationBreath(); // 숨쉬기 모션 판단하기.. 가진 아이템과 타겟이 있는냐에 따라 다른 에니메이션 인덱스를 리턴. e_Ani JudgeAnimationWalk(); // 걷기 모드판단하기.. 가진 아이템과 타겟이 있는냐에 따라 다른 에니메이션 인덱스를 리턴. - e_Ani JudgeAnimationRun(); // 걷기 모드판단하기.. 가진 아이템과 타겟이 있는냐에 따라 다른 에니메이션 인덱스를 리턴. + e_Ani JudgeAnimationRun(); // 걷기 모드판단하기.. 가진 아이템과 타겟이 있는냐에 따라 다른 에니메이션 인덱스를 리턴. e_Ani JudgeAnimationWalkBackward(); // 걷기 모드판단하기.. 가진 아이템과 타겟이 있는냐에 따라 다른 에니메이션 인덱스를 리턴. - e_Ani JudgeAnimationAttack(); // 공격 모션 판단하기.. 가진 아이템에 따라 다른 에니메이션 인덱스를 리턴. - e_Ani JudgeAnimationStruck(); // 단지 NPC 와 유저를 구별해서 에니메이션 인덱스를 리턴 - e_Ani JudgeAnimationGuard(); // 막는 동작 판단하기. 단지 NPC 와 유저를 구별해서 에니메이션 인덱스를 리턴 + e_Ani JudgeAnimationAttack(); // 공격 모션 판단하기.. 가진 아이템에 따라 다른 에니메이션 인덱스를 리턴. + e_Ani JudgeAnimationStruck(); // 단지 NPC 와 유저를 구별해서 에니메이션 인덱스를 리턴 + e_Ani JudgeAnimationGuard(); // 막는 동작 판단하기. 단지 NPC 와 유저를 구별해서 에니메이션 인덱스를 리턴 e_Ani JudgeAnimationDying(); // 단지 NPC 와 유저를 구별해서 에니메이션 인덱스를 리턴 e_Ani JudgetAnimationSpellMagic(); // 마법 동작 @@ -241,13 +241,13 @@ class CPlayerBase : public CGameBase { float fDurationTime); // 컬러를 정하는 시간대로 유지하면서 원래색대로 돌아간다. void FlickerFactorSet(float fAlpha); - void InfoStringSet(const std::string & szInfo, D3DCOLOR crFont); - void BalloonStringSet(const std::string & szBalloon, D3DCOLOR crFont); - void IDSet(int iID, const std::string & szID, D3DCOLOR crID); - virtual void KnightsInfoSet(int iID, const std::string & szName, int iGrade, int iRank); + void InfoStringSet(const std::string & szInfo, D3DCOLOR crFont); + void BalloonStringSet(const std::string & szBalloon, D3DCOLOR crFont); + void IDSet(int iID, const std::string & szID, D3DCOLOR crID); + virtual void KnightsInfoSet(int iID, const std::string & szName, int iGrade, int iRank); const std::string & IDString() { return m_InfoBase.szID; } // ID 는 Character 포인터의 이름으로 대신한다. - int IDNumber() { return m_InfoBase.iID; } - CPlayerBase * TargetPointerCheck(bool bMustAlive); + int IDNumber() { return m_InfoBase.iID; } + CPlayerBase * TargetPointerCheck(bool bMustAlive); //////////////////// // 충돌 체크 함수들... @@ -273,7 +273,7 @@ class CPlayerBase : public CGameBase { virtual void Tick(); virtual void Render(float fSunAngle); virtual void RenderCollisionMesh() { m_Chr.RenderCollisionMesh(); } - void RenderChrInRect(CN3Chr * pChr, const RECT & Rect); // Dino 추가, 지정된 사각형안에 캐릭터를 그린다. + void RenderChrInRect(CN3Chr * pChr, const RECT & Rect); // Dino 추가, 지정된 사각형안에 캐릭터를 그린다. void Release(); diff --git a/src/game/PlayerMySelf.cpp b/src/game/PlayerMySelf.cpp index e181f9b7..84a6050e 100644 --- a/src/game/PlayerMySelf.cpp +++ b/src/game/PlayerMySelf.cpp @@ -238,7 +238,7 @@ void CPlayerMySelf::Tick() { CGameProcedure::s_pProcMain->MsgSend_Attack(pTarget->IDNumber(), fIntervalTable, fDistance); if (m_iSkillStep == 0 && PSA_ATTACK != m_eState && - m_fFlickeringFactor == 1.0f) { // 스킬을 쓰는게 아닌데 공격하지 않으면.. + m_fFlickeringFactor == 1.0f) { // 스킬을 쓰는게 아닌데 공격하지 않으면.. this->Action(PSA_ATTACK, true, pTarget); // 공격 중이아니면 공격한다.. } @@ -256,7 +256,7 @@ void CPlayerMySelf::Tick() { } } if (m_iSkillStep == 0 && - PSA_SITDOWN != m_eState) { // 스킬을 쓰는게 아닌데 앉아있는 상태가 아니면.. + PSA_SITDOWN != m_eState) { // 스킬을 쓰는게 아닌데 앉아있는 상태가 아니면.. this->Action(PSA_BASIC, true); // 기본자세.. } } @@ -639,7 +639,7 @@ CN3CPart * CPlayerMySelf::PartSet(e_PartPosition ePos, const std::string & szFN, __TABLE_PLAYER_LOOKS * pLooks = s_pTbl_UPC_Looks->Find(m_InfoBase.eRace); // User Player Character Skin 구조체 포인터.. m_ChrInv.PartSet(PART_POS_LOWER, pLooks->szPartFNs[PART_POS_LOWER]); // 하체에 기본옷을 입힌다. - m_Chr.PartSet(PART_POS_LOWER, pLooks->szPartFNs[PART_POS_LOWER]); // 하체에 기본옷을 입힌다. + m_Chr.PartSet(PART_POS_LOWER, pLooks->szPartFNs[PART_POS_LOWER]); // 하체에 기본옷을 입힌다. } } } @@ -868,7 +868,7 @@ bool CPlayerMySelf::CheckCollision() { float fYTerrain = ACT_WORLD->GetHeightWithTerrain(vPosNext.x, vPosNext.z); // 지면의 높이값.. float fYClimb = ACT_WORLD->GetHeightNearstPosWithShape(vPosNext, CN3Base::s_fSecPerFrm * 30.0f, &vNormal); // 충돌 체크 오브젝트의 높이값.. - vNormal.y = 0; // 이래야 정상적인 경사를 얻을수 있다.. + vNormal.y = 0; // 이래야 정상적인 경사를 얻을수 있다.. if (!s_pWorldMgr->IsIndoor()) { if (fYClimb > fYTerrain && diff --git a/src/game/PlayerMySelf.h b/src/game/PlayerMySelf.h index f0ce6810..73c5b000 100644 --- a/src/game/PlayerMySelf.h +++ b/src/game/PlayerMySelf.h @@ -26,8 +26,8 @@ class CPlayerMySelf : public CPlayerBase { bool m_bStun; // 기절.. float m_fStunTime; // 기절한 시간.. - int m_iSendRegeneration; // 한번 보내면 다시 죽을때까지 안보내는 플래그 0 일때는 메시지 박스를 띄운다.. - bool m_bTempMoveTurbo; // 개발을 위해 임시로 넣은 코드.. 무지 빠르게 움직이게 한다.. Tick 참조. + int m_iSendRegeneration; // 한번 보내면 다시 죽을때까지 안보내는 플래그 0 일때는 메시지 박스를 띄운다.. + bool m_bTempMoveTurbo; // 개발을 위해 임시로 넣은 코드.. 무지 빠르게 움직이게 한다.. Tick 참조. DWORD m_dwMagicID; // 쓰고 있는 마법.. float m_fCastingTime; // 마법 주문 거는 시간.. @@ -57,7 +57,7 @@ class CPlayerMySelf : public CPlayerBase { float DistanceExceptRadius(CPlayerBase * pTarget); bool IsAttackableTarget(CPlayerBase * pTarget, bool bMesureAngle = true); // 공격 가능한 범위에 있는지.. bool IsRunning() { return m_bRunning; } - bool CheckCollision(); // 움직이는 처리와 충돌체크를 한다. 충돌되는게 있으면 움직이지 않는다. + bool CheckCollision(); // 움직이는 처리와 충돌체크를 한다. 충돌되는게 있으면 움직이지 않는다. //.. bool InitChr(__TABLE_PLAYER_LOOKS * pTblUPC); CN3CPart * PartSet(e_PartPosition ePos, const std::string & szFN, __TABLE_ITEM_BASIC * pItemBasic, diff --git a/src/game/PlayerNPC.h b/src/game/PlayerNPC.h index 6fdf2226..7cce9468 100644 --- a/src/game/PlayerNPC.h +++ b/src/game/PlayerNPC.h @@ -15,7 +15,7 @@ class CPlayerNPC : public CPlayerBase { friend class CPlayerOtherMgr; public: - void MoveTo(float fPosX, float fPosY, float fPosZ, float fMoveSpeed, int iMoveMode); // 이 위치로 이동.. + void MoveTo(float fPosX, float fPosY, float fPosZ, float fMoveSpeed, int iMoveMode); // 이 위치로 이동.. virtual void Tick(); CPlayerNPC(); diff --git a/src/game/PlayerOtherMgr.cpp b/src/game/PlayerOtherMgr.cpp index a4e2da32..2e13bcd4 100644 --- a/src/game/PlayerOtherMgr.cpp +++ b/src/game/PlayerOtherMgr.cpp @@ -492,7 +492,7 @@ void CPlayerOtherMgr::MoveToCorpsesForcely(CPlayerNPC * pNPC, bool bErase) { } } -CPlayerNPC * CPlayerOtherMgr::CharacterGetByNearstEnemy(e_Nation eNation, +CPlayerNPC * CPlayerOtherMgr::CharacterGetByNearstEnemy(e_Nation eNation, const __Vector3 & vPosPlayer) // 가장 가까운 적 가져오기.. { CPlayerNPC * pTarget = NULL; diff --git a/src/game/PlayerOtherMgr.h b/src/game/PlayerOtherMgr.h index cd90da2b..a579a96e 100644 --- a/src/game/PlayerOtherMgr.h +++ b/src/game/PlayerOtherMgr.h @@ -27,10 +27,10 @@ class CPlayerOtherMgr : public CGameBase { // std::list m_NPCs; // NPC // std::list m_UPCs; // User Player Character // std::list m_Corpses; // 죽은놈.. 죽는 에니메이션 및 시간이 지나면 없어지게 한다.. - std::map m_NPCs; // NPC - std::map m_UPCs; // User Player Character - std::map m_Corpses; // 죽은놈.. 죽는 에니메이션 및 시간이 지나면 없어지게 한다.. - int m_iChrCountToRender; // 렌더링되는 캐릭 카운트 + std::map m_NPCs; // NPC + std::map m_UPCs; // User Player Character + std::map m_Corpses; // 죽은놈.. 죽는 에니메이션 및 시간이 지나면 없어지게 한다.. + int m_iChrCountToRender; // 렌더링되는 캐릭 카운트 public: bool IsValidCharacter(CPlayerBase * pCharacter); @@ -43,23 +43,23 @@ class CPlayerOtherMgr : public CGameBase { bool UPCDelete(int iID); // 고유 ID 와 일치하는 NPC를 리스트에서 제거.. 및 리소스 해제 // CPlayerOther* UPCGetByName(const char* szID); // User Player Character 와 NPC 를 조사해서 포인터를 가져온다. - CPlayerOther * UPCGetByID(int iID, + CPlayerOther * UPCGetByID(int iID, bool bFromAliveOnly); // User Player Character 와 NPC 를 조사해서 포인터를 가져온다. // CPlayerNPC* NPCGetByName(const char* szID); // User Player Character 와 NPC 를 조사해서 포인터를 가져온다. - CPlayerNPC * NPCGetByID(int iID, + CPlayerNPC * NPCGetByID(int iID, bool bFromAliveOnly); // User Player Character 와 NPC 를 조사해서 포인터를 가져온다. CPlayerNPC * NPCGetByPos(const __Vector3 & vPos); CPlayerNPC * CharacterGetByID(int iID, bool bFromAliveOnly); // User, NPC 안 가리고 가져온다.. CPlayerNPC * CharacterGetByNearstEnemy(e_Nation eNation, const __Vector3 & vPosPlayer); // 가장 가까운 적 가져오기.. - bool CharacterDelete(int iID); // User, NPC 안 가리고 지운다.. + bool CharacterDelete(int iID); // User, NPC 안 가리고 지운다.. CPlayerBase * CorpseGetByID(int iID); // 시체들에서 Player Character 와 NPC 를 조사해서 포인터를 가져온다. - void CorpseRemove(CPlayerNPC * pCorpse, bool bRemoveImmediately = false); - void CorpseAdd(CPlayerNPC * pNPC); - void CorpseAdd(int iID); - CPlayerNPC * CorpseGetNearstNPC(bool bMustHaveItem, e_Nation eNation, - const __Vector3 & vPosPlayer); // 가장 가까운 적 시체 가져오기.. - void MoveToCorpsesForcely(CPlayerNPC * pNPC, bool bErase); // 아이디가 겹치거나 하면 강제로 시체를 만든다.. + void CorpseRemove(CPlayerNPC * pCorpse, bool bRemoveImmediately = false); + void CorpseAdd(CPlayerNPC * pNPC); + void CorpseAdd(int iID); + CPlayerNPC * CorpseGetNearstNPC(bool bMustHaveItem, e_Nation eNation, + const __Vector3 & vPosPlayer); // 가장 가까운 적 시체 가져오기.. + void MoveToCorpsesForcely(CPlayerNPC * pNPC, bool bErase); // 아이디가 겹치거나 하면 강제로 시체를 만든다.. //.. Picking된 PlayerOther 계산.. CPlayerNPC * Pick(int ixScreen, int iyScreen, int & iIDResult, __Vector3 * pvPick = NULL); diff --git a/src/game/SubProcPerTrade.h b/src/game/SubProcPerTrade.h index 1bd846dd..406d7d9c 100644 --- a/src/game/SubProcPerTrade.h +++ b/src/game/SubProcPerTrade.h @@ -9,9 +9,9 @@ enum e_PerTradeState { // 아이템 개인 PER_TRADE_STATE_WAIT_FOR_REQ, // 상대방에게 요청하고 응답을 기다림.. PER_TRADE_STATE_WAIT_FOR_MY_DECISION_AGREE_OR_DISAGREE, // 상대방에게서 요청받고 내 결정을 기다림.. PER_TRADE_STATE_NORMAL, // 아이템 개인 거래 정상적인 상태.. - PER_TRADE_STATE_ADD_AND_WAIT_FROM_SERVER, // 아이템을 더하고 서버로 부터 응답을 기다림.. - PER_TRARE_STATE_EDITTING, // 아이템 개인 거래 금액이나 갯수등 편집중.. - PER_TRADE_STATE_MY_TRADE_DECISION_DONE, // 내 거래 버튼 누른 상태.. + PER_TRADE_STATE_ADD_AND_WAIT_FROM_SERVER, // 아이템을 더하고 서버로 부터 응답을 기다림.. + PER_TRARE_STATE_EDITTING, // 아이템 개인 거래 금액이나 갯수등 편집중.. + PER_TRADE_STATE_MY_TRADE_DECISION_DONE, // 내 거래 버튼 누른 상태.. }; enum e_PerTradeResultCode { // 아이템 거래가 해제되는 코드 정의.. @@ -60,11 +60,11 @@ class CSubProcPerTrade : public CGameBase { void InitPerTradeDlg(CUIManager * pUIManager); - void EnterWaitMsgFromServerStatePerTradeReq(); // 내가 아이템 거래를 타인에게 신청한 상태.. + void EnterWaitMsgFromServerStatePerTradeReq(); // 내가 아이템 거래를 타인에게 신청한 상태.. void EnterWaitMsgFromServerStatePerTradeReq(std::string szName); // 내가 아이템 거래를 타인에게 신청한 상태.. - void EnterWaitMyDecisionToPerTrade(int iOtherID); // 내가 타인에게서 아이템 거래를 신청 받은 상태.. - void LeavePerTradeState(e_PerTradeResultCode ePTRC); // 아이템 거래 상태가 해제되는 코드.. - void ProcessProceed(e_PerTradeProceedCode ePTPC); // 아이템 거래가 계속되는 상태를 정의.. + void EnterWaitMyDecisionToPerTrade(int iOtherID); // 내가 타인에게서 아이템 거래를 신청 받은 상태.. + void LeavePerTradeState(e_PerTradeResultCode ePTRC); // 아이템 거래 상태가 해제되는 코드.. + void ProcessProceed(e_PerTradeProceedCode ePTPC); // 아이템 거래가 계속되는 상태를 정의.. void SecureCodeBegin(); // 보호 코드.. diff --git a/src/game/UIChat.h b/src/game/UIChat.h index b433115b..b1c822ef 100644 --- a/src/game/UIChat.h +++ b/src/game/UIChat.h @@ -37,10 +37,10 @@ class CUIChat : public CN3UIBase { CN3UIString * m_pNoticeTitle; // 채팅창 맨윗줄에 표시될 공지... CN3UIString * m_pChatOut; // 채팅이 출력되는 UIString 참조포인터(실제 m_Child로 관리), 글씨체와 초기 영역만 참조한다. - CN3UIScrollBar * m_pScrollbar; // scrollbar 참조포인터(실제 m_Child로 관리) - int m_iChatLineCount; // 채팅창에 출력되는 line의 수(채팅창 사이즈가 변했을때 다시 계산해주자.) - RECT m_rcChatOutRegion; // 채팅이 출력되는 영역 - CN3UIString ** m_ppUILines; // 채팅이 출력되는 UIString 배열포인터(채팅창 사이즈가 변하므로 배열도 변한다. + CN3UIScrollBar * m_pScrollbar; // scrollbar 참조포인터(실제 m_Child로 관리) + int m_iChatLineCount; // 채팅창에 출력되는 line의 수(채팅창 사이즈가 변했을때 다시 계산해주자.) + RECT m_rcChatOutRegion; // 채팅이 출력되는 영역 + CN3UIString ** m_ppUILines; // 채팅이 출력되는 UIString 배열포인터(채팅창 사이즈가 변하므로 배열도 변한다. CN3UIEdit * m_pEdit; //son, chat_in std::string m_szString; //son, chat_in @@ -76,20 +76,20 @@ class CUIChat : public CN3UIBase { void SetTopLine(int iTopLine); // 맨 윗줄을 지정해준다. // void AddLineBuffer(e_ChatBuffer eCB, const std::string& szString, D3DCOLOR color); // line 버퍼를 만들어준다.(너무 길면 알아서 2줄로 만들어준다.) void AddLineBuffer(const std::string & szString, - D3DCOLOR color); // line 버퍼를 만들어준다.(너무 길면 알아서 2줄로 만들어준다.) - void RecalcLineBuffers(); // 채팅창 사이즈가 변했을때 호출해주면 line buffer를 다시 계산해서 넣어준다. + D3DCOLOR color); // line 버퍼를 만들어준다.(너무 길면 알아서 2줄로 만들어준다.) + void RecalcLineBuffers(); // 채팅창 사이즈가 변했을때 호출해주면 line buffer를 다시 계산해서 넣어준다. void CreateLines(); // Operations public: - void SetNoticeTitle(const std::string & szString, D3DCOLOR color); - void ShowContinueMsg(); - void DeleteContinueMsg(); - bool OnKeyPress(int iKey); - bool GetEnableKillFocus() { return m_bKillFocus; } - void SetEnableKillFocus(bool bKillFocus) { m_bKillFocus = bKillFocus; } - void ChatListenEnable(); - void ChangeChattingMode(e_ChatMode eCM); + void SetNoticeTitle(const std::string & szString, D3DCOLOR color); + void ShowContinueMsg(); + void DeleteContinueMsg(); + bool OnKeyPress(int iKey); + bool GetEnableKillFocus() { return m_bKillFocus; } + void SetEnableKillFocus(bool bKillFocus) { m_bKillFocus = bKillFocus; } + void ChatListenEnable(); + void ChangeChattingMode(e_ChatMode eCM); virtual BOOL MoveOffset(int iOffsetX, int iOffsetY); // Offset만큼 이동해준다.(region, children, move rect 이동) virtual bool ReceiveMessage(CN3UIBase * pSender, DWORD dwMsg); virtual void Release(); diff --git a/src/game/UIDead.cpp b/src/game/UIDead.cpp index 6cb189d5..9862b460 100644 --- a/src/game/UIDead.cpp +++ b/src/game/UIDead.cpp @@ -242,7 +242,7 @@ void CUIDead::MsgRecv_Revival(DataPack * pDataPack, int & iOffset) { CGameProcedure::s_pPlayer->RegenerateCollisionMesh(); // 충돌 메시를 다시 만든다.. CGameProcedure::s_pPlayer->m_iSendRegeneration = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 - CGameProcedure::s_pPlayer->m_fTimeAfterDeath = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 + CGameProcedure::s_pPlayer->m_fTimeAfterDeath = 0; // 한번 보내면 다시 죽을때까지 안보내는 플래그 TRACE("받음 - 다시 살아나기(%.1f, %.1f)\n", vPosPlayer.x, vPosPlayer.z); // diff --git a/src/game/UIInventory.cpp b/src/game/UIInventory.cpp index 7f4d9ca4..dd0f60f1 100644 --- a/src/game/UIInventory.cpp +++ b/src/game/UIInventory.cpp @@ -79,7 +79,7 @@ CUIInventory::CUIInventory() { m_bOpenningNow = false; // 열리고 있다.. m_bClosingNow = false; // 닫히고 있다.. - m_fMoveDelta = 0; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. + m_fMoveDelta = 0; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. m_bDestoyDlgAlive = false; m_pText_Weight = NULL; @@ -111,7 +111,7 @@ void CUIInventory::Release() { m_bOpenningNow = false; // 열리고 있다.. m_bClosingNow = false; // 닫히고 있다.. - m_fMoveDelta = 0; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. + m_fMoveDelta = 0; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. m_pText_Weight = NULL; } @@ -619,7 +619,7 @@ int CUIInventory::GetArmDestinationIndex(__IconItemSkill * spItem) { switch (pItem->byAttachPoint) { case ITEM_ATTACH_POS_DUAL: if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT] && m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { // 양쪽에 있는 경우.. - return ITEM_SLOT_POS_HAND_RIGHT; // 둘다 있으면 오른쪽.. + return ITEM_SLOT_POS_HAND_RIGHT; // 둘다 있으면 오른쪽.. } if (!m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT]) { // 오른쪽에 없는 경우.. return ITEM_SLOT_POS_HAND_RIGHT; @@ -638,14 +638,14 @@ int CUIInventory::GetArmDestinationIndex(__IconItemSkill * spItem) { case ITEM_ATTACH_POS_HAND_LEFT: return ITEM_SLOT_POS_HAND_LEFT; - case ITEM_ATTACH_POS_TWOHAND_RIGHT: // 양손검을 오른손에 찰때.. + case ITEM_ATTACH_POS_TWOHAND_RIGHT: // 양손검을 오른손에 찰때.. if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT] && m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { // 양쪽에 있는 경우.. return -1; } else { return ITEM_SLOT_POS_HAND_RIGHT; } - case ITEM_ATTACH_POS_TWOHAND_LEFT: // 양손검을 오른손에 찰때.. + case ITEM_ATTACH_POS_TWOHAND_LEFT: // 양손검을 오른손에 찰때.. if (m_pMySlot[ITEM_SLOT_POS_HAND_RIGHT] && m_pMySlot[ITEM_SLOT_POS_HAND_LEFT]) { // 양쪽에 있는 경우.. return -1; } else { diff --git a/src/game/UIInventory.h b/src/game/UIInventory.h index 8f7fa189..0cc78b5d 100644 --- a/src/game/UIInventory.h +++ b/src/game/UIInventory.h @@ -58,9 +58,9 @@ class CUIInventory : public CN3UIWndBase { e_InvenState m_eInvenState; CItemRepairMgr m_cItemRepairMgr; - bool m_bOpenningNow; // 열리고 있다.. - bool m_bClosingNow; // 닫히고 있다.. - float m_fMoveDelta; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. + bool m_bOpenningNow; // 열리고 있다.. + bool m_bClosingNow; // 닫히고 있다.. + float m_fMoveDelta; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. CN3UIArea * m_pArea_User; CN3UIArea * m_pArea_Destroy; diff --git a/src/game/UIManager.cpp b/src/game/UIManager.cpp index 793d36a0..c319d95e 100644 --- a/src/game/UIManager.cpp +++ b/src/game/UIManager.cpp @@ -346,9 +346,9 @@ void CUIManager::SetFocusedUI(CN3UIBase * pUI) { return; } - it = m_Children.erase(it); // 우선 리스트에서 지우고 + it = m_Children.erase(it); // 우선 리스트에서 지우고 m_Children.push_front(pUI); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하고 메세지를 맨 먼저 받게 하려고 - ReorderChildList(); // child list 재정렬(항상 위에 뜨는 dialog 때문에 다시 정렬한다.) + ReorderChildList(); // child list 재정렬(항상 위에 뜨는 dialog 때문에 다시 정렬한다.) m_pUIFocused = this->GetTopUI(true); } @@ -429,9 +429,9 @@ void CUIManager::SetVisibleFocusedUI(CN3UIBase * pUI) { } if (!(dwUIStyle & UISTYLE_FOCUS_UNABLE)) { - it = m_Children.erase(it); // 우선 리스트에서 지우고 + it = m_Children.erase(it); // 우선 리스트에서 지우고 m_Children.push_front(pUI); // 맨앞에 넣는다. 그리는 순서를 맨 나중에 그리도록 하고 메세지를 맨 먼저 받게 하려고 - ReorderChildList(); // child list 재정렬(항상 위에 뜨는 dialog 때문에 다시 정렬한다.) + ReorderChildList(); // child list 재정렬(항상 위에 뜨는 dialog 때문에 다시 정렬한다.) } m_pUIFocused = this->GetEnableFocusTopUI(true); diff --git a/src/game/UIMessageWnd.h b/src/game/UIMessageWnd.h index 80c4fc97..07aefd96 100644 --- a/src/game/UIMessageWnd.h +++ b/src/game/UIMessageWnd.h @@ -17,15 +17,15 @@ class CUIMessageWnd : public CN3UIBase { ChatList m_ChatBuffer; // 채팅 packet기준으로 된 buffer ChatList m_LineBuffer; // Line 기준으로 된 buffer - int m_iChatLineCount; // 채팅창에 출력되는 line의 수(채팅창 사이즈가 변했을때 다시 계산해주자.) - RECT m_rcChatOutRegion; // 채팅이 출력되는 영역 - CN3UIString ** m_ppUILines; // 채팅이 출력되는 UIString 배열포인터(채팅창 사이즈가 변하므로 배열도 변한다. + int m_iChatLineCount; // 채팅창에 출력되는 line의 수(채팅창 사이즈가 변했을때 다시 계산해주자.) + RECT m_rcChatOutRegion; // 채팅이 출력되는 영역 + CN3UIString ** m_ppUILines; // 채팅이 출력되는 UIString 배열포인터(채팅창 사이즈가 변하므로 배열도 변한다. protected: void SetTopLine(int iTopLine); // 맨 윗줄을 지정해준다. void AddLineBuffer(const std::string & szString, - D3DCOLOR color); // line 버퍼를 만들어준다.(너무 길면 알아서 2줄로 만들어준다.) - void RecalcLineBuffer(); // 채팅창 사이즈가 변했을때 호출해주면 line buffer를 다시 계산해서 넣어준다. + D3DCOLOR color); // line 버퍼를 만들어준다.(너무 길면 알아서 2줄로 만들어준다.) + void RecalcLineBuffer(); // 채팅창 사이즈가 변했을때 호출해주면 line buffer를 다시 계산해서 넣어준다. void CreateLines(); // Operations @@ -40,7 +40,7 @@ class CUIMessageWnd : public CN3UIBase { Rect); // 영역 지정(사이즈가 변할때 호출된다. 단순 이동은 호출되지 않는다.(단순이동은 MoveOffset이 호출)) void AddMsg(const std::string & szString, - D3DCOLOR color = 0xffffffff); // 채팅 메세지를 저장하고 알맞은 형태로 화면에 출력해준다. + D3DCOLOR color = 0xffffffff); // 채팅 메세지를 저장하고 알맞은 형태로 화면에 출력해준다. CUIMessageWnd(); virtual ~CUIMessageWnd(); diff --git a/src/game/UISkillTreeDlg.cpp b/src/game/UISkillTreeDlg.cpp index 05d078d7..2c039355 100644 --- a/src/game/UISkillTreeDlg.cpp +++ b/src/game/UISkillTreeDlg.cpp @@ -31,7 +31,7 @@ CUISkillTreeDlg::CUISkillTreeDlg() { m_bOpenningNow = false; // 열리고 있다.. m_bClosingNow = false; // 닫히고 있다.. - m_fMoveDelta = 0.0f; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. + m_fMoveDelta = 0.0f; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. m_iRBtnDownOffs = -1; m_iCurKindOf = 0; @@ -77,7 +77,7 @@ void CUISkillTreeDlg::Release() { m_bOpenningNow = false; // 열리고 있다.. m_bClosingNow = false; // 닫히고 있다.. - m_fMoveDelta = 0.0f; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. + m_fMoveDelta = 0.0f; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. for (int i = 0; i < MAX_SKILL_KIND_OF; i++) { for (int j = 0; j < MAX_SKILL_PAGE_NUM; j++) { diff --git a/src/game/UISkillTreeDlg.h b/src/game/UISkillTreeDlg.h index ef43ca3c..f3598c11 100644 --- a/src/game/UISkillTreeDlg.h +++ b/src/game/UISkillTreeDlg.h @@ -25,9 +25,9 @@ const int SKILL_DEF_SPECIAL3 = 4; class CUISkillTreeDlg : public CN3UIWndBase { protected: - bool m_bOpenningNow; // 열리고 있다.. - bool m_bClosingNow; // 닫히고 있다.. - float m_fMoveDelta; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. + bool m_bOpenningNow; // 열리고 있다.. + bool m_bClosingNow; // 닫히고 있다.. + float m_fMoveDelta; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. int m_iRBtnDownOffs; diff --git a/src/game/UIVarious.cpp b/src/game/UIVarious.cpp index a85207f6..17cc3d1c 100644 --- a/src/game/UIVarious.cpp +++ b/src/game/UIVarious.cpp @@ -1430,7 +1430,7 @@ CUIVarious::CUIVarious() { m_bOpenningNow = false; // 열리고 있다.. m_bClosingNow = false; // 닫히고 있다.. - m_fMoveDelta = 0; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. + m_fMoveDelta = 0; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. } CUIVarious::~CUIVarious() {} @@ -1451,7 +1451,7 @@ void CUIVarious::Release() { m_bOpenningNow = false; // 열리고 있다.. m_bClosingNow = false; // 닫히고 있다.. - m_fMoveDelta = 0; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. + m_fMoveDelta = 0; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. } bool CUIVarious::Load(HANDLE hFile) { diff --git a/src/game/UIVarious.h b/src/game/UIVarious.h index ca77b720..cf5fca04 100644 --- a/src/game/UIVarious.h +++ b/src/game/UIVarious.h @@ -248,9 +248,9 @@ class CUIVarious : public CN3UIBase // 다용도 UI CN3UIButton * m_pBtn_Friends; CN3UIButton * m_pBtn_Close; - bool m_bOpenningNow; // 열리고 있다.. - bool m_bClosingNow; // 닫히고 있다.. - float m_fMoveDelta; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. + bool m_bOpenningNow; // 열리고 있다.. + bool m_bClosingNow; // 닫히고 있다.. + float m_fMoveDelta; // 부드럽게 열리고 닫히게 만들기 위해서 현재위치 계산에 부동소수점을 쓴다.. public: void SetVisibleWithNoSound(bool bVisible, bool bWork = false, bool bReFocus = false); diff --git a/src/server/AIServer/AIServerDlg.cpp b/src/server/AIServer/AIServerDlg.cpp index dc23d7ba..b386f049 100644 --- a/src/server/AIServer/AIServerDlg.cpp +++ b/src/server/AIServer/AIServerDlg.cpp @@ -1037,27 +1037,27 @@ BOOL CServerDlg::CreateNpcThread() { pNpc->m_fSpeed_2 = (float)pNpcTable->m_bySpeed_2 * (dbSpeed / 1000); // 뛰는 이동 타입.. pNpc->m_fOldSpeed_1 = (float)pNpcTable->m_bySpeed_1 * (dbSpeed / 1000); // 기본 이동 타입 pNpc->m_fOldSpeed_2 = (float)pNpcTable->m_bySpeed_2 * (dbSpeed / 1000); // 뛰는 이동 타입.. - pNpc->m_fSecForMetor = 4.0f; // 초당 갈 수 있는 거리.. - pNpc->m_sStandTime = pNpcTable->m_sStandTime; // 서있는 시간 - pNpc->m_iMagic1 = pNpcTable->m_iMagic1; // 사용마법 1 - pNpc->m_iMagic2 = pNpcTable->m_iMagic2; // 사용마법 2 - pNpc->m_iMagic3 = pNpcTable->m_iMagic3; // 사용마법 3 - pNpc->m_sFireR = pNpcTable->m_sFireR; // 화염 저항력 - pNpc->m_sColdR = pNpcTable->m_sColdR; // 냉기 저항력 - pNpc->m_sLightningR = pNpcTable->m_sLightningR; // 전기 저항력 - pNpc->m_sMagicR = pNpcTable->m_sMagicR; // 마법 저항력 - pNpc->m_sDiseaseR = pNpcTable->m_sDiseaseR; // 저주 저항력 - pNpc->m_sPoisonR = pNpcTable->m_sPoisonR; // 독 저항력 - pNpc->m_sLightR = pNpcTable->m_sLightR; // 빛 저항력 + pNpc->m_fSecForMetor = 4.0f; // 초당 갈 수 있는 거리.. + pNpc->m_sStandTime = pNpcTable->m_sStandTime; // 서있는 시간 + pNpc->m_iMagic1 = pNpcTable->m_iMagic1; // 사용마법 1 + pNpc->m_iMagic2 = pNpcTable->m_iMagic2; // 사용마법 2 + pNpc->m_iMagic3 = pNpcTable->m_iMagic3; // 사용마법 3 + pNpc->m_sFireR = pNpcTable->m_sFireR; // 화염 저항력 + pNpc->m_sColdR = pNpcTable->m_sColdR; // 냉기 저항력 + pNpc->m_sLightningR = pNpcTable->m_sLightningR; // 전기 저항력 + pNpc->m_sMagicR = pNpcTable->m_sMagicR; // 마법 저항력 + pNpc->m_sDiseaseR = pNpcTable->m_sDiseaseR; // 저주 저항력 + pNpc->m_sPoisonR = pNpcTable->m_sPoisonR; // 독 저항력 + pNpc->m_sLightR = pNpcTable->m_sLightR; // 빛 저항력 pNpc->m_fBulk = (float)(((double)pNpcTable->m_sBulk / 100) * ((double)pNpcTable->m_sSize / 100)); pNpc->m_bySearchRange = pNpcTable->m_bySearchRange; // 적 탐지 범위 pNpc->m_byAttackRange = pNpcTable->m_byAttackRange; // 사정거리 pNpc->m_byTracingRange = pNpcTable->m_byTracingRange; // 추격거리 pNpc->m_sAI = pNpcTable->m_sAI; // 인공지능 인덱스 pNpc->m_tNpcType = pNpcTable->m_tNpcType; // NPC Type - pNpc->m_byFamilyType = pNpcTable->m_byFamilyType; // 몹들사이에서 가족관계를 결정한다. - pNpc->m_iMoney = pNpcTable->m_iMoney; // 떨어지는 돈 - pNpc->m_iItem = pNpcTable->m_iItem; // 떨어지는 아이템 + pNpc->m_byFamilyType = pNpcTable->m_byFamilyType; // 몹들사이에서 가족관계를 결정한다. + pNpc->m_iMoney = pNpcTable->m_iMoney; // 떨어지는 돈 + pNpc->m_iItem = pNpcTable->m_iItem; // 떨어지는 아이템 pNpc->m_tNpcLongType = pNpcTable->m_byDirectAttack; pNpc->m_byWhatAttackType = pNpcTable->m_byMagicAttack; diff --git a/src/server/AIServer/AIServerDlg.h b/src/server/AIServer/AIServerDlg.h index 6e51b21c..18d62bbf 100644 --- a/src/server/AIServer/AIServerDlg.h +++ b/src/server/AIServer/AIServerDlg.h @@ -159,8 +159,8 @@ class CServerDlg : public CDialog { short m_sMapEventNpc; // Map에서 읽어들이는 event npc 수 // sungyong 2002.05.23 - BOOL m_bFirstServerFlag; // 서버가 처음시작한 후 게임서버가 붙은 경우에는 1, 붙지 않은 경우 0 - short m_sSocketCount; // GameServer와 처음접시 필요 + BOOL m_bFirstServerFlag; // 서버가 처음시작한 후 게임서버가 붙은 경우에는 1, 붙지 않은 경우 0 + short m_sSocketCount; // GameServer와 처음접시 필요 short m_sReSocketCount; // GameServer와 재접시 필요 float m_fReConnectStart; // 처음 소켓이 도착한 시간 short m_sErrorSocketCount; // 이상소켓 감시용 diff --git a/src/server/AIServer/Define.h b/src/server/AIServer/Define.h index adc9498e..7761b6a9 100644 --- a/src/server/AIServer/Define.h +++ b/src/server/AIServer/Define.h @@ -130,7 +130,7 @@ struct _OBJECT_EVENT { int sBelong; // 소속 short sIndex; // 100 번대 - 카루스 바인드 포인트 | 200 번대 엘모라드 바인드 포인트 | 1100 번대 - 카루스 성문들 1200 - 엘모라드 성문들 - short sType; // 0 - 바인드 포인트.. 1 - 좌우로 열리는 성문 2 - 상하로 열리는 성문 3 - 레버 + short sType; // 0 - 바인드 포인트.. 1 - 좌우로 열리는 성문 2 - 상하로 열리는 성문 3 - 레버 short sControlNpcID; // 조종할 NPC ID (조종할 Object Index) short sStatus; // status float fPosX; // 위치값 diff --git a/src/server/AIServer/MAP.h b/src/server/AIServer/MAP.h index 9d0fc9b8..1653fd02 100644 --- a/src/server/AIServer/MAP.h +++ b/src/server/AIServer/MAP.h @@ -43,9 +43,9 @@ class MAP { float m_fUnitDist; // i Grid Distance float ** m_fHeight; // short m_arDungeonBossMonster[MAX_DUNGEON_BOSS_MONSTER]; - BYTE m_byRoomType; // 방의 초기화관련( 0:자동으로 초기화, 1:전쟁이벤트 관련(특정조건이 완료시 초기화) - BYTE m_byRoomEvent; // event room(0:empty, 1:use) - BYTE m_byRoomStatus; // room status(1:진행중, 2:방을 초기화중, 3:방초기화 완료) + BYTE m_byRoomType; // 방의 초기화관련( 0:자동으로 초기화, 1:전쟁이벤트 관련(특정조건이 완료시 초기화) + BYTE m_byRoomEvent; // event room(0:empty, 1:use) + BYTE m_byRoomStatus; // room status(1:진행중, 2:방을 초기화중, 3:방초기화 완료) BYTE m_byInitRoomCount; // room 초기화 시간을 제어(몬스터와 동기화를 맞추기 위해) ObjectEventArray m_ObjectEventArray; RoomEventArray m_arRoomEventArray; @@ -76,7 +76,7 @@ class MAP { int GetXRegionMax() { return m_sizeRegion.cx - 1; }; int GetZRegionMax() { return m_sizeRegion.cy - 1; }; - int IsRoomCheck(float fx, float fz); // 던젼에서 사용, 유저의 현재위치가 던젼의 어느 위치에 있는지를 판단 + int IsRoomCheck(float fx, float fz); // 던젼에서 사용, 유저의 현재위치가 던젼의 어느 위치에 있는지를 판단 BOOL IsRoomStatusCheck(); BOOL IsMovable(int dest_x, int dest_y); diff --git a/src/server/AIServer/N3BASE/My_3DStruct.h b/src/server/AIServer/N3BASE/My_3DStruct.h index 5d931f5e..f8ed834d 100644 --- a/src/server/AIServer/N3BASE/My_3DStruct.h +++ b/src/server/AIServer/N3BASE/My_3DStruct.h @@ -681,10 +681,10 @@ const DWORD RF_NOTUSEFOG = 0x2; // 안개 무시 const DWORD RF_DOUBLESIDED = 0x4; // 양면 - D3DCULL_NONE const DWORD RF_BOARD_Y = 0x8; // Y 축으로 해서.. 카메라를 본다. const DWORD RF_POINTSAMPLING = 0x10; // MipMap 에서.. PointSampling 으로 한다.. -const DWORD RF_WINDY = 0x20; // 바람에 날린다.. 바람의 값은 CN3Base::s_vWindFactor 를 참조 한다.. -const DWORD RF_NOTUSELIGHT = 0x40; // Light Off -const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse 값을 갖고 투명하게 Alpha blending -const DWORD RF_NOTZWRITE = 0x100; // ZBuffer 에 안쓴다. +const DWORD RF_WINDY = 0x20; // 바람에 날린다.. 바람의 값은 CN3Base::s_vWindFactor 를 참조 한다.. +const DWORD RF_NOTUSELIGHT = 0x40; // Light Off +const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse 값을 갖고 투명하게 Alpha blending +const DWORD RF_NOTZWRITE = 0x100; // ZBuffer 에 안쓴다. struct __Material : public _D3DMATERIAL9 { public: diff --git a/src/server/AIServer/N3BASE/N3ShapeMgr.cpp b/src/server/AIServer/N3BASE/N3ShapeMgr.cpp index 0b765f03..56e33c55 100644 --- a/src/server/AIServer/N3BASE/N3ShapeMgr.cpp +++ b/src/server/AIServer/N3BASE/N3ShapeMgr.cpp @@ -536,10 +536,10 @@ void CN3ShapeMgr::GenerateCollisionData() { pSubCell->pdwCCVertIndices[nCCPC * 3 + 0] = i * 3 + 0; // 인덱스 저장.. pSubCell->pdwCCVertIndices[nCCPC * 3 + 1] = i * 3 + 1; // 인덱스 저장.. pSubCell->pdwCCVertIndices[nCCPC * 3 + 2] = i * 3 + 2; // 인덱스 저장.. - pSubCell->nCCPolyCount++; // Collision Check Polygon Count 를 늘린다. - } // end of for(int x = xx1; x <= xx2; x++) - } // end of for(int z = zz1; z <= zz2; z++) // 범위만큼 처리.. - } // end of for(int j = 0; j < 3; j++) // 걸쳐 있는 메시 만큼 생성... + pSubCell->nCCPolyCount++; // Collision Check Polygon Count 를 늘린다. + } // end of for(int x = xx1; x <= xx2; x++) + } // end of for(int z = zz1; z <= zz2; z++) // 범위만큼 처리.. + } // end of for(int j = 0; j < 3; j++) // 걸쳐 있는 메시 만큼 생성... } } #endif // end of _N3TOOL @@ -703,8 +703,8 @@ bool CN3ShapeMgr::CheckCollision(const __Vector3 & vPos, // 충돌 위 return false; // 움직이는 속도가 없거나 반대로 움직이면 넘어간다.. } static __CellSub * ppCells[128]; - __Vector3 vPosNext = vPos + (vDir * fSpeedPerSec); // 다음 위치 - int nSubCellCount = this->SubCellPathThru(vPos, vPosNext, ppCells); // 통과하는 서브셀을 가져온다.. + __Vector3 vPosNext = vPos + (vDir * fSpeedPerSec); // 다음 위치 + int nSubCellCount = this->SubCellPathThru(vPos, vPosNext, ppCells); // 통과하는 서브셀을 가져온다.. if (nSubCellCount <= 0 || nSubCellCount > 128) { return false; // 없음 말자. } @@ -758,7 +758,7 @@ bool CN3ShapeMgr::CheckCollision(const __Vector3 & vPos, // 충돌 위 #ifndef _3DSERVER else { it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... - int iSC = m_ShapesToRender.size(); + int iSC = m_ShapesToRender.size(); if (iSC > 0) { // 거리순으로 정렬.. @@ -897,7 +897,7 @@ CN3Shape * CN3ShapeMgr::Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __ vPos, vDir); it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... - int iSC = m_ShapesToRender.size(); + int iSC = m_ShapesToRender.size(); // 거리순으로 정렬.. std::vector Shapes(iSC, NULL); diff --git a/src/server/AIServer/N3BASE/N3ShapeMgr.h b/src/server/AIServer/N3BASE/N3ShapeMgr.h index 5e6c6562..4237819f 100644 --- a/src/server/AIServer/N3BASE/N3ShapeMgr.h +++ b/src/server/AIServer/N3BASE/N3ShapeMgr.h @@ -15,8 +15,8 @@ const int CELL_MAIN_DEVIDE = 4; // 메인셀은 4 X 4 의 서브셀로 나뉜다.. const int CELL_SUB_SIZE = 4; // 4 Meter 가 서브셀의 사이즈이다.. const int CELL_MAIN_SIZE = CELL_MAIN_DEVIDE * CELL_SUB_SIZE; // 메인셀 크기는 서브셀갯수 X 서브셀 크기이다. -const int MAX_CELL_MAIN = 4096 / CELL_MAIN_SIZE; // 메인셀의 최대 갯수는 지형크기 / 메인셀크기 이다. -const int MAX_CELL_SUB = MAX_CELL_MAIN * CELL_MAIN_DEVIDE; // 서브셀 최대 갯수는 메인셀 * 메인셀나눔수 이다. +const int MAX_CELL_MAIN = 4096 / CELL_MAIN_SIZE; // 메인셀의 최대 갯수는 지형크기 / 메인셀크기 이다. +const int MAX_CELL_SUB = MAX_CELL_MAIN * CELL_MAIN_DEVIDE; // 서브셀 최대 갯수는 메인셀 * 메인셀나눔수 이다. #ifdef _3DSERVER class CN3ShapeMgr @@ -114,10 +114,10 @@ class CN3ShapeMgr : public CN3BaseFileAccess protected: #ifndef _3DSERVER - std::vector m_Shapes; // 리스트로 안 만든 이유는... 배열이 훨씬 효율적이기 때문이다. - std::list m_ShapesToRender; // Tick 을 호출하면 렌더링할 것만 추린다.. - std::list m_ShapesHaveID; // ID 를 갖고 있어 NPC 가 될수 있는 Shapes.... -#endif // end of #ifndef _3DSERVER + std::vector m_Shapes; // 리스트로 안 만든 이유는... 배열이 훨씬 효율적이기 때문이다. + std::list m_ShapesToRender; // Tick 을 호출하면 렌더링할 것만 추린다.. + std::list m_ShapesHaveID; // ID 를 갖고 있어 NPC 가 될수 있는 Shapes.... +#endif // end of #ifndef _3DSERVER float m_fMapWidth; // 맵 너비.. 미터 단위 float m_fMapLength; // 맵 길이.. 미터 단위 @@ -159,12 +159,12 @@ class CN3ShapeMgr : public CN3BaseFileAccess float Height() { return m_fMapWidth; } // 맵의 너비. 단위는 미터이다. #ifndef _3DSERVER - void ReleaseShapes(); - void RenderCollision(__Vector3 & vPos); // 넣은 위치에 있는 충돌 메시를 그려준다.. 디버깅용... - void Tick(); - void Render(); - bool Load(HANDLE hFile); - bool CheckCollisionCamera(__Vector3 & vEye, const __Vector3 & vAt, float fNP); + void ReleaseShapes(); + void RenderCollision(__Vector3 & vPos); // 넣은 위치에 있는 충돌 메시를 그려준다.. 디버깅용... + void Tick(); + void Render(); + bool Load(HANDLE hFile); + bool CheckCollisionCamera(__Vector3 & vEye, const __Vector3 & vAt, float fNP); static int SortByCameraDistance(const void * pArg1, const void * pArg2); #endif // end of #ifndef _3DSERVER diff --git a/src/server/AIServer/Npc.cpp b/src/server/AIServer/Npc.cpp index 4527a0e6..47b4f557 100644 --- a/src/server/AIServer/Npc.cpp +++ b/src/server/AIServer/Npc.cpp @@ -4279,9 +4279,9 @@ void CNpc::SendExpToUserList() { } } - if (m_pMain->m_byBattleEvent == BATTLEZONE_OPEN) { // 전쟁중 + if (m_pMain->m_byBattleEvent == BATTLEZONE_OPEN) { // 전쟁중 if (m_bySpecialType >= 90 && m_bySpecialType <= 100) { // 죽었을때 데미지를 많이 입힌 유저를 기록해 주세여 - if (strlen(strMaxDamageUser) != 0) { // 몬스터에게 가장 데미지를 많이 입힌 유저의 이름을 전송 + if (strlen(strMaxDamageUser) != 0) { // 몬스터에게 가장 데미지를 많이 입힌 유저의 이름을 전송 char send_buff[100]; memset(send_buff, 0x00, 100); int send_index = 0; diff --git a/src/server/AIServer/Npc.h b/src/server/AIServer/Npc.h index 4aad1059..c32be9f6 100644 --- a/src/server/AIServer/Npc.h +++ b/src/server/AIServer/Npc.h @@ -111,9 +111,9 @@ class CNpc { _Target m_Target; // 공격할 유저 저장,, short m_ItemUserLevel; // 죽을때 매직 이상 아이템를 떨구기위해 참조해야하는 유저의레벨 - int m_TotalDamage; // 총 누적된 대미지양 + int m_TotalDamage; // 총 누적된 대미지양 _ExpUserList m_DamagedUserList[NPC_HAVE_USER_LIST]; // 나에게 타격치를 준 유저정보를 리스트로 관리한다.(경험치 분배) - short m_sMaxDamageUserid; // 나에게 최고의 데미지를 준 유저의 아이디 저장.. + short m_sMaxDamageUserid; // 나에게 최고의 데미지를 준 유저의 아이디 저장.. _PathList m_PathList; // Npc의 패스 리스트 _PattenPos m_pPattenPos; // Npc의 패턴,, @@ -235,7 +235,7 @@ class CNpc { short m_byFamilyType; // 몹들사이에서 가족관계를 결정한다. BYTE m_tItemPer; // 아이템이 떨어질 확률 BYTE m_tDnPer; // 돈이 떨어질확률 - BYTE m_byMoneyType; // Event몬스터일 경우 돈을 많이 주는 것, (0:루팅, 1:루팅을 하지 않고 바로 나눠갖는다) + BYTE m_byMoneyType; // Event몬스터일 경우 돈을 많이 주는 것, (0:루팅, 1:루팅을 하지 않고 바로 나눠갖는다) int m_iMoney; // 떨어지는 돈 int m_iItem; // 떨어지는 아이템 @@ -249,32 +249,32 @@ class CNpc { //---------------------------------------------------------------- // MONSTER AI에 관련된 변수들 //---------------------------------------------------------------- - BYTE m_tNpcLongType; // 공격 거리 : 원거리(1), 근거리(0), 직.간접(2) - BYTE m_tNpcAttType; // 공격 성향 : 선공(1), 후공(0) - BYTE m_tNpcOldAttType; // 공격 성향 : 선공(1), 후공(0) (활동영역 제어) - BYTE m_tNpcGroupType; // 군집을 형성하냐(1), 안하냐?(0) - BYTE m_byNpcEndAttType; // 마지막까지 싸우면(1), 그렇지 않으면(0) - // BYTE m_tNpcTraceType; // 끝까지 따라간다(1), 시야에서 없어지면 그만(0) - BYTE m_byAttackPos; // User의 어느 부분에서 공격하느지를 판단(8방향) - BYTE m_byBattlePos; // 어떤 진형을 선택할 것인지를 판단.. - BYTE m_byWhatAttackType; // 공격 타입 : Normal(0), 근.장거리마법(1), 독(2), 힐링(3), 지역마법만(4), 1+4번 마법(5) + BYTE m_tNpcLongType; // 공격 거리 : 원거리(1), 근거리(0), 직.간접(2) + BYTE m_tNpcAttType; // 공격 성향 : 선공(1), 후공(0) + BYTE m_tNpcOldAttType; // 공격 성향 : 선공(1), 후공(0) (활동영역 제어) + BYTE m_tNpcGroupType; // 군집을 형성하냐(1), 안하냐?(0) + BYTE m_byNpcEndAttType; // 마지막까지 싸우면(1), 그렇지 않으면(0) + // BYTE m_tNpcTraceType; // 끝까지 따라간다(1), 시야에서 없어지면 그만(0) + BYTE m_byAttackPos; // User의 어느 부분에서 공격하느지를 판단(8방향) + BYTE m_byBattlePos; // 어떤 진형을 선택할 것인지를 판단.. + BYTE m_byWhatAttackType; // 공격 타입 : Normal(0), 근.장거리마법(1), 독(2), 힐링(3), 지역마법만(4), 1+4번 마법(5) BYTE m_byGateOpen; // 성문일 경우에.. 사용... Gate Npc Status -> 1 : open 0 : close BYTE m_byMaxDamagedNation; // 나를 죽인 유저의 국가를 저장.. (1:카루스, 2:엘모라드) BYTE m_byObjectType; // 보통은 0, object타입(성문, 레버)은 1 BYTE m_byDungeonFamily; // 던젼에서 같은 패밀리 묶음 (같은 방) - BYTE m_bySpecialType; // 몬스터의 형태가 변하는지를 판단(0:변하지 않음, 1:변하는 몬스터, - // 2:죽는경우 조정하는 몬스터(대장몬스터 죽을경우 성문이 열림), + BYTE m_bySpecialType; // 몬스터의 형태가 변하는지를 판단(0:변하지 않음, 1:변하는 몬스터, + // 2:죽는경우 조정하는 몬스터(대장몬스터 죽을경우 성문이 열림), // 3:대장몬스터의 죽음과 관련이 있는 몬스터(대장몬스터가 죽으면 관계되는 몬스터는 같이 죽도록) // 4:변하면서 죽는경우 조정하는 몬스터 (m_sControlSid) // 5:처음에 죽었있다가 출현하는 몬스터,, // 6:일정시간이 지난 후에 행동하는 몬스터,, // 100:죽었을때 데미지를 많이 입힌 유저를 기록해 주세여 - BYTE m_byTrapNumber; // 던젼에서 트랩의 번호,, - BYTE m_byChangeType; // 0:정상상태, 1:변하기 위한 준비, 2:다른몬스터로 변함, 3:몬스터의 출현, 100:몬스터의 죽음 - BYTE m_byRegenType; // 0:정상적으로 리젠이 됨.. , 1:한번 죽으면 리젠이 안되는 특수 몸, 2:리젠이 안됨 - BYTE m_byDeadType; // 0:살아 있는 경우, 100:전쟁이벤트중 죽은 경우 - short m_sChangeSid; // 변하는 몬스터의 Sid번호.. - short m_sControlSid; // 조정하는 몬스터의 Sid번호.. + BYTE m_byTrapNumber; // 던젼에서 트랩의 번호,, + BYTE m_byChangeType; // 0:정상상태, 1:변하기 위한 준비, 2:다른몬스터로 변함, 3:몬스터의 출현, 100:몬스터의 죽음 + BYTE m_byRegenType; // 0:정상적으로 리젠이 됨.. , 1:한번 죽으면 리젠이 안되는 특수 몸, 2:리젠이 안됨 + BYTE m_byDeadType; // 0:살아 있는 경우, 100:전쟁이벤트중 죽은 경우 + short m_sChangeSid; // 변하는 몬스터의 Sid번호.. + short m_sControlSid; // 조정하는 몬스터의 Sid번호.. //---------------------------------------------------------------- // MONSTER_POS DB 쪽에 있는 변수들 diff --git a/src/server/Ebenezer/EbenezerDlg.h b/src/server/Ebenezer/EbenezerDlg.h index a7f9f1b9..34070c46 100644 --- a/src/server/Ebenezer/EbenezerDlg.h +++ b/src/server/Ebenezer/EbenezerDlg.h @@ -180,9 +180,9 @@ class CEbenezerDlg : public CDialog { short m_sSocketCount; // AI Server 재접속시 사용 // sungyong 2002.05.23 short m_sSendSocket; - BOOL m_bFirstServerFlag; // 서버가 처음시작한 후 게임서버가 붙은 경우에는 1, 붙지 않은 경우 0 - BOOL m_bServerCheckFlag; - BOOL m_bPointCheckFlag; // AI서버와 재접전에 NPC포인터 참조막기 (TRUE:포인터 참조, FALSE:포인터 참조 못함) + BOOL m_bFirstServerFlag; // 서버가 처음시작한 후 게임서버가 붙은 경우에는 1, 붙지 않은 경우 0 + BOOL m_bServerCheckFlag; + BOOL m_bPointCheckFlag; // AI서버와 재접전에 NPC포인터 참조막기 (TRUE:포인터 참조, FALSE:포인터 참조 못함) short m_sReSocketCount; // GameServer와 재접시 필요 float m_fReConnectStart; // 처음 소켓이 도착한 시간 short m_sErrorSocketCount; // 이상소켓 감시용 diff --git a/src/server/Ebenezer/Map.cpp b/src/server/Ebenezer/Map.cpp index 88efe5b1..58b7852c 100644 --- a/src/server/Ebenezer/Map.cpp +++ b/src/server/Ebenezer/Map.cpp @@ -191,9 +191,9 @@ void C3DMap::LoadRegeneEvent(HANDLE hFile) { pEvent = new _REGENE_EVENT; pEvent->sRegenePoint = i; - ReadFile(hFile, &(pEvent->fRegenePosX), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 왼아래쪽 구석 좌표 X - ReadFile(hFile, &(pEvent->fRegenePosY), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 왼아래쪽 구석 좌표 Y - ReadFile(hFile, &(pEvent->fRegenePosZ), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 왼아래쪽 구석 좌표 Z + ReadFile(hFile, &(pEvent->fRegenePosX), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 왼아래쪽 구석 좌표 X + ReadFile(hFile, &(pEvent->fRegenePosY), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 왼아래쪽 구석 좌표 Y + ReadFile(hFile, &(pEvent->fRegenePosZ), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 왼아래쪽 구석 좌표 Z ReadFile(hFile, &(pEvent->fRegeneAreaZ), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 Z 축 길이 ReadFile(hFile, &(pEvent->fRegeneAreaX), 4, &dwNum, NULL); // 캐릭터 나타나는 지역의 X 축 길이 diff --git a/src/server/Ebenezer/N3BASE/My_3DStruct.h b/src/server/Ebenezer/N3BASE/My_3DStruct.h index 5d931f5e..f8ed834d 100644 --- a/src/server/Ebenezer/N3BASE/My_3DStruct.h +++ b/src/server/Ebenezer/N3BASE/My_3DStruct.h @@ -681,10 +681,10 @@ const DWORD RF_NOTUSEFOG = 0x2; // 안개 무시 const DWORD RF_DOUBLESIDED = 0x4; // 양면 - D3DCULL_NONE const DWORD RF_BOARD_Y = 0x8; // Y 축으로 해서.. 카메라를 본다. const DWORD RF_POINTSAMPLING = 0x10; // MipMap 에서.. PointSampling 으로 한다.. -const DWORD RF_WINDY = 0x20; // 바람에 날린다.. 바람의 값은 CN3Base::s_vWindFactor 를 참조 한다.. -const DWORD RF_NOTUSELIGHT = 0x40; // Light Off -const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse 값을 갖고 투명하게 Alpha blending -const DWORD RF_NOTZWRITE = 0x100; // ZBuffer 에 안쓴다. +const DWORD RF_WINDY = 0x20; // 바람에 날린다.. 바람의 값은 CN3Base::s_vWindFactor 를 참조 한다.. +const DWORD RF_NOTUSELIGHT = 0x40; // Light Off +const DWORD RF_DIFFUSEALPHA = 0x80; // Diffuse 값을 갖고 투명하게 Alpha blending +const DWORD RF_NOTZWRITE = 0x100; // ZBuffer 에 안쓴다. struct __Material : public _D3DMATERIAL9 { public: diff --git a/src/server/Ebenezer/N3BASE/N3ShapeMgr.cpp b/src/server/Ebenezer/N3BASE/N3ShapeMgr.cpp index 3f2811f5..2022bb89 100644 --- a/src/server/Ebenezer/N3BASE/N3ShapeMgr.cpp +++ b/src/server/Ebenezer/N3BASE/N3ShapeMgr.cpp @@ -534,10 +534,10 @@ void CN3ShapeMgr::GenerateCollisionData() { pSubCell->pdwCCVertIndices[nCCPC * 3 + 0] = i * 3 + 0; // 인덱스 저장.. pSubCell->pdwCCVertIndices[nCCPC * 3 + 1] = i * 3 + 1; // 인덱스 저장.. pSubCell->pdwCCVertIndices[nCCPC * 3 + 2] = i * 3 + 2; // 인덱스 저장.. - pSubCell->nCCPolyCount++; // Collision Check Polygon Count 를 늘린다. - } // end of for(int x = xx1; x <= xx2; x++) - } // end of for(int z = zz1; z <= zz2; z++) // 범위만큼 처리.. - } // end of for(int j = 0; j < 3; j++) // 걸쳐 있는 메시 만큼 생성... + pSubCell->nCCPolyCount++; // Collision Check Polygon Count 를 늘린다. + } // end of for(int x = xx1; x <= xx2; x++) + } // end of for(int z = zz1; z <= zz2; z++) // 범위만큼 처리.. + } // end of for(int j = 0; j < 3; j++) // 걸쳐 있는 메시 만큼 생성... } } #endif // end of _N3TOOL @@ -701,8 +701,8 @@ bool CN3ShapeMgr::CheckCollision(const __Vector3 & vPos, // 충돌 위 return false; // 움직이는 속도가 없거나 반대로 움직이면 넘어간다.. } static __CellSub * ppCells[128]; - __Vector3 vPosNext = vPos + (vDir * fSpeedPerSec); // 다음 위치 - int nSubCellCount = this->SubCellPathThru(vPos, vPosNext, ppCells); // 통과하는 서브셀을 가져온다.. + __Vector3 vPosNext = vPos + (vDir * fSpeedPerSec); // 다음 위치 + int nSubCellCount = this->SubCellPathThru(vPos, vPosNext, ppCells); // 통과하는 서브셀을 가져온다.. if (nSubCellCount <= 0 || nSubCellCount > 128) { return false; // 없음 말자. } @@ -756,7 +756,7 @@ bool CN3ShapeMgr::CheckCollision(const __Vector3 & vPos, // 충돌 위 #ifndef _3DSERVER else { it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... - int iSC = m_ShapesToRender.size(); + int iSC = m_ShapesToRender.size(); if (iSC > 0) { // 거리순으로 정렬.. @@ -895,7 +895,7 @@ CN3Shape * CN3ShapeMgr::Pick(int iXScreen, int iYScreen, bool bMustHaveEvent, __ vPos, vDir); it_Shp it = m_ShapesToRender.begin(), itEnd = m_ShapesToRender.end(); // 눈에 보이는것만 대상으로 해서... - int iSC = m_ShapesToRender.size(); + int iSC = m_ShapesToRender.size(); // 거리순으로 정렬.. std::vector Shapes(iSC, NULL); diff --git a/src/server/Ebenezer/N3BASE/N3ShapeMgr.h b/src/server/Ebenezer/N3BASE/N3ShapeMgr.h index 5e6c6562..4237819f 100644 --- a/src/server/Ebenezer/N3BASE/N3ShapeMgr.h +++ b/src/server/Ebenezer/N3BASE/N3ShapeMgr.h @@ -15,8 +15,8 @@ const int CELL_MAIN_DEVIDE = 4; // 메인셀은 4 X 4 의 서브셀로 나뉜다.. const int CELL_SUB_SIZE = 4; // 4 Meter 가 서브셀의 사이즈이다.. const int CELL_MAIN_SIZE = CELL_MAIN_DEVIDE * CELL_SUB_SIZE; // 메인셀 크기는 서브셀갯수 X 서브셀 크기이다. -const int MAX_CELL_MAIN = 4096 / CELL_MAIN_SIZE; // 메인셀의 최대 갯수는 지형크기 / 메인셀크기 이다. -const int MAX_CELL_SUB = MAX_CELL_MAIN * CELL_MAIN_DEVIDE; // 서브셀 최대 갯수는 메인셀 * 메인셀나눔수 이다. +const int MAX_CELL_MAIN = 4096 / CELL_MAIN_SIZE; // 메인셀의 최대 갯수는 지형크기 / 메인셀크기 이다. +const int MAX_CELL_SUB = MAX_CELL_MAIN * CELL_MAIN_DEVIDE; // 서브셀 최대 갯수는 메인셀 * 메인셀나눔수 이다. #ifdef _3DSERVER class CN3ShapeMgr @@ -114,10 +114,10 @@ class CN3ShapeMgr : public CN3BaseFileAccess protected: #ifndef _3DSERVER - std::vector m_Shapes; // 리스트로 안 만든 이유는... 배열이 훨씬 효율적이기 때문이다. - std::list m_ShapesToRender; // Tick 을 호출하면 렌더링할 것만 추린다.. - std::list m_ShapesHaveID; // ID 를 갖고 있어 NPC 가 될수 있는 Shapes.... -#endif // end of #ifndef _3DSERVER + std::vector m_Shapes; // 리스트로 안 만든 이유는... 배열이 훨씬 효율적이기 때문이다. + std::list m_ShapesToRender; // Tick 을 호출하면 렌더링할 것만 추린다.. + std::list m_ShapesHaveID; // ID 를 갖고 있어 NPC 가 될수 있는 Shapes.... +#endif // end of #ifndef _3DSERVER float m_fMapWidth; // 맵 너비.. 미터 단위 float m_fMapLength; // 맵 길이.. 미터 단위 @@ -159,12 +159,12 @@ class CN3ShapeMgr : public CN3BaseFileAccess float Height() { return m_fMapWidth; } // 맵의 너비. 단위는 미터이다. #ifndef _3DSERVER - void ReleaseShapes(); - void RenderCollision(__Vector3 & vPos); // 넣은 위치에 있는 충돌 메시를 그려준다.. 디버깅용... - void Tick(); - void Render(); - bool Load(HANDLE hFile); - bool CheckCollisionCamera(__Vector3 & vEye, const __Vector3 & vAt, float fNP); + void ReleaseShapes(); + void RenderCollision(__Vector3 & vPos); // 넣은 위치에 있는 충돌 메시를 그려준다.. 디버깅용... + void Tick(); + void Render(); + bool Load(HANDLE hFile); + bool CheckCollisionCamera(__Vector3 & vEye, const __Vector3 & vAt, float fNP); static int SortByCameraDistance(const void * pArg1, const void * pArg2); #endif // end of #ifndef _3DSERVER diff --git a/src/tool/N3CE/TransDummy.h b/src/tool/N3CE/TransDummy.h index 079d1fa9..165c8787 100644 --- a/src/tool/N3CE/TransDummy.h +++ b/src/tool/N3CE/TransDummy.h @@ -32,13 +32,13 @@ class CTransDummy : public CN3Transform { // Attributes public: protected: - __DUMMYCUBE m_DummyCubes[NUM_DUMMY]; // 4개의 큐브(center, x, y, z); - __VertexXyzColor m_LineVertices[6]; // 4개의 큐브를 이어주는 선을 구성하는 점 - CTypedPtrArray m_SelObjArray; // MapMng에서 선택된 객체들 + __DUMMYCUBE m_DummyCubes[NUM_DUMMY]; // 4개의 큐브(center, x, y, z); + __VertexXyzColor m_LineVertices[6]; // 4개의 큐브를 이어주는 선을 구성하는 점 + CTypedPtrArray m_SelObjArray; // MapMng에서 선택된 객체들 __DUMMYCUBE * m_pSortedCubes[NUM_DUMMY]; // Cube 거리에 따라 정렬된 포인터 __DUMMYCUBE * m_pSelectedCube; // 선택된 큐브 - __Vector3 m_vPrevPos; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 - __Quaternion m_qPrevRot; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 + __Vector3 m_vPrevPos; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 + __Quaternion m_qPrevRot; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 __Vector3 * m_vPrevScaleArray; // 이번 마우스 드래그 이전에 확대/축소값들 (선택된 객체들 모두의 값을 가지고 있어야 하기 때문에 배열) @@ -53,7 +53,7 @@ class CTransDummy : public CN3Transform { void GetPickRay(POINT point, __Vector3 & vDir, __Vector3 & vOrig); // 마우스 포인터가 가리키는 쪽으로 뻗어나가는 선 얻는 함수 protected: - __DUMMYCUBE * Pick(int x, int y); // 큐브 picking + __DUMMYCUBE * Pick(int x, int y); // 큐브 picking void InitDummyCube(int iType, __DUMMYCUBE * pDummyCube, const __Vector3 & vOffset, D3DCOLOR color); // 큐브 초기화 static int SortCube(const void * pArg1, const void * pArg2); // 큐브 카메라 거리에 대한 정렬함수 virtual void TransDiff(__Vector3 * pvDiffPos, __Quaternion * pvDiffRot, diff --git a/src/tool/N3Indoor/MainFrm.h b/src/tool/N3Indoor/MainFrm.h index 33915d8a..3f205240 100644 --- a/src/tool/N3Indoor/MainFrm.h +++ b/src/tool/N3Indoor/MainFrm.h @@ -82,19 +82,19 @@ class CMainFrame : public CFrameWnd, public CN3Base { CN3Light m_Light; CDlgBase * m_pDlgBase; // 객체 등록정보 편집 대화상자.. CTotalToolSheet * m_pTotalSheet; - CDlgShapeList * m_pDlgSourceList; // Object 목록을 보여줄 다이알로그 - CDlgShapeList * m_pDlgOutputList; // 맵에 배치한 Object를 보여줄 다이알로그 - CN3Scene * m_pSceneSource; // source object 목록에 보여줄 것들을 담은 Scene - SelectElement m_LastSelectedElement; // 가장 마지막으로 선택된 객체.. 포커스 맞출때 쓴다.. + CDlgShapeList * m_pDlgSourceList; // Object 목록을 보여줄 다이알로그 + CDlgShapeList * m_pDlgOutputList; // 맵에 배치한 Object를 보여줄 다이알로그 + CN3Scene * m_pSceneSource; // source object 목록에 보여줄 것들을 담은 Scene + SelectElement m_LastSelectedElement; // 가장 마지막으로 선택된 객체.. 포커스 맞출때 쓴다.. //................. CArray m_SelVolArray; std::list m_FloorList; - CTransDummy * m_pDummy; // 물체를 이동 회전 확대/축소 하는 기능을 담당하는 클래스 - CPosDummy m_PosDummy; // 이동 - CRotDummy m_RotDummy; // 회전 - CScaleDummy m_ScaleDummy; // 확대/축소 - CSwappedDummy m_SwappedDummy; + CTransDummy * m_pDummy; // 물체를 이동 회전 확대/축소 하는 기능을 담당하는 클래스 + CPosDummy m_PosDummy; // 이동 + CRotDummy m_RotDummy; // 회전 + CScaleDummy m_ScaleDummy; // 확대/축소 + CSwappedDummy m_SwappedDummy; //.................. // Overrides @@ -109,15 +109,15 @@ class CMainFrame : public CFrameWnd, public CN3Base { // Implementation public: - void FindMinMaxTotalShape(__Vector3 & vecMin, __Vector3 & vecMax); - void OutputDlgRefresh(); // 소스목록에서 선택한 Object를 넣으면 OutputScene으로 복사해서 넣어준다. + void FindMinMaxTotalShape(__Vector3 & vecMin, __Vector3 & vecMax); + void OutputDlgRefresh(); // 소스목록에서 선택한 Object를 넣으면 OutputScene으로 복사해서 넣어준다. CN3Transform * AddChr(CN3Scene * pDestScene, const std::string & szFN, BOOL bGenerateChainNumber); // 특정Scene에 캐릭터 객체를 복사해 추가 CN3Transform * AddShape(CN3Scene * pDestScene, const std::string & szFN, BOOL bGenerateChainNumber); // 특정Scene에 Shape 객체를 복사해 추가 - void UpdateShapeInfoDisplay(); - void RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd); // 특정 윈도우에 Object를 그려준다. + void UpdateShapeInfoDisplay(); + void RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd); // 특정 윈도우에 Object를 그려준다. ShapeInfo * GetShapeForDisplay(); void TotalValidateCheckAfterDelete(); diff --git a/src/tool/N3Indoor/TransDummy.h b/src/tool/N3Indoor/TransDummy.h index cbb869a9..77edf987 100644 --- a/src/tool/N3Indoor/TransDummy.h +++ b/src/tool/N3Indoor/TransDummy.h @@ -97,7 +97,7 @@ class CTransDummy : public CN3Transform { void GetPickRay(POINT point, __Vector3 & vDir, __Vector3 & vOrig); // 마우스 포인터가 가리키는 쪽으로 뻗어나가는 선 얻는 함수 protected: - __DUMMYCUBE * Pick(int x, int y); // 큐브 picking + __DUMMYCUBE * Pick(int x, int y); // 큐브 picking void InitDummyCube(int iType, __DUMMYCUBE * pDummyCube, const __Vector3 & vOffset, D3DCOLOR color); // 큐브 초기화 static int SortCube(const void * pArg1, const void * pArg2); // 큐브 카메라 거리에 대한 정렬함수 virtual void TransDiff(__Vector3 * pvDiffPos, __Quaternion * pvDiffRot, diff --git a/src/tool/N3ME/DlgRiverProperty.cpp b/src/tool/N3ME/DlgRiverProperty.cpp index 33977cf1..c6852b6d 100644 --- a/src/tool/N3ME/DlgRiverProperty.cpp +++ b/src/tool/N3ME/DlgRiverProperty.cpp @@ -276,7 +276,7 @@ BOOL CDlgRiverProperty::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT * pResult char szFName[_MAX_FNAME]; char szExt[_MAX_EXT]; _splitpath(tmp.m_szName.c_str(), NULL, szDir, szFName, szExt); - int iCount = atoi(szFName + lstrlen(szFName) - 2) + 1; // 파일 이름의 끝에 두자리를 숫자로 변환 + int iCount = atoi(szFName + lstrlen(szFName) - 2) + 1; // 파일 이름의 끝에 두자리를 숫자로 변환 CString strFName = szDir; strFName += szFName; strFName = strFName.Left(strFName.GetLength() - 2); diff --git a/src/tool/N3ME/LyTerrain.cpp b/src/tool/N3ME/LyTerrain.cpp index a05429d0..aaf4b271 100644 --- a/src/tool/N3ME/LyTerrain.cpp +++ b/src/tool/N3ME/LyTerrain.cpp @@ -1017,7 +1017,7 @@ bool CLyTerrain::LoadFromFile(const char * lpszPath) { ProgressBar.StepIt(); _makepath(szNewFName, szDrive, szDir, szFName, - NULL); // 파일 이름과 동일한 이름으로 컬러맵 저장되어 있다. + NULL); // 파일 이름과 동일한 이름으로 컬러맵 저장되어 있다. wsprintf(szAdd, "_%02d%02d.DXT", x, z); // Tool 경로를 붙이고 번호와 확장자를 붙여서 저장되어 있다. lstrcat(szNewFName, szAdd); diff --git a/src/tool/N3ME/LyTerrain.h b/src/tool/N3ME/LyTerrain.h index 3fd9f2c4..8803cbe1 100644 --- a/src/tool/N3ME/LyTerrain.h +++ b/src/tool/N3ME/LyTerrain.h @@ -43,10 +43,10 @@ class CLyTerrain : public CN3BaseFileAccess { CQTNode * m_pRefCurrNode; //지형 edit관련... - __VertexXyzColor m_vBrushVertices[MAX_BRUSH_SIZE * MAX_BRUSH_SIZE * 9]; // Brush의 모양을 나타내는 vertex buffer - WORD m_wBrushIndices[MAX_BRUSH_SIZE * MAX_BRUSH_SIZE * 6 * 4]; // Brush의 모양을 나타내는 index buffer - int m_iBrushIndexCount; // Brush의 모양을 나타내는 index의 숫자 - int m_iEditMode; // Edit의 모드인가? + __VertexXyzColor m_vBrushVertices[MAX_BRUSH_SIZE * MAX_BRUSH_SIZE * 9]; // Brush의 모양을 나타내는 vertex buffer + WORD m_wBrushIndices[MAX_BRUSH_SIZE * MAX_BRUSH_SIZE * 6 * 4]; // Brush의 모양을 나타내는 index buffer + int m_iBrushIndexCount; // Brush의 모양을 나타내는 index의 숫자 + int m_iEditMode; // Edit의 모드인가? CDTexMng * m_pDTexMng; @@ -69,7 +69,7 @@ class CLyTerrain : public CN3BaseFileAccess { bool ** m_ppIsLightMap; int m_iNumLightMap; bool m_bDrawLineLightMap; //라이트 맵 그리는 옵션에서.. 라인형태로 그리는지.. - __VertexXyzColor m_vLineLightMap[2]; //라인형태로 그린다면 그 라인을 화면에 표시해야되겠지?..^^ 그점이야.. + __VertexXyzColor m_vLineLightMap[2]; //라인형태로 그린다면 그 라인을 화면에 표시해야되겠지?..^^ 그점이야.. //LOD관련.. int m_iHeightLimit; @@ -142,7 +142,7 @@ class CLyTerrain : public CN3BaseFileAccess { BOOL IntersectTriangle(const D3DXVECTOR3 orig, const D3DXVECTOR3 dir, D3DXVECTOR3 & v0, D3DXVECTOR3 & v1, D3DXVECTOR3 & v2, float * t, float * u, float * v); void Heighten(POINT ptCenter, float fHeight); // 지형을 높게하거나 낮게 하는 함수 - void Smooth(POINT ptCenter); // 지형을 주변 맵의 높이값과 비교해서 부드럽게 한다. + void Smooth(POINT ptCenter); // 지형을 주변 맵의 높이값과 비교해서 부드럽게 한다. void Flaten(POINT ptCenter); void SetApexHeight(int x, int z, float fHeight); // 높이맵의 높이값 지정 float GetApexHeight(int x, int z) const; // 높이맵의 높이값 얻기 diff --git a/src/tool/N3ME/MapMng.h b/src/tool/N3ME/MapMng.h index 5bf47105..64f56393 100644 --- a/src/tool/N3ME/MapMng.h +++ b/src/tool/N3ME/MapMng.h @@ -122,7 +122,7 @@ class CMapMng : public CN3Base { // CTypedPtrArray m_SelOutputObjArray; // 맵에 배치한 Object 중 선택한 것들 CTypedPtrArray m_SelOutputObjArray; // 맵에 배치한 Object 중 선택한 것들 - ENUM_EDIT_STATE m_eSelObjBackState; // 임시복사(ctrl+c)의 상태표시 + ENUM_EDIT_STATE m_eSelObjBackState; // 임시복사(ctrl+c)의 상태표시 CTypedPtrArray m_SelOutputObjBack; // 맵에 배치한 Object 중 선택한 것들 가지고 있음 int m_CursorMode; // 마우스의 기능 모드 구분 @@ -159,32 +159,32 @@ class CMapMng : public CN3Base { } } //지형 존 아이디 셋팅. void ImportShape(const char * szFullPath); - void MakeTerrainMovableAttr(CN3ShapeMgr * pShapeMgr); //지형에서 갈수 있는 타일과 갈 수 없는 타일을 정리해라.. + void MakeTerrainMovableAttr(CN3ShapeMgr * pShapeMgr); //지형에서 갈수 있는 타일과 갈 수 없는 타일을 정리해라.. void ImportPostDataFromScene(const char * szFileName); // Scene 에서 오브젝트 배치된걸 불러온다.. void UpDateFP(); void Tick(); void Render(); void Release(); void SavePartition(float x, float z, float width); - void SaveToFile(LPCTSTR lpszPathName); // Map 파일 저장 - void LoadFromFile(LPCTSTR lpszPathName); // Map 파일 불러오기 - BOOL MouseMsgFilter(LPMSG pMsg); // 마우스의 기능 - void ImportTerrain(const char * szMeshFN); // VMesh 파일에서 지형 데이터 읽어오기 - void ImportTerrainHeight(const char * szMeshFN); // VMesh 파일에서 지형의 높이값만 읽어오기.. + void SaveToFile(LPCTSTR lpszPathName); // Map 파일 저장 + void LoadFromFile(LPCTSTR lpszPathName); // Map 파일 불러오기 + BOOL MouseMsgFilter(LPMSG pMsg); // 마우스의 기능 + void ImportTerrain(const char * szMeshFN); // VMesh 파일에서 지형 데이터 읽어오기 + void ImportTerrainHeight(const char * szMeshFN); // VMesh 파일에서 지형의 높이값만 읽어오기.. void MakeGameFiles(LPCTSTR lpszPathName, float fSize = 128.0f); // 게임 데이터로 변환하기 void MakeServerDataFiles(LPCTSTR lpszPathName); void SelectObject(CN3Base * pObj, BOOL IsSourceObj, BOOL bAdd = FALSE); // 객체를 선택한다. - void RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd); // 특정 윈도우에 Object를 그려준다. - void SetCursorMode(int iMode); // 마우스커서의 이용방법을 바꾼다. - int GetCursorMode() const { return m_CursorMode; } // 마우스 커서의 이용방법을 얻는다. - void Invalidate(); // View 화면 갱신 - void FocusSelObj(); // 선택된 객체로 포터스를 옮긴다. - void FocusAll(); // 전체 맵을 볼수 있도록 한다. - void FocusAt(__Vector3 v); // 지정된 점으로 포커스 옮겨. - void DropSelObjToTerrain(); // 선택한 객체를 지형에 붙인다.(Y값만 조정) - void DeleteSelObjectFromOutputScene(); // OutputScene에서 선택한 객체를 지운다. - void RenderDragRect(RECT * rc); // 드래그 영역을 그린다. - void UpdateAll(); // source 와 output dialog를 update시킨다. + void RenderObjectToWindow(CN3TransformCollision * pObj, HWND hWnd); // 특정 윈도우에 Object를 그려준다. + void SetCursorMode(int iMode); // 마우스커서의 이용방법을 바꾼다. + int GetCursorMode() const { return m_CursorMode; } // 마우스 커서의 이용방법을 얻는다. + void Invalidate(); // View 화면 갱신 + void FocusSelObj(); // 선택된 객체로 포터스를 옮긴다. + void FocusAll(); // 전체 맵을 볼수 있도록 한다. + void FocusAt(__Vector3 v); // 지정된 점으로 포커스 옮겨. + void DropSelObjToTerrain(); // 선택한 객체를 지형에 붙인다.(Y값만 조정) + void DeleteSelObjectFromOutputScene(); // OutputScene에서 선택한 객체를 지운다. + void RenderDragRect(RECT * rc); // 드래그 영역을 그린다. + void UpdateAll(); // source 와 output dialog를 update시킨다. void LoadObjectPostData(LPCTSTR lpszFileName); // Shape 배치정보를 text파일에서 읽어온다. void SaveObjectPostData(LPCTSTR lpszFileName); // Shape 배치정보를 text파일로 저장한다. @@ -201,7 +201,7 @@ class CMapMng : public CN3Base { CN3Transform * pObj); // 소스목록에서 선택한 Object를 넣으면 OutputScene으로 복사해서 넣어준다. CN3Camera * CameraGet(); - CN3Base * Pick(POINT point, int * pnPart); // 객체 picking 함수 + CN3Base * Pick(POINT point, int * pnPart); // 객체 picking 함수 static int SortByCameraDistance(const void * pArg1, const void * pArg2); // 카메라 거리에 따른 정렬함수 qsort에 이용 // BOOL CameraMove(LPMSG pMsg); // 카메라 이동에 관한 메세지 처리 diff --git a/src/tool/N3ME/PondMesh.cpp b/src/tool/N3ME/PondMesh.cpp index 88462287..ebb9a985 100644 --- a/src/tool/N3ME/PondMesh.cpp +++ b/src/tool/N3ME/PondMesh.cpp @@ -612,10 +612,10 @@ void CPondMesh::CalcuWidth(int iSx, int iSy, int iEx, int iEy) { int iHeightNum = iSy * m_iWaterScaleWidth; // ---------------------------------------------------------------------------------- // 계산해야할 첫점을 구한다 - __Vector3 vBakPick = *(m_pVertices + iHeightNum + iSx); // 백업된 전의 좌표(참조하여 새로운 좌표 계산) - __Vector3 vNowPick = *(m_pViewVts + iHeightNum + iSx); // 현재 지정된 점(나중에 여러개 지정되게) - __Vector3 * pLRVertices = m_pVertices + iHeightNum; // 계산할 첫 점(백업용) - __VertexXyzT2 * pLRViewVer = m_pViewVts + iHeightNum; // 계산할 첫 점(현재용) + __Vector3 vBakPick = *(m_pVertices + iHeightNum + iSx); // 백업된 전의 좌표(참조하여 새로운 좌표 계산) + __Vector3 vNowPick = *(m_pViewVts + iHeightNum + iSx); // 현재 지정된 점(나중에 여러개 지정되게) + __Vector3 * pLRVertices = m_pVertices + iHeightNum; // 계산할 첫 점(백업용) + __VertexXyzT2 * pLRViewVer = m_pViewVts + iHeightNum; // 계산할 첫 점(현재용) // ---------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------- @@ -697,7 +697,7 @@ void CPondMesh::SetAllPos(int iSx, int iSy, int iEx, int iEy) { __Vector3 vTop, vBottom, vCenter, vNowCenter; vTop = *pTBVertices; vBottom = *(m_pVertices + m_iVC - m_iWaterScaleWidth + iSx); - vCenter = *(m_pVertices + m_iWaterScaleWidth * iSy + iSx); // 현재 지정된 점(나중에 여러개 지정되게) + vCenter = *(m_pVertices + m_iWaterScaleWidth * iSy + iSx); // 현재 지정된 점(나중에 여러개 지정되게) vNowCenter = *(m_pViewVts + m_iWaterScaleWidth * iSy + iSx); // 백업된 전의 좌표(참조하여 새로운 좌표 계산) // 새로운 좌표 계산 diff --git a/src/tool/N3ME/PondMesh.h b/src/tool/N3ME/PondMesh.h index 7215a9d1..54ae92a6 100644 --- a/src/tool/N3ME/PondMesh.h +++ b/src/tool/N3ME/PondMesh.h @@ -116,8 +116,8 @@ class CPondMesh : public CN3BaseFileAccess { void EstimatePos(); // 줄의 크기에 따라 점들의 갯수를 임의로 지정//// - void ClearSelectPos(); // 선택점에 관한 데이터 초기화 - void InputSelectPos(float fX, float fY, float fZ, int iVC = -1); // 선택한 점들에 대한 자료입력 + void ClearSelectPos(); // 선택점에 관한 데이터 초기화 + void InputSelectPos(float fX, float fY, float fZ, int iVC = -1); // 선택한 점들에 대한 자료입력 BOOL InputDummyMovingPos(__Vector3 vDummyMovingPos, BOOL bMovePond); // 더미가 움직였을시 나머지점을 처리하기 위해 protected: diff --git a/src/tool/N3ME/PondMng.cpp b/src/tool/N3ME/PondMng.cpp index 602b1fd1..532304a6 100644 --- a/src/tool/N3ME/PondMng.cpp +++ b/src/tool/N3ME/PondMng.cpp @@ -405,9 +405,9 @@ BOOL CPondMng::MouseMsgFilter(LPMSG pMsg) { } if (PCM_CREATE == m_PCursorMode) { // 새로운 연못 추가할때 드래그 하는 선 설정 - __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 - __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 - __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) + __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 + __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 + __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) vPN.Set(0, 1, 0); vPV = vMouseStrPos; diff --git a/src/tool/N3ME/PondMng.h b/src/tool/N3ME/PondMng.h index 656a91b0..e0b5dcee 100644 --- a/src/tool/N3ME/PondMng.h +++ b/src/tool/N3ME/PondMng.h @@ -63,7 +63,7 @@ class CPondMng : public CN3BaseFileAccess { BOOL m_bChooseGroup; // 연못물 그룹으로 편집하는가 BOOL m_bChooseEditPond; // 현재 쓰는 연못내에서만 편집할것인가 BOOL m_bMovePond; // 선택한 연못을 통째로 움직일 것인가 - int m_PCursorMode; // 연못을 추가?하는 것인가 점을 선택하는 것인가? + int m_PCursorMode; // 연못을 추가?하는 것인가 점을 선택하는 것인가? CMainFrame * m_pMainFrm; // mainframe pointer CDlgPondProperty * m_pDlgProperty; // property dialog @@ -125,5 +125,5 @@ class CPondMng : public CN3BaseFileAccess { void ReSetVtxBackup(); void ReSetDrawRect(__Vector3 vStrPos, __Vector3 vEndPos); // 연못을 그리기위한 영역 재정리 - void InputDummyMovePos(__Vector3 vMovePos); // 더미가 움직인 만큼 선택한 연못에 입력 + void InputDummyMovePos(__Vector3 vMovePos); // 더미가 움직인 만큼 선택한 연못에 입력 }; diff --git a/src/tool/N3ME/RiverMesh.cpp b/src/tool/N3ME/RiverMesh.cpp index acfa3d31..73d2dc9a 100644 --- a/src/tool/N3ME/RiverMesh.cpp +++ b/src/tool/N3ME/RiverMesh.cpp @@ -78,13 +78,13 @@ bool CRiverMesh::Load(HANDLE hFile) { int iLen; char szTextueFName[_MAX_PATH]; - ReadFile(hFile, &m_iRiverID, sizeof(m_iRiverID), &dwNum, NULL); // 강 번호 - ReadFile(hFile, &m_fSpeed1, sizeof(m_fSpeed1), &dwNum, NULL); // 유속 - ReadFile(hFile, &m_fSpeed2, sizeof(m_fSpeed2), &dwNum, NULL); // 유속2 - ReadFile(hFile, &m_fMeterPerV, sizeof(m_fMeterPerV), &dwNum, NULL); // U좌표 1.0에 해당하는 강의 길이 - ReadFile(hFile, &m_fMeterPerU, sizeof(m_fMeterPerU), &dwNum, NULL); // V좌표 1.0에 해당하는 강의 길이 - ReadFile(hFile, &m_fMeterPerV2, sizeof(m_fMeterPerV2), &dwNum, NULL); // U2좌표 1.0에 해당하는 강의 길이 - ReadFile(hFile, &m_fMeterPerU2, sizeof(m_fMeterPerU2), &dwNum, NULL); // V2좌표 1.0에 해당하는 강의 길이 + ReadFile(hFile, &m_iRiverID, sizeof(m_iRiverID), &dwNum, NULL); // 강 번호 + ReadFile(hFile, &m_fSpeed1, sizeof(m_fSpeed1), &dwNum, NULL); // 유속 + ReadFile(hFile, &m_fSpeed2, sizeof(m_fSpeed2), &dwNum, NULL); // 유속2 + ReadFile(hFile, &m_fMeterPerV, sizeof(m_fMeterPerV), &dwNum, NULL); // U좌표 1.0에 해당하는 강의 길이 + ReadFile(hFile, &m_fMeterPerU, sizeof(m_fMeterPerU), &dwNum, NULL); // V좌표 1.0에 해당하는 강의 길이 + ReadFile(hFile, &m_fMeterPerV2, sizeof(m_fMeterPerV2), &dwNum, NULL); // U2좌표 1.0에 해당하는 강의 길이 + ReadFile(hFile, &m_fMeterPerU2, sizeof(m_fMeterPerU2), &dwNum, NULL); // V2좌표 1.0에 해당하는 강의 길이 ReadFile(hFile, &m_dwAlphaFactor, sizeof(m_dwAlphaFactor), &dwNum, NULL); // 강을 투명하게 하기 위한 알파값 ReadFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // 점 갯수 @@ -126,13 +126,13 @@ bool CRiverMesh::Load(HANDLE hFile) { bool CRiverMesh::Save(HANDLE hFile) { DWORD dwNum; - WriteFile(hFile, &m_iRiverID, sizeof(m_iRiverID), &dwNum, NULL); // 강 번호 - WriteFile(hFile, &m_fSpeed1, sizeof(m_fSpeed1), &dwNum, NULL); // 유속1 - WriteFile(hFile, &m_fSpeed2, sizeof(m_fSpeed2), &dwNum, NULL); // 유속2 - WriteFile(hFile, &m_fMeterPerV, sizeof(m_fMeterPerV), &dwNum, NULL); // U좌표 1.0에 해당하는 강의 길이 - WriteFile(hFile, &m_fMeterPerU, sizeof(m_fMeterPerU), &dwNum, NULL); // V좌표 1.0에 해당하는 강의 길이 - WriteFile(hFile, &m_fMeterPerV2, sizeof(m_fMeterPerV2), &dwNum, NULL); // U2좌표 1.0에 해당하는 강의 길이 - WriteFile(hFile, &m_fMeterPerU2, sizeof(m_fMeterPerU2), &dwNum, NULL); // V2좌표 1.0에 해당하는 강의 길이 + WriteFile(hFile, &m_iRiverID, sizeof(m_iRiverID), &dwNum, NULL); // 강 번호 + WriteFile(hFile, &m_fSpeed1, sizeof(m_fSpeed1), &dwNum, NULL); // 유속1 + WriteFile(hFile, &m_fSpeed2, sizeof(m_fSpeed2), &dwNum, NULL); // 유속2 + WriteFile(hFile, &m_fMeterPerV, sizeof(m_fMeterPerV), &dwNum, NULL); // U좌표 1.0에 해당하는 강의 길이 + WriteFile(hFile, &m_fMeterPerU, sizeof(m_fMeterPerU), &dwNum, NULL); // V좌표 1.0에 해당하는 강의 길이 + WriteFile(hFile, &m_fMeterPerV2, sizeof(m_fMeterPerV2), &dwNum, NULL); // U2좌표 1.0에 해당하는 강의 길이 + WriteFile(hFile, &m_fMeterPerU2, sizeof(m_fMeterPerU2), &dwNum, NULL); // V2좌표 1.0에 해당하는 강의 길이 WriteFile(hFile, &m_dwAlphaFactor, sizeof(m_dwAlphaFactor), &dwNum, NULL); // 강을 투명하게 하기 위한 알파값 WriteFile(hFile, &m_iVC, sizeof(m_iVC), &dwNum, NULL); // 점 갯수 diff --git a/src/tool/N3ME/RiverMng.cpp b/src/tool/N3ME/RiverMng.cpp index 128a939f..106605b2 100644 --- a/src/tool/N3ME/RiverMng.cpp +++ b/src/tool/N3ME/RiverMng.cpp @@ -283,9 +283,9 @@ BOOL CRiverMng::MouseMsgFilter(LPMSG pMsg) { DWORD nFlags = pMsg->wParam; POINT point = {short(LOWORD(pMsg->lParam)), short(HIWORD(pMsg->lParam))}; if (RCM_CREATE == m_RCursorMode) { // 새로운 강 추가할때 드래그 하는 선 설정 - __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 - __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 - __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) + __Vector3 vRayDir, vRayOrig; // 화면 중앙(시점)과 마우스 포인터를 이은 직선의 방향과 원점 + __Vector3 vPN, vPV; // 평면의 법선과 포함된 점 + __Vector3 vPos; // 위의 평면과 직선의 만나는 점(구할 점) vPN.Set(0, 1, 0); vPV = m_CreateLine[0]; diff --git a/src/tool/N3ME/RiverMng.h b/src/tool/N3ME/RiverMng.h index cdb69697..681dcbe0 100644 --- a/src/tool/N3ME/RiverMng.h +++ b/src/tool/N3ME/RiverMng.h @@ -55,7 +55,7 @@ class CRiverMng : public CN3BaseFileAccess { CTypedPtrArray m_SelVtxArray; // 선택된 점들 CVtxPosDummy m_VtxPosDummy; // 점을 움직일수 있는 dummy object BOOL m_bEditMode; // 강물 편집모드인가? - int m_RCursorMode; // 강을 추가?하는 것인가 점을 선택하는 것인가? + int m_RCursorMode; // 강을 추가?하는 것인가 점을 선택하는 것인가? CMainFrame * m_pMainFrm; // mainframe pointer CDlgRiverProperty * m_pDlgProperty; // property dialog diff --git a/src/tool/N3ME/TransDummy.h b/src/tool/N3ME/TransDummy.h index fcde59cb..5ca05c9f 100644 --- a/src/tool/N3ME/TransDummy.h +++ b/src/tool/N3ME/TransDummy.h @@ -36,13 +36,13 @@ class CTransDummy : public CN3Transform { // Attributes public: protected: - __DUMMYCUBE m_DummyCubes[NUM_DUMMY]; // 4개의 큐브(center, x, y, z); - __VertexXyzColor m_LineVertices[6]; // 4개의 큐브를 이어주는 선을 구성하는 점 - CTypedPtrArray m_SelObjArray; // MapMng에서 선택된 객체들 + __DUMMYCUBE m_DummyCubes[NUM_DUMMY]; // 4개의 큐브(center, x, y, z); + __VertexXyzColor m_LineVertices[6]; // 4개의 큐브를 이어주는 선을 구성하는 점 + CTypedPtrArray m_SelObjArray; // MapMng에서 선택된 객체들 __DUMMYCUBE * m_pSortedCubes[NUM_DUMMY]; // Cube 거리에 따라 정렬된 포인터 __DUMMYCUBE * m_pSelectedCube; // 선택된 큐브 - __Vector3 m_vPrevPos; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 - __Quaternion m_qPrevRot; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 + __Vector3 m_vPrevPos; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 + __Quaternion m_qPrevRot; // 이번 마우스 드래그 이전에 위치 회전 확대/축소값 __Vector3 * m_vPrevScaleArray; // 이번 마우스 드래그 이전에 확대/축소값들 (선택된 객체들 모두의 값을 가지고 있어야 하기 때문에 배열) @@ -57,8 +57,8 @@ class CTransDummy : public CN3Transform { void GetPickRay(POINT point, __Vector3 & vDir, __Vector3 & vOrig); // 마우스 포인터가 가리키는 쪽으로 뻗어나가는 선 얻는 함수 protected: - __DUMMYCUBE * Pick(int x, int y); // 큐브 picking - void InitDummyCube(int iType, __DUMMYCUBE * pDummyCube, __Vector3 & vOffset, D3DCOLOR color); // 큐브 초기화 + __DUMMYCUBE * Pick(int x, int y); // 큐브 picking + void InitDummyCube(int iType, __DUMMYCUBE * pDummyCube, __Vector3 & vOffset, D3DCOLOR color); // 큐브 초기화 static int SortCube(const void * pArg1, const void * pArg2); // 큐브 카메라 거리에 대한 정렬함수 virtual void TransDiff(__Vector3 * pvDiffPos, __Quaternion * pvDiffRot, __Vector3 * pvDiffScale); // 차이만큼 선택된 오므젝트들을 변형시킨다. diff --git a/src/tool/PlugIn_Max/N3DExp.cpp b/src/tool/PlugIn_Max/N3DExp.cpp index b73a81e5..8d2d5780 100644 --- a/src/tool/PlugIn_Max/N3DExp.cpp +++ b/src/tool/PlugIn_Max/N3DExp.cpp @@ -1332,7 +1332,7 @@ bool CN3DExp::FindNodeRecursive(INode * pNode, Class_ID cID, std::list return true; } -bool CN3DExp::CheckObjectClassID(INode * pNode, +bool CN3DExp::CheckObjectClassID(INode * pNode, const Class_ID & cID) const // 주어진 노드가 주어진 클래스 아이디인지 검사 { if (NULL == pNode) { diff --git a/src/tool/PlugIn_Max/N3DExp.h b/src/tool/PlugIn_Max/N3DExp.h index 6c66ac0b..136afc61 100644 --- a/src/tool/PlugIn_Max/N3DExp.h +++ b/src/tool/PlugIn_Max/N3DExp.h @@ -95,7 +95,7 @@ class CN3DExp : public SceneExport { bool IsBone(INode * pNode); bool FindNodeRecursive(INode * pNode, Class_ID cID, std::list & list); - bool CheckObjectClassID(INode * pNode, + bool CheckObjectClassID(INode * pNode, const Class_ID & cID) const; // 주어진 노드의 오브젝트가 주어진 클래스 아이디인지 검사 Modifier * FindPhysiqueModifier(INode * pNode); // bool FindNodeIndex(INode* pNodeCompare, INode* pNodeSrc, Class_ID& cID, int& nNodeIndex); diff --git a/src/tool/RscTables/TableGenerator.cpp b/src/tool/RscTables/TableGenerator.cpp index 99da4e55..9c9b9916 100644 --- a/src/tool/RscTables/TableGenerator.cpp +++ b/src/tool/RscTables/TableGenerator.cpp @@ -614,7 +614,7 @@ bool CTableGenerator::Generate(int iIndex, const std::string & szEnumFileName, c } iCountWhole2++; // 실제 처리한 갯수 증가.. - } // end of if(iType == iExt) // 무기 타입과 확장 테이블에 적용할 번호가 맞는경우만 처리.. + } // end of if(iType == iExt) // 무기 타입과 확장 테이블에 적용할 번호가 맞는경우만 처리.. // 인덱스 계산.. iIndexCur2++; diff --git a/src/tool/UIE/TexViewer.h b/src/tool/UIE/TexViewer.h index 2b461eff..4db04b45 100644 --- a/src/tool/UIE/TexViewer.h +++ b/src/tool/UIE/TexViewer.h @@ -36,7 +36,7 @@ class CTexViewer : public CWnd { CPoint m_ptMouseOld; // 마우스의 이전 지점 기억 BOOL m_bDeselect; // deselect 할 것인가? CPoint m_ptClickOffset; // 선택 영역을 움직이려고 할때 click했을경우의 - // 선택창의 클릭지점 상대좌표(선택 영역lefttop 0,0 기준)(image pixel좌표계) + // 선택창의 클릭지점 상대좌표(선택 영역lefttop 0,0 기준)(image pixel좌표계) enum eDRAGTYPE { DRAGTYPE_NONE = 0, @@ -72,15 +72,15 @@ class CTexViewer : public CWnd { // Operations public: - void Release(); - BOOL Zoom(BOOL bZoomIn); // in : 확대, out : 축소 - BOOL Zoom(float fScale); // f배로 Zoom 하기 - void Render(); // texture render하기 - void SetTexture(LPCTSTR pszFName); // texture 지정 - eEDITMODE SetEditMode(eEDITMODE eMode); // mode 바꾸기 (zoom, hand, select) 실패하면 이전 mode를 돌려준다. - void SetLeftTopInImage(CPoint ptLeftTop); // 이미지의 좌측 상단 좌표 바꾸기 - BOOL GetSelectedUVRect(struct __FLOAT_RECT * pFRect) const; // 현재 선택된 UV좌표 얻기 - void SetSelectedUVRect(const struct __FLOAT_RECT * pFRect); // 현재 선택된 UV좌표 넣기 + void Release(); + BOOL Zoom(BOOL bZoomIn); // in : 확대, out : 축소 + BOOL Zoom(float fScale); // f배로 Zoom 하기 + void Render(); // texture render하기 + void SetTexture(LPCTSTR pszFName); // texture 지정 + eEDITMODE SetEditMode(eEDITMODE eMode); // mode 바꾸기 (zoom, hand, select) 실패하면 이전 mode를 돌려준다. + void SetLeftTopInImage(CPoint ptLeftTop); // 이미지의 좌측 상단 좌표 바꾸기 + BOOL GetSelectedUVRect(struct __FLOAT_RECT * pFRect) const; // 현재 선택된 UV좌표 얻기 + void SetSelectedUVRect(const struct __FLOAT_RECT * pFRect); // 현재 선택된 UV좌표 넣기 // image type관련 void SetImageTypeCount(int iCount) { m_iImageTypeCount = iCount; } // image type 갯수 정하기 diff --git a/src/tool/UIE/UIEView.h b/src/tool/UIE/UIEView.h index fc74ce98..c9a82b33 100644 --- a/src/tool/UIE/UIEView.h +++ b/src/tool/UIE/UIEView.h @@ -61,15 +61,15 @@ class CUIEView : public CView { // Operations public: CN3UIBase * Pick(const POINT & point, CN3UIBase * pUI); - void SetMode(eUIE_MODE eMode); // 모드를 변경하는 함수(Edit, Preview) + void SetMode(eUIE_MODE eMode); // 모드를 변경하는 함수(Edit, Preview) void SelectRectType(eRECTTYPE eRectType); // 수정하는 사각형 종류(영역, 움직이는 영역, 클릭 영역)를 정하는 함수 - void ChangeBkgndColor(); // 배경색을 바꿈 + void ChangeBkgndColor(); // 배경색을 바꿈 protected: - void RenderPreview(); // Preview 화면을 렌더하는 함수 - void RenderEditview(); // Editview 화면을 렌더하는 함수 + void RenderPreview(); // Preview 화면을 렌더하는 함수 + void RenderEditview(); // Editview 화면을 렌더하는 함수 eDRAGTYPE CheckDragType(CRect rcSel, CPoint point); // 마우스 위치에 따라 드래그 상태를 구별하는 함수 - void UpdateStatusBarText(); // Status Bar text를 현재 상태에 받게 갱신하는 함수 - void UpdateUIInfo_SelectedRect(); // selected rect정보를 토대로 UI 정보를 갱신하기 + void UpdateStatusBarText(); // Status Bar text를 현재 상태에 받게 갱신하는 함수 + void UpdateUIInfo_SelectedRect(); // selected rect정보를 토대로 UI 정보를 갱신하기 public: // Overrides // ClassWizard generated virtual function overrides From 48a073169e3e9ddabfb310f722e3a5ac8dcdfa9f Mon Sep 17 00:00:00 2001 From: Steve Williams <90905675+stevewgr@users.noreply.github.com> Date: Sat, 20 Jul 2024 16:29:46 -0400 Subject: [PATCH 5/7] Add .editorconfig file. --- .editorconfig | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..47d13423 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.rc] +charset = utf-16le + +[*.{cpp,h,hpp,c}] +indent_style = space +indent_size = 4 From ad08ec567ee94da17e2a5371203a016f1d94b7bd Mon Sep 17 00:00:00 2001 From: Steve Williams <90905675+stevewgr@users.noreply.github.com> Date: Sat, 20 Jul 2024 16:48:13 -0400 Subject: [PATCH 6/7] Update JPEH.H/CPP to use camel-case. --- src/engine/N3Base/{JPEG.CPP => Jpeg.cpp} | 0 src/engine/N3Base/{JPEG.H => Jpeg.h} | 0 src/game/KnightOnLine.vcxproj | 4 ++-- src/game/KnightOnLine.vcxproj.filters | 4 ++-- src/tool/PlugIn_Max/N3DExp.dsp | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) rename src/engine/N3Base/{JPEG.CPP => Jpeg.cpp} (100%) rename src/engine/N3Base/{JPEG.H => Jpeg.h} (100%) diff --git a/src/engine/N3Base/JPEG.CPP b/src/engine/N3Base/Jpeg.cpp similarity index 100% rename from src/engine/N3Base/JPEG.CPP rename to src/engine/N3Base/Jpeg.cpp diff --git a/src/engine/N3Base/JPEG.H b/src/engine/N3Base/Jpeg.h similarity index 100% rename from src/engine/N3Base/JPEG.H rename to src/engine/N3Base/Jpeg.h diff --git a/src/game/KnightOnLine.vcxproj b/src/game/KnightOnLine.vcxproj index ec30c5a5..c981d51c 100644 --- a/src/game/KnightOnLine.vcxproj +++ b/src/game/KnightOnLine.vcxproj @@ -138,7 +138,7 @@ - + @@ -334,7 +334,7 @@ - + diff --git a/src/game/KnightOnLine.vcxproj.filters b/src/game/KnightOnLine.vcxproj.filters index 1668d172..cba47d86 100644 --- a/src/game/KnightOnLine.vcxproj.filters +++ b/src/game/KnightOnLine.vcxproj.filters @@ -151,7 +151,7 @@ N3Base\Core - + N3Base\Core @@ -697,7 +697,7 @@ N3Base\Core - + N3Base\Core diff --git a/src/tool/PlugIn_Max/N3DExp.dsp b/src/tool/PlugIn_Max/N3DExp.dsp index 2306285b..3a802d10 100644 --- a/src/tool/PlugIn_Max/N3DExp.dsp +++ b/src/tool/PlugIn_Max/N3DExp.dsp @@ -190,11 +190,11 @@ SOURCE=..\..\engine\N3Base\DFont.h # End Source File # Begin Source File -SOURCE=..\..\engine\N3Base\JPEG.CPP +SOURCE=..\..\engine\N3Base\Jpeg.cpp # End Source File # Begin Source File -SOURCE=..\..\engine\N3Base\JPEG.H +SOURCE=..\..\engine\N3Base\Jpeg.h # End Source File # Begin Source File From 317d79598a439dbac4c3eada2e59302c005320a2 Mon Sep 17 00:00:00 2001 From: Steve Williams <90905675+stevewgr@users.noreply.github.com> Date: Sat, 20 Jul 2024 22:25:49 -0400 Subject: [PATCH 7/7] Remove UTF-16 encoding from .gitatrributes. Test made the RC files act up, as it was wrongly trying to transcode them and failed to do so. --- .gitattributes | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitattributes b/.gitattributes index edcba996..6313b56c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1 @@ -* text=auto -*.rc text working-tree-encoding=UTF-16 -*.rc2 text working-tree-encoding=UTF-16 +* text=auto eol=lf