public Weapon Init() { currentAmmo = stat.ammo; shootPos = transform.Find("ShootPos"); muzzleFlash = transform.Find("MuzzleFlash").gameObject; rb = GetComponent <Rigidbody2D>(); // NOTE: For some stupid reason, setting the bodyType to Static rather than Kinematic still make it move for the first 2 frames when the game starts. rb.bodyType = RigidbodyType2D.Kinematic; box = gameObject.AddComponent <BoxCollider2D>(); trigger = GetComponent <TextboxTrigger>(); trigger.weapon = this; return(this); }
static bool ShowTextbox(TextboxTrigger trigger, DialogueBox textbox, GameObject textboxCanvas) { if (trigger) { Vector3 textboxPos = trigger.transform.position; switch (trigger.textboxType) { case TextboxType.None: return(false); // NOTE: We never update the lastObj if the type is None case TextboxType.Dialogue: { textbox.ShowDialogue(null, "Press F to talk"); } break; case TextboxType.Chest: { textbox.ShowDialogue(null, "Press F to open"); } break; case TextboxType.Weapon: { WeaponStat stat = trigger.weapon.stat; System.Text.StringBuilder builder = new System.Text.StringBuilder(); builder.Append("Damage: ").Append(stat.damage).Append("\nCritical: ").Append(stat.critDamage) .Append("\nFire rate:").Append(stat.fireRate).Append("\nPress F to change weapon"); textbox.ShowDialogue("Name: " + stat.weaponName, builder.ToString()); textboxPos = trigger.hitGroundPos; } break; } textboxCanvas.transform.position = textboxPos + (Vector3)trigger.textboxOffset; } textboxCanvas.SetActive(trigger); return(true); }
// Update is called once per frame void Update() { if (displayHealthBar) { int health = (int)Mathf.Clamp(GameManager.player.health, 0, healthSlider.maxValue); healthSlider.value = health; healthText.text = health.ToString(); } if (displayMoneyCount) { moneyText.text = money.value.ToString(); } if (displayWaveCount) { if (EnemySpawner.totalWaves > 0) { waveText.gameObject.SetActive(true); enemyText.gameObject.SetActive(true); waveText.text = $"Waves: {EnemySpawner.waveCount}/{EnemySpawner.totalWaves}"; enemyText.text = $"Number of enemies left: {Enemy.numberOfEnemiesAlive}"; } else { waveText.gameObject.SetActive(false); enemyText.gameObject.SetActive(false); } } if (displayWeaponUI) { weaponImage.sprite = weaponController.inventory.current.stat.icon; ammoText.text = $"{weaponController.inventory.current.currentAmmo}/{weaponController.inventory.current.stat.ammo}"; } if (displayMinimap && GameInput.GetInput(InputType.Map)) { minimap.gameObject.SetActive(!minimap.gameObject.activeSelf); map.gameObject.SetActive(!map.gameObject.activeSelf); } if (displayTextbox) { if (inDialogue) { if (GameInput.GetRawInput(InputType.NextDialogue)) { if (sentences.Count == 0) { inDialogue = false; lastObj = null; // This will make closestObj != lastObj and will show the "Press F to talk" textbox properly textboxCanvas.SetActive(false); GameInput.EnableAllInputs(true); return; } textbox.ShowDialogue(null, sentences.Dequeue()); } return; } closestObj = GameUtils.GetClosestCollider(weaponHolder.position, radius, overlapObjects, LayerMask.GetMask("HasTextbox"))?.gameObject; if (closestObj != lastObj) { if (ShowTextbox(trigger = closestObj?.GetComponent <TextboxTrigger>(), textbox, textboxCanvas)) { lastObj = closestObj; } } if (trigger && GameInput.GetInput(InputType.Interact)) { trigger.trigger?.Invoke(); switch (trigger.textboxType) { case TextboxType.Dialogue: { Dialogue dialogue = trigger.GetRandomDialogue(); foreach (var sentence in dialogue.dialogues) { sentences.Enqueue(sentence); } inDialogue = true; textbox.ShowDialogue(null, sentences.Dequeue()); GameInput.EnableAllInputs(false); } break; case TextboxType.Chest: { int randomWeapon = Random.Range(0, trigger.chestData.inventory.items.Count); trigger.chestData.inventory.SpawnAndDropWeapon(randomWeapon, trigger.transform.position, trigger.GetRandomDir()); closestObj.layer = 0; Destroy(trigger); textboxCanvas.SetActive(false); } break; case TextboxType.Weapon: { inventory.SwapCurrent(new Vector2(weaponHolder.right.x, 1) * 10, trigger.weapon, weaponHolder); textboxCanvas.SetActive(false); } break; } } } }