Post

(TIL) 2025-03-04 FINAL(21)

(TIL) 2025-03-04 FINAL(21)

허니 머스타드 생성


오늘 작업한 내용은 코어(기지)에 특정 재료를 넣어서 재료가 모아지만 자동으로 허니 머스타드를 만드는 로직을 구현하였다. 현재 구현되어있는 아이템 박스 로직을 사용하여 해당 기능을 구현하려고 했으나 작업을 하고 테스트를 하다보니 클라에서 해당 방식으로는 사용이 불가능했다.
그래서 코어에서 아이템을 관리를 따로 해야하는데 현재 구현된 로직을 분석해보니 하드코딩으로 임시로 군데군데 박혀있고 전혀 관리가 되지 않고 있었다. 결국 코어 객체를 새로 만들어 관리를 해야하는데 다른 로직에서 연결되는 부분이 있어서 좀 뜯어 고치는 작업을 해야만했다. ㅠㅠ

코드 작업

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
class Core {
  constructor(maxHp) {
    this.objectId = 1;
    this.objectCode = 1;
    this.itemData = [];
    this.x = 0;
    this.y = 0;
    this.coreHp = maxHp;
    this.occupied = null;
  }

  getCoreData() {
    return {
      ObjectData: { objectId: this.objectId, objectCode: this.objectCode },
      itemData: this.itemData,
      x: this.x,
      y: this.y,
    };
  }

  getCoreHp() {
    return this.coreHp;
  }

  coreDamaged(damage) {
    this.coreHp -= damage;
    return this.coreHp;
  }

  getItemList() {
    return this.itemData;
  }

  //플레이어가 박스에서 꺼내기
  takeOutAnItem(player, itemCode, count, emptyIndex) {
    //temType을 기반으로 박스에 아이템 조회
    const removedItem = this.itemData.find((item) => item.itemCode === itemCode);
    const removedItemIndex = this.itemData.findIndex((item) => item.itemCode === itemCode);
    if (!removedItem) {
      throw new CustomError('상자에서 아이템을 찾을 수 없습니다.');
    }

    //보유량이 더 많으면 갯수만 줄이기
    if (removedItem.count > count) {
      removedItem.count -= count;
      const item = player.addItem(itemCode, count, emptyIndex);
    } else {
      //아이템을 제거하고 stack만큼만 아이템을 반환하도록
      count = removedItem.count;
      this.itemData.splice(removedItemIndex, 1, 0);
      const item = player.addItem(itemCode, count, emptyIndex);
      return item;
    }
    //player 인벤토리에 추가된 item반환
    return removedItem;
  }
  //플레이어가 박스에 넣기
  putAnItem(player, itemCode, count) {
    const existItem = this.itemData.find((item) => item.itemCode === itemCode);
    if (existItem) {
      existItem.count += count;
      if (player) player.removeItem(itemCode, count);
      return existItem;
    } else {
      const item = { itemCode: itemCode, count: count };
      this.itemData.push(item);
      if (player) player.removeItem(itemCode, count);
      return item;
    }
  }

  createMustardItem(materialCounts) {
    // 생성 가능 개수
    const createCount = materialCounts.reduce((a, b) => Math.min(a, b));

    // const materialCodes = [
    //   config.game.item.mustardMaterialCode1,
    //   config.game.item.mustardMaterialCode2,
    //   config.game.item.mustardMaterialCode3,
    // ];

    const materialCodes = [
      config.game.item.mustardMaterialCode1,
      config.game.item.mustardMaterialCode2,
    ];
    // 재료 소비
    materialCodes.forEach((materialCode) => {
      const removedItem = this.itemData.find((item) => item.itemCode === materialCode);
      const removedItemIndex = this.itemData.findIndex((item) => item.itemCode === materialCode);
      if (!removedItem) {
        throw new CustomError(
          `코어 보관함에서 아이템을 찾을 수 없습니다. (itemCode:${materialCode})`,
        );
      }

      if (removedItem.count > createCount) {
        removedItem.count -= createCount;
      } else {
        this.itemData.splice(removedItemIndex, 1);
      }
    });

    // 머스타드 생성
    this.putAnItem(null, config.game.item.mustardItemCode, createCount);
    console.log('허니 머스타드 생성 성공!!');
  }

  removeItem(itemCode, count) {
    const removedItem = this.itemData.find((item) => item.itemCode === itemCode);
    const removedItemIndex = this.itemData.findIndex((item) => item.itemCode === itemCode);
    if (!removedItem) {
      throw new CustomError(`코어 보관함에서 아이템을 찾을 수 없습니다. (itemCode:${itemCode})`);
    }

    if (removedItem.count > count) {
      removedItem.count -= count;
    } else {
      this.itemData.splice(removedItemIndex, 1, 0);
    }
  }
}

우선 기존에 코어HP를 Game클래스에서 관리를 했는데 이제 코어로 옮겨서 HP연관된 함수들을 옮겨주고 연괸된 부분을 수정하였다. 그리고 코어에 아이템을 넣고 뺴는 기능들도 추가를 하였다. Core 클래스의 요소들은 기존에 이미 클라와 저런형태로 데이터를 주고 받고 있어 그대로 따를 수 밖에 없었다.

테스트

원래 기획은 꿀, 계란후라이, 머스타드 씨앗 이라는 이 3개 아이템으로 허니 머스타드를 만드는건데 아직 몇개 아이템이 구현이 안되어있어 얻을 수 없으니 게임 시작 시 기본으로 주는 아이템으로 허니머스트를 만드는걸로 해서 테스트를 진행했다. 테스트용으로 돌아가는것만 잘 확인되면 정상적인 아이템 코드로도 잘 돌아 갈 것이다.

  1. 코어(기지) 보관함 오픈 사진1

  2. 재료 넣기 사진2

  3. 허니 머스타드 생성 - 조합(자동) 사진3

  4. 인벤토리로 이동 사진4

This post is licensed under CC BY 4.0 by the author.